【深度学习】BP算法-误差逆传播算法详解

前些开始准备找实习找工作了,复习机器学习算法的时候发现BP算法又忘了,这次写博客记录一下,由于我矩阵知识不是很好,所以这篇文章没有以矩阵运算的方式来讲解。本文表面是原创,实际上参考了很多很多文章

符号与神经网络结构说明

【深度学习】BP算法-误差逆传播算法详解

LL : 当前神经网络的总层数
nln^{l} : 第ll层神经元拥有的神经元个数
αil\alpha^{l}_{i} : 第ll层神经网络中的第ii个神经元的输入
βil\beta^{l}_{i} : 第ll层神经网络中的第ii个神经元的输出
wijlw^{l}_{ij} : 第ll层神经网络中的第ii个神经元的到第l+1l+1层神经网络中的第jj个神经元的权重
bjlb^{l}_{j} : 第ll层神经网络中到第l+1l+1层神经网络中第jj个神经元的的偏置项(想不出来叫啥了)
EE : 神经网络的总损失
ff : **函数
MM : 总样本数
xijx_{ij} : 第ii个样本的第jj个属性值(特征值,whatever)
yijy_{ij} : 第ii个样本的第jj个输出的真实值
y^ij\hat{y}_{ij} : 神经网络对于第ii个样本在第jj个输出的预测值,也就是βjL\beta^{L}_{j}

一些准备知识

神经网络内部的运算

  • 神经元的输入与输出的关系:βil=f(αil)\beta^{l}_{i}=f(\alpha^{l}_{i})
  • ll层神经元与第l+1l+1层神经元之间的关系:αjl+1=k=1nlwkjlβkl+bjl\alpha^{l+1}_{j}=\sum_{k=1}^{n^{l}}w^{l}_{kj}\beta^{l}_{k}+b^{l}_{j}
  • 常用的均方损失:E=m=1M12knL(ymky^mk)2E=\sum_{m=1}^{M}\frac{1}{2}\sum_{k}^{n^L}(y_{mk}-\hat{y}_{mk})^2

求导的链式法则

  • 如果y=g(x),z=h(y)y=g(x),z=h(y),那么有zx=zyyx\frac{\partial z}{\partial x}=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}
  • 如果y1=g(x),y2=h(x),z=k(y1,y2)y_1=g(x),y_2=h(x),z=k(y_1,y_2),那么有zx=zy1y1x+zy2y2x\frac{\partial z}{\partial x}=\frac{\partial z}{\partial y_1}\frac{\partial y_1}{\partial x}+\frac{\partial z}{\partial y_2}\frac{\partial y_2}{\partial x}

BP算法

请结合图看,重点关注第ll层第ii个和第l+1l+1层第jj个神经元之间的权重更新
由于梯度下降方法,权重一定是按下式更新的wijl=wijlηEwijlw^{l}_{ij}=w^{l}_{ij}-\eta\frac{\partial E}{\partial w^{l}_{ij}}因此求Ewijl\frac{\partial E}{\partial w^{l}_{ij}}就是BP算法的核心

由链式法则可知Ewijl=Eαjl+1αjl+1wijl(1)\frac{\partial E}{\partial w^{l}_{ij}}=\frac{\partial E}{\partial \alpha^{l+1}_{j}} \frac{\partial \alpha^{l+1}_{j}}{\partial w^{l}_{ij}} \qquad(1)

ll层神经元与第l+1l+1层神经元之间的关系:αjl+1=k=1nlwkjlβkl+bjl\alpha^{l+1}_{j}=\sum_{k=1}^{n^{l}}w^{l}_{kj}\beta^{l}_{k}+b^{l}_{j}可知 αjl+1wijl=βil(2)\frac{\partial \alpha^{l+1}_{j}}{\partial w^{l}_{ij}}=\beta_{i}^{l} \qquad(2)

又由(2)带入(1)可得Ewijl=Eαjl+1βil(3)\frac{\partial E}{\partial w^{l}_{ij}}=\frac{\partial E}{\partial \alpha^{l+1}_{j}} \beta_{i}^{l} \qquad(3)

由链式法则可知Eαjl+1=Eβjl+1βjl+1αjl+1(4)\frac{\partial E}{\partial \alpha^{l+1}_{j}}=\frac{\partial E}{\partial \beta^{l+1}_{j}} \frac{\partial \beta^{l+1}_{j}}{\partial \alpha^{l+1}_{j}} \qquad(4)

神经元的输入与输出的关系:βil=f(αil)\beta^{l}_{i}=f(\alpha^{l}_{i})可知βjl+1αjl+1=f(αjl+1)(5)\frac{\partial \beta^{l+1}_{j}}{\partial \alpha^{l+1}_{j}}=f'(\alpha^{l+1}_{j}) \qquad(5)

由于EE是第l+2l+2层神经元的输入α1l+2,α2l+2,...,αnl+1l+2\alpha_{1}^{l+2},\alpha_{2}^{l+2},...,\alpha_{n^{l+1}}^{l+2}的函数,所以由链式法则第二条有Eβjl+1=k=1nl+2Eαkl+2αkl+2βjl+1=k=1nl+2Eαkl+2wjkl+1(6)\frac{\partial E}{\partial \beta^{l+1}_{j}}=\sum_{k=1}^{n^{l+2}}\frac{\partial E}{\partial \alpha^{l+2}_{k}} \frac{\partial \alpha^{l+2}_{k}}{\partial \beta^{l+1}_{j}}=\sum_{k=1}^{n^{l+2}}\frac{\partial E}{\partial \alpha^{l+2}_{k}} w_{jk}^{l+1} \qquad(6)

