梯度下降与反向传播

梯度下降算法

基于梯度的优化是优化一个函数的最终取值。输入参数** ω \omega ω**,需要优化的函数是 J ( ω ) J(\omega) J(ω),基于梯度的优化即通过改变 ω \omega ω使得最大化或最小化 J ( ω ) J(\omega) J(ω),称 J ( ω ) J(\omega) J(ω)为目标函数。

对于一元函数 l = J ( ω ) l=J(\omega) l=J(ω),它的导数记为 J ′ ( ω ) J'(\omega) J(ω),输入 w w w发生微小变化 σ \sigma σ时,输出也发生变化,可以近似为
J ( w + σ ) ≈ J ( w ) + σ J ′ ( w ) J(w+\sigma)\approx J(w) + \sigma J'(w) J(w+σ)J(w)+σJ(w)
假设存在的 σ \sigma σ足够小,则有 J ( w − σ ∗ s i g n ( J ′ ( w ) ) ) &lt; J ( w ) J(w-\sigma *sign(J&#x27;(w)))&lt;J(w) J(wσsign(J(w)))<J(w),其中 s i g n sign sign是符号函数。当 J ′ ( w ) J&#x27;(w) J(w)小于0时,随着 w w w增加, J ( w ) J(w) J(w)减小,而当 J ′ ( w ) J&#x27;(w) J(w)大于0时,随着 w w w减小, J ( w ) J(w) J(w)才能减小。 w w w的变化方向(+或者-)与导数 J ( w ) J(w) J(w)的方向(正负)相反。

多元函数:方向导数与梯度的理解,参考博客https://www.cnblogs.com/wangguchangqing/p/10521330.html#autoid-0-0-0

方向导数

方向导数是指 z = f ( x , y ) z=f(x,y) z=f(x,y)在某一点 P P P沿着某个方向 l l l的变化率,是一个数值。记为
∂ f ∂ l = l i m ρ → 0 f ( x + Δ x , y + Δ y ) − f ( x , y ) ρ \frac {\partial f}{\partial l}={lim}_{\rho \to 0} \frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho} lf=limρ0ρf(x+Δx,y+Δy)f(x,y)
自点 P P P引射线 l l l,与 X X X正轴方向的夹角为 θ \theta θ,与函数 z = f ( x , y ) z=f(x,y) z=f(x,y)的交点 P ′ ( x + Δ x , y + Δ y ) P&#x27;(x+\Delta x,y+\Delta y) P(x+Δx,y+Δy),函数在 P 、 P ′ P、P&#x27; PP的增量为 f ( x + Δ x , y + Δ y ) − f ( x , y ) f(x+\Delta x,y+\Delta y)-f(x,y) f(x+Δx,y+Δy)f(x,y),两点之间的距离 ρ = ( Δ x ) 2 + ( Δ y ) 2 \rho = \sqrt {(\Delta x) ^2+ (\Delta y)^2} ρ=(Δx)2+(Δy)2 。若 P ′ P&#x27; P沿着 l l l趋近于 P P P,如果增量与距离比值的极限存在,称该值为函数在 P P P处的方向导数,即公式(2)。

同时,若函数在 P P P处可微,则有 f ( x + Δ x , y + Δ y ) − f ( x , y ) = ∂ f ∂ x ⋅ Δ x + ∂ f ∂ y ⋅ Δ y + o ( ρ ) f(x+\Delta x,y+\Delta y)-f(x,y)= \frac {\partial f} {\partial x}\cdot \Delta x +\frac {\partial f} {\partial y} \cdot \Delta y+o(\rho) f(x+Δx,y+Δy)f(x,y)=xfΔx+yfΔy+o(ρ)

两边同除以 ρ \rho ρ,可以得到
f ( x + Δ x , y + Δ y ) − f ( x , y ) ρ = ∂ f ∂ x ⋅ cos ⁡ θ + ∂ f ∂ y ⋅ sin ⁡ θ + o ( ρ ) ρ \frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho}= \frac {\partial f} {\partial x}\cdot\cos \theta +\frac {\partial f} {\partial y}\cdot \sin \theta + \frac {o(\rho)} {\rho} ρf(x+Δx,y+Δy)f(x,y)=xfcosθ+yfsinθ+ρo(ρ)
取极限得到
∂ f ∂ l = l i m ρ → 0 f ( x + Δ x , y + Δ y ) − f ( x , y ) ρ = f x ⋅ cos ⁡ θ + f y ⋅ sin ⁡ θ \frac {\partial f}{\partial l}={lim}_{\rho \to 0} \frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho} =f_x \cdot \cos \theta +f_y \cdot \sin \theta lf=limρ0ρf(x+Δx,y+Δy)f(x,y)=fxcosθ+fysinθ

梯度

