反向传播算法大揭秘
注: 该篇博文是我阅读《How the backpropagation algorithm works》一文的笔记,该博文详细介绍了反向传播算法,并给出了反向传播算法四个基本公式中的前两个证明,我顺着作者的思路证明了后面两个,并记录了证明过程,希望能帮助到需要了解反向传播算法数学原理的童鞋。
符号说明
- $w^l_{jk}$表示$l-1$层的第$k$个神经元到$l$层的第$j$个神经元连接的权重.
- $b^l_j$表示$l$层的第$j$个神经元的偏置,$a^l_j$表示$l$层的第$j$个神经元作用于激活函数以后的取值.
- 对于$a^l_j$的计算,我们可以使用如下公式计算:$a^l_j=\sigma (\sum_\limits{k}w^l_{jk}a^{l-1}_k + b^l_j)$,其中,$\sigma$表示的是激活函数,求和符号表示的是第$l-1$层的所有神经元与$l$层第$j$个神经元连接的加权和.
- 上式使用矩阵表示则有:$a^l = \sigma (w^la^{l-1} + b^l)$,其中,$w^l$表示$l$层的权重矩阵,矩阵的第$j$行第$k$列的元素为$w^l_{jk}$,类似的,$b^l$和$a^l$用列向量表示第$j$层神经元的偏置和激活值.
- 对于$z^l = w^la^{l-1} + b^l$我们称之为$l$层的加权输出.
- 设推导反向传播过程中的代价函数为$C$.
- 我们使用$\odot$表示两个矩阵对应元素的乘积,即$(s\odot t){i,j} = s{i,j} \cdot t_{i,j}$,称之为Hadamard乘积.
反向传播的四个基本公式
反向传播过程中的四个基本公式:
$$\delta^L = \nabla_aC\odot \sigma’(z^L) \tag{BP1}$$
$$\delta^l = ((w^{l+1})^\mathrm{T}\delta^{l+1})\odot\sigma’(z^l) \tag{BP2}$$
$$\frac{\partial C}{\partial b^l_j} = \delta^l_j \tag{BP3}$$
$$\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k\delta^l_j \tag{BP4}$$
反向传播算法
- 输入$x$:输入层的激活值$a^1$可以假定就是其输入$x$
- 前向传播:对于$l=2,3,\cdots,L$,依次通过$z^l = w^la^{l-1} + b^l$和$a^l = \sigma(z^l)$公式进行计算激活值
- 计算最终输出误差$\delta^L$:通过公式计BP1算误差向量
- 反向误差传播:对于$l=L-1, L-2, \cdots, 2$,使用公式分BP2别计算每层神经元对应的误差
- 更新权重和增益:根据代价函数的梯度更新权重和增益,如公式BP3和BP4所示
推导过程
下面我们来进行公式的推导
对于公式BP1的推导
设最后一层$L$的第$j$个神经元的误差是
$$\delta^L_j = \frac{\partial C}{\partial z^L_j} \tag{1}$$
通过链式法则,我们可以得到
$$\delta^L_j = \frac{\partial C}{\partial a^L_j}\frac{\partial a^L_j}{\partial z^L_j} \tag{2}$$
将$a^l_j=\sigma(z^L_j)$带入可得
$$\delta^L_j = \frac{\partial C}{\partial a^L_j}\sigma’(z^L_j) \tag{3}$$
公式BP1即是上式的矩阵形式
对于公式BP2的推导
对于$l$层的第$j$个神经元,我们使用链式法则有:
$$\delta^l_j = \frac{\partial C}{\partial z^l_j} = \sum\limits_k\frac{\partial C}{\partial z^{l+1}_k}\frac{\partial z^{l+1}_k}{\partial z^l_j} = \sum\limits_k\frac{\partial z^{l+1}_k}{\partial z^l_j}\delta^{l+1}_k \tag{4}$$
此外,我们有
$$z^{l+1}k = \sum\limits_jw^{l+1}{kj}a^l_j + b^{l+1}k = \sum\limits_jw^{l+1}{kj}\sigma(z^l_j) + b^{l+1}_k \tag{5}$$
对上式微分,得
$$\frac{\partial z^{l+1}k}{\partial z^l_j} = w^{l+1}{kj}\sigma’(z^l_j) \tag{6}$$
带入公式4,可得
$$\delta^l_j = \sum\limits_kw^{l+1}_{kj}\delta^{l+1}_k\sigma’(z^l_j) \tag{7}$$
对于公式BP3的推导
对于$l$层的第$j$个神经元,我们使用链式法则有:
$$\frac{\partial C}{\partial b^L_j} = \frac{\partial C}{\partial z^l_j}\frac{\partial z^l_j}{\partial b^l_j} \tag{8}$$
由于$\frac{\partial z^l_k}{\partial b^l_j}$恒等于1,所以有
$$\frac{\partial C}{\partial b^L_j} = \frac{\partial C}{\partial z^l_j} = \delta^l_j \tag{9}$$
对于公式BP4的推导
因为$z^{l}j = \sum\limits_kw^{l}{jk}a^{l-1}_k + b^{l+1}_j$,取导数有
$$\frac{\partial z^l_j}{\partial w^{l}_{jk}} = a^{l-1}_k \tag{10}$$
对于$l$层的第$j$个神经元,我们使用链式法则有:
$$\frac{\partial C}{\partial w^l_{jk}} = \frac{\partial C}{\partial z^l_{j}} \frac{\partial z^l_{j}}{\partial w^l_{jk}} \tag{11}$$
将$\delta^l_j = \frac{\partial C}{\partial z^l_j}$和$\frac{\partial z^l_{jk}}{\partial w^l_{jk}} = a^{l-1}k$带入公式11,得
$$\frac{\partial C}{\partial w^l{jk}} = \delta^l_ja^{l-1}_k \tag{12}$$
终于,推导完毕!