Xu xuのLab
首页文章专栏说说项目音乐照片墙友链关于归档
Xu xu
封面

循环卷积神经网络

写作时间:2026年10月26日 22:19

循环卷积神经网络CRNN

循环卷积神经网络(Recurrent Convolutional Neural Network,RCNN)的核心思想是:在传统卷积神经网络(CNN)中引入循环连接,使卷积特征通过多次迭代不断更新,在共享网络参数的同时提取更大范围的空间特征。

下面从 CNN 和 RNN 的基本公式出发,依次推导 RCNN 的前向传播、感受野、反向传播、梯度更新以及收敛性质。

一、从 CNN 和 RNN 推导 RCNN

1. 传统卷积神经网络(CNN)

假设输入特征图为 X∈RH×W×CinX\in\mathbb R^{H\times W\times C_{\mathrm{in}}}X∈RH×W×Cin​,其中 H,WH,WH,W 分别为特征图的高度和宽度,CinC_{\mathrm{in}}Cin​ 为输入通道数。

普通卷积层的计算公式为:

H=σ(Wf∗X+b)H=\sigma(W_f*X+b)H=σ(Wf​∗X+b)

其中,WfW_fWf​ 为卷积核,∗*∗ 表示卷积操作,bbb 为偏置项,σ\sigmaσ 为激活函数,HHH 为输出特征图。

传统 CNN 的特点是每层通过卷积从输入特征中提取信息,其层内不存在循环反馈机制。如果希望扩大感受野,通常需要增加卷积核尺寸、堆叠更多卷积层或采用空洞卷积等方式。

2. 传统循环神经网络(RNN)

RNN 的隐藏状态更新公式为:

ht=σ(Uxt+Wht−1+b)h_t=\sigma(Ux_t+Wh_{t-1}+b)ht​=σ(Uxt​+Wht−1​+b)

其中,xtx_txt​ 为当前输入,ht−1h_{t-1}ht−1​ 为上一时刻的隐藏状态,UUU 和 WWW 为对应的权重矩阵。

该公式可以分为两个部分:

Uxt⏟当前输入信息+Wht−1⏟历史状态信息\underbrace{Ux_t}_{\text{当前输入信息}} + \underbrace{Wh_{t-1}}_{\text{历史状态信息}}当前输入信息Uxt​​​+历史状态信息Wht−1​​​

因此,RNN 的本质是利用历史隐藏状态参与当前状态的计算,实现信息的循环更新。

3. 将 RNN 的循环机制引入 CNN

为了保留 CNN 的局部空间特征提取能力,同时引入 RNN 的循环反馈机制,可以将 RNN 中的矩阵乘法替换为卷积运算:

Uxt⟶Wf∗XWht−1⟶Wr∗H(t−1)\begin{aligned} Ux_t&\longrightarrow W_f*X\\ Wh_{t-1}&\longrightarrow W_r*H^{(t-1)} \end{aligned}Uxt​Wht−1​​⟶Wf​∗X⟶Wr​∗H(t−1)​

由此得到循环卷积层的核心公式:

H(t)=σ(Wf∗X+Wr∗H(t−1)+b)(1)H^{(t)} = \sigma\left( W_f*X+W_r*H^{(t-1)}+b \right) \tag{1}H(t)=σ(Wf​∗X+Wr​∗H(t−1)+b)(1)

其中,WfW_fWf​ 为前馈卷积核,WrW_rWr​ 为循环卷积核,H(t−1)H^{(t-1)}H(t−1) 表示上一轮迭代的隐藏特征图,H(t)H^{(t)}H(t) 为当前迭代的输出,ttt 表示循环次数。

与普通 CNN 不同,RCNN 的输出不仅依赖于当前输入 XXX,还依赖于上一轮提取的特征 H(t−1)H^{(t-1)}H(t−1)。在同一个循环卷积模块内,WfW_fWf​、WrW_rWr​ 和 bbb 通常在各次迭代之间共享。

二、RCNN 的前向传播推导

假设初始隐藏状态为:

H(0)=0H^{(0)}=0H(0)=0

为简化表示,定义前馈项 U=Wf∗X+bU=W_f*X+bU=Wf​∗X+b,循环卷积算子 R(H)=Wr∗H\mathcal R(H)=W_r*HR(H)=Wr​∗H,则式(1)可写为:

H(t)=σ(U+R(H(t−1)))(2)H^{(t)}=\sigma\left(U+\mathcal R(H^{(t-1)})\right) \tag{2}H(t)=σ(U+R(H(t−1)))(2)

第一次迭代: 由于初始隐藏状态为零,计算过程为:

H(1)=σ(U)=σ(Wf∗X+b)H^{(1)}=\sigma(U)=\sigma(W_f*X+b)H(1)=σ(U)=σ(Wf​∗X+b)

此时的计算形式与普通卷积层相同。

第二次迭代: 将第一次得到的特征图作为循环输入:

H(2)=σ(U+R(H(1)))=σ(Wf∗X+Wr∗σ(Wf∗X+b)+b)\begin{aligned} H^{(2)} &=\sigma\left(U+\mathcal R(H^{(1)})\right)\\ &=\sigma\left( W_f*X+W_r*\sigma(W_f*X+b)+b \right) \end{aligned}H(2)​=σ(U+R(H(1)))=σ(Wf​∗X+Wr​∗σ(Wf​∗X+b)+b)​

因此,第二次迭代不仅包含原始输入特征,还融合了第一次迭代得到的信息。

第三次迭代: 继续将第二次得到的特征反馈给循环卷积层:

H(3)=σ(U+R(H(2)))=σ(U+R[σ(U+R(σ(U)))])\begin{aligned} H^{(3)} &=\sigma\left(U+\mathcal R(H^{(2)})\right)\\ &=\sigma\left( U+\mathcal R\left[ \sigma\left(U+\mathcal R(\sigma(U))\right) \right]\right) \end{aligned}H(3)​=σ(U+R(H(2)))=σ(U+R[σ(U+R(σ(U)))])​

推广到第 TTT 次迭代:

H(T)=σ(U+R(H(T−1)))(3)H^{(T)} = \sigma\left( U+\mathcal R(H^{(T-1)}) \right) \tag{3}H(T)=σ(U+R(H(T−1)))(3)

由此可以看出,RCNN 可以沿循环维度展开为一个具有 TTT 个计算步骤的深层网络,但每个步骤共享相同的卷积参数。这使网络能够通过多次迭代逐步提取和融合特征,而不必为每次迭代引入一组新的卷积核。

三、从线性系统角度理解 RCNN

为了进一步分析循环机制,暂时忽略非线性激活函数,令 σ(z)=z\sigma(z)=zσ(z)=z,则循环关系变为:

H(t)=U+R(H(t−1))H^{(t)}=U+\mathcal R(H^{(t-1)})H(t)=U+R(H(t−1))

由 H(0)=0H^{(0)}=0H(0)=0,逐次展开可得:

H(1)=UH(2)=U+R(U)H(3)=U+R(U)+R2(U)⋮H(T)=∑k=0T−1Rk(U)\begin{aligned} H^{(1)}&=U\\ H^{(2)}&=U+\mathcal R(U)\\ H^{(3)}&=U+\mathcal R(U)+\mathcal R^2(U)\\ &\vdots\\ H^{(T)}&=\sum_{k=0}^{T-1}\mathcal R^k(U) \end{aligned}H(1)H(2)H(3)H(T)​=U=U+R(U)=U+R(U)+R2(U)⋮=k=0∑T−1​Rk(U)​

其中,Rk\mathcal R^kRk 表示循环卷积算子连续作用 kkk 次。

该公式说明:在线性情况下,RCNN 的输出相当于将输入特征经过不同深度的循环卷积处理后进行累积。 随着循环次数增加,网络能够融合更多次空间变换后的特征。

若循环算子满足 ∥R∥<1\|\mathcal R\|<1∥R∥<1,当 T→∞T\to\inftyT→∞ 时,根据 Neumann 级数:

