深度学习训练过程中到底学的是什么?

  深度学习技术应用在语音识别、计算机视觉领域近几年突破性的进展,但是深度学习的可解释性弱,无法有效的进行理论推导。例如:困惑我这样的深度学习小白疑问:深度学习到底学习的是什么?如何进行学习?如何进行迭代进行最优学习的等等问题?本篇博文只是个人浅显的理解,与参考网上资料的一篇个人总结(大神请绕到),如有错误,还请批评指正。

深度学习到底学习的是什么?

  相信大家做图像处理方面的都知道卷积运算,卷积核参数在经典计算机视觉中是人手工进行设定。例如:滤波的高斯核函数、提取图像梯度值的Sobel核函数等等。以Sobel梯度X方向提取核函数 W k e r n e l W_{kernel} Wkernel为例:

W k e r n e l = [ w 00 w 01 w 02 w 10 w 11 w 12 w 20 w 21 w 22 ] = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] W_{kernel}= \left[ \begin{matrix} w_{00} & w_{01} & w_{02} \\ w_{10} & w_{11} & w_{12} \\ w_{20} & w_{21} & w_{22} \end{matrix} \right] = \left[ \begin{matrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{matrix} \right] Wkernel=w00w10w20w01w11w21w02w12w22=121000+1+2+1

  手工设计 W k e r n e l W_{kernel} Wkernel核函数里面的参数是固定值,深度学习要学习的就是这些 W k e r n e l W_{kernel} Wkernel里面的参数值;不同的 W k e r n e l W_{kernel} Wkernel对应着不同的信息提取,通过非线性组合来获取复杂的图像信息描述。简言之:卷积神经网络会有不同的卷积核对图像进行卷积,那么学习的内容就是这些卷积核参数

学习卷积核参数,总是要有个标准来判断卷积核参数学的到底好不好?

  假设第一次学习后,图像进行卷积运算后的结果,与标准的期望输出图像来计算偏离误差,计算出来的误差作为惩罚系数对卷积核参数进行修改,以此来不断的降低误差系数,最终得到期望的输出图像。上述的这个过程就会产生出:学习率损失函数两个深度学习中的重要设置因素。

我们先放出以卷积神经网络的示例图来简单描述一下整个过程:

按照上图示例,整个学习过程步骤如下

  1 初始化卷积核系数 w i w_i wi与偏置项 b i b_i bi,进行卷积运算、激活函数、池化运算;

  2 得出输出值,然后与期望输出计算偏离误差;

  3 通过计算出误差来计算每一层卷积核系数 w i w_i wi的偏导数、偏置项 b i b_i bi偏导数,进行对卷积核系数更新 w i + w^{+}_i wi+、偏置项更新 b i + b^{+}_i bi+

  4 重复上述过程,直至计算误差低于一个指定值;

可能说到这里,还是会有些疑惑,下面就以一个简单的例子来介绍一下整个深度学习的过程。

如何学习:前向反向传播过程详解

  多个神经元组成网络才能够拟合复杂变化的情况,神经网络主要分为三个层次:输入层、隐藏层、输出层。隐藏层是神经网络的关键(想一下如果隐藏层是固定的卷积核,是否就是早期的计算机视觉解决方案)。如果隐藏层大于1层,那么神经网络至少3层,就是现在流行的深度学习。一句话解释隐藏层的功能:对输入的向量进行特征提取与坐标变换来获得理想的输出。就是对特征向量平移、旋转、伸缩、扭曲等,来逼近期望的输出。推荐一个网站进行简单操作体验:传送门

  下面通过以BP(Back Propagation)神经网络为基础进行介绍网络中卷积核参数是如何学习出来的。

老铁,enjoying公式的海洋里遨游吧!

参数初始化:

输入: i 1 i_1 i1=0.1, i 2 i_2 i2=0.2

期望输出: O 1 O_1 O1=0.01, O 2 O_2 O2=0.99

权重系数: w 1 w_1 w1=0.1, w 2 w_2 w2=0.2, w 3 w_3 w3=0.3, w 4 w_4 w4=0.4, w 5 w_5 w5=0.5, w 6 w_6 w6=0.6, w 7 w_7 w7=0.7, w 8 w_8 w8=0.8

偏置: b 1 b_1 b1=0.55, b 2 b_2 b2=0.56, b 3 b_3 b3=0.66, b 4 b_4 b4=0.67

输入到输出之间的激活函数为Sigmoid函数:

y s i g m o i d = 1 e − x + 1 y_{sigmoid}=\frac{1}{e^{-x}+1} ysigmoid=ex+11

附:在此求出 y s i g m o i d y_{sigmoid} ysigmoid的导数:

d y s i g m o i d d x = y s i g m o i d ( 1 − y s i g m o i d ) \frac{dy_{sigmoid}}{dx}=y_{sigmoid}(1-y_{sigmoid}) dxdysigmoid=ysigmoid(1ysigmoid)

下面就要进行公式推导,老铁,Are you ready?

前向传播网络计算过程:

S t e p 1 Step1 Step1: 计算隐层神经元 i n h 1 in_{h1} inh1的加权和:

i n h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 = 0.1 ∗ 0.1 + 0.2 ∗ 0.2 + 0.55 = 0.6 in_{h1}=w_1*i_1+w_2*i_2+b_1=0.1*0.1+0.2*0.2+0.55=0.6 inh1=w1i1+w2i2+b1=0.10.1+0.20.2+0.55=0.6

S t e p 2 Step2 Step2: 计算神经元 i n h 1 in_{h1} inh1经过激活函数Sigmoid输出 o u t h 1 out_{h1} outh1:

o u t h 1 = 1 e − i n h 1 + 1 = 1 e − 0.6 + 1 = 0.6456563062 out_{h1}=\frac{1}{e^{-in_{h1}}+1}=\frac{1}{e^{-0.6}+1}=0.6456563062 outh1=einh1+11=e0.6+11=0.6456563062

同理,可以计算出 i n h 2 in_{h2} inh2 o u t h 2 out_{h2} outh2的输出:

i n h 2 = w 3 ∗ i 1 + w 4 ∗ i 2 + b 2 in_{h2}=w_3*i_1+w_4*i_2+b_2 inh2=w3i1+w4i2+b2

o u t h 2 = 1 e − i n h 2 + 1 = 0.6592603884 out_{h2}=\frac{1}{e^{-in_{h2}}+1}=0.6592603884 outh2=einh2+11=0.6592603884

S t e p 3 Step3 Step3: 计算神经元 i n o 1 in_{o1} ino1的输入加权和:

i n o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 = 0.5 ∗ 0.6456563062 + 0.6 ∗ 0.6592603884 + 0.66 = 1.3783843861 in_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_3=0.5*0.6456563062+0.6*0.6592603884+0.66=1.3783843861 ino1=w5outh1+w6outh2+b3=0.50.6456563062+0.60.6592603884+0.66=1.3783843861

S t e p 4 Step4 Step4: 计算神经元 i n o 1 in_{o1} ino1经过激活函数Sigmoid的输出 o u t o 1 out_{o1} outo1

o u t o 1 = 1 e − i n o 1 + 1 = 1 e − 1.3783843861 + 1 = 0.7987314002 out_{o1}=\frac{1}{e^{-in_{o1}}+1}=\frac{1}{e^{-1.3783843861}+1}=0.7987314002 outo1=eino1+11=e1.3783843861+11=0.7987314002

同理,可以计算得出 i n o 2 in_{o2} ino2 o u t o 2 out_{o2} outo2的输出:

i n o 2 = w 7 ∗ o u t h 1 + w 8 ∗ o u t h 2 + b 4 in_{o2}=w_7*out_{h1}+w_8*out_{h2}+b_4 ino2=w7outh1+w8outh2+b4

o u t o 2 = 1 e − i n o 2 + 1 = 0.8374488853 out_{o2}=\frac{1}{e^{-in_{o2}}+1}=0.8374488853 outo2=eino2+11=0.8374488853

  OK,到这里第一次正向传播结束,得出的输出结果为: [ o u t o 1 , o u t o 2 ] = [ 0.7987314002 , 0.8374488853 ] [out_{o1},out_{o2} ]=[0.7987314002,0.8374488853] [outo1,outo2]=[0.7987314002,0.8374488853],我们期望的输出为 [ 0.01 , 0.99 ] [0.01,0.99] [0.01,0.99]。可以看出偏差有点大,那么这个时候就需要反向传播来更新权值参数 w i w_i wi与偏置 b i b_i bi,然后重新计算输出。

反向传播网络计算过程:

通过正向传播得出第一次输出 [ o u t o 1 , o u t o 2 ] [out_{o1},out_{o2}] [outo1,outo2],从而我们可以计算出输出误差:

E t o t a l = ∑ i = 1 2 E o u t o i = E o u t o 1 + E o u t o 2 = 1 2 ( O 1 − o u t o 1 ) 2 + 1 2 ( O 2 − o u t o 2 ) 2 = 0.0116359213 + 0.3110486109 = 0.3226845322 \begin{aligned} E_{total} =& {\sum^{2}_{i=1}E_{out_{o_i}}}\\ =& E_{out_{o1}}+E_{out_{o2}}\\ =& {\frac{1}{2}(O_1-out_{o1} )^2+\frac{1}{2} (O_2-out_{o2} )^2}\\ =& 0.0116359213+0.3110486109 \\ =& 0.3226845322 \end{aligned} Etotal=====i=12EoutoiEouto1+Eouto221(O1outo1)2+21(O2outo2)20.0116359213+0.31104861090.3226845322

其中: E o u t o 1 = 0.0116359213 E_{out_{o1}}=0.0116359213 Eouto1=0.0116359213 E o u t o 2 = 0.3110486109 E_{out_{o2}}=0.3110486109 Eouto2=0.3110486109

计算出误差值后,下面我们需要对权重 w i w_i wi与偏置 b i b_i bi进行更新:

链式求导法则:

假设 y y y u u u的函数,而u是x的函数: y = f ( u ) y=f(u) y=f(u) u = g ( x ) u=g(x) u=g(x)

那么,对应的复合函数就是: y = f ( g ( x ) ) y=f(g(x)) y=f(g(x))

y y y x x x的导数则有: d y d x = d y d u d u d x \frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx} dxdy=dudydxdu

