反向传播(BackPropagation)与梯度下降(Gradient Descent)

梯度下降算法(Gradient Descent)

在机器学习的模型的训练阶段,对模型反复做的事情就是将训练样本通过模型计算出的结果与实际训练集的标签进行比对,用以修改模型中的参数,直至模型的计算结果与训练集中的结果一致。

损失函数

为了量化的表现出模型计算结果与实际的差距,因此引入了损失函数(Loss function)用以显示模型的准确率,不断修改模型参数使得损失函数的值降到最小

  • 输入:模型
  • 输出:模型的优劣

基于统计学的知识,我们可以采用模型计算结果与实际结果的均方差来表示损失函数,下面公式中假设模型f(x)f(x),损失函数L(f)L(f)y^\hat y表示训练集中的标签
L(f)=(y^f(x))2L(f)=\sum (\hat y-f(x))^2
因此,修正模型的任务就转化为了找到最优的模型ff^*使得L(f)L(f)得到最小值。
f=argminfL(f)f^*=\arg \min_f L(f)
ff^*的确定就是f(x)f(x)中参数的确定。

假设f(x)f(x)中有两个参数ω\omegabb,则L(f)L(f)可表示为L(ω,b)L(\omega,b),而上述问题就最终变为
ω,b=argminω,bL(ω,b)\omega^*,b^*=\arg \min_{\omega,b}L(\omega,b)
而寻找最优参数的过程则是使用梯度下降算法

梯度下降

类比想象一个形象一点的过程:一个被随机放在群山中的登山者,在一个看不见前路的黑夜,在对地形一无所知的情况下,如何最快速的从所在位置找到其能找到的最低点呢?

答案是,从所在位置朝下降坡度最大的方向迈步,每迈出一步,判断一下当前位置下降坡度最大的方向,并迈出下一步,直至到达不存在下降坡度的地方。
反向传播(BackPropagation)与梯度下降(Gradient Descent)
回到当前的问题,这里的群山就是损失函数,登山者就是模型中的参数,随机放入山中指的是,参数初始为随机值。

找到最低点就是找到最小的损失函数,而登山者的迈步就是不断修改参数值,对任意参数v
vvΔvv\gets v-\Delta v
而寻找最大的下降坡度就是计算函数相对于某个参数的梯度,向梯度下降最为明显的方向移动,以前面含两个参数的损失函数为例,对于第n次计算
ωn+1=ωnηLωω=ωnbn+1=bnηLbb=bn\omega^{n+1}=\omega^n-\eta\frac{\partial L}{\partial \omega}|_{\omega=\omega^n}\\{}\\ b^{n+1}=b^n-\eta\frac{\partial L}{\partial b}|_{b=b^n}
公式中的η\eta为学习率(learning rate),可以自行设置的常数,用以控制模型修正的速度

反向传播算法

将梯度下降算法用于神经网络的模型

数学基础——求导链式法则(chain rule)

对于函数x=g(s),y=h(s),z=f(x,y)x=g(s),y=h(s),z=f(x,y)
dzds=zxdxds+zydyds\frac{\mathrm{d}z}{\mathrm{d}s}=\frac{\partial z}{\partial x}\frac{\mathrm{d}x}{\mathrm{d}s}+\frac{\partial z}{\partial y}\frac{\mathrm{d}y}{\mathrm{d}s}

神经网络的梯度下降计算

我们以一个结构较为简单的神经网络为例

反向传播(BackPropagation)与梯度下降(Gradient Descent)

同样要求得该模型损失函数最小时的参数值,由于神经网络模型中有多个输出,需要将各自输出求和作为总的损失函数。
L(θ)=l(θ)L(\theta)=\sum l(\theta)
求解梯度时,用w代指参数
Lw=lw\frac{\partial L}{\partial w}=\sum \frac{\partial l}{\partial w}
因此,只需要逐一求解每个输出节点的损失函数梯度


正向传递(forward pass)