梯度是指是这样一个向量:每个元素为函数对一元变量的偏导数,它的大小即为最大方向导数。梯度记为
∇ f = g r a d f ( x , y ) = ∂ f ∂ x ⋅ i + ∂ f ∂ y ⋅ j \nabla f = gradf(x,y)= \frac {\partial f} {\partial x}\cdot i + \frac {\partial f} {\partial y}\cdot j f=gradf(x,y)=xfi+yfj
梯度与方向导数的联系:

设向量 e = cos ⁡ θ ∗ i + sin ⁡ θ ∗ j e=\cos \theta *i +\sin \theta*j e=cosθi+sinθj l l l同方向,根据方向导数的计算公式,有
∂ f ∂ l = ∂ f ∂ x cos ⁡ θ + ∂ f ∂ y sin ⁡ θ = [ ∂ f ∂ x ∂ f ∂ y ] [ cos ⁡ θ sin ⁡ θ ] = ∇ f ⋅ e = ∣ ∣ ∇ f ∣ ∣ cos ⁡ &lt; ∇ f , e &gt; \frac {\partial f}{\partial l} =\frac {\partial f} {\partial x}\cos \theta +\frac {\partial f} {\partial y}\sin \theta = \begin{bmatrix} \frac {\partial f} {\partial x} &amp; \frac {\partial f} {\partial y}\end{bmatrix} \begin{bmatrix} \cos \theta \\ \sin \theta \end{bmatrix} = \nabla f \cdot e =||\nabla f|| \cos&lt;\nabla f,e&gt; lf=xfcosθ+yfsinθ=[xfyf][cosθsinθ]=fe=fcos<f,e>
其中 cos ⁡ &lt; ∇ f , e &gt; \cos&lt;\nabla f,e&gt; cos<f,e>表示梯度 ∇ f \nabla f f与向量的夹角, ∣ ∣ ∇ f ∣ ∣ ||\nabla f|| f表示梯度的大小。可以看到,当方向向量与梯度同方向时,方向导数达到最大值,且最大值等于梯度的大小。

最大方向导数的等于梯度的模, ∣ ∣ ∇ f ∣ ∣ = f x 2 + f y 2 ||\nabla f||=\sqrt{f_x^2+f_y^2} f=fx2+fy2 ,而梯度的方向由梯度向量与 X X X轴的角度给出, α ( x , y ) = arctan ⁡ f y f x \alpha(x,y)=\arctan \frac {f_y}{f_x} α(x,y)=arctanfxfy

由上述可得,函数在某点沿着梯度的方向增长最快,逆梯度方向减小最快。因此,要想求得函数的极小值(或最小值),可以通过沿逆梯度方向变化,不断下降找到极小值。

e g : eg: eg:

函数 J ( θ ) = 2 − 3 θ 1 + 4 θ 2 − 5 θ 3 J(\theta) = 2-3\theta_1+4\theta_2 -5\theta_3 J(θ)=23θ1+4θ25θ3,则梯度为
∇ J ( θ ) = [ ∂ J ∂ θ 1 ∂ J ∂ θ 2 ∂ J ∂ θ 3 ] = [ − 3 4 − 5 ] \nabla J(\theta)=\begin{bmatrix} \frac {\partial J} {\partial \theta_1} &amp; \frac {\partial J} {\partial \theta_2} &amp; \frac {\partial J} {\partial \theta_3}\end{bmatrix} =\begin{bmatrix}-3 &amp;4 &amp; -5 \end{bmatrix} J(θ)=[θ1Jθ2Jθ3J]=[345]

梯度下降算法步骤

算法步骤:

给定目标函数 f ( x ) f(x) f(x)和初始点位置 x 0 x_0 x0

  1. 计算梯度,取反表示沿逆梯度方向。 Δ x t = − ∇ f ( x t ) \Delta x_t=-\nabla f(x_t) Δxt=f(xt)
  2. 计算下一处的值:每次参数移动的幅度是 σ \sigma σ,称为学习率。更新后的参数 x t + 1 = x t + σ ⋅ Δ x t x_{t+1}=x_t+\sigma \cdot\Delta x_t xt+1=xt+σΔxt
  3. 重复1、2,直至 ∣ Δ x t ∣ &lt; ϵ |\Delta x_t| &lt;\epsilon Δxt<ϵ ,其中 ϵ \epsilon ϵ是预先设置一个很小的值,满足条件时结束。

e g : eg: eg:

函数 J ( w ) = w 2 J(w)=w^2 J(w)=w2,它的梯度计算公式为 ∇ = 2 ⋅ w \nabla = 2\cdot w =2w初始位置 w = 10 w=10 w=10,使用梯度下降计算极小值。其中学习率0.2。

计算过程如下