下面就以更新权重 w 5 w_5 w5举例一:

那么,根据链式求导法则可以得出:

(1) ∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ w 5 \frac{∂E_{total}}{∂w_5}=\frac{∂E_{total}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1} }*\frac{∂in_{o1}}{∂w_5}\tag{1} w5Etotal=outo1Etotalino1outo1w5ino1(1)

Now,我们来逐个计算:

E t o t a l = 1 2 ( O 1 − o u t o 1 ) 2 + 1 2 ( O 2 − o u t o 2 ) 2 E_{total}=\frac{1}{2}(O_1-out_{o1})^{2}+\frac{1}{2}(O_2-out_{o2})^{2} Etotal=21(O1outo1)2+21(O2outo2)2

则有:

∂ E t o t a l ∂ o u t o 1 = ∂ ( 1 2 ( O 1 − o u t o 1 ) 2 + 1 2 ( O 2 − o u t o 2 ) 2 ) ∂ o u t o 1 = − ( O 1 − o u t o 1 ) = − ( 0.01 − 0.7987314002 ) = 0.7887314002 \begin{aligned} \frac{∂E_{total}}{∂out_{o1}}=& \frac{∂(\frac{1}{2}(O_1-out_{o1})^{2}+\frac{1}{2}(O_2-out_{o2})^{2})}{∂out_{o1}} \\ =& -(O_1-out_{o1}) \\ =& -(0.01-0.7987314002) \\ =& 0.7887314002 \end{aligned} outo1Etotal====outo1(21(O1outo1)2+21(O2outo2)2)(O1outo1)(0.010.7987314002)0.7887314002

