多层神经网络反向传播的推导
BP网络其实就是多个逻辑斯特模型的组合,逻辑斯特模型的梯度下降反向传播请看上一篇。
首先,前向传播的过程是这样的
a
l
=
σ
(
z
l
)
=
σ
(
W
l
a
l
−
1
+
b
l
)
a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)
al=σ(zl)=σ(Wlal−1+bl)
a
l
a^l
al是第L层的输出,列向量,
W
l
W^l
Wl就是该层前面的权重,矩阵,
b
l
b^l
bl是该层的偏置,列向量。
损失函数
在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失,比如均方误差:
J
(
W
,
b
,
x
,
y
)
=
1
2
∣
∣
a
L
−
y
∣
∣
2
2
J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2
J(W,b,x,y)=21∣∣aL−y∣∣22
其中,
a
L
a^L
aL和
y
y
y为特征维度为
n
o
u
t
n_{out}
nout的向量,而
∣
∣
S
∣
∣
2
||S||^2
∣∣S∣∣2为S的L2范数。
计算输出层第L层的梯度
那么第L层关于
W
W
W和
b
b
b的表达式为:
a
L
=
σ
(
z
L
)
=
σ
(
W
L
a
L
−
1
+
b
L
)
a^L = \sigma(z^L) = \sigma(W^La^{L-1} + b^L)
aL=σ(zL)=σ(WLaL−1+bL)
拆分来看,
a
L
1
{a^L}_1
aL1由前一层的四个神经元影响,这里就不拆分开了,其表达就是
W
L
a
L
−
1
W^La^{L-1}
WLaL−1两个矩阵的点积,即2$\times
4
矩
阵
和
4
4矩阵和4
4矩阵和4\times
1
矩
阵
点
积
,
得
到
2
1矩阵点积,得到2
1矩阵点积,得到2\times$1矩阵。
损失函数就变为:
J
(
W
,
b
,
x
,
y
)
=
1
2
∣
∣
a
L
−
y
∣
∣
2
2
=
1
2
∣
∣
σ
(
W
L
a
L
−
1
+
b
L
)
−
y
∣
∣
2
2
J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2 = \frac{1}{2}|| \sigma(W^La^{L-1} + b^L)-y||_2^2
J(W,b,x,y)=21∣∣aL−y∣∣22=21∣∣σ(WLaL−1+bL)−y∣∣22
从上式就可以求
W
W
W,
b
b
b的梯度:
∂
J
(
W
,
b
,
x
,
y
)
∂
W
L
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
L
∂
z
L
∂
W
L
=
[
(
a
L
−
y
)
⊙
σ
′
(
z
L
)
]
(
a
L
−
1
)
T
\frac{\partial J(W,b,x,y)}{\partial W^L} =\frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial W^L} = [(a^L-y) \odot \sigma^{'}(z^L)](a^{L-1})^T
∂WL∂J(W,b,x,y)=∂zL∂J(W,b,x,y)∂WL∂zL=[(aL−y)⊙σ′(zL)](aL−1)T
求导过程中用到了链式法则和复合函数的求导法则,而对于离散型变量的求导则是将其系数矩阵转置,且座乘右乘也要相同,其中
A
⊙
B
=
(
a
1
b
1
,
a
2
b
2
,
.
.
.
a
n
b
n
)
T
A \odot B = (a_1b_1, a_2b_2,...a_nb_n)^T
A⊙B=(a1b1,a2b2,...anbn)T。
同理:
∂
J
(
W
,
b
,
x
,
y
)
∂
b
L
=
(
a
L
−
y
)
⊙
σ
′
(
z
L
)
\frac{\partial J(W,b,x,y)}{\partial b^L} =(a^L-y)\odot \sigma^{'}(z^L)
∂bL∂J(W,b,x,y)=(aL−y)⊙σ′(zL)
这样,就得到了L层权重和偏置的梯度。
计算非输出层任意第 l l l层的梯度
为了方便向前面层传播,将
∂
J
(
W
,
b
,
x
,
y
)
∂
z
L
\frac{\partial J(W,b,x,y)}{\partial z^L}
∂zL∂J(W,b,x,y)记做
δ
L
\delta^L
δL,叫做该层的误差,有:
δ
L
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
L
=
(
a
L
−
y
)
⊙
σ
′
(
z
L
)
\delta^L = \frac{\partial J(W,b,x,y)}{\partial z^L} = (a^L-y)\odot \sigma^{'}(z^L)
δL=∂zL∂J(W,b,x,y)=(aL−y)⊙σ′(zL)
现在,得到了第L层的梯度,就可以计算前面的某层
l
l
l的梯度,对于第
l
l
l层的未激活输出
z
l
z^l
zl,它的误差可以表示为:
δ
l
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
l
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
L
(
∂
z
L
∂
z
L
−
1
∂
z
L
−
1
∂
z
L
−
2
.
.
.
∂
z
l
+
1
∂
z
l
)
\delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^L}(\frac{\partial z^L}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}})
δl=∂zl∂J(W,b,x,y)=∂zL∂J(W,b,x,y)(∂zL−1∂zL∂zL−2∂zL−1...∂zl∂zl+1)
从第L层直接求第
l
l
l层的误差是不好求的,这里用到了数学归纳法,第L层的$\delta^L
上
面
我
们
已
经
求
出
,
假
设
第
上面我们已经求出, 假设第
上面我们已经求出,假设第l+1
层
的
层的
层的\delta{l+1}$已经求出来了,那么我们就可以求第$l$层的$\deltal$:
δ
l
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
l
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
l
+
1
∂
z
l
+
1
∂
z
l
=
δ
l
+
1
∂
z
l
+
1
∂
z
l
\delta^{l} = \frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^{l+1}} \frac{\partial z^{l+1}}{\partial z^{l}} =\delta^{l+1}\frac{\partial z^{l+1}}{\partial z^{l}}
δl=∂zl∂J(W,b,x,y)=∂zl+1∂J(W,b,x,y)∂zl∂zl+1=δl+1∂zl∂zl+1
其中:未知量是
∂
z
l
+
1
∂
z
l
\frac{\partial z^{l+1}}{\partial z^{l}}
∂zl∂zl+1,而
z
l
+
1
=
W
l
+
1
a
l
+
b
l
+
1
=
W
l
+
1
σ
(
z
l
)
+
b
l
+
1
z^{l+1}= W^{l+1}a^{l} + b^{l+1} = W^{l+1}\sigma(z^l) + b^{l+1}
zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1,所以:
∂
z
l
+
1
∂
z
l
=
(
W
l
+
1
)
T
⊙
σ
′
(
z
l
)
\frac{\partial z^{l+1}}{\partial z^{l}} = {(W^{l+1})}^T\odot\sigma^{'}(z^l)
∂zl∂zl+1=(Wl+1)T⊙σ′(zl)
同样,求导后矩阵运算是左乘还是右乘需要与求导前保持一致,并且需要经过转置,此处需要进行矩阵的广播,将
σ
′
(
z
l
)
\sigma^{'}(z^l)
σ′(zl)广播成可以和前者运算的大小。
δ
l
=
(
∂
z
l
+
1
∂
z
l
)
T
∂
J
(
W
,
b
,
x
,
y
)
∂
z
l
+
1
=
(
W
l
+
1
)
T
δ
l
+
1
⊙
σ
′
(
z
l
)
\delta^{l} = (\frac{\partial z^{l+1}}{\partial z^{l}})^T\frac{\partial J(W,b,x,y)}{\partial z^{l+1}} =(W^{l+1})^T\delta^{l+1}\odot \sigma^{'}(z^l)
δl=(∂zl∂zl+1)T∂zl+1∂J(W,b,x,y)=(Wl+1)Tδl+1⊙σ′(zl)
由于我们之前计算出了最后一层的delta误差
δ
L
\delta^{L}
δL ,通过上式,我们可以依次求得一直到第二层的delta误差
δ
2
\delta^{2}
δ2 ,第一层为我们的输入,并不存在第一层的delta误差。因此我们的计算到第二层截止。
现在就可以对每一层的
W
W
W,
b
b
b求解梯度了,由于
z
l
=
W
l
a
l
−
1
+
b
l
z^l= W^la^{l-1} + b^l
zl=Wlal−1+bl:
∂
J
(
W
,
b
,
x
,
y
)
∂
W
l
=
∂
J
(
W
,
b
,
x
,
y
)
∂
z
l
∂
z
l
∂
W
l
=
δ
l
(
a
l
−
1
)
T
\frac{\partial J(W,b,x,y)}{\partial W^l} = \frac{\partial J(W,b,x,y)}{\partial z^l}\frac{\partial z^l}{\partial W^l} = \delta^{l}(a^{l-1})^T
∂Wl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂Wl∂zl=δl(al−1)T
∂ J ( W , b , x , y ) ∂ b l = ∂ J ( W , b , x , y ) ∂ z l ∂ b l ∂ W l = δ l \frac{\partial J(W,b,x,y)}{\partial b^l} = \frac{\partial J(W,b,x,y)}{\partial z^l}\frac{\partial b^l}{\partial W^l} = \delta^{l} ∂bl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂Wl∂bl=δl
参数更新
到现在,就得到了所有层
W
W
W和
b
b
b的梯度,可以进行权重更新了:
W
l
=
W
l
−
α
∂
J
(
W
,
b
,
x
,
y
)
∂
W
l
W^l = W^l - α\frac{\partial J(W,b,x,y)}{\partial W^l}
Wl=Wl−α∂Wl∂J(W,b,x,y)
b l = b l − α ∂ J ( W , b , x , y ) ∂ b l b^l = b^l - α\frac{\partial J(W,b,x,y)}{\partial b^l} bl=bl−α∂bl∂J(W,b,x,y)
,x,y)}{\partial W^l}
$$
b l = b l − α ∂ J ( W , b , x , y ) ∂ b l b^l = b^l - α\frac{\partial J(W,b,x,y)}{\partial b^l} bl=bl−α∂bl∂J(W,b,x,y)