1. 全连接层
与深度神经网络DNN的反向传播算法一致,辅助变量:
⎩⎪⎪⎪⎨⎪⎪⎪⎧δL=∂zL∂J=∂aL∂J⊙σ′(zL)δl=(Wl+1)Tδl+1⊙σ′(zl)(1)
进而求得参数
W,
b的梯度:
⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧∂Wl∂J=∂zl∂J∂Wl∂zl=δl(al−1)T∂bl∂J=∂zl∂J∂bl∂zl=δl
解释一下式(1)中为何使用点乘:
以平方误差损失函数为例:
J=21∥∥aL−y∥∥22=21i=1∑N(aiL−y)2=21i=1∑N(σ(ziL)−y)2
则
δL=∂zL∂J=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∂z1L∂J∂z2L∂J⋮∂zNL∂J⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡(a1L−y)σ′(z1L)(a2L−y)σ′(z2L)⋮(aNL−y)σ′(zNL)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=(aL−y)⊙σ′(zL)=∂aL∂J⊙σ′(zL)
也可以从向量的维度上进行分析:
向量
aL−y和向量
σ′(zL)的维度相同,都属于
RN×1,因此只能是点乘。
如果是交叉熵损失函数:
J=−i=1∑NyilogaiL
则
δL=∂zL∂J=aL−y
不存在
σ′(zL)这一项。
2. 池化层
设池化层的输入为
al,输出为
zl+1,则有:
zl+1=pool(al)
则
δl=∂zl∂J=∂zl+1∂J∂al∂zl+1∂zl∂al=upsample(δl+1)⊙σ′(zl)
其中,upsample指在反向传播时,把
δl+1的矩阵大小还原成池化之前的大小,一共分为两种情况:
- 如果是Max,则把
δl+1的各元素值放在之前做前向传播算法得到最大值的位置,所以这里需要额外记录每个区块中最大元素的位置
- 如果是Average,则把
δl+1的各元素值取平均后,填入对应的区块位置。
举例,设池化层的核心大小是
2×2,则:
δl+1=(2486)Max upsample
⎝⎜⎜⎛2000004000060800⎠⎟⎟⎞
δl+1=(2486)Average upsample
⎝⎜⎜⎛0.50.5110.50.511221.51.5221.51.5⎠⎟⎟⎞
注意,对于Average情况下的反向传播,容易误认为是把梯度值复制几遍之后直接填入对应的区块位置。其实很容易理解为什么要把梯度值求平均,我们用一个小例子来说明:
假设对四个变量
a,b,c,d求平均,得到
z,也即:
z=41(a+b+c+d)
那么,
z关于每个变量的导数都是1/4。反向传播到
z时,累积的梯度值为
δ,那么,
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧∂a∂J=∂z∂J∂a∂z=41δ∂b∂J=∂z∂J∂b∂z=41δ∂c∂J=∂z∂J∂c∂z=41δ∂d∂J=∂z∂J∂d∂z=41δ
这样就很容易理解了。
3. 卷积层
卷积层的前向传播公式:
al+1=σ(zl+1)=σ(al∗Wl+1+bl+1)
则
δl=∂zl∂J=∂zl+1∂J∂al∂zl+1∂zl∂al=δl+1∗Rotation180(Wl+1)⊙σ′(zl)
其中Rotation180意思是卷积核
W被旋转180度,也即上下翻转一次,接着左右翻转一次。另外注意,这里需要对
δl+1进行适当的padding,当stride为1时,
p′=k−p−1。
详细推导请参见 https://www.cnblogs.com/pinard/p/6494810.html
参数
W,
b的梯度:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∂Wl∂J=∂zl∂J∂Wl∂zl=al−1∗δl∂bl∂J=∂zl∂J∂bl∂zl=u,v∑(δl)u,v
其中,关于
W的梯度没有旋转操作,
u,v∑(δl)u,v意思是把
δl的所有通道沿通道方向求和,累加成一个通道。
4. 参考资料
感谢 https://www.cnblogs.com/pinard/p/6494810.html