轮数当前参数值 w w w梯度取反 Δ w t = − 2 w \Delta w_t=-2w Δwt=2w更新后的参数值 w t + σ ⋅ Δ w t w_t+\sigma \cdot \Delta w_t wt+σΔwt
110-206.0
26.0-12.03.6
33.6-7.22.16
42.16-4.321.296
51.296-2.5920.7776
60.7776-1.55520.466560
70.466560-0.9331200.279936
80.279936-0.5598720.167962
90.167962-0.3359230.100777
100.100777-0.2015540.060466

几种梯度下降算法

批梯度下降 batch gradient descent (BGD)

在每次参数更新时使用全部的样本数据, θ i = θ i − α ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiαj=0m(hθ(x0(j),x1(j),...xn(j))yj)xi(j),优点是充分利用了全部数据,保证在足够多的的迭代后可以达到最优,缺点是数据量过大时迭代十分缓慢,收敛速度很慢。

随机梯度下降 stochastic gradient descent (SGD)

与BGD不同在于,每次使用一个样本用于更新参数。 θ i = θ i − α ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiα(hθ(x0(j),x1(j),...xn(j))yj)xi(j)。优点是一次训练一个样本速度快,但一个样本决定梯度方向, 可能导致解不是最优,而且每次样本方向变化大,不容易很快收敛到最优解或局部最优解。

小批量梯度算法 Mini-batch gradient descent

每次使用一部分样本用于更新参数,即batch_size。对一个总样本数据m的数据集,每次使用x个样本,更新公式为 θ i = θ i − α ∑ j = t t + x − 1 ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiαj=tt+x1(hθ(x0(j),x1(j),...xn(j))yj)xi(j)

batch_size=1时,即为SGD的情况,batch_size=m时,即为BGD的情况。

梯度下降的缺陷

图片出自《深度学习与计算机视觉、算法原理、框架与代码实现》

1562770424938.png

函数的特殊点。从梯度下降的步骤来看,根据梯度的方向判断参数移动的方向,但是当 J ′ ( w ) = 0 J&#x27;(w)=0 J(w)=0的时候,就无法判断往哪边移动。称 J ′ ( w ) = 0 J&#x27;(w)=0 J(w)=0的点为驻点或者临界点。

函数会出现存在梯度为0的临界点,但该点不是最小点也不是最大点,这种临界点称为鞍点(Saddle Point)。

函数在某一段区域,梯度很小,且范围很大,梯度值小于更新条件,此时算法可能会停止迭代,这种区域称为停滞区。

极小值的存在,也会使算法停止迭代,从而得到不准确的结果,陷入局部最优解的情况。

因此,梯度下降算法的缺陷在于鞍点、停滞区、极小值的存在。

梯度下降算法通常适用于凸函数的情况。

梯度下降算法的改进

冲量momentum

算法步骤:

给定目标函数 f ( x ) f(x) f(x)和初始点位置 x 0 x_0 x0

  1. 计算梯度,取反表示沿逆梯度方向。 Δ x t = − ∇ f ( x t ) \Delta x_t=-\nabla f(x_t) Δxt=f(xt)
  2. 计算下一处的值:设置一个冲量项, V t + 1 = γ v t + η Δ x t V_{t+1}=\gamma v_t + \eta \Delta x_t Vt+1=γvt+ηΔxt,更新后的参数为 x t + 1 = x t + v t + 1 x_{t+1}=x_t+v_{t+1} xt+1=xt+vt+1
  3. 重复1、2。

与原始梯度下降算法不一样的是,更新参数时,考虑到一个冲量,且冲量每次迭代时要乘以衰减数。在冲量项的影响下,算法迭代就相当于带上了“惯性”,前次迭代位置前进的方向可以影响到下一次迭代。这样当算法经过鞍点或是停滞区时,就不至于停下来做过于缓慢的迭代,而经过并不是很“深”的极值时,就可以借助冲量项带来的“惯性”冲出极值所的“坑”

算法停止的的标准也不再是梯度小于一个阈值。停止算法的标准可以是冲量小于某个值,梯度小于某个值,或是用户给定一个次数就停止。

Nesterov Accelerated Gradient Descent (NAG方法)

与加入冲量的改进唯一不同是,计算梯度的位置,不是当前位置 x t x_t xt,而是沿当前冲量前进一步的位置。

给定目标函数 f ( x ) f(x) f(x)和初始点位置 x 0 x_0 x0,以及初始动量 v 0 v_0 v0

  1. 计算梯度,取反表示沿逆梯度方向。 Δ x t = − ∇ f ( x t + γ v t ) \Delta x_t=-\nabla f(x_t+\gamma v_t) Δxt=f(xt+γvt)
  2. 计算下一处的值:设置一个冲量项, V t + 1 = γ v t + η Δ x t V_{t+1}=\gamma v_t + \eta \Delta x_t Vt+1=γvt+ηΔxt,更新后的参数为 x t + 1 = x t + v t + 1 x_{t+1}=x_t+v_{t+1} xt+1=xt+vt+1
  3. 重复1、2。