将(5)(6)带入(4)可得Eαjl+1=f(αjl+1)k=1nl+2Eαkl+2wjkl+1(7)\frac{\partial E}{\partial \alpha^{l+1}_{j}}=f'(\alpha^{l+1}_{j})\sum_{k=1}^{n^{l+2}}\frac{\partial E}{\partial \alpha^{l+2}_{k}} w_{jk}^{l+1} \qquad(7)

到这里可以看出,w,f,αjl+1w,f',\alpha_j^{l+1}都已知,如果知道了第l+2l+2层的所有Eαjl+2\frac{\partial E}{\partial \alpha^{l+2}_{j}},就能求得第l+1l+1层的所有Eαjl+1\frac{\partial E}{\partial \alpha^{l+1}_{j}},由(3)(7)就能得到Ewijl=βilf(αjl+1)k=1nl+2Eαkl+2wjkl+1(8)\frac{\partial E}{\partial w^{l}_{ij}}=\beta_{i}^{l} f'(\alpha^{l+1}_{j})\sum_{k=1}^{n^{l+2}}\frac{\partial E}{\partial \alpha^{l+2}_{k}} w_{jk}^{l+1} \qquad(8)

而对于输出层来说EαjL=EβjLβjLαjL\frac{\partial E}{\partial \alpha^{L}_{j}}=\frac{\partial E}{\partial \beta^{L}_{j}} \frac{\beta^{L}_{j}}{\partial \alpha^{L}_{j}}

然后由(7)我们就可以得到上一层的EαjL1\frac{\partial E}{\partial \alpha^{L-1}_{j}},由(8)就可以的得到这一层的梯度

有了上面的基础,求Ebjl\frac{\partial E}{\partial b^{l}_{j}}就非常简单了,因为他就等于Ebjl=Eαjl+1αjl+1bjl=Eαjl+11\frac{\partial E}{\partial b^{l}_{j}}=\frac{\partial E}{\partial \alpha^{l+1}_{j}} \frac{\partial \alpha^{l+1}_{j}}{\partial b^{l}_{j}}=\frac{\partial E}{\partial \alpha^{l+1}_{j}}*1

典型损失的梯度

平方损失

如果E=yf(α)2E=||y-f(\alpha)||^2,那么Eα=2(yf(α))f(α)\frac{\partial E}{\partial \alpha}=2(y-f(\alpha))f'(\alpha)

交叉熵损失

如果E=ikyilogf(αi)E=-\sum_i^k y_ilogf(\alpha_i),其中kk为类别个数,假设该样本真实类别为jj,那么有E=logf(αj)E=- logf(\alpha_j),于是Eαj=f(α)f(α)\frac{\partial E}{\partial \alpha_j}=-\frac{f'(\alpha)}{f(\alpha)}

softmax的梯度

f(αi)=eαijkeαjf(\alpha_i)=\frac{e^{\alpha_i}}{\sum_j^k e^{\alpha_j}}f(αi)=f(αi)(1f(αi))f'(\alpha_i)=f(\alpha_i)(1-f(\alpha_i))

Resnet

resnet可以把梯度传回到更远的位置
就相当于多了个短接E=E(α1l+2,...,α0)E=E(\alpha_1^{l+2},...,\alpha_0),其中α0=βjl+1\alpha_0=\beta_j^{l+1}
举个例子,一个函数z=f(y1,y2,y3)=y1+y2+y3z=f(y_1,y_2,y_3)=y_1+y_2+y_3,其中y1=x2,y2=x3,y3=xy_1=x^2,y_2=x^3,y_3=x,那么zx=zy1y1x+zy2y2x+zy3y3x\frac{\partial z}{\partial x}=\frac{\partial z}{\partial y_1}\frac{\partial y_1}{\partial x}+\frac{\partial z}{\partial y_2}\frac{\partial y_2}{\partial x}+\frac{\partial z}{\partial y_3}\frac{\partial y_3}{\partial x}
注意,尽管y3=xy3=xzx\frac{\partial z}{\partial x}zy3\frac{\partial z}{\partial y_3}也不是同一个东西奥!因为zx\frac{\partial z}{\partial x}还得考虑y1,y2y_1,y_2

【深度学习】BP算法-误差逆传播算法详解
原谅我不想拿Visio画图了,看上面最简单的resnet一个案例,嘉定输入就是个一维的
Ew0=Eβ1β1α1α1w0\frac{\partial E}{\partial w_0}=\frac{\partial E}{\partial \beta_1}\frac{\partial \beta_1}{\partial \alpha_1}\frac{\partial \alpha_1}{\partial w_0},和上面不同的地方就在于Eβ1\frac{\partial E}{\partial \beta_1},假设短接那个变量记为α0\alpha_0,那么有
Eβ1=Eα2α2β1+Eα0α0β1\frac{\partial E}{\partial \beta_1}=\frac{\partial E}{\partial \alpha_2}\frac{\partial \alpha_2}{\partial \beta1}+\frac{\partial E}{\partial \alpha_0} \frac{\partial \alpha_0}{\partial \beta1}其中α0β1=1\frac{\partial \alpha_0}{\partial \beta1}=1,那么也就是说Eα0\frac{\partial E}{\partial \alpha_0}这个梯度被传递回去了,这样就有助于缓解梯度消失

感性认识

为什么叫反向呢?李宏毅老师给出的解释非常好,在这里简单说一下,如果我们把Eαkl+2\frac{\partial E}{\partial \alpha^{l+2}_{k}}看做输入的话,那(8)这个式子就像这个神经网络在反着从后往前走一样,具体请见李宏毅机器学习

例子

A Step by Step Backpropagation Example