激活函数Sigmoid函数:

y s i g m o i d = 1 e − x + 1 y_{sigmoid}=\frac{1}{e^{-x}+1} ysigmoid=ex+11

求导:

∂ y s i g m o i d ∂ x = ∂ ( 1 e − x + 1 ) ∂ x = y ( 1 − y ) \frac{∂y_{sigmoid}}{∂x}=\frac{∂(\frac{1}{e^{-x}+1})}{∂x}=y(1-y) xysigmoid=x(ex+11)=y(1y)

则有:

∂ o u t o 1 ∂ i n o 1 = o u t o 1 ∗ ( 1 − o u t o 1 ) = 0.7987314002 ∗ ( 1 − 0.7987314002 ) = 0.1607595505 \begin{aligned} \frac{∂out_{o1}}{∂in_{o1}}=& out_{o1}*(1-out_{o1})\\ =& 0.7987314002*(1-0.7987314002) \\ =& 0.1607595505 \end{aligned} ino1outo1===outo1(1outo1)0.7987314002(10.7987314002)0.1607595505

由于公式:
i n o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 in_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_3 ino1=w5outh1+w6outh2+b3

则有:

∂ i n o 1 ∂ w 5 = ∂ ( w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 ) ∂ w 5 = o u t h 1 + 0 + 0 = 0.6456563062 \begin{aligned} \frac{∂in_{o1}}{∂w_5}=& \frac{∂(w_5*out_{h1}+w_6*out_{h2}+b_3)}{∂w_5}\\ =& out_{h1}+0+0 \\ =& 0.6456563062 \end{aligned} w5ino1===w5(w5outh1+w6outh2+b3)outh1+0+00.6456563062

