1.全连接层反向传播
设
C
C
为loss
全连接层输入:(bottom_data)
全连接层输出:(top_data)
z
z
假设 维度K_,
z
z
维度N_,则权值矩阵维度为N_行*K_列,batchsize=M_
全连接层每个输出
1.1bottom_diff计算:
对bottom_data求导:
∂C∂aj=∑i∂C∂zi⋅∂ziaj=∑izi′wij
∂
C
∂
a
j
=
∑
i
∂
C
∂
z
i
⋅
∂
z
i
a
j
=
∑
i
z
i
′
w
i
j
(batchsize=1时)
当batchsize不为1时,需要分别获得各个样本下的结果,组成矩阵:
caffe实现:
1.2weight_diff计算:
对weight求导:
∂C∂wij=∂C∂zi⋅∂ziwij=zi′aj
∂
C
∂
w
i
j
=
∂
C
∂
z
i
⋅
∂
z
i
w
i
j
=
z
i
′
a
j
当batchsize不为1时,需要将各个样本下的结果进行求和:
caffe实现:
1.3bias_diff计算:
对bias进行求导:
∂C∂b=∑i∂C∂zi⋅∂zib=∑izi′
∂
C
∂
b
=
∑
i
∂
C
∂
z
i
⋅
∂
z
i
b
=
∑
i
z
i
′
(batchsize=1时)
当batchsize不为1时,需要分别获得各个样本下的结果,组成向量:
caffe实现:
2.Pooling层反向传播
2.1 Max Pooling:
首先,在前向传播时,在输出新的feature map的同时,还要记录每个输出点对应于前一层feature map中的位置,放入mask或者top_mask中(top_mask是指,该mask存放在top_data里当作输出的一部分)
max pooling 前向传播caffe实现:
在反向传播时:将top_diff按照记录下来的index返回到输入层中,即只对前向传播时选中的一些位置进行误差传播,如下图:
max pooling 反向传播caffe实现:
2.2 Average Pooling
前向传播较简单,block内数值的平均值作为输出,每个输出值对应固定的输入block,如图:
反向传播,将输出层各个位置的梯度,平均分配到其对应的输入block中,如图:
average pooling 反向传播caffe实现:
3.Relu层反向传播
由Relu定义可得其导数:
其中 α α 默认为0
则Relu反向传播只需判断原始输入数据是否大于0,若大于0则将top_diff直接传到前层,否则将top_diff乘上 α α 传到前层,如图:
![Relu层前向和反向传播示意图](https://i-blog.csdnimg.cn/blog_migrate/272458282118ae68c886a8a4e1e5ce5c.png)
Relu层反向传播caffe实现:
![](https://i-blog.csdnimg.cn/blog_migrate/c2476d610d0243c0f3af9ae0b1b3067b.png)