反向传播算法-Backpropagation

`

函数 $L=L(z), z=f(x,y)$
正向(forward): $\frac{\partial z}{\partial x}, \frac{\partial z}{\partial y}, \frac{\partial L}{\partial z}$
反向(reverse): $\frac{\partial L}{\partial x}= \frac{\partial L}{\partial z}, \frac{\partial z}{\partial x}$, $\frac{\partial L}{\partial y}= \frac{\partial L}{\partial z}, \frac{\partial z}{\partial y}$

反向传播算法(Backpropagation, BP)是训练人工神经网络最核心的方法。基本做法是从后往前计算损失函数关于参数的导数,然后结合梯度下降算法求解求解神经网络的参数。

一般有监督机器学习方法具有共同结构:模型(model),损失函数(loss function)和优化方法(optimizer)。下面在该框架下推导BP。

模型

多层神经网络(Multilayer Perceptron, MLP):

其中:

  • $l=1,2,…,L$: 神经网络的层数。不考虑输入层和输出层的话,该网络是一个$L-2$个隐含层的神经网络
  • $n_l$: $l$层神经元(units/neurons)的个数
  • $W^{(l)}$: $l$与$l+1$层之间的权重(weights)
  • $b^{(l)}$: $l$层的阈值(bias)
  • $f(\cdot)$: 激活函数。比较常见的有Sigmoid: $f(x)=\frac{1}{1+e^{-x}}$, ReLU: $f(x)=\max(0,x)$
  • $z^{(l)}$: 激活函数的输入
  • $a^{(l)}$: 激活函数的输出,称为activations

上面的网络中,前一层的输出做线性变换后, 成为后一层的输入。 当$l=1, 2,3,….,L-1$时,值传递的关系为:

\begin{aligned}
z^{(l+1)} &= W_{n_{l+1}\times n_{l} }^{(l)} a^{(l)} + b^{(l)} \\
a^{(l+1)} &= f(z^{(l)})
\end{aligned}


损失函数

给定样本$\{(x^{(i)},y^{(i)})\}_{i=1}^m$, 将模型的损失函数定义为

\begin{aligned}
J(W,b)&=J(W^{(1)},…,W^{(L-1)},b^{(1)},…,b^{(L-1)};\{(x^{(i)},y^{(i)})\}_{i=1}^m) \\
&=\frac{1}{m}\sum_{i=1}^m J(W,b;x^{(i)}, y^{(i)})
\end{aligned}


优化方法

参数更新的迭代公式为 ($l=1,2,…,L-1; i=1,2,…,n_{l+1}; j=1,2,…,n_l​$):

\begin{aligned}
W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\
b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)
\end{aligned}

​ 其中:
$$\begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &= \frac{1}{m} \sum_{k=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(k)}, y^{(k)}) \\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &= \frac{1}{m}\sum_{k=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(k)}, y^{(k)}) \end{align}$$

Backpropagation

如果采用随机梯度下降方法(stochastic gradient descent), 为了更新参数,需要计算每一对样本点 $(x^{(i)},y^{(i)})$的损失函数关于参数的导数。记 $(x,y)=(x^{(i)},y^{(i)})$, 上式右边求和的一项可改写为

\begin{align}
\frac{\partial J(W,b; x, y)}{\partial W_{ij}^{(l)}} & = {\frac{\partial J(W,b; x, y)}{\partial z_i^{(l+1)} } }\frac{\partial z_i^{(l+1)} }{\partial W_{ij}^{(l)}} = \delta_i^{(l+1)} a^{(l)}_j
\end{align}

\begin{align}
\frac{\partial J(W,b; x, y)}{\partial b_{i}^{(l)}} & = \frac{\partial J(W,b; x, y)}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)} }{\partial b_{i}^{(l)}} = \delta_i^{(l+1)}.
\end{align}

其中$\delta_i^{(l+1)}$ 在BP的推导中处于核心位置可以理解为 $l$层中节点$i$的误差(“error” of node $i$ in layer $l$) . 计算过程如下:

  • $l=L$

\begin{aligned}
\delta^{(L)}_i & = \frac{\partial J(W,b;x,y) }{\partial z^{(L)}_i} = \frac{\partial}{\partial z^{(L)}_i}\frac{1}{2} \left|y - \hat{y}\right|_2^2 \\\\
&= \frac{\partial}{\partial z^{(L)}_i}\frac{1}{2} \sum_{j=1}^{n_L} \left(y_j-a_j^{(L)}\right)^2 \\\\
&= - (y_i - a_i^{(L)}) \cdot f’(z^{(L)}_i)
\end{aligned}

UFLDL Tutorial: Backpropagation Algorithm计算方法如上。

但是在Andrew Ng的Machine Learning课程和书《Python Machine Learining》Chapter 12 用的是$\delta_i^{(L)}=a_i^{(L)}-y_i$.

可以把$f’(z^{(L)}_i)$理解为误差的尺度参数(scale),所以取1也可以.

  • $l=L-1,L-2,…,2$

\begin{aligned}
\delta^{(l)}_i &= \frac{\partial J(W,b;x,y) }{\partial z^{(l)}_i} \\\\
​ &=\sum_{j=1}^{n_{l+1}} \frac{\partial J(W,b;x,y)}{\partial z^{(l+1)}_j} \frac{\partial z^{(l+1)}_j} {\partial z^{(l)}_i} \quad \leftarrow \frac{\partial J(W,b;x,y)}{\partial z^{(l+1)}_i}=\delta_i^{(l+1) } \\\\
​ &= \sum_{j=1}^{n_{l+1}} \left[\delta_i^{(l+1) } \frac{\partial z^{(l+1)}_j} {\partial a^{(l)}_i}\frac{\partial a^{(l)}_i} {\partial z^{(l)}_i} \right] \\\\
​ &= \left[ \sum_{j=1}^{n_{l+1}} \delta_i^{(l+1) } W_{ji}^{(l)}\right]f’(z_i^{(l)})
\end{aligned}




MachineLearning. Machine Leraning, Andrew Ng
Chapter 12. Python Machine Learining, Sebastian Raschka and Vahid Mirjalili第十二章, 书中测试的例子没有$f’(z^{(L)}_i)$. 加上$f’(z^{(L)}_i)$收敛速度训练速度变慢。