所以,公式(1)的计算结果为:

∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ w 5 = 0.7887314002 ∗ 0.1607595505 ∗ 0.6456563062 = 0.0818667051 \begin{aligned} \frac{∂E_{total}}{∂w_5}=& \frac{∂E_{total}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1} }*\frac{∂in_{o1}}{∂w_5} \\ =& 0.7887314002*0.1607595505*0.6456563062 \\ =& 0.0818667051 \end{aligned} w5Etotal===outo1Etotalino1outo1w5ino10.78873140020.16075955050.64565630620.0818667051

针对 w 5 w_5 w5隐藏求导,我们归纳一下偏导求取公式:

∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ w 5 = − ( O 1 − o u t o 1 ) ∗ o u t o 1 ∗ ( 1 − o u t o 1 ) ∗ o u t h 1 \begin{aligned} \frac{∂E_{total}}{∂w_5}=& \frac{∂E_{total}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1} }*\frac{∂in_{o1}}{∂w_5} \\ =& -(O_1-out_{o1})*out_{o1}*(1-out_{o1})*out_{h1} \end{aligned} w5Etotal==outo1Etotalino1outo1w5ino1(O1outo1)outo1(1outo1)outh1

同理,更新输出层偏置 b 3 b_3 b3

i n o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 in_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_3 ino1=w5outh1+w6outh2+b3

∂ i n o 1 ∂ b 3 = ∂ ( w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 ) ∂ b 3 = 0 + 0 + 1 = 1 \begin{aligned} \frac{∂in_{o1}}{∂b_3}=& \frac{∂(w_5*out_{h1}+w_6*out_{h2}+b_3)}{∂b_3}\\ =& 0+0+1\\ =&1 \end{aligned} b3ino1===b3(w5outh1+w6outh2+b3)0+0+11

则有:

∂ E t o t a l ∂ b 3 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ b 3 = − ( O 1 − o u t o 1 ) ∗ o u t o 1 ( 1 − o u t o 1 ) ∗ 1 \begin{aligned} \frac{∂E_{total}}{∂b_3}=& \frac{∂E_{total}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1}}*\frac{∂in_{o1}}{∂b_3} \\ =& -(O_1-out_{o1})*out_{o1}(1-out_{o1})*1 \end{aligned} b3Etotal==outo1Etotalino1outo1b3ino1(O1outo1)outo1(1outo1)1

计算到这里,得解释一下为什么要计算 ∂ E t o t a l ∂ w 5 \frac{∂E_total}{∂w_5} w5Etotal ∂ E t o t a l ∂ b 3 \frac{∂E_total}{∂b_3} b3Etotal的偏导数?

我们都知道,二次函数中求导数解释:传送门