1562773584951.png

反向传播算法( BackPropagation算法 BP)

此部分参考了一篇博客,https://www.cnblogs.com/charlotte77/p/5629865.html,
写的超级详细,跟着走了一遍过程,很容易理解反向传播的计算过程。

此外,参考《机器学习》的BP算法步骤,总结很简练,但没有具体数据去实现,看着很抽象。

算法的主要思想:

  1. 数据集输入神经网络,经过隐藏层,最终达到输出层。该过程是前向传播过程。
  2. 计算输出结果与真实结果存在误差,因此计算出误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层。
  3. 在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛

e g : eg: eg: 以下图为例,使用BP算法更新各层参数。

1562835182331.png

  1. 输入 ( 0.05 , 0.1 ) (0.05,0.1) (0.050.1) 计算各级的输出:

    隐藏层输入 h 1 i n = w 11 1 ∗ x 1 + w 21 1 ∗ x 2 + b 11 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.35 = 0.3775 h1_{in}=w_{11}^1*x_1 +w_{21}^1*x_2+b_{11}^1=0.15*0.05+0.2*0.1+0.35=0.3775 h1in=w111x1+w211x2+b111=0.150.05+0.20.1+0.35=0.3775

    ​ 输入 h 2 i n = w 12 1 ∗ x 1 + w 22 1 ∗ x 2 + b 12 1 = 0.25 ∗ 0.05 + 0.3 ∗ 0.1 + 0.35 = 0.3925 h2_{in}=w_{12}^1*x_1 +w_{22}^1*x_2+b_{12}^1=0.25*0.05+0.3*0.1+0.35=0.3925 h2in=w121x1+w221x2+b121=0.250.05+0.30.1+0.35=0.3925

    隐藏层输出: h 1 o u t = s i g m o i d ( h 1 i n ) = 0.59326999211 h1_{out}=sigmoid(h1_{in})=0.59326999211 h1out=sigmoid(h1in)=0.59326999211 h 2 o u t = s i g m o i d ( h 2 i n ) = 0.596884378259767 h2_{out}=sigmoid(h2_{in})=0.596884378259767 h2out=sigmoid(h2in)=0.596884378259767

    隐藏层到输出层:

    神经元 y 1 y_1 y1的输入输出是[1.10590596705977 0.7513650695523157]

    神经元 y 2 y_2 y2的输入输出是[1.2249214040964653 0.7729284653214625]

    因此,前向传播的输出结果是 [ 0.7513650695523157 0.7729284653214625 ] \begin{bmatrix} 0.7513650695523157 &amp; 0.7729284653214625 \end{bmatrix} [0.75136506955231570.7729284653214625] 而真实值是 [ 0.01 0.99 ] \begin{bmatrix} 0.01 &amp; 0.99 \end{bmatrix} [0.010.99]

  2. 计算前向传播的结果与真实值的误差 ,使用均方误差

    E k = 1 2 ∑ i ( y p r e d i c t − y t r u t h ) 2 E_k = \frac 1 2 \sum_i (y_{predict}-y_{truth}) ^2 Ek=21i(ypredictytruth)2

    根据公式,可以算出总误差值 E k = 1 2 ( ( 0.7513650695523157 − 0.01 ) 2 + ( 0.7729284653214625 − 0.99 ) 2 ) = 0.2983711087600027 E_k = \frac 1 2 ((0.7513650695523157-0.01)^2+(0.7729284653214625-0.99)^2)=0.2983711087600027 Ek=21((0.75136506955231570.01)2+(0.77292846532146250.99)2)=0.2983711087600027

  3. 反向传播,更新参数。

    1562838188147.png

    误差的公式
    M S E = 1 2 [ ( y 1 o u t − y 1 t r u t h ) 2 + ( y 2 o u t − y 2 t r u t h ) 2 ] 其 中 y 1 t r u t h 、 y 2 t r u t h 都 是 常 量 MSE = \frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] 其中y1_{truth}、y2_{truth}都是常量 MSE=21[(y1outy1truth)2+(y2outy2truth)2]y1truthy2truth

    误差公式中只有输出值是变量,每个输出值又是通过各个路径的参数“复合”而来,看成一个复合函数。以输出y1为例: y 1 o u t = s i g m o i d ( y 1 i n ) = s i g m o i d ( h 1 o u t ∗ w 5 + h 2 o u t ∗ w 6 + b 21 ) y1_{out} = sigmoid(y1_{in})=sigmoid(h1_{out}*w_5+h2_{out}*w_6+b21) y1out=sigmoid(y1in)=sigmoid(h1outw5+h2outw6+b21),而 h 1 o u t 、 h 2 o u t h1_{out}、h2_{out} h1outh2out等又可以推向输出层。 h 1 o u t = s i g m o i d ( h 1 i n ) = s i g m o i d ( x 1 ∗ w 1 + x 2 ∗ w 2 + b 11 ) h1_{out}=sigmoid(h1_{in})=sigmoid(x_1*w1+x2*w2+b_{11}) h1out=sigmoid(h1in)=sigmoid(x1w1+x2w2+b11)


    y 1 o u t = s i g m o i d ( y 1 i n ) = s i g m o i d ( h 1 o u t ∗ w 5 + h 2 o u t ∗ w 6 + b 21 ) = s i g m o i d ( s i g m o i d ( h 1 i n ) ∗ w 5 + s i g m o i d ( h 2 i n ) ∗ w 6 + b 21 ) = s i g m o i d ( s i g m o i d ( x 1 ∗ w 1 + x 2 ∗ w 2 + b 11 ) ∗ w 5 + s i g m o i d ( x 1 ∗ w 3 + x 2 ∗ w 4 + b 12 ) + b 21 ) y1_{out} = sigmoid(y1_{in})=sigmoid(h1_{out}*w_5+h2_{out}*w_6+b_{21})\\=sigmoid(sigmoid(h1_{in})*w5+sigmoid(h2_{in})*w_6+b_{21})\\ =sigmoid(sigmoid(x_1*w1+x2*w2+b_{11})*w_5+sigmoid(x_1*w_3+x_2*w_4+b_{12})+b_{21}) y1out=sigmoid(y1in)=sigmoid(h1outw5+h2outw6+b21)=sigmoid(sigmoid(h1in)w5+sigmoid(h2in)w6+b21)=sigmoid(sigmoid(x1w1+x2w2+b11)w5+sigmoid(x1w3+x2w4+b12)+b21)

    计算误差与某个参数 w w w的偏导,使用链式法则求偏导。

    从输出层到隐藏层的参数

    例如计算 w 5 w_5 w5对最终损失的影响,偏导公式如下。没有考虑 y 2 o u t y2_{out} y2out,因为 y 2 y2 y2的传播路径与 w 5 w5 w5无关。
    ∂ ∂ w 5 M S E = ∂ M S E ∂ y 1 o u t ∗ ∂ y 1 o u t ∂ y 1 i n ∗ ∂ y 1 i n ∂ w 5 \frac {\partial} {\partial w_5}MSE=\frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}*\frac {\partial y1_{in}} {\partial w_5} w5MSE=y1outMSEy1iny1outw5y1in

    依次计算该公式的各个部分的值。

    M S E MSE MSE y 1 o u t y1_{out} y1out的偏导,
    ∂ M S E ∂ y 1 o u t = ∂ 1 2 [ ( y 1 o u t − y 1 t r u t h ) 2 + ( y 2 o u t − y 2 t r u t h ) 2 ] ∂ y 1 o u t = y 1 o u t − y 1 t r u t h = 0.74136507 \frac {\partial MSE} {\partial y1_{out}}=\frac {\partial\frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] } {\partial y1_{out}}=y1_{out}-y1_{truth}=0.74136507 y1outMSE=y1out21[(y1outy1truth)2+(y2outy2truth)2]=y1outy1truth=0.74136507

    y 1 o u t y1_{out} y1out y 1 i n y1_{in} y1in的偏导,sigmoid函数的导数公式是 f ′ ( x ) = f ( x ) ∗ ( 1 − f ( x ) ) f&#x27;(x)=f(x)*(1-f(x)) f(x)=f(x)(1f(x))

    根据计算式 y 1 o u t = s i g m o i d ( y 1 i n ) y1_{out}=sigmoid(y1_{in}) y1out=sigmoid(y1in)可以算出
    ∂ y 1 o u t ∂ y 1 i n = y 1 o u t ∗ ( 1 − y 1 o u t ) = 0.75136507 ∗ ( 1 − 0.75136507 ) = 0.1868156016 \frac {\partial y1_{out}} {\partial y1_{in}}=y1_{out}*(1-y1_{out})=0.75136507*(1-0.75136507)=0.1868156016 y1iny1out=y1out(1y1out)=0.75136507(10.75136507)=0.1868156016
    y 1 i n y1_{in} y1in w 5 w_5 w5的偏导,计算式 y 1 i n = h 1 o u t ∗ w 5 + h 2 o u t ∗ w 6 + b 21 y1_{in}=h1_{out}*w_5+h2_{out}*w_6+b_{21} y1in=h1outw5+h2outw6+b21,可以算出
    ∂ y 1 i n ∂ w 5 = h 1 o u t = 0.59326999211 \frac {\partial y1_{in}} {\partial w_5}=h1_{out}=0.59326999211 w5y1in=h1out=0.59326999211
    最后将三者乘起来,得到
    ∂ ∂ w 5 M S E = 0.74136507 ∗ 0.1868156016 ∗ 0.59326999211 = 0.08216704052233154 \frac {\partial} {\partial w_5}MSE =0.74136507*0.1868156016*0.59326999211=0.08216704052233154 w5MSE=0.741365070.18681560160.59326999211=0.08216704052233154
    更新 w 5 w_5 w5的值, w 5 = w 5 − σ ∗ ∂ ∂ w 5 M S E = 0.4 − 0.5 ∗ 0.08216704052233154 = 0.3589164797388342 w_5=w_5 - \sigma * \frac {\partial} {\partial w_5}MSE=0.4-0.5*0.08216704052233154=0.3589164797388342 w5=w5σw5MSE=0.40.50.08216704052233154=0.3589164797388342

    其中 σ \sigma σ是学习率,更新公式和梯度下降算法一样。

    总误差对 w 5 w_5 w5的偏导: ( y 1 o u t − y 1 t r u t h ) ∗ [ y 1 o u t ∗ ( 1 − y 1 o u t ) ] ∗ h 1 o u t (y1_{out}-y1_{truth})*[y1_{out}*(1-y1_{out})]*h1_{out} (y1outy1truth)[y1out(1y1out)]h1out

    同理可得对 w 6 、 w 7 、 w 8 w_6、w_7、w_8 w6w7w8的偏导。
    ∂ ∂ w 6 M S E = ( y 1 o u t − y 1 t r u t h ) ∗ [ y 1 o u t ∗ ( 1 − y 1 o u t ) ] ∗ h 2 o u t = 0.0826676278049868 ∂ ∂ w 7 M S E = ( y 2 o u t − y 2 t r u t h ) ∗ [ y 2 o u t ∗ ( 1 − y 2 o u t ) ] ∗ h 1 o u t = − 0.02260254047747507 ∂ ∂ w 8 M S E = ( y 2 o u t − y 2 t r u t h ) ∗ [ y 2 o u t ∗ ( 1 − y 2 o u t ) ] ∗ h 2 o u t = − 0.022740242215978222 \frac {\partial} {\partial w_6}MSE =(y1_{out}-y1_{truth})*[y1_{out}*(1-y1_{out})]*h2_{out}=0.0826676278049868\\ \frac {\partial} {\partial w_7}MSE =(y2_{out}-y2_{truth})*[y2_{out}*(1-y2_{out})]*h1_{out}=-0.02260254047747507\\ \frac {\partial} {\partial w_8}MSE =(y2_{out}-y2_{truth})*[y2_{out}*(1-y2_{out})]*h2_{out}=-0.022740242215978222 w6MSE=(y1outy1truth)[y1out(1y1out)]h2out=0.0826676278049868w7MSE=(y2outy2truth)[y2out(1y2out)]h1out=0.02260254047747507w8MSE=(y2outy2truth)[y2out(1y2out)]h2out=0.022740242215978222
    更新后的参数
    w 6 = w 6 − σ ∗ ∂ ∂ w 6 M S E = 0.4086661860975066 w 7 = w 7 − σ ∗ ∂ ∂ w 7 M S E = 0.5113012702387375 w_6 = w_6 - \sigma * \frac {\partial} {\partial w_6}MSE=0.4086661860975066\\ w_7 = w_7 - \sigma * \frac {\partial} {\partial w_7}MSE=0.5113012702387375 w6=w6σw6MSE=0.4086661860975066w7=w7σw7MSE=0.5113012702387375

