一步一步推导反向传播
假如我们由如下的网络(这里只给出最后两层
l
l
l和
l
+
1
l+1
l+1)其中
l
+
1
l+1
l+1是最后输出:
其中有如下定义:
a
l
+
1
=
s
i
g
m
o
i
d
(
z
l
+
1
)
…
…
(
1
)
a^{l+1} = sigmoid(z^{l+1})……(1)
al+1=sigmoid(zl+1)……(1)
z
l
+
1
=
w
l
∗
a
l
…
…
…
…
(
2
)
z^{l+1} = w^l*a^l… ………(2)
zl+1=wl∗al…………(2)
注意这里的
w
、
a
、
z
w、a、z
w、a、z都是矩阵或向量。其定义和吴恩达的一样,比如
a
j
l
a^l_j
ajl代表第
l
层
的
第
j
个
节
点
l层的第j个节点
l层的第j个节点。
因为反向传播是要求最后的损失对前面所有的权重的导数,然后再更新权重,所以我们的关键在于求出损失的权重的求导,上面的图中最后的输出是 a l + 1 a^{l+1} al+1,所以我们对应的损失如下:
J ( θ ) = − [ y l o g a l + 1 + ( 1 − y ) l o g ( 1 − a l + 1 ) ] J(\theta) =-[yloga^{l+1}+(1-y)log(1-a^{l+1})] J(θ)=−[ylogal+1+(1−y)log(1−al+1)] 我们将 J ( θ ) 写 作 C J(\theta)写作C J(θ)写作C。
我们的目的是要求 ∂ C ∂ w l \frac{\partial C}{\partial w^l} ∂wl∂C,我们可以通过链式运算:
首先由上面的损失公式,我们可以很直观的看出来 ∂ C ∂ a l + 1 = a l + 1 − y a l + 1 ( 1 − a l + 1 ) \frac{\partial C}{\partial a^{l+1}} =\frac{a^{l+1}-y}{a^{l+1}(1-a^{l+1})} ∂al+1∂C=al+1(1−al+1)al+1−y ,注意这里省去了常数部分。
根据链式法则,我们可以得到
∂
C
∂
z
l
+
1
=
∂
C
∂
a
l
+
1
∂
a
l
+
1
∂
z
l
+
1
\frac{\partial C}{\partial z^{l+1}} =\frac{\partial C}{\partial a^{l+1}}\frac{\partial a^{l+1}}{\partial z^{l+1}}
∂zl+1∂C=∂al+1∂C∂zl+1∂al+1 ,然后再结合式1,因为
a
l
+
1
=
s
i
g
m
o
i
d
(
z
l
+
1
)
a^{l+1} = sigmoid(z^{l+1})
al+1=sigmoid(zl+1) ,并且
f
(
x
)
=
s
i
g
m
o
i
d
(
x
)
的
导
数
为
f
’
(
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
f(x) = sigmoid(x)的导数为f’(x) =f(x)(1-f(x))
f(x)=sigmoid(x)的导数为f’(x)=f(x)(1−f(x)),所以
∂
a
l
+
1
∂
z
l
+
1
=
a
l
+
1
(
1
−
a
l
+
1
)
\frac{\partial a^{l+1}}{\partial z^{l+1}}=a^{l+1}(1-a^{l+1})
∂zl+1∂al+1=al+1(1−al+1) ,最终我们得到如下:
∂
C
∂
z
l
+
1
=
∂
C
∂
a
l
+
1
∂
a
l
+
1
∂
z
l
+
1
=
a
l
+
1
−
y
…
…
(
3
)
\frac{\partial C}{\partial z^{l+1}} =\frac{\partial C}{\partial a^{l+1}}\frac{\partial a^{l+1}}{\partial z^{l+1}}=a^{l+1}-y …… (3)
∂zl+1∂C=∂al+1∂C∂zl+1∂al+1=al+1−y……(3)
我们离权重只剩下一步之遥了,同样利用链式法则,我们可以得到
∂
C
∂
w
l
=
∂
C
∂
z
l
+
1
∂
z
l
+
1
∂
w
l
\frac{\partial C}{\partial w^{l}} =\frac{\partial C}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial w^{l}}
∂wl∂C=∂zl+1∂C∂wl∂zl+1 ,结合式子2,因为
z
l
+
1
=
w
l
∗
a
l
z^{l+1} = w^l*a^l
zl+1=wl∗al,所以
∂
z
l
+
1
∂
w
l
=
a
l
\frac{\partial z^{l+1}}{\partial w^{l}} =a^l
∂wl∂zl+1=al到此为止,我们得到了损失对
w
l
w^l
wl的导数:
∂
C
∂
w
l
=
∂
C
∂
z
l
+
1
∂
z
l
+
1
∂
w
l
=
∂
C
∂
z
l
+
1
a
l
=
(
a
l
+
1
−
y
)
∗
a
l
…
…
(
4
)
\frac{\partial C}{\partial w^{l}} =\frac{\partial C}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial w^{l}}=\frac{\partial C}{\partial z^{l+1}}a^l=(a^{l+1}-y)*a^l ……(4)
∂wl∂C=∂zl+1∂C∂wl∂zl+1=∂zl+1∂Cal=(al+1−y)∗al……(4)
看到这里,可能心里想,这如果要好几百层怎么推呀,其实我们可以发现当我们求第
l
l
l层的时候,我们会用到
l
+
1
l+1
l+1层的数据,所以如果能找到规律就好了,那么我们再向下推一层看看,同理,根据链式法则,我们可以得到
∂
C
∂
z
l
=
∂
C
∂
z
l
+
1
∂
z
l
+
1
∂
z
l
\frac{\partial C}{\partial z^{l}}=\frac{\partial C}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial z^{l}}
∂zl∂C=∂zl+1∂C∂zl∂zl+1 ,而
z
l
+
1
=
w
l
a
l
=
w
l
s
i
g
m
o
i
d
(
z
l
)
z^{l+1}=w^la^l=w^lsigmoid(z^l)
zl+1=wlal=wlsigmoid(zl),所以
∂
z
l
+
1
∂
z
l
=
(
w
l
)
T
a
l
(
1
−
a
l
)
\frac{\partial z^{l+1}}{\partial z^{l}}=(w^l)^Ta^l(1-a^l)
∂zl∂zl+1=(wl)Tal(1−al),所以我们得到如下:
∂
C
∂
z
l
=
∂
C
∂
z
l
+
1
(
w
l
)
T
a
l
(
1
−
a
l
)
…
…
(
5
)
\frac{\partial C}{\partial z^{l}}=\frac{\partial C}{\partial z^{l+1}}(w^l)^Ta^l(1-a^l)……(5)
∂zl∂C=∂zl+1∂C(wl)Tal(1−al)……(5)
看看我们发现了什么,我们发现第
l
l
l层对
z
z
z的导数和第
l
+
1
l+1
l+1层对
z
z
z的关系了,所以我们可以设
∂
C
∂
z
l
=
δ
l
\frac{\partial C}{\partial z^{l}} =\delta^l
∂zl∂C=δl,所以我们有:
δ
l
=
δ
l
+
1
(
w
l
)
T
a
l
(
1
−
a
l
)
…
…
(
6
)
\delta^l = \delta^{l+1}(w^l)^Ta^l(1-a^l)……(6)
δl=δl+1(wl)Tal(1−al)……(6)
再根据链式法则得到对权重的导数为:
∂
C
∂
w
l
−
1
=
∂
C
∂
z
l
∂
z
l
∂
w
l
−
1
=
δ
l
a
l
−
1
…
…
(
7
)
\frac{\partial C}{\partial w^{l-1}} =\frac{\partial C}{\partial z^{l}} \frac{\partial z^l}{\partial w^{l-1}} =\delta^la^{l-1}……(7)
∂wl−1∂C=∂zl∂C∂wl−1∂zl=δlal−1……(7)
其中(
z
l
=
w
l
−
1
a
l
−
1
z^l=w^{l-1}a^{l-1}
zl=wl−1al−1)
按照(7)这种写法,我们也可以将(4)改下如下:
∂
C
∂
w
l
=
∂
C
∂
z
l
+
1
∂
z
l
+
1
∂
w
l
=
δ
l
+
1
a
l
…
…
(
4
_
1
)
\frac{\partial C}{\partial w^{l}} =\frac{\partial C}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial w^{l}}= \delta^{l+1}a^l ……(4\_1)
∂wl∂C=∂zl+1∂C∂wl∂zl+1=δl+1al……(4_1)
所以我们就得到了我们的损失对于任意
l
l
l层的权重的导数,也就是式子4_1,发现里面只存在一个
δ
\delta
δ是未知的,而结合式子6,我们就能递推求出所有层的
δ
\delta
δ。
比如我们最后一层是 L L L层,根据 δ l \delta^l δl的定义得到 δ L = ∂ C ∂ z L \delta^L=\frac{\partial C}{\partial z^{L}} δL=∂zL∂C,因为最后一层,所以结合损失,计算得到 δ L = ∂ C ∂ z L = a L − y \delta^L=\frac{\partial C}{\partial z^{L}}=a^L-y δL=∂zL∂C=aL−y,可以参考式子3的计算。当计算得到第 L 层 的 δ L层的\delta L层的δ,那么 L − 1 , L − 2... L-1,L-2... L−1,L−2...就可以递推得到,进而带入4_1,就能得到对所有层权重的导数,进而更新权重。