对于每个参数而言,将所在的网络层结构细化
反向传播(BackPropagation)与梯度下降(Gradient Descent)
对于每一层的计算
z=w1x1+w2x2+ba=σ(z)l1=f1(a)l2=f2(a)z=w_1x_1+w_2x_2+b\\ a=\sigma(z)\\ l_1=f_1(a)\\ l_2=f_2(a)

  • zz是输入、系数及偏置(bias)的和
  • aa是将zz放入**函数a=σ(z)a=\sigma(z),**函数是人为选择,不同的函数有不同的导数
  • aa不仅作为本层神经网络的输出,也同样是下一层神经网络的输入,因此下一层神经网络与本层操作完全相同,所以f1f2f_1f_2是对于后面更多层神经网络的简易表示

因此对于每个参数的梯度所需要的最终结果,使用链式法则
lwn=zwndadzla\frac{\partial l}{\partial w_n}=\frac{\partial z}{\partial w_n}\frac{\mathrm{d} a}{\mathrm{d} z}\frac{\partial l}{\partial a}
对于链式法则中的每一项分别求解
zwn=xndadz=σ(z)\frac{\partial z}{\partial w_n}=x_n\\{}\\ \frac{\mathrm{d} a}{\mathrm{d} z}=\sigma'(z)
第一项的值取决于该层的输入(wnw_n收输入影响,偏置b该项永远为1)

第二项的值取决于选择的**函数

而最后一项则取决于后续更多层神经网络的推导


反向传递(backward pass)

为了细化上一部分未解决的部分推导,将参数所在层的后一部分网络细化
反向传播(BackPropagation)与梯度下降(Gradient Descent)
这一部分里面
z=w3a+...z=w4a+...a=σ(z)a=σ(z)z'=w_3a+...\\ z''=w_4a+...\\ a'=\sigma(z')\\ a''=\sigma(z'')
因此
la=zaazla+zaazlaza=w3za=w4az=σ(z)az=σ(z)\frac{\partial l}{\partial a}=\frac{\partial z'}{\partial a}\frac{\partial a'}{\partial z'}\frac{\partial l}{\partial a'}+\frac{\partial z''}{\partial a}\frac{\partial a''}{\partial z''}\frac{\partial l}{\partial a''}\\{}\\ \frac{\partial z'}{\partial a}=w_3\\{}\\ \frac{\partial z'}{\partial a}=w_4\\{}\\ \frac{\partial a'}{\partial z'}=\sigma'(z')\\{}\\ \frac{\partial a''}{\partial z''}=\sigma'(z'')
将已知部分化繁为简
la=F(la,la)\frac{\partial l}{\partial a}=F(\frac{\partial l}{\partial a'},\frac{\partial l}{\partial a''})
由此可见,l/an\partial l/\partial a^n的计算存在递归的性质。

因此,按照递归的方式分为以下两种情况

  • znz^n位于网络的最后一层,经过**函数后直接输出
  • znz^n没有位于网络的最后一层,通过后续计算得出

若位于神经网络的最后一层

反向传播(BackPropagation)与梯度下降(Gradient Descent)

lz=dy1dzdldy1\frac{\partial l}{\partial z'}=\frac{\mathrm{d} y_1}{\mathrm{d} z'}\frac{\mathrm{d} l}{\mathrm{d} y_1}
分解后的两项均可计算,分别取决于所选的**函数和损失函数

若并非位于神经网络的最后一层

则根据需要接下来的网络计算时的结果作为输入,递归运算。

反向传播

根据上面的推导,我们可以看出:靠前的网络层的部分取值取决于后面的结果
反向传播(BackPropagation)与梯度下降(Gradient Descent)

也就是说
lalala\frac{\partial l}{\partial a}\gets \frac{\partial l}{\partial a'}\gets \frac{\partial l}{\partial a''}

总结

最终将forward pass 和 backward pass 过程中计算出的结果进行合并
lw=laaw\frac{\partial l}{\partial w}=\frac{\partial l}{\partial a}\frac{\partial a}{\partial w}

参考资料
李宏毅机器学习(2017)