偏置更新: y 1 o u t = s i g m o i d ( y 1 i n ) y1_{out}=sigmoid(y1_{in}) y1out=sigmoid(y1in) y 1 i n y1_{in} y1in中的偏置项只有一项,偏导是1。因此复合后的结果是 ∂ ∂ b 21 M S E = y 1 o u t ∗ ( y 1 o u t − y 1 o u t ) \frac {\partial} {\partial b_{21}}MSE =y1_{out}*(y1_{out}-y1_{out}) b21MSE=y1out(y1outy1out)
b 21 = b 21 − σ ∗ [ y 1 o u t ∗ ( 1 − y 1 o u t ) ] = 0.6 − 0.5 ∗ 0.1868156016 = 0.5065921992 b 22 = b 22 − σ ∗ [ y 2 o u t ∗ ( 1 − y 2 o u t ) ] = 0.6 − 0.5 ∗ 0.1755100528 = 0.5122449736 b_{21}=b_{21}- \sigma * [y1_{out}*(1-y1_{out})] = 0.6-0.5*0.1868156016=0.5065921992\\ b_{22}=b_{22}- \sigma * [y2_{out}*(1-y2_{out})] = 0.6-0.5*0.1755100528=0.5122449736 b21=b21σ[y1out(1y1out)]=0.60.50.1868156016=0.5065921992b22=b22σ[y2out(1y2out)]=0.60.50.1755100528=0.5122449736