简单点说就是我们希望 E t o t a l E_{total} Etotal的值尽可能小,假设 E t o t a l E_{total} Etotal是不具备单调性的话,那么最小的 E t o t a l E_{total} Etotal也一定在 E t o t a l E_{total} Etotal导数为0的集合里面。

  举例:假设误差 E t o t a l E_{total} Etotal为上图的多元函数,那么最小的 E t o t a l E_{total} Etotal一定在上图中的红点处,你会发现红点处的 E t o t a l E_{total} Etotal导数都为0,我们称作极值点。所以对 E t o t a l E_{total} Etotal求各个变量的偏导数,让其按照偏导数梯度方向移动,就会到达极值点。所以,为了获得 E t o t a l E_{total} Etotal最小误差,深度学习中有个学习率 α α α和步长名词。

  学习率:每次迭代优化各个权重 w w w和偏置 b b b时候,通过学习率乘以偏导值来更新权重 w w w。训练神经网络系统中,学习率的设置不能过高也不能过低,貌似是一个经验设置。学习率过高的话,系统难以收敛,会在一个区域内振荡,无法到达最优点;学习率过小的话,很容易陷入局部最优点。

  步长:我们知道,多元函数会存在局部最小值,并非全局最小值,步长是在一定程度上跳出局部最小值,来进一步搜索全局最小值。

OK,我们求取出来 ∂ E t o t a l ∂ w 5 \frac {∂E_{total}}{∂w_5} w5Etotal ∂ E t o t a l ∂ b 3 \frac {∂E_{total}}{∂b_3} b3Etotal,下面来更新一下权重 w 5 w_5 w5 b 3 b_3 b3

w 5 + = w 5 − α ∗ ∂ E t o t a l ∂ w 5 w_5^+=w_5-α*\frac{∂E_{total}}{∂w_5} w5+=w5αw5Etotal

我们初步设置学习率 α α α为0.5:

则可得 w 5 + w_5^+ w5+

w 5 + = 0.5 − 0.5 ∗ 0.0818667051 = 0.4590664745 \begin{aligned} w_5^+ =& 0.5-0.5*0.0818667051 \\ =& 0.4590664745 \end{aligned} w5+==0.50.50.08186670510.4590664745

同理更新偏置 b 3 b_3 b3

b 3 + = b 3 − α ∗ ∂ E t o t a l ∂ b 3 b_3^+=b_3-α*\frac{∂E_{total}}{∂b_3} b3+=b3αb3Etotal

相似的计算出 w 6 + w^{+}_6 w6+ w 7 + w^{+}_7 w7+ w 8 + w^{+}_8 w8+

∂ E t o t a l ∂ w 6 = ∂ E t o t a l ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ i n o 1 ∂ w 6 \frac{∂E_{total}}{∂w_6}=\frac{∂E_{total}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1}}*\frac{in_{o1}}{∂w_6} w6Etotal=outo1Etotalino1outo1w6ino1

w 6 + = w 6 − α ∗ ∂ E t o t a l ∂ w 6 w^{+}_6=w_6 - α*\frac{∂E_{total}}{∂w_6} w6+=w6αw6Etotal

其中 w 7 + 与 w 8 + w^{+}_7与w^{+}_8 w7+w8+的计算过程同上述 w 5 + w^{+}_5 w5+一致;

老铁,再坚持一下,我们求取 w 1 w_1 w1 b 1 b_1 b1的偏导:

  我们观察一下求取 w 5 w_5 w5偏导时候,反向传播更新路径为: o u t o 1 → i n o 1 → w 5 out_{o1} \rightarrow in_{o1} \rightarrow w_5 outo1ino1w5 w 5 w_5 w5的总误差只存在1根线传回。但是,求取 w 1 w_1 w1的时候,反向传播更新路径有2条,计算偏导数时候,需要分开来进行计算出 ∂ E t o t a l ∂ w 1 \frac {∂E_{total}}{∂w_1} w1Etotal:

(2) ∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ i n h 1 ∗ ∂ i n h 1 ∂ w 1 \frac{∂E_{total}}{∂w_1}=\frac{∂E_{total}}{∂out_{h1}}*\frac{∂out_{h1}}{∂in_{h1}}*\frac{∂in_{h1}}{∂w_1}\tag{2} w1Etotal=outh1Etotalinh1outh1w1inh1(2)

Now,下面进行分别计算:

(2-1) ∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 \frac{∂E_{total}}{∂out_{h1}}=\frac{∂E_{o1}}{∂out_{h1}}+\frac{∂E_{o2}}{∂out_{h1}}\tag{2-1} outh1Etotal=outh1Eo1+outh1Eo2(2-1)

