ResNet数学模型
时间: 2025-01-03 09:39:14 浏览: 8
### ResNet 数学模型原理
ResNet(残差网络)通过引入跳跃连接解决了深层神经网络训练过程中遇到的梯度消失问题。传统卷积神经网络随着层数增加,会出现退化现象——即当网络更深时,准确率反而下降。
#### 跳跃连接的作用
在ResNet中,输入可以直接传递到后续层而无需经过激活函数或权重矩阵变换。这种设计使得前向传播过程可以表示为:
\[ y = F(x, W_i) + x \]
其中 \(F(x,W_i)\) 表示标准的堆叠几层(例如两个3×3卷积层),\(W_i\) 是这些层中的参数集合;加号后的 \(x\) 则代表来自前面某一层未经修改过的原始特征图作为捷径路径加入当前输出之中[^1]。
对于反向传播而言,在计算损失相对于输入 \(x\) 的偏导数时有:
\[
\frac{\partial L}{\partial x}=\frac{\partial L}{\partial H}\left(\frac{\partial H}{\partial x}\right)=\frac{\partial L}{\partial H}(I+\frac{\partial F}{\partial x})
\]
这里 \(L\) 为最终目标函数,\(H=F+x\) 。因为存在恒等映射部分 (\(I\)) ,即使其他项接近于零也不会完全消除梯度信号,从而缓解了梯度消失的问题[^3]。
#### 残差学习公式推导
假设理想情况下希望某个子网能够拟合出一个较浅网络所应具备的功能,则该子网应该学会逼近恒等映射 (Identity mapping),即让自己的输出尽可能等于输入。如果采用常规方法构建非常深的CNN架构去尝试捕捉这样的特性会变得异常困难,容易陷入局部最优解甚至无法收敛。
然而借助上述提到的跳过链接机制,就可以轻松实现这一点。具体来说就是把原本要学到的目标转换成“残差”,也就是实际需要调整的部分而非整个图像特征本身。这样做的好处在于它大大降低了优化难度并提高了泛化能力。
设第 l 层的期望输出为 \(y_l\) , 输入为 \(a_{l−1}\), 非线性激活之前的状态记作 z :
\[
z_l=W_la_{l-1}\\
a_l=f(z_l)
\]
那么对于两层之间的关系可以用下面这个表达式描述:
\[ a_l=f(W_2f(W_1a_{l-1}))=g(a_{l-1})
\]
现在考虑带有旁路结构的情况:
\[
a'_l=a_{l-1}+f(W_2f(W_1a_{l-1}))
\]
此时的学习任务变成了寻找合适的权值使上式的第二项趋近于0,而不是直接试图让 g 函数的结果无限靠近单位阵 I 【注意这里的 f 和 g 可以看做任意复杂的非线性操作】。这正是所谓的 “residual learning” 或者说 “learning residual functions with reference to the layer inputs”。
```python
import torch.nn as nn
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_channels, out_channels, stride=1, downsample=None):
super(BasicBlock, self).__init__()
# 定义基本的残差块组件
self.conv1 = conv3x3(in_channels, out_channels, stride)
self.bn1 = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
self.conv2 = conv3x3(out_channels, out_channels)
self.bn2 = nn.BatchNorm2d(out_channels)
self.downsample = downsample
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample is not None:
identity = self.downsample(x)
out += identity
out = self.relu(out)
return out
```
阅读全文