从隐藏层到输入层的参数更新

w 1 w_1 w1为例,但是与上面不同的是, w 1 w_1 w1会影响到全部的输出,因为它通过 h 1 、 w 5 、 w 7 h_1、w_5、w_7 h1w5w7传播到两个输出y,因此会有两个误差。(这段公式老是报错。。。只好贴图了)
image.png
1562858618013.png

如上图绿色箭头,每个神经元被分为两块,左边表示输入in,右边表示输出out,绿色表示反向传播的路径,截止到w1,可以看到,损失对w1的偏导,分为两条路径,但两条路径有部分是共用,即 h 1 o u t h1_{out} h1out反向传播到输入层的部分。

公式(19)的计算过程如下,可以发现部分运算值已经在上面的w5到w8部分更新过一次。
∂ M S E ∂ y 1 o u t ∗ ∂ y 1 o u t ∂ y 1 i n = [ ∂ 1 2 [ ( y 1 o u t − y 1 t r u t h ) 2 + ( y 2 o u t − y 2 t r u t h ) 2 ] ∂ y 1 o u t ] [ y 1 o u t ∗ ( 1 − y 1 o u t ) ] = 0.74136507 ∗ [ 0.75136507 ∗ ( 1 − 0.75136507 ) ] = 0.13849856154533652 \frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}= [\frac {\partial\frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] } {\partial y1_{out}}] [y1_{out}*(1-y1_{out})]\\=0.74136507*[0.75136507*(1-0.75136507)] =0.13849856154533652 y1outMSEy1iny1out=[y1out21[(y1outy1truth)2+(y2outy2truth)2]][y1out(1y1out)]=0.74136507[0.75136507(10.75136507)]=0.13849856154533652

