本文主要讲解梯度在CNN网络中的误差传播:
包括两个内容:
池化层到卷积层的误差计算
卷积层到池化层的误差计算
CNN的前向结构为 一层卷积->激活函数->一层池化
1.池化层到卷积层的反向传播(只传播误差,因为池化层没权重)
当L层表示的是池化层的时候
当L-1层表示的是卷积层的时候
池化层:L层输出
a
t
a_{t}
at #池化层输出
a
t
=
z
t
a_{t}=z_{t}
at=zt
↑
\uparrow
↑ #池化
卷积层:L-1层输出
a
t
−
1
a_{t-1}
at−1 #卷积层输出
a
t
−
1
=
σ
(
z
t
−
1
)
a_{t-1}=\sigma (z_{t-1})
at−1=σ(zt−1)
↑
\uparrow
↑
#卷积操作
z
t
−
1
=
a
t
−
2
∗
w
z_{t-1}=a_{t-2}*w
zt−1=at−2∗w
↑
\uparrow
↑
池化层:L-1层输出
a
t
−
2
a_{t-2}
at−2 #池化层输出
2.卷积层到池化层的反向传播(包括误差灵敏度传播和计算权重):
当L层表示的是j卷积层的时候
当L-1层表示的是池化层的时候
卷积层:L层输出:
a
l
a^{l}
al #卷积层输出
a
l
=
σ
(
z
l
)
a^{l}=\sigma (z^{l})
al=σ(zl)
↑
\uparrow
↑
z
l
=
a
l
−
1
∗
w
z^{l}=a^{l-1}*w
zl=al−1∗w
↑
\uparrow
↑
池化层:L-1层输出:
a
l
−
1
a^{l-1}
al−1 #池化层输出
a
l
−
1
=
z
l
−
1
a^{l-1}=z^{l-1}
al−1=zl−1
↑
\uparrow
↑ #池化层没有激活函数,所以第L层a对z求偏导就为1
#池化操作
z
l
−
1
=
a
l
−
2
z^{l-1}=a^{l-2}
zl−1=al−2
↑
\uparrow
↑
卷积层:L-1层输出:
a
l
−
2
a^{l-2}
al−2 #卷积层输出
我们的目标是希望根据当前的误差灵敏度能够得到计算上一时刻的误差灵敏度公式。
以及根据当前灵敏度传播矩阵得到计算梯度w的更新公式。
1) 根据当前误差灵敏度,计算上一时刻的误差灵敏度
下面开始计算得到以上公式
列出卷积公式,分别对at-1求导得到t和t-1的关系
#根据关系还原成矩阵形式,便于计算机批量计算
2)根据当前误差灵敏度计算当前权重的梯度,从而进行更新
根据求导结果写成矩阵形式:得到误差灵敏度t和权重wt之间的关系