机器学习算法 —— 反向传播

一、简介

  反向传播算法,也叫BP(Backpropagation)算法,是一种在神经网络中用于根据误差更新各层连接权重的算法,其核心为梯度下降。


二、理论

 (1)梯度

  在二元函数的情形,设函数 f ( x , y ) {f(x,y)} f(x,y)在平面区域 D {D} D内具有一阶连续偏导数,则对于每一点 P 0 ( x 0 , y 0 ) ∈ D {P_0(x_0,y_0)\in{D}} P0(x0,y0)D,都可定出一个向量
f x ( x 0 , y 0 ) i + f y ( x 0 , y 0 ) j , {f_x(x_0,y_0)\mathbf{i}+f_y(x_0,y_0)\mathbf{j}}, fx(x0,y0)i+fy(x0,y0)j,这向量称为函数 f ( x , y ) {f(x,y)} f(x,y)在点 P 0 ( x 0 , y 0 ) {P_0(x_0,y_0)} P0(x0,y0)的梯度,记作 g r a d f ( x 0 , y 0 ) {\mathbf{grad}f(x_0,y_0)} gradf(x0,y0) ∇ f ( x 0 , y 0 ) {\nabla{f(x_0,y_0)}} f(x0,y0),即
g r a d f ( x 0 , y 0 ) = ∇ f ( x 0 , y 0 ) = f x ( x 0 , y 0 ) i + f y ( x 0 , y 0 ) j . {\mathbf{grad}f(x_0,y_0)=\nabla{f(x_0,y_0)}=f_x(x_0,y_0)\mathbf{i}+f_y(x_0,y_0)\mathbf{j}}. gradf(x0,y0)=f(x0,y0)=fx(x0,y0)i+fy(x0,y0)j.

  这是同济版高等数学教材中对梯度的定义。根据梯度的定义我们可以看出梯度是一个向量,在 k {k} k维空间中( k ≥ 3 {k\ge3} k3),函数某一点的梯度可以理解为在该点对其中 k − 1 {k-1} k1维求偏导所得的 k − 1 {k-1} k1个一维向量(即切线)的向量和。由此可知,函数在某点的梯度方向即为函数值增长最快的方向

 (2)梯度下降

  梯度下降(Gradient Descent)是一种常用的最优化算法,其思想是通过不断迭代,使初始解不断逼近最优解,而其核心就是梯度。
  在(1)中我们得出,函数在某点的梯度方向即为函数值增长最快的方向,所以梯度的反方向就是函数值减少最快的方向。在机器学习领域,我们常用梯度下降法优化损失函数的参数,使损失函数达到最小值,优化的依据就是梯度。
  梯度下降法的核心可用如下公式表示:
θ 1 = θ 0 − α ∇ F ( θ 0 ) {\theta_1=\theta_0-\alpha\nabla{F(\theta_0)}} θ1=θ0αF(θ0)其中 θ 0 {\theta_0} θ0为原参数, θ 1 {\theta_1} θ1为更新后的参数, ∇ F ( θ 0 ) {\nabla{F(\theta_0)}} F(θ0)为函数在 θ 0 {\theta_0} θ0处的梯度, α {\alpha} α为学习率或步长,意为参数沿梯度方向“走多远”。使用梯度下降法即不断重复这一过程,当误差小于给定阈值后停止迭代,得到近似最优解。
  不难看出,这里的 α {\alpha} α为超参数。 α {\alpha} α的取值不宜过大也不宜过小,若过大则在更新时可能跳过最优解,若过小则会导致收敛过慢。
  若待优化函数为凸函数,则使用梯度下降法总能得到全局最优解;若为非凸函数,则可能到达局部最优解。
  本文中介绍梯度下降的只是最原始的形式,还有很多种梯度下降的优化算法,如SGD、Adam等,这里不再详细介绍。

 (3)反向传播

  当我们使用神经网络近似目标函数时通常使用反向传播算法,根据输出层的输出与真实值的误差更新各层间的权重。
  假设一个单隐藏层神经网络,记 w j k i {w^i_{jk}} wjki为第 i {i} i层的第 j {j} j个神经元与第 i + 1 {i+1} i+1层的第 k {k} k个神经元间的权重,记输入矩阵为 X i {X^i} Xi,偏置矩阵为 B i {B^i} Bi,输出矩阵为 Y i {Y^i} Yi,激活后的输出矩阵为 Z i {Z^i} Zi,假设激活函数为 s i g m o i d {sigmoid} sigmoid,则