∂ y 1 i n ∂ h 1 o u t = w 5 = 0.4 , 因 为 y 1 i n 是 线 性 叠 加 而 来 , 与 h 1 有 关 的 边 只 有 w 5 \frac {\partial y1_{in}} {\partial h1_{out}}=w_5=0.4,因为y1_{in}是线性叠加而来,与h1有关的边只有w_5 h1outy1in=w5=0.4y1in线h1w5
同理可以算出
∂ M S E ∂ y 2 o u t ∗ ∂ y 2 o u t ∂ y 2 i n = ( y 2 o u t − y 2 t r u t h ) ∗ ( y 2 o u t ∗ ( 1 − y 2 o u t ) ) = − 0.038098236516556236 \frac {\partial MSE} {\partial y2_{out}}*\frac {\partial y2_{out}} {\partial y2_{in}}= (y2_{out}-y2_{truth})*(y2_{out}*(1-y2_{out}))=-0.038098236516556236 y2outMSEy2iny2out=(y2outy2truth)(y2out(1y2out))=0.038098236516556236

∂ y 2 i n ∂ h 1 o u t = w 7 = 0.5 , 因 为 y 2 i n 是 线 性 叠 加 而 来 , 与 h 1 有 关 的 边 只 有 w 7 \frac {\partial y2_{in}} {\partial h1_{out}}=w_7=0.5,因为y2_{in}是线性叠加而来,与h1有关的边只有w_7 h1outy2in=w7=0.5y2in线h1w7
从而,公式(19)的括号里的值,计算结果是
0.13849856154533652 ∗ 0.4 − 0.038098236516556236 ∗ 0.5 = 0.03635030635985649 0.13849856154533652*0.4-0.038098236516556236*0.5=0.03635030635985649 0.138498561545336520.40.0380982365165562360.5=0.03635030635985649
计算 h 1 o u t h1_{out} h1out w 1 w_1 w1的偏导。从 h 1 o u t h1_{out} h1out h 1 i n h1_{in} h1in,是一个sigmoid函数,而 h 1 i n h1_{in} h1in到输入是线性叠加,与 w 1 w_1 w1有关的项是 w 1 ∗ x 1 w1*x1 w1x1,因此 h 1 i n h1_{in} h1in对于 w 1 w_1 w1的偏导是 x 1 x_1 x1
∂ h 1 o u t ∂ h 1 i n ∗ ∂ h 1 i n ∂ w 1 = h 1 o u t ∗ ( 1 − h 1 o u t ) ∗ x 1 = 0.012065035428616262 \frac {\partial h1_{out}} {\partial h1_{in}}*\frac {\partial h1_{in}} {\partial w_{1}}=h1_{out}*(1-h1_{out})*x_1=0.012065035428616262 h1inh1outw1h1in=h1out(1h1out)x1=0.012065035428616262
综上, ∂ ∂ w 1 M S E = 0.012065035428616262 ∗ 0.03635030635985649 = 0.0004385677340727236 \frac {\partial} {\partial w_1}MSE=0.012065035428616262*0.03635030635985649=0.0004385677340727236 w1MSE=0.0120650354286162620.03635030635985649=0.0004385677340727236

