深度学习系列之理解BP网络原理
深度学习训练过程中到底学的是什么? 深度学习技术应用在语音识别、计算机视觉领域近几年突破性的进展,但是深度学习的可解释性弱,无法有效的进行理论推导。例如:困惑我这样的深度学习小白疑问:深度学习到底学习的是什么?如何进行学习?如何进行迭代进行最优学习的等等问题?本篇博文只是个人浅显的理解,与参考网上资料的一篇个人总结(大神请绕到),如有错误,还请批评指正。深度学习到底学习的是什么? 相信大...
深度学习训练过程中到底学的是什么?
深度学习技术应用在语音识别、计算机视觉领域近几年突破性的进展,但是深度学习的可解释性弱,无法有效的进行理论推导。例如:困惑我这样的深度学习小白疑问:深度学习到底学习的是什么?如何进行学习?如何进行迭代进行最优学习的等等问题?本篇博文只是个人浅显的理解,与参考网上资料的一篇个人总结(大神请绕到),如有错误,还请批评指正。
深度学习到底学习的是什么?
相信大家做图像处理方面的都知道卷积运算,卷积核参数在经典计算机视觉中是人手工进行设定。例如:滤波的高斯核函数、提取图像梯度值的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⎦⎤=⎣⎡−1−2−1000+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=e−x+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(1−ysigmoid)
下面就要进行公式推导,老铁,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=w1∗i1+w2∗i2+b1=0.1∗0.1+0.2∗0.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=e−inh1+11=e−0.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=w3∗i1+w4∗i2+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=e−inh2+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=w5∗outh1+w6∗outh2+b3=0.5∗0.6456563062+0.6∗0.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=e−ino1+11=e−1.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=w7∗outh1+w8∗outh2+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=e−ino2+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=1∑2EoutoiEouto1+Eouto221(O1−outo1)2+21(O2−outo2)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} ∂w5∂Etotal=∂outo1∂Etotal∗∂ino1∂outo1∗∂w5∂ino1(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(O1−outo1)2+21(O2−outo2)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} ∂outo1∂Etotal====∂outo1∂(21(O1−outo1)2+21(O2−outo2)2)−(O1−outo1)−(0.01−0.7987314002)0.7887314002
激活函数Sigmoid函数:
y s i g m o i d = 1 e − x + 1 y_{sigmoid}=\frac{1}{e^{-x}+1} ysigmoid=e−x+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) ∂x∂ysigmoid=∂x∂(e−x+11)=y(1−y)
则有:
∂ 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} ∂ino1∂outo1===outo1∗(1−outo1)0.7987314002∗(1−0.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=w5∗outh1+w6∗outh2+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} ∂w5∂ino1===∂w5∂(w5∗outh1+w6∗outh2+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} ∂w5∂Etotal===∂outo1∂Etotal∗∂ino1∂outo1∗∂w5∂ino10.7887314002∗0.1607595505∗0.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} ∂w5∂Etotal==∂outo1∂Etotal∗∂ino1∂outo1∗∂w5∂ino1−(O1−outo1)∗outo1∗(1−outo1)∗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=w5∗outh1+w6∗outh2+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} ∂b3∂ino1===∂b3∂(w5∗outh1+w6∗outh2+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} ∂b3∂Etotal==∂outo1∂Etotal∗∂ino1∂outo1∗∂b3∂ino1−(O1−outo1)∗outo1(1−outo1)∗1
计算到这里,得解释一下为什么要计算 ∂ E t o t a l ∂ w 5 \frac{∂E_total}{∂w_5} ∂w5∂Etotal与 ∂ E t o t a l ∂ b 3 \frac{∂E_total}{∂b_3} ∂b3∂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也一定在 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} ∂w5∂Etotal与 ∂ E t o t a l ∂ b 3 \frac {∂E_{total}}{∂b_3} ∂b3∂Etotal,下面来更新一下权重 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−α∗∂w5∂Etotal
我们初步设置学习率 α α α为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.5−0.5∗0.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−α∗∂b3∂Etotal
相似的计算出 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} ∂w6∂Etotal=∂outo1∂Etotal∗∂ino1∂outo1∗∂w6ino1
w 6 + = w 6 − α ∗ ∂ E t o t a l ∂ w 6 w^{+}_6=w_6 - α*\frac{∂E_{total}}{∂w_6} w6+=w6−α∗∂w6∂Etotal
其中 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 outo1→ino1→w5, 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} ∂w1∂Etotal:
(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} ∂w1∂Etotal=∂outh1∂Etotal∗∂inh1∂outh1∗∂w1∂inh1(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} ∂outh1∂Etotal=∂outh1∂Eo1+∂outh1∂Eo2(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} ∂outh1∂Eo1=∂outo1∂Eo1∗∂ino1∂outo1∗∂outh1∂ino1(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} ∂outh1∂Eo2=∂outo2∂Eo2∗∂ino2∂outo2∗∂outh1∂ino2(2-1-2)
计算 ∂ E o 1 ∂ o u t h 1 \frac{∂E_{o1}}{∂out_{h1}} ∂outh1∂Eo1:
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(O1−outo1)2+21(O2−outo2)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(O1−outo1)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=w5∗outh1+w6∗outh2+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 ∂outo1∂Eo1=∂outo1∂(21(O1−outo1)2)=−(O1−outo1)=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} ∂ino1∂outo1===outo1∗(1−outo1)0.7987314002∗(1−0.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 ∂outh1∂ino1=∂outh1∂(w5∗outh1+w6∗outh2+b3)=w5=0.5
所以,可以得到 ∂ E o 1 ∂ o u t h 1 \frac{∂E_{o1}}{∂out_{h1}} ∂outh1∂Eo1:
∂ 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} ∂outh1∂Eo1===∂outo1∂Eo1∗∂ino1∂outo1∗∂outh1∂ino10.7887314002∗0.1607595505∗0.50.06420185045
同理,可以计算出 ∂ E o 2 ∂ o u t h 1 \frac{∂E_{o2}}{∂out_{h1}} ∂outh1∂Eo2:
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(O2−outo2)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=w7∗outh1+w8∗outh2+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}} ∂outh1∂Eo2=∂outo2∂Eo2∗∂ino2∂outo2∗∂outh1∂ino2
则有:
∂ E o 2 ∂ o u t o 2 = − ( O 2 − o u t o 2 ) \frac{∂E_{o2}}{∂out_{o2}}=-(O_2-out_{o2}) ∂outo2∂Eo2=−(O2−outo2)
∂ 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}) ∂ino2∂outo2=outo2∗(1−outo2)
∂ i n o 2 ∂ o u t h 1 = w 7 \frac{∂in_{o2}}{∂out_{h1}}=w_7 ∂outh1∂ino2=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 ∂outh1∂Eo2=−(O2−outo2)∗outo2∗(1−outo2)∗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} ∂outh1∂Etotal===∂outh1∂Eo1+∂outh1∂Eo20.06420185045−0.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} ∂w1∂Etotal=∂outh1∂Etotal∗∂inh1∂outh1∗∂w1∂inh1(2)
接下来,我们要计算 ∂ o u t h 1 ∂ i n h 1 \frac{∂out_{h1}}{∂in_{h1}} ∂inh1∂outh1:
∂ 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} ∂inh1∂outh1===outh1∗(1−outh1)0.6456563062∗(1−0.6456563062)0.2287842405
最后,我们来计算 ∂ i n h 1 ∂ w 1 \frac{∂in_{h1}}{∂w_1} ∂w1∂inh1:
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=w1∗i1+w2∗i2+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 ∂w1∂inh1=∂w1∂(w1∗i1+w2∗i2+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 ∂b1∂inh1=∂b1∂(w1∗i1+w2∗i2+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} ∂w1∂Etotal===∂outh1∂Etotal∗∂inh1∂outh1∗∂w1∂inh10.04966528905∗0.2287842405∗0.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−α∗∂w1∂Etotal0.1−0.5∗0.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} ∂b1∂Etotal=∂outh1∂Etotal∗∂inh1∂outh1∗∂b1∂inh1
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−α∗∂b1∂Etotal0.55−0.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神经网络算法推导及代码实现笔记博文的完整推导,同时加上自己的一点理解,算是一篇学习笔记。公式编辑打的手都酸了,好了我该去吃饭了!最后,祝大家清明假期愉快!
如有错误,还请批评指正。
更多推荐
所有评论(0)