梯度下降法
我们只到梯度下降法是用来进行模型学习参数的,神经网络的学习同样需要梯度下降法,我们设网络的参数
θ
\theta
θ为:
他也是这样不停的更新的:
我们计算每个参数的梯度来进行更新,我们采用比较高效的反向传播来进行梯度的计算:
链式求导法则
在说反向传播之前,先讲下链式求导法则,简单的理解就像一个链条一样,一个接着一个求导数,然后连乘起来,通俗的说,就是蝴蝶效应,很微小的变化可能会被传递到很远。比如这个函数,x是y的输入,y是z的输入,那么x的变化不仅会影响y也会影响z:
如果有两歌输入或者多个输入呢,把输入的影响加起来即可:
反向传播
反向传播主要用于进行高效的梯度计算,计算损失对每个参数的梯度,我们的损失是所有样本的误差之和:
我们拿上面的输入和隐藏层的第一个单元做例子:
根据链式法则,我们求损失l关于w的微分,可以化为:
如果我们要得到w的两个微分的话,直接微分可以得到值,也就是前面输入值:
我们叫正向传递,意思应该就是从前面传过来的值。
比如下图,每个w参数的微分就等于前面的输入值:
再来看看损失l对z的微分,因为有激活函数
σ
\sigma
σ的作用,所以也可以链式法则分解:
但是损失l对于a的微分是基于后面层,如果没有层了,那直接就是l对a的微分,如果有,那还要考虑后面的值,比如:
假设后面还有很多层,我们知道
∂
l
∂
z
′
,
∂
l
∂
z
′
′
,
∂
z
′
∂
a
=
w
3
,
∂
z
′
′
∂
a
=
w
4
\frac{\partial {l}}{\partial z'},\frac{\partial l}{\partial z''},\frac{\partial {z'}}{\partial a}=w_3,\frac{\partial {z''}}{\partial a}=w_4
∂z′∂l,∂z′′∂l,∂a∂z′=w3,∂a∂z′′=w4,则
∂
l
∂
a
=
∂
z
′
∂
a
∂
l
∂
z
′
+
∂
z
′
′
∂
a
∂
l
∂
z
′
′
=
w
3
∂
l
∂
z
′
+
w
4
∂
l
∂
z
′
′
\frac{\partial {l}}{\partial a}=\frac{\partial {z'}}{\partial a} \frac{\partial {l}}{\partial z'} + \frac{\partial {z''}}{\partial a} \frac{\partial {l}}{\partial z''} = w_3 \frac{\partial {l}}{\partial z'}+w_4 \frac{\partial {l}}{\partial z''}
∂a∂l=∂a∂z′∂z′∂l+∂a∂z′′∂z′′∂l=w3∂z′∂l+w4∂z′′∂l
∂
l
∂
z
=
∂
l
∂
a
∂
a
∂
z
=
(
w
3
∂
l
∂
z
′
+
w
4
∂
l
∂
z
′
′
)
σ
′
(
z
)
\frac{\partial {l}}{\partial z}=\frac{\partial {l}}{\partial a} \frac{\partial {a}}{\partial z} = (w_3 \frac{\partial {l}}{\partial z'}+w_4 \frac{\partial {l}}{\partial z''})\sigma'(z)
∂z∂l=∂a∂l∂z∂a=(w3∂z′∂l+w4∂z′′∂l)σ′(z)
即:
因为z是前面计算出来,已经确定了,所以
σ
′
(
z
)
是
常
数
\sigma'(z)是常数
σ′(z)是常数,那整个式子可以看成从右边向左边的计算,三角形的标志就是说后面的线性加权之后再乘以
σ
′
(
z
)
\sigma ' (z)
σ′(z):
相对于正向传递的从左到右,这个从右到左的就是反向传递了。
因此我们要求的
∂
l
∂
w
=
∂
z
∂
w
∂
l
∂
z
\frac{\partial {l}}{\partial w}=\frac{\partial {z}}{\partial w} \frac{\partial {l}}{\partial z}
∂w∂l=∂w∂z∂z∂l就变成了两部分相乘了,一个是正向传递的输入
∂
z
∂
w
\frac{\partial {z}}{\partial w}
∂w∂z=x,一个是反向传递的微分
∂
l
∂
z
\frac{\partial {l}}{\partial z}
∂z∂l。
大多数情况下,后面可能还有很多层,但是思路是一样的,我们先来看后面没有层的,也就是输出y,可以直接算出来:
后面不是直接输出层的:
但是可以用反向传递计算,比如下面的
∂
l
∂
z
′
=
(
w
5
∂
l
∂
z
a
+
w
6
∂
l
∂
z
b
)
σ
′
(
z
′
)
\frac{\partial {l}}{\partial z'}=(w_5\frac{\partial {l}}{\partial z_a} + w_6\frac{\partial {l}}{\partial z_b})\sigma '(z')
∂z′∂l=(w5∂za∂l+w6∂zb∂l)σ′(z′) :
所以我们可以用这个思路,先前向传递求出
z
,
∂
z
∂
w
=
a
z ,\frac{\partial {z}}{\partial w}=a
z,∂w∂z=a,然后反向传递求出线性加权乘以
σ
′
(
z
)
\sigma '(z)
σ′(z),得
∂
l
∂
z
\frac{\partial {l}}{\partial z}
∂z∂l,然后乘以a即可得
∂
l
∂
w
\frac{\partial {l}}{\partial w}
∂w∂l,即结果为前向传递和反向传递的乘积:
总结
本篇主要介绍了反向传播算法,用比较简答的例子展现了某个参数的微分可以看做前向传递和反向传递的结果的乘积,因此可以很有效率的计算微分,其实只要先前向传播一遍,得到各个点的输入,然后反向传递即可计算各个点的微分,思维导图:
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。