等式右边分别计算:

(2-1-1) ∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ o u t h 1 \frac{∂E_{o1}}{∂out_{h1}}=\frac{∂E_{o1}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1}}*\frac{∂in_{o1}}{∂out_{h1}}\tag{2-1-1} outh1Eo1=outo1Eo1ino1outo1outh1ino1(2-1-1)

(2-1-2) ∂ E o 2 ∂ o u t h 1 = ∂ E o 2 ∂ o u t o 2 ∗ ∂ o u t o 2 ∂ i n o 2 ∗ ∂ i n o 2 ∂ o u t h 1 \frac{∂E_{o2}}{∂out_{h1}}=\frac{∂E_{o2}}{∂out_{o2}}*\frac{∂out_{o2}}{∂in_{o2}}*\frac{∂in_{o2}}{∂out_{h1}}\tag{2-1-2} outh1Eo2=outo2Eo2ino2outo2outh1ino2(2-1-2)

计算 ∂ E o 1 ∂ o u t h 1 \frac{∂E_{o1}}{∂out_{h1}} outh1Eo1

E t o t a l = 1 2 ( O 1 − o u t o 1 ) 2 + 1 2 ( O 2 − o u t o 2 ) 2 E_{total}=\frac{1}{2}(O_1-out_{o1})^{2}+\frac{1}{2}(O_2-out_{o2})^{2} Etotal=21(O1outo1)2+21(O2outo2)2

E o 1 = 1 2 ( O 1 − o u t o 1 ) 2 E_{o1}=\frac{1}{2}(O_1-out_{o1})^{2} Eo1=21(O1outo1)2

i n o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 in_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_3 ino1=w5outh1+w6outh2+b3

∂ E o 1 ∂ o u t o 1 = ∂ ( 1 2 ( O 1 − o u t o 1 ) 2 ) ∂ o u t o 1 = − ( O 1 − o u t o 1 ) = 0.7887314002 \frac{∂E_{o1}}{∂out_{o1}}=\frac{∂(\frac{1}{2}(O_1-out_{o1})^{2})}{∂out_{o1}}=-(O_1-out_{o1})=0.7887314002 outo1Eo1=outo1(21(O1outo1)2)=(O1outo1)=0.7887314002

∂ o u t o 1 ∂ i n o 1 = o u t o 1 ∗ ( 1 − o u t o 1 ) = 0.7987314002 ∗ ( 1 − 0.7987314002 ) = 0.1607595505 \begin{aligned} \frac{∂out_{o1}}{∂in_{o1}}=& out_{o1}*(1-out_{o1})\\ =& 0.7987314002*(1-0.7987314002)\\ =& 0.1607595505 \end{aligned} ino1outo1===outo1(1outo1)0.7987314002(10.7987314002)0.1607595505

∂ i n o 1 ∂ o u t h 1 = ∂ ( w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 3 ) ∂ o u t h 1 = w 5 = 0.5 \frac{∂in_{o1}}{∂out_{h1}}=\frac{∂(w_5*out_{h1}+w_6*out_{h2}+b_3 )}{∂out_{h1}}=w_5=0.5 outh1ino1=outh1(w5outh1+w6outh2+b3)=w5=0.5

所以,可以得到 ∂ E o 1 ∂ o u t h 1 \frac{∂E_{o1}}{∂out_{h1}} outh1Eo1:

∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ o u t o 1 ∗ ∂ o u t o 1 ∂ i n o 1 ∗ ∂ i n o 1 ∂ o u t h 1 = 0.7887314002 ∗ 0.1607595505 ∗ 0.5 = 0.06420185045 \begin{aligned} \frac{∂E_{o1}}{∂out_{h1}}=&\frac{∂E_{o1}}{∂out_{o1}}*\frac{∂out_{o1}}{∂in_{o1}}*\frac{∂in_{o1}}{∂out_{h1}}\\ =& 0.7887314002*0.1607595505*0.5\\ =& 0.06420185045 \end{aligned} outh1Eo1===outo1Eo1ino1outo1outh1ino10.78873140020.16075955050.50.06420185045

同理,可以计算出 ∂ E o 2 ∂ o u t h 1 \frac{∂E_{o2}}{∂out_{h1}} outh1Eo2:

