CNN反向传播求解:基于给定网络结构与δ参数的完整推导
没问题,我来一步步给你推这个CNN的反向传播过程,咱们从已知的全连接层误差δH₁=0.25、δH₂=-0.15开始,逐层往回计算各层参数的梯度以及误差项的回传:
1. 全连接层(FC1)的梯度计算
首先明确全连接层的结构:激活层输出的2x2特征图会被展平成4维向量(记为A_flat = [A₁₁, A₁₂, A₂₁, A₂₂]^T),全连接层权重矩阵W_fc是2×4的矩阵,偏置b_fc是2×1的向量,输出H = [H₁, H₂]^T。
已知该层的误差项δH = [0.25, -0.15]^T,我们可以计算:
- 权重梯度
dW_fc:每个元素为误差项对应神经元与展平后激活值的乘积,公式为:
展开后就是一个2×4的矩阵,比如第一行是dW_fc[i][j] = δH[i] * A_flat[j] (i=0,1;j=0,1,2,3)0.25*A₁₁, 0.25*A₁₂, 0.25*A₂₁, 0.25*A₂₂,第二行是-0.15*A₁₁, -0.15*A₁₂, -0.15*A₂₁, -0.15*A₂₂。 - 偏置梯度
db_fc:偏置的梯度直接等于对应神经元的误差项,因为偏置只作用于单个神经元:db_fc = [δH₁, δH₂]^T = [0.25, -0.15]^T
2. Sigmoid激活层的误差回传
激活层的输入是池化后的2x2特征图F₂,输出A = σ(F₂)(σ是logistic sigmoid函数)。我们需要把全连接层的误差回传到激活层的输入F₂,得到误差项δA(对应F₂的误差)。
Sigmoid函数的导数特性是σ'(z) = σ(z)*(1-σ(z)) = A*(1-A),所以误差项的计算是:
δA[i][j] = (W_fc[0][2i+j] * δH₁ + W_fc[1][2i+j] * δH₂) * A[i][j]*(1-A[i][j])
这里2i+j是展平向量的索引对应关系(比如i=0,j=0对应索引0;i=0,j=1对应索引1,以此类推),*表示元素-wise乘法。最终δA是一个2x2的矩阵,每个元素对应池化后特征图的位置误差。
3. 最大池化层的误差回传
池化层是2×2最大池化、步长2,输入是4x4的卷积特征图F₁,输出是2x2的F₂。最大池化没有可训练参数,回传误差时需要把δA的值放回F₁中对应池化窗口内最大值的位置,窗口内其他位置误差为0。
具体来说:
F₁被分成4个不重叠的2×2窗口,分别对应F₂的4个元素:- 窗口1(F₁的(0,0)-(1,1))对应F₂的(0,0),若该窗口最大值在F₁的(p1,q1)位置,则
δF₁[p1][q1] = δA[0][0],窗口内其他3个位置为0; - 窗口2(F₁的(0,2)-(1,3))对应F₂的(0,1),若最大值在F₁的(p2,q2)位置,则
δF₁[p2][q2] = δA[0][1],其他位置为0; - 窗口3(F₁的(2,0)-(3,1))对应F₂的(1,0),同理赋值;
- 窗口4(F₁的(2,2)-(3,3))对应F₂的(1,1),同理赋值。
- 窗口1(F₁的(0,0)-(1,1))对应F₂的(0,0),若该窗口最大值在F₁的(p1,q1)位置,则
最终δF₁是一个4x4的矩阵,只有4个位置有非零值(对应每个池化窗口的最大值位置),其余为0。
4. 卷积层的梯度计算
卷积层使用2×2卷积核W_c、步长1,输入是5x5的图像X,输出是4x4的F₁。现在我们计算卷积核的梯度dW_c和偏置的梯度db_c:
- 卷积核梯度
dW_c:采用互相关运算,每个元素是输入X对应区域与δF₁对应位置的乘积之和,公式为:
比如dW_c[m][n] = Σ(i=0到3) Σ(j=0到3) X[i+m][j+n] * δF₁[i][j] (m=0,1;n=0,1)dW_c[0][0]就是所有X[i][j] * δF₁[i][j]的和(m=0,n=0时i+m=i,j+n=j)。 - 偏置梯度
db_c:偏置作用于卷积后的每个元素,所以梯度是δF₁所有元素的和:db_c = Σ(i=0到3) Σ(j=0到3) δF₁[i][j]
5. 输入层的梯度(可选)
如果需要计算输入图像X的梯度dX,可以通过δF₁与卷积核W_c的全卷积运算得到(需要对δF₁补1层零,使其尺寸变为5x5),公式为:
dX[i][j] = Σ(m=0到1) Σ(n=0到1) W_c[m][n] * δF₁[i-m][j-n]
这里当i-m或j-n不在0-3范围内时,δF₁取0。最终dX是一个5x5的矩阵,对应输入图像每个像素的梯度。
内容的提问来源于stack exchange,提问作者koryakinp

