1. 深度网络的困境与残差连接的诞生
在2015年之前,深度学习社区普遍认为"网络越深,性能越好"。但实际情况却让人大跌眼镜——当网络深度超过20层后,准确率不升反降。这个问题在ImageNet等大型数据集上尤为明显。我当时在复现VGG网络时就遇到过这个坑:明明增加了更多卷积层,测试准确率却下降了3个百分点。
问题的根源在于梯度传播的衰减。传统的前馈神经网络中,梯度需要通过链式法则从输出层反向传播到输入层。当网络过深时,连续的乘法操作会导致梯度值指数级缩小(消失)或放大(爆炸)。想象一下用0.9连续乘以自己20次,结果会趋近于0——这就是深层网络难以训练的本质原因。
何恺明团队提出的残差连接(Residual Connection)巧妙地解决了这个问题。其核心思想可以用一个简单公式表示:H(x) = F(x) + x。这里的x是输入特征,F(x)是神经网络要学习的残差映射。这种设计让网络拥有了"短路"能力——当F(x)=0时,H(x)就等同于原始输入x。在实际项目中,我发现这种结构让50层网络的训练变得和20层网络一样稳定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BasicBlock:浅层网络的基石
2.1 结构解析与实现细节
BasicBlock是ResNet-18和ResNet-34的核心组件,它的设计极其简洁:
- 两个3×3卷积层构成主路径
- 每个卷积后接BatchNorm和ReLU激活
- 通过shortcut连接实现残差相加
用PyTorch实现时需要注意几个关键点:
python复制class BasicBlock(nn.Module):
expansion = 1 # 通道扩展系数
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3,
stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_cha