H(∞)=∑k=0∞Rk(U)=(I−R)−1U(4)H^{(\infty)} = \sum_{k=0}^{\infty}\mathcal R^k(U) = (I-\mathcal R)^{-1}U \tag{4}H(∞)=k=0∑∞​Rk(U)=(I−R)−1U(4)

这表明,在线性且满足收敛条件的情况下,RCNN 可以被理解为一种具有反馈机制的空间滤波系统。

对于实际采用 ReLU 等非线性激活的 RCNN,不能直接使用上述线性级数,但可以通过固定点方程描述其稳定状态:

H∗=σ(U+R(H∗))(5)H^*=\sigma(U+\mathcal R(H^*)) \tag{5}H∗=σ(U+R(H∗))(5)

如果激活函数的 Lipschitz 常数为 LσL_\sigmaLσ​,且满足:

Lσ∥R∥<1L_\sigma\|\mathcal R\|<1Lσ​∥R∥<1

那么对应的状态更新映射具有压缩性,迭代将收敛到唯一固定点。

四、RCNN 感受野的数学推导

RCNN 的重要优势之一是可以通过循环迭代扩大理论感受野。

假设前馈卷积核与循环卷积核均为 3×33\times33×3,卷积步长为 1,不采用池化或空洞卷积,且初始隐藏状态为零。

第一次迭代的感受野边长为:

R1=3R_1=3R1​=3

第二次迭代中,循环卷积处理上一轮输出,使理论感受野扩大:

R2=3+(3−1)=5R_2=3+(3-1)=5R2​=3+(3−1)=5

第三次迭代:

R3=5+(3−1)=7R_3=5+(3-1)=7R3​=5+(3−1)=7

推广到第 TTT 次迭代:

RT=kf+(T−1)(kr−1)(6)R_T=k_f+(T-1)(k_r-1) \tag{6}RT​=kf​+(T−1)(kr​−1)(6)

其中,kfk_fkf​ 为前馈卷积核边长,krk_rkr​ 为循环卷积核边长。

当 kf=kr=3k_f=k_r=3kf​=kr​=3 时:

RT=2T+1(7)R_T=2T+1 \tag{7}RT​=2T+1(7)

例如:

循环次数 TTT理论感受野感受野面积
13×33\times33×39
25×55\times55×525
37×77\times77×749
49×99\times99×981
511×1111\times1111×11121

由此可知,在这些假设条件下,循环次数每增加一次,理论感受野边长增加 2。因此,RCNN 可以通过重复使用卷积核扩大特征感知范围,而不必增加新的循环卷积核参数。

需要注意,理论感受野并不等同于有效感受野。实际特征对输出的影响范围还受到权重分布、激活函数及网络训练情况等因素的影响。

五、RCNN 的反向传播推导(BPTT)

由于 RCNN 在多次迭代中共享相同的卷积参数,因此训练时需要利用时间反向传播(Backpropagation Through Time,BPTT),将各个迭代步骤产生的梯度累加到共享参数上。

1. 定义前向传播和损失函数

令:

A(t)=Wf∗X+Wr∗H(t−1)+bH(t)=σ(A(t))\begin{aligned} A^{(t)}&=W_f*X+W_r*H^{(t-1)}+b\\ H^{(t)}&=\sigma(A^{(t)}) \end{aligned}A(t)H(t)​=Wf​∗X+Wr​∗H(t−1)+b=σ(A(t))​

假设最终隐藏状态 H(T)H^{(T)}H(T) 经过分类器得到预测结果:

y^=softmax⁡(g(H(T)))\hat y=\operatorname{softmax}(g(H^{(T)}))y^​=softmax(g(H(T)))

采用交叉熵损失函数:

L=−∑c=1Cyclog⁡y^c\mathcal L=-\sum_{c=1}^{C}y_c\log\hat y_cL=−c=1∑C​yc​logy^​c​

训练目标是计算损失函数对前馈卷积核 WfW_fWf​、循环卷积核 WrW_rWr​ 和偏置 bbb 的梯度,再更新参数。

