前馈神经网络前向传播
一个三层的前馈神经网络如下图所示:
对于第二层的输出$a_1^2,a_2^2,a_3^2$,有:
$$
a_1^2 = \sigma(z_1^2)=\sigma(w_{11}^2x_1+w_{12}^2x_2+w_{13}^2x_3+b_1^2)\\\\
a_2^2 = \sigma(z_2^2)=\sigma(w_{21}^2x_1+w_{22}^2x_2+w_{23}^2x_3+b_3^2)\\\\
a_3^2 = \sigma(z_3^2)=\sigma(w_{31}^2x_1+w_{32}^2x_2+w_{33}^2x_3+b_3^2)
$$
对于第三层的输出$a_1^3$,有:
$$a_1^3 = \sigma(z_1^3)=\sigma(w_{11}^3x_1+w_{12}^3x_2+w_{13}^3x_3+b_1^3)$$
用下面的符号来描述一个前馈神经网络:
- L:表示神经网络的层数;
- $n^l$:表示第l层神经元的个数;
- $f_l(.)$:表示第l层神经元的激活函数;
- $W^{(l)}\in R^{n^l\times n^{l-1}}$:表示第l-1层到第l层的权重矩阵;
- $b^{(l)\in R^{n^l}}$:表示第l-1层到第l层的偏置;
- $z^{(l)\in R^{n^l}}$:表示第l层神经元的净输入;
- $a^{(l)\in R^{n^l}}$:表示第l层神经元的输出(激活值);
- $W_{ij}^{(l)}$:表示第l-1层第j个输入到第l层第i个神经元的权重;
前馈神经网络通过下面的公式进行信息传播:
$$
z^{(l)} = W^{(l)}\cdot a^{(l-1)} + b^{(l)} \\\\
a^{(l)} = f_l(z^{(l)})
$$
上面的公式可以合并为:$$
z^{(l)} = W^{(l)}\cdot f_{l-1}(z^{(l-1)}) + b^{(l)}
$$
这样,前馈神经网络可以通过逐层的信息传递,得到网络最后的输出$a^{(L)}$。整个网络可以看作一个复合函数$\phi(x;W,b)$,将输入x作为第1层的输入$a^{(0)}$,将第L层的输出作为$a^{(L)}$作为输出。
$$x=a^{(0)}\rightarrow z^{(l)} \rightarrow a^{(1)}\rightarrow z^{(2)}\rightarrow … \rightarrow a^{(L-1)} \rightarrow z^{(L)} \rightarrow a^{(L-1)}=\phi(x;W,b)$$
反向传播推导
假设损失函数是$L(y,\hat{y})$,对第l层中的参数$W^{(l)}$和$b^{(l)}$计算偏导数。因为$
\frac {\partial L(y,\hat{y})}{\partial W^{(l)}}$的计算涉及到矩阵的微分,十分繁琐,可以先计算偏导数$\frac {\partial L(y,\hat{y})}{\partial W_{ij}^{(l)}}$。根据链式法则:$$
\frac {\partial L(y,\hat{y})}{\partial W_{ij}^{(l)}} =\left(\frac {\partial z^{(l)}}{\partial W_{ij}^{(l)}}\right)^T\frac {\partial L(y,\hat{y})}{\partial z^{(l)}} (1)
\\\\
\frac {\partial L(y,\hat{y})}{\partial b^{(l)}} =\left(\frac {\partial z^{(l)}}{\partial b^{(l)}}\right)^T\frac {\partial L(y,\hat{y})}{\partial z^{(l)}} (2)
$$
公式(1)和(2)都是为目标函数关于第l层神经元$z^{(l)}$的偏导数,称为误差项,因此可以共用。我们只需要计算三个偏导数,分别为$\frac {\partial z^{(l)}}{\partial W_{ij}^{(l)}},\frac {\partial L(y,\hat{y})}{\partial b^{(l)}}和\frac {\partial L(y,\hat{y})}{\partial z^{(l)}}$
1、计算偏导数$\frac {\partial z^{(l)} }{\partial W_{ij}^{(l)}}$
因为$z^{(l)}和W_{ij}^{(l)}$的函数关系为$z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}$,因此,偏导数:
$$
\frac {\partial z^{(l)}}{\partial W_{ij}^{(l)}}=\frac {\partial (W^{(l)}a^{(l-1)}+b^{(l)})}{\partial W_{ij}^{(l)}}= a_j^{(l-1)}
$$
其中,$W_{i:}^{(l)}$为权重矩阵$W^{(l)}$的第i行
2、计算偏导数$\frac {\partial z^{l}}{\partial b^{(l)}}$
因为$z^{(l)}$和$b^{(l)}$的函数关系为$z^{(l)} = W^{(l)}a^{(l-1)}+b^{(l)}$,因此偏导数:
$$
\frac {\partial z^{l}}{\partial b^{(l)}}=I_{n^l}
$$
为$n^l\times n^l$的单位矩阵。
3、计算偏导数$\frac {\partial L(y,\hat{y})}{\partial z{(l)}}$
用$\delta^{(l)}$来定义第l层的神经元误差项:
$$
\delta^{(l)} = \frac {\partial L(y,\hat{y})}{\partial z^{(l)}} \in R^{n^l}
$$
误差项$\delta^{l}$表示第l层的神经元对最终的误差的影响,也反映了最终的输出对第l层的神经元对最终误差的敏感程度。
根据$z^{(l+1)}=W^{(l+1)}a^{(l)} + b^{(l+1)}$,有:
$$
\frac {\partial z^{(l+1)}}{\partial a^{(l)}} = (W^{(l+1)})^T
$$
根据$a^{(l)}=f(z^{(l)})$,其中,$f_l(.)$为按位计算的函数,因此有:
$$
\frac {\partial a^{(l)}}{\partial z^{(l)}} = \frac {\partial f_l(z^{(l)})}{\partial z^{l}} = diag(f_l^{\prime}(z^{(l)}))
$$
因此,根据链式法则,第l层的误差项为:
$$
\delta^{(l)} = \frac {\partial L(y, \hat{y})}{\partial z^{(l)}}\\\\
=\frac {\partial a^{(l)}}{\partial z^{(l)}}\cdot\frac{\partial z^{(l+1)}}{\partial a^{(l)}}\cdot \frac {\partial L(y, \hat{y})}{\partial z^{(l+1)}}\\\\=diag(f_l^{\prime}(z^{(l)}))\bigodot ((W^{(l+1)})^T\delta^{(l+1)}) (3)
$$
其中,$\bigodot$是向量的点积运算,表示每个元素相乘。
从公式3可以看出,第l层的误差项可以通过第l+1层的误差项计算,这就是反向传播。反向传播算法的含义是:第l层的一个神经元的误差项是所有与该神经元相连的第l+1层神经元误差项的权重和,然后再乘上该神经元激活函数的梯度。
在计算出三个偏导数之后,可以得到最终的偏导数:
$$
\frac {\partial L(y,\hat{y})}{\partial W_{ij}^{(l)}} = \delta_i^{(l)}a_j^{(l-1)}
$$
进一步,$L(y,\hat{y})$关于第l层的权重$W^{(l)}$的梯度为:
$$
\frac {\partial L(y,\hat{y})}{\partial W^{(l)}} = \delta^{(l)}a^{(l-1)}
$$
同理可得,$L(y,\hat{y})$关于第l层偏置$b^(l)$的梯度为:
$$
\frac {\partial L(y,\hat{y})}{\partial b^{(l)}} = \delta^{(l)}
$$
基于随机梯度下降的反向传播算法如下:
图片引自:https://github.com/nndl/nndl.github.io,chap-前馈神经网络.pdf。