更新 w 1 w_1 w1的值, w 1 = w 1 − σ ∗ ∂ ∂ w 1 M S E = 0.14978071613296362 w_1=w_1 - \sigma*\frac {\partial} {\partial w_1}MSE=0.14978071613296362 w1=w1σw1MSE=0.14978071613296362

同理,计算对 w 2 w_2 w2的偏导。可以看到与计算 w 1 w_1 w1不同的传播路径在于隐藏层到输入层是连接到 x 2 x_2 x2这个神经元,因此

∂ ∂ w 2 M S E = h 1 o u t ∗ ( 1 − h 1 o u t ) ∗ x 2 ∗ 0.03635030635985649 = 0.0008771354681454472 \frac {\partial} {\partial w_2}MSE=h1_{out}*(1-h1_{out})*x_2*0.03635030635985649=0.0008771354681454472 w2MSE=h1out(1h1out)x20.03635030635985649=0.0008771354681454472

更新后w2的值是 w 2 = 0.1995614322659273 w_2=0.1995614322659273 w2=0.1995614322659273

同理计算w3和w4
∂ ∂ w 3 M S E = ( ∂ M S E ∂ y 1 o u t ∗ ∂ y 1 o u t ∂ y 1 i n ∗ ∂ y 1 i n ∂ h 2 o u t + ∂ M S E ∂ y 2 o u t ∗ ∂ y 2 o u t ∂ y 2 i n ∗ ∂ y 2 i n ∂ h 2 o u t ) ∗ ∂ h 2 o u t ∂ h 2 i n ∗ ∂ h 2 i n ∂ w 3 = [ ( y 1 o u t − y 1 t r u t h ) ∗ ( y 1 o u t ∗ ( 1 − y 1 o u t ) ) ∗ w 6 + ( y 2 o u t − y 2 t r u t h ) ∗ ( y 2 o u t ∗ ( 1 − y 2 o u t ) ) ∗ w 8 ] ∗ ( h 2 o u t ∗ ( 1 − h 2 o u t ) ) ∗ x 1 = 0.0004977127352608601 \frac {\partial} {\partial w_3}MSE=(\frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}*\frac {\partial y1_{in}} {\partial h2_{out}}+ \frac {\partial MSE} {\partial y2_{out}}*\frac {\partial y2_{out}} {\partial y2_{in}}*\frac {\partial y2_{in}} {\partial h2_{out}})*\frac {\partial h2_{out}} {\partial h2_{in}}*\frac {\partial h2_{in}} {\partial w_3}\\ =[(y1_{out}-y1_{truth})*(y1_{out}*(1-y1_{out}))*w_6+(y2_{out}-y2_{truth})*(y2_{out}*(1-y2_{out}))*w8]*\\(h2_{out}*(1-h_2{out}))*x1=0.0004977127352608601 w3MSE=(y1outMSEy1iny1outh2outy1in+y2outMSEy2iny2outh2outy2in)h2inh2outw3h2in=[(y1outy1truth)(y1out(1y1out))w6+(y2outy2truth)(y2out(1y2out))w8](h2out(1h2out))x1=0.0004977127352608601

更新后 w 3 = 0.24975114363236958 w_3=0.24975114363236958 w3=0.24975114363236958

w 4 与 w 3 w4与w3 w4w3也只有隐藏层反向到输出的位置不同,对 w 4 的 偏 导 为 0.0009954254705217202 w_4的偏导为0.0009954254705217202 w40.0009954254705217202,更新后 w 4 = 0.29950228726473915 w_4=0.29950228726473915 w4=0.29950228726473915

b 11 = 0.34998903580664814 b 12 = 0.3450228726473914 b_{11}= 0.34998903580664814\\ b_{12}=0.3450228726473914 b11=0.34998903580664814b12=0.3450228726473914

全部更新一轮后的输出结果为 [ 0.7237123710461725 0.7595051820170899 ] \begin{bmatrix} 0.7237123710461725 &amp; 0.7595051820170899 \end{bmatrix} [0.72371237104617250.7595051820170899],损失由0.29837110876000270变降低到0.2812566048506621

总结:

这部分内容,在书上都放在了神经网络的优化方法部分。神经网络的训练实际上就是通过不断的训练,通过某种算法更新网络各个层级的权重参数,从而使损失函数降低。
梯度下降是通过函数的梯度性质来求解函数最小值,当然优缺点也很明显。除了梯度下降,还有牛顿-拉普森法、Adam法等很多其他优化算法。
而反向传播算法,是针对神经网络逆向优化所有参数,利用了梯度下降计算,达到一个全局最优的解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值