2. 最后一次迭代的梯度

定义第 ttt 次迭代的误差项:

δ(t)=∂L∂A(t)\delta^{(t)} = \frac{\partial\mathcal L}{\partial A^{(t)}}δ(t)=∂A(t)∂L​

根据链式法则,最后一次迭代满足:

δ(T)=∂L∂H(T)⊙σ′(A(T))(8)\delta^{(T)} = \frac{\partial\mathcal L}{\partial H^{(T)}} \odot\sigma'(A^{(T)}) \tag{8}δ(T)=∂H(T)∂L​⊙σ′(A(T))(8)

其中,⊙\odot⊙ 表示逐元素相乘。如果激活函数采用 ReLU,则在非零点:

σ′(z)={1,z>00,z<0\sigma'(z)= \begin{cases} 1,&z>0\\ 0,&z<0 \end{cases}σ′(z)={1,0,​z>0z<0​

3. 梯度沿循环步骤反向传播

由于:

A(t+1)=Wf∗X+Wr∗H(t)+bA^{(t+1)} = W_f*X+W_r*H^{(t)}+bA(t+1)=Wf​∗X+Wr​∗H(t)+b

第 ttt 次迭代的隐藏状态会直接影响第 t+1t+1t+1 次迭代,因此必须将后一轮误差继续反向传递。

设 R∗\mathcal R^*R∗ 为循环卷积算子 R\mathcal RR 的伴随算子,即卷积反向传播中将输出梯度传回输入特征图的线性算子。

当损失函数只依赖于最后一次迭代的输出时,有:

∂L∂H(t)=R∗(δ(t+1))\frac{\partial\mathcal L}{\partial H^{(t)}} = \mathcal R^*(\delta^{(t+1)})∂H(t)∂L​=R∗(δ(t+1))

结合激活函数的导数:

δ(t)=R∗(δ(t+1))⊙σ′(A(t))(9)\delta^{(t)} = \mathcal R^*(\delta^{(t+1)}) \odot\sigma'(A^{(t)}) \tag{9}δ(t)=R∗(δ(t+1))⊙σ′(A(t))(9)

从 t=T−1t=T-1t=T−1 开始,依次反向递推到 t=1t=1t=1,即可求得所有迭代步骤的误差。

如果中间隐藏状态也直接参与损失函数,则梯度递推式中还需要加入这些损失对应的直接梯度项。

4. 循环卷积核的梯度

由于每次迭代共享同一组 WrW_rWr​,因此总梯度等于所有循环步骤对该参数的梯度贡献之和。

采用深度学习框架中常见的互相关形式,循环卷积核中某一元素 Wu,v,c,qrW^r_{u,v,c,q}Wu,v,c,qr​ 的梯度为:

∂L∂Wu,v,c,qr=∑t=1T∑i,jHi+u,j+v,c(t−1)δi,j,q(t)(10)\frac{\partial\mathcal L} {\partial W^r_{u,v,c,q}} = \sum_{t=1}^{T} \sum_{i,j} H^{(t-1)}_{i+u,j+v,c} \delta^{(t)}_{i,j,q} \tag{10}∂Wu,v,c,qr​∂L​=t=1∑T​i,j∑​Hi+u,j+v,c(t−1)​δi,j,q(t)​(10)

其中,u,vu,vu,v 表示卷积核位置,ccc 表示输入通道,qqq 表示输出通道,i,ji,ji,j 表示输出特征图的位置。超出图像边界的位置按相应的 padding 规则处理。

同理,前馈卷积核在各次迭代中也被重复使用,其梯度为:

∂L∂Wu,v,c,qf=∑t=1T∑i,jXi+u,j+v,cδi,j,q(t)(11)\frac{\partial\mathcal L} {\partial W^f_{u,v,c,q}} = \sum_{t=1}^{T} \sum_{i,j} X_{i+u,j+v,c} \delta^{(t)}_{i,j,q} \tag{11}∂Wu,v,c,qf​∂L​=t=1∑T​i,j∑​Xi+u,j+v,c​δi,j,q(t)​(11)

偏置梯度为:

∂L∂bq=∑t=1T∑i,jδi,j,q(t)(12)\frac{\partial\mathcal L}{\partial b_q} = \sum_{t=1}^{T}\sum_{i,j} \delta^{(t)}_{i,j,q} \tag{12}∂bq​∂L​=t=1∑T​i,j∑​δi,j,q(t)​(12)

因此,RCNN 与普通 CNN 在梯度计算上的主要区别在于:循环卷积核的梯度需要沿多个迭代步骤反向传播,并将所有步骤的贡献进行累加。

5. 参数更新

得到全部梯度后,可以采用梯度下降、Adam 等优化算法更新参数。以梯度下降为例:

Wf←Wf−η∂L∂WfWr←Wr−η∂L∂Wrb←b−η∂L∂b\begin{aligned} W_f&\leftarrow W_f-\eta\frac{\partial\mathcal L}{\partial W_f}\\ W_r&\leftarrow W_r-\eta\frac{\partial\mathcal L}{\partial W_r}\\ b&\leftarrow b-\eta\frac{\partial\mathcal L}{\partial b} \end{aligned}Wf​Wr​b​←Wf​−η∂Wf​∂L​←Wr​−η∂Wr​∂L​←b−η∂b∂L​​

其中,η\etaη 为学习率。

因此,RCNN 的完整训练过程为:

前向循环迭代 → 计算损失函数 → 沿循环步骤反向传播 → 累加共享参数梯度 → 更新网络参数。

六、RCNN 的梯度消失与梯度爆炸

由于 RCNN 的梯度需要跨越多个循环步骤,其训练过程也可能出现梯度消失和梯度爆炸。

定义第 ttt 次迭代的 Jacobian 矩阵:

Jt=∂H(t)∂H(t−1)J_t= \frac{\partial H^{(t)}}{\partial H^{(t-1)}}Jt​=∂H(t−1)∂H(t)​

将特征图展平后,可表示为:

Jt=DtRJ_t=D_t\mathcal RJt​=Dt​R

其中:

Dt=diag⁡(σ′(A(t)))D_t=\operatorname{diag}(\sigma'(A^{(t)}))Dt​=diag(σ′(A(t)))

根据链式法则,最终损失函数对第 sss 次迭代隐藏状态的梯度为:

∂L∂H(s)=Js+1⊤Js+2⊤⋯JT⊤∂L∂H(T)(13)\frac{\partial\mathcal L}{\partial H^{(s)}} = J_{s+1}^{\top}J_{s+2}^{\top}\cdots J_T^{\top} \frac{\partial\mathcal L}{\partial H^{(T)}} \tag{13}∂H(s)∂L​=Js+1⊤​Js+2⊤​⋯JT⊤​∂H(T)∂L​(13)

可以看到,梯度由多个 Jacobian 矩阵连续相乘得到。如果这些矩阵乘积的范数趋近于零,就可能出现梯度消失;如果乘积持续放大,则可能出现梯度爆炸。

因此,当循环次数较多时,网络训练的稳定性可能下降。实际模型中可以采用残差连接、归一化、梯度裁剪或门控循环结构等方法缓解上述问题。

七、RCNN 与普通 CNN 的参数量比较

假设前馈卷积核和循环卷积核均为 3×33\times33×3,输入通道数为 CinC_{\mathrm{in}}Cin​,隐藏通道数为 ChC_hCh​。

前馈卷积核参数量为:

Nf=9CinChN_f=9C_{\mathrm{in}}C_hNf​=9Cin​Ch​

循环卷积核参数量为:

Nr=9Ch2N_r=9C_h^2Nr​=9Ch2​

若包含每个输出通道一个共享偏置,则循环卷积模块的总参数量为:

NRCNN=9CinCh+9Ch2+Ch(14)N_{\mathrm{RCNN}} = 9C_{\mathrm{in}}C_h+9C_h^2+C_h \tag{14}NRCNN​=9Cin​Ch​+9Ch2​+Ch​(14)

这一参数量不直接依赖循环次数 TTT。因此,循环 3 次和循环 10 次使用的仍然是同一组参数。

相比之下,如果采用 TTT 个具有独立参数的普通卷积层,且各层输入、输出通道数均为 ChC_hCh​,其参数量为:

NCNN=T(9Ch2+Ch)(15)N_{\mathrm{CNN}}=T(9C_h^2+C_h) \tag{15}NCNN​=T(9Ch2​+Ch​)(15)

由此可以看出,RCNN 的主要优势在于通过共享参数实现多次特征变换。但需要注意,随着循环次数增加,卷积计算量通常仍会增长,反向传播的存储开销也可能增加。

八、RCNN、ConvRNN 与 CRNN 的区别

这三个名称在相关研究中容易混淆。

RCNN(Recurrent Convolutional Neural Network) 通常指在卷积模块内部引入循环连接,对同一个输入特征图进行多次迭代更新:

H(t)=σ(Wf∗X+Wr∗H(t−1)+b)H^{(t)} = \sigma(W_f*X+W_r*H^{(t-1)}+b)H(t)=σ(Wf​∗X+Wr​∗H(t−1)+b)

ConvRNN(Convolutional Recurrent Neural Network) 一般用于时空序列建模,其输入随时间发生变化:

Ht=σ(Wx∗Xt+Wh∗Ht−1+b)H_t = \sigma(W_x*X_t+W_h*H_{t-1}+b)Ht​=σ(Wx​∗Xt​+Wh​∗Ht−1​+b)

其中 XtX_tXt​ 表示第 ttt 个时间步的输入,例如视频序列中的当前帧特征,因此可以同时处理空间信息和时间依赖关系。

CRNN 在另一种常见用法中指 CNN 与 RNN 串联的网络结构,先使用 CNN 提取空间特征,再将特征序列输入 RNN 或 LSTM:

X→CNNF→RNNH→OutputY^X\xrightarrow{\mathrm{CNN}}F \xrightarrow{\mathrm{RNN}}H \xrightarrow{\mathrm{Output}}\hat YXCNN​FRNN​HOutput​Y^

这种结构常用于文本识别、语音识别等任务,与卷积层内部存在循环反馈连接的 RCNN 并不完全相同。

九、总结

循环卷积神经网络的数学原理可以归纳为以下三个方面。

(1)循环特征更新。 在传统卷积计算中引入上一轮隐藏状态,使网络能够不断迭代和融合特征:

H(t)=σ(Wf∗X+Wr∗H(t−1)+b)H^{(t)} = \sigma(W_f*X+W_r*H^{(t-1)}+b)H(t)=σ(Wf​∗X+Wr​∗H(t−1)+b)

(2)感受野扩展。 在步长为 1、无空洞卷积等条件下,理论感受野随循环次数增加:

RT=kf+(T−1)(kr−1)R_T=k_f+(T-1)(k_r-1)RT​=kf​+(T−1)(kr​−1)

(3)参数共享与梯度累积。 循环迭代使用相同的卷积参数,其梯度需要通过 BPTT 计算并累加:

∇WrL=∑t=1T∇WrL∣t\nabla_{W_r}\mathcal L = \sum_{t=1}^{T} \left.\nabla_{W_r}\mathcal L\right|_t∇Wr​​L=t=1∑T​∇Wr​​L∣t​

这里右侧表示第 ttt 次迭代对共享参数梯度的贡献,并且包含由后续迭代反向传播得到的影响。

综上,RCNN 的本质是利用循环反馈与卷积参数共享,将有限参数的卷积模块展开为具有多个计算步骤的深层特征提取网络。 它能够在不随循环次数增加卷积参数量的情况下,逐步扩大理论感受野、融合不同迭代深度的特征信息,但也需要考虑迭代计算开销以及梯度传播稳定性等问题。

交流与留言

留下你的想法,和大家聊聊。

avatar

Xu xu

每一次进步 都再进一步

NOW PLAYING

cover

1022-比尔的歌

Bomb比尔