Y i = W i X i + B i , {Y^i=W^iX^i+B^i}, Yi=WiXi+Bi, Z i = s i g m o i d ( Y i ) , {Z^i=sigmoid(Y^i)}, Zi=sigmoid(Yi), X i + 1 = Z i . {X^{i+1}=Z^i}. Xi+1=Zi.  实际上,我们使用梯度下降法近似的目标函数,是关于 Z 3 {Z^3} Z3的损失函数 L ( Z 3 ) {L(Z^3)} L(Z3),而 Z 3 {Z^3} Z3又是 Y 3 {Y^3} Y3的函数, Y 3 {Y^3} Y3又是 W 3 {W^3} W3的函数,所以通过不断在梯度的反方向上更新 W {W} W,使损失函数达到最小值。
  当有多个输出神经元时,由于每一个输出神经元的值都与其上一层的所有神经元有权重连接,且这些权重有大有小,所以我们将 L ( Z 3 ) {L(Z^3)} L(Z3)的值按比例分配给其上一层的每个神经元。接下来以两个输出神经元的情况为例。
  记真实值为 R {R} R,令
L ( Z 3 ) = 1 2 ∑ ( R − Z 3 ) 2 , {L(Z^3)=\frac{1}{2}\sum(R-Z^3)^2}, L(Z3)=21(RZ3)2, w 11 2 {w^2_{11}} w112分得的权重为
l 1 2 = l 11 2 + l 12 2 = w 11 2 ∑ j = 1 n w j 1 2 ⋅ 1 2 ( r 1 − z 1 3 ) 2 + w 12 2 ∑ j = 1 n w j 1 2 ⋅ 1 2 ( r 2 − z 2 3 ) 2 , {l^2_1=l^2_{11}+l^2_{12}=\frac{w^2_{11}}{\sum^{n}_{j=1}{w^2_{j1}}}\cdot{\frac{1}{2}(r_1-z^3_1)^2}+\frac{w^2_{12}}{\sum^{n}_{j=1}{w^2_{j1}}}\cdot{\frac{1}{2}(r_2-z^3_2)^2}}, l12=l112+l122=j=1nwj12w11221(r1z13)2+j=1nwj12w12221(r2z23)2,所以当我们更新 w 11 2 {w^2_{11}} w112时,根据(2)中的公式得
w 11 2 ^ = w 11 2 − α ∂ l 1 2 ∂ w 11 2 , {\hat{w^2_{11}}=w^2_{11}-\alpha\frac{\partial{l^2_1}}{\partial{w^2_{11}}}}, w112^=w112αw112l12,其中
∂ l 1 2 ∂ w 11 2 = ∂ l 1 2 ∂ Z 2 ⋅ ∂ Z 2 ∂ Y 2 ⋅ ∂ Y 2 ∂ w 11 2 = − ( R − Z 2 ) ⋅ s i g m o i d ( Y 2 ) ⋅ ( 1 − s i g m o i d ( Y 2 ) ) ⋅ X 2 . {\frac{\partial{l^2_1}}{\partial{w^2_{11}}}=\frac{\partial{l^2_1}}{\partial{Z^2}}\cdot\frac{\partial{Z^2}}{\partial{Y^2}}\cdot\frac{\partial{Y^2}}{\partial{w^2_{11}}}=-(R-Z^2)\cdot sigmoid(Y^2)\cdot(1-sigmoid(Y^2))\cdot X^2}. w112l12=Z2l12Y2Z2w112Y2=(RZ2)sigmoid(Y2)(1sigmoid(Y2))X2.  其余各层同理。


三、总结

  总的来说,神经网络中的反向传播算法就是通过链式求导,将整体误差分摊到网络中的每个权重上,并通过梯度下降对权重进行优化。通过迭代大量的数据集,使损失函数的参数逐渐收敛至最优解,从而使网络更好地对数据进行拟合。
  当然,这种算法也有一些缺点,比如当网络深度较高时会出现梯度消失现象等,这里不再详细介绍。

你可能感兴趣的:(机器学习)