E o 2 = 1 2 ( O 2 − o u t o 2 ) 2 E_{o2}=\frac{1}{2}(O_2-out_{o2})^2 Eo2=21(O2outo2)2

i n o 2 = w 7 ∗ o u t h 1 + w 8 ∗ o u t h 2 + b 4 in_{o2}=w_7*out_{h1}+w_8*out_{h2}+b_4 ino2=w7outh1+w8outh2+b4

∂ E o 2 ∂ o u t h 1 = ∂ E o 2 ∂ o u t o 2 ∗ ∂ o u t o 2 ∂ i n o 2 ∗ ∂ i n o 2 ∂ o u t h 1 \frac{∂E_{o2}}{∂out_{h1}}=\frac{∂E_{o2}}{∂out_{o2}}*\frac{∂out_{o2}}{∂in_{o2}}*\frac{∂in_{o2}}{∂out_{h1}} outh1Eo2=outo2Eo2ino2outo2outh1ino2

则有:

∂ E o 2 ∂ o u t o 2 = − ( O 2 − o u t o 2 ) \frac{∂E_{o2}}{∂out_{o2}}=-(O_2-out_{o2}) outo2Eo2=(O2outo2)

∂ o u t o 2 ∂ i n o 2 = o u t o 2 ∗ ( 1 − o u t o 2 ) \frac{∂out_{o2}}{∂in_{o2}}=out_{o2}*(1-out_{o2}) ino2outo2=outo2(1outo2)

∂ i n o 2 ∂ o u t h 1 = w 7 \frac{∂in_{o2}}{∂out_{h1}}=w_7 outh1ino2=w7

所以:

∂ E o 2 ∂ o u t h 1 = − ( O 2 − o u t o 2 ) ∗ o u t o 2 ∗ ( 1 − o u t o 2 ) ∗ w 7 = − 0.0145365614 \frac{∂E_{o2}}{∂out_{h1}}=-(O_2-out_{o2})*out_{o2}*(1-out_{o2})*w_7=-0.0145365614 outh1Eo2=(O2outo2)outo2(1outo2)w7=0.0145365614

到这里,我们公式(2-1)计算结束:

∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 = 0.06420185045 − 0.0145365614 = 0.04966528905 \begin{aligned} \frac{∂E_{total}}{∂out_{h1}}=& \frac{∂E_{o1}}{∂out_{h1}}+\frac{∂E_{o2}}{∂out_{h1}}\\ =& 0.06420185045-0.0145365614 \\ =& 0.04966528905 \end{aligned} outh1Etotal===outh1Eo1+outh1Eo20.064201850450.01453656140.04966528905

老铁,醒醒。别忘记了,总公式如下:

(2) ∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ i n h 1 ∗ ∂ i n h 1 ∂ w 1 \frac{∂E_{total}}{∂w_1}=\frac{∂E_{total}}{∂out_{h1}}*\frac{∂out_{h1}}{∂in_{h1}}*\frac{∂in_{h1}}{∂w_1}\tag{2} w1Etotal=outh1Etotalinh1outh1w1inh1(2)

接下来,我们要计算 ∂ o u t h 1 ∂ i n h 1 \frac{∂out_{h1}}{∂in_{h1}} inh1outh1:

∂ o u t h 1 ∂ i n h 1 = o u t h 1 ∗ ( 1 − o u t h 1 ) = 0.6456563062 ∗ ( 1 − 0.6456563062 ) = 0.2287842405 \begin{aligned} \frac{∂out_{h1}}{∂in_{h1}}=& out_{h1}*(1-out_{h1})\\ =& 0.6456563062*(1-0.6456563062)\\ =& 0.2287842405 \end{aligned} inh1outh1===outh1(1outh1)0.6456563062(10.6456563062)0.2287842405

最后,我们来计算 ∂ i n h 1 ∂ w 1 \frac{∂in_{h1}}{∂w_1} w1inh1:

i n h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 in_{h1}=w_1*i_1+w_2*i_2+b_1 inh1=w1i1+w2i2+b1

∂ i n h 1 ∂ w 1 = ∂ ( w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ) ∂ w 1 = i 1 = 0.1 \frac{∂in_{h1}}{∂w_1}=\frac{∂(w_1*i_1+w_2*i_2+b_1)}{∂w_1}=i_1=0.1 w1inh1=w1(w1i1+w2i2+b1)=i1=0.1

∂ i n h 1 ∂ b 1 = ∂ ( w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ) ∂ b 1 = 1 \frac{∂in_{h1}}{∂b_1}=\frac{∂(w_1*i_1+w_2*i_2+b_1)}{∂b_1}=1 b1inh1=b1(w1i1+w2i2+b1)=1

因此,公式(2)的计算结果为:

∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ i n h 1 ∗ ∂ i n h 1 ∂ w 1 = 0.04966528905 ∗ 0.2287842405 ∗ 0.1 = 0.0011362635 \begin{aligned} \frac{∂E_{total}}{∂w_1}=& \frac{∂E_{total}}{∂out_{h1}}*\frac{∂out_{h1}}{∂in_{h1}}*\frac{∂in_{h1}}{∂w_1}\\ =& 0.04966528905*0.2287842405*0.1 \\ =& 0.0011362635 \end{aligned} w1Etotal===outh1Etotalinh1outh1w1inh10.049665289050.22878424050.10.0011362635

终于可以到了更新 w 1 w_1 w1的权值了:

w 1 + = w 1 − α ∗ ∂ E t o t a l ∂ w 1 = 0.1 − 0.5 ∗ 0.0011362635 = 0.09943186825 \begin{aligned} w^{+}_1=& w_1-α*\frac{∂E_{total}}{∂w_1}\\ =& 0.1-0.5*0.0011362635 \\ =& 0.09943186825 \end{aligned} w1+===w1αw1Etotal0.10.50.00113626350.09943186825

同理,可以求取 b 1 b_1 b1的更新:

∂ E t o t a l ∂ b 1 = ∂ E t o t a l ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ i n h 1 ∗ ∂ i n h 1 ∂ b 1 \frac{∂E_{total}}{∂b_1}= \frac{∂E_{total}}{∂out_{h1}}*\frac{∂out_{h1}}{∂in_{h1}}*\frac{∂in_{h1}}{∂b_1} b1Etotal=outh1Etotalinh1outh1b1inh1

b 1 + = b 1 − α ∗ ∂ E t o t a l ∂ b 1 = 0.55 − 0.5 = 0.05 \begin{aligned} b^{+}_1=& b_1-α*\frac{∂E_{total}}{∂b_1}\\ =& 0.55-0.5\\ =& 0.05 \end{aligned} b1+===b1αb1Etotal0.550.50.05

  OK,到此处我们更新完权重 w 1 w_1 w1 b 1 b_1 b1的值,同层网络更新权重 w 2 w_2 w2 w 3 w_3 w3 w 4 w_4 w4与偏置 b 2 b_2 b2 b 3 b_3 b3 b 4 b_4 b4计算过程与 w 1 w_1 w1 b 1 b_1 b1类似,在此就不多重复计算啦。

  至此,反向传播计算完所有的权重系数与偏置项,完成一次迭代。下一次将会进行更新所有的权重系数与偏置来进行下一轮的正向、反向传播,不断迭代优化最终的误差与期望误差最小化。一次完整的迭代过程,重复迭代就是深度学习的主要学习过程。

总结

  老铁,终于看到结尾了。本篇博文主要通过简单的公式推导来进行系统阐述正向、反向传播过程。通过不断更新权重与偏置系数,来优化误差比例,最终获取最优的结果。当然,在进行深度学习训练时候,会有很多的Tricks来优化我们的学习过程,例如:选取不同的损失函数、学习率的设置、步长的设置、网络层数的大小设置等等。但是,每一轮迭代更新权重与偏置的过程是整个深度学习流程的核心,掌握一次完整的正向、反向传播的推导,后面的细节理解起来就会轻松许多。建议大家,自己手推一遍公式吧理解程度会加深。最后,本文参考知乎AI从入门到放弃:BP神经网络算法推导及代码实现笔记博文的完整推导,同时加上自己的一点理解,算是一篇学习笔记。公式编辑打的手都酸了,好了我该去吃饭了!最后,祝大家清明假期愉快!
 如有错误,还请批评指正。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