从零开始理解 ResNet(上):为什么 CNN 需要“残差连接”?

从零开始理解 ResNet(上):为什么 CNN 需要"残差连接"?


🔥 星恒随风: 个人主页 ❄️ 个人专栏: 《指针合集》 《C语言基础》 《数据结构》 《机器学习导论》 《前端基础》 ✨ 数据即知识,压缩即智能


书接上回:
上一篇我们讲了 CNN。CNN 的核心思想是通过 卷积核局部扫描、参数共享、层次化特征提取 来理解图像。

但当我们继续往下学时,一个新问题马上出现: 既然 CNN 越深越能提取复杂特征,那是不是把网络一直加深就可以了?

ResNet 的故事,正是从这个问题开始的。

目录

  • [从零开始理解 ResNet(上):为什么 CNN 需要"残差连接"?](#从零开始理解 ResNet(上):为什么 CNN 需要“残差连接”?)
    • [一、从 CNN 到 ResNet:网络越深真的越好吗?](#一、从 CNN 到 ResNet:网络越深真的越好吗?)
    • 二、深层网络的现实问题:不是越深越好训
    • 三、什么是退化问题?
    • [四、ResNet 的核心思路:不要直接学完整答案,而是学"修正量"](#四、ResNet 的核心思路:不要直接学完整答案,而是学“修正量”)
    • 五、什么叫"残差"?
    • 六、用作文修改理解残差学习
    • [七、shortcut connection:给信息开一条"近路"](#七、shortcut connection:给信息开一条“近路”)
    • [八、shortcut connection 为什么有用?](#八、shortcut connection 为什么有用?)
    • [九、从"爬楼梯"理解 ResNet](#九、从“爬楼梯”理解 ResNet)
    • [十、为什么 ResNet 不是简单"作弊"?](#十、为什么 ResNet 不是简单“作弊”?)
    • [十一、ResNet 到底解决了什么?](#十一、ResNet 到底解决了什么?)
    • 十二、上篇总结

一、从 CNN 到 ResNet:网络越深真的越好吗?

在 CNN 中,不同层通常会学习不同层次的视觉特征。

浅层更关注:

text 复制代码
边缘
颜色变化
亮暗对比
简单纹理

中间层进一步组合这些低级特征:

text 复制代码
角点
局部形状
叶脉纹理
病斑边缘

更深层则可能学到更抽象的语义信息:

text 复制代码
叶片区域
病害区域
目标部件
类别相关特征

所以,一个很自然的想法是:
如果网络越深,能学到越复杂的特征,那是不是只要不断加深 CNN 就可以提升效果?

这个想法有道理,但实际训练中并不总是成立。


二、深层网络的现实问题:不是越深越好训

理论上,更深的网络表达能力更强。

但是实际训练时,研究者发现:如果只是简单地把普通卷积层一层层堆上去,网络加深以后,效果不一定变好,甚至可能变差。

更关键的是,这种变差并不只是过拟合。

过拟合通常表现为:

训练集效果很好

测试集效果不好

但深层普通网络有时会出现另一种现象:

训练集误差也变高

测试集误差也变高

这说明模型不是"记得太多",而是连训练集都没有很好地学会。

这个问题被称为:
退化问题,Degradation Problem


三、什么是退化问题?

退化问题可以这样理解:

网络加深后,按理说能力应该更强;

但实际训练时,更深的普通网络训练误差反而更高。

这件事很反直觉。

假设一个 20 层网络已经能做得不错,那么一个 56 层网络理论上至少可以这样做:

text 复制代码
前 20 层照常工作;
后面 36 层什么都不改变,只负责把信息原样传下去。

也就是说,更深的网络至少应该能模拟浅层网络。

但是在普通深层 CNN 中,让后面几十层自动学会"什么都不做",并不是一件容易的事。

这就是 ResNet 要解决的关键问题:
普通深层网络很难自动学会恒等映射。这句话目前听起来好像很难理解,没事我们换个说法
也就是说,它很难学会:"如果这一层暂时没必要改变特征,那就让信息原样通过。"



图 1:普通 CNN 简单堆深后,训练误差可能不降反升,这就是退化问题。
配图画法:
画两条训练误差曲线:浅层 Plain Net 曲线逐渐下降;更深 Plain Net 曲线反而更高。下方标注:"更深不等于更好训"。


四、ResNet 的核心思路:不要直接学完整答案,而是学"修正量"

普通 CNN 中,若干层网络要直接学习一个目标映射:

text 复制代码
H(x)

意思是:

text 复制代码
输入 x
经过几层网络
直接得到目标输出 H(x)

ResNet 换了一个角度。

它不要求网络直接学习完整的 H(x),而是让网络学习:

text 复制代码
F(x) = H(x) - x

最后再把输入 x 加回来:
H(x) = F(x) + x

这里:

text 复制代码
x:原来的输入
F(x):残差,也就是需要修改的部分
F(x) + x:最终输出

所以 ResNet 的核心不是"多加几层",而是改变了网络要学习的目标。


五、什么叫"残差"?

"残差"这个词听起来比较数学,其实可以理解成:
残差 = 原始输入距离目标输出还差多少。

如果目标输出是 H(x),原始输入是 x,那么残差就是:

text 复制代码
F(x) = H(x) - x

这就像写作文的时你已经写了一个初稿,而当你修改的时候不会让你从头再写一遍,而是告诉你:

text 复制代码
这里改一点;
那里补一点;
这个地方删一点;
整体结构保留。

这时你要学的不是"从零写完整答案",而是"如何修改已有答案"。


六、用作文修改理解残差学习

直接学习 H(x),像是:

text 复制代码
把原文全部删掉,从头重写一篇文章。

学习 F(x),像是:

text 复制代码
保留原文,只修改需要改的地方。

显然,第二种更容易。

ResNet 的直觉也是这样:
普通 CNN:每个模块都试图重新生成新特征。
ResNet:每个残差块只需要学习"在原有特征上应该改什么"。也就是把之前学到的特征直接拼接到下一层

这就是残差学习更容易优化的一个重要原因。


七、shortcut connection:给信息开一条"近路"

ResNet 中最醒目的结构就是:

text 复制代码
shortcut connection

也叫:

text 复制代码
skip connection

中文可以理解为:

抄近道连接

它的作用是让输入 x 不必完全经过中间卷积层,而是可以直接绕过去,参与最后的相加。

残差块可以简化为:

text 复制代码
输入 x
     │
     ├──────────────┐
     ↓              │
若干卷积层得到 F(x) │
     ↓              │
     └──── F(x) + x ←┘

最终输出是:

text 复制代码
y = F(x) + x

这条 shortcut 看起来只是多了一条线,但它改变了深层网络的信息流动方式。



图 2:残差块通过 shortcut connection 把输入直接加到输出上,让网络学习 F(x) 而不是直接学习 H(x)。


八、shortcut connection 为什么有用?

shortcut connection 至少有三个重要作用。

作用 直观理解
更容易学习恒等映射 如果某个残差块暂时没必要改变特征,只要让 F(x) 接近 0,输出就接近 x
保留原始信息 输入信息不会被后续卷积层完全覆盖,而是可以直接参与输出
改善梯度传递 反向传播时,梯度有了一条更直接的回传路径

用一句话概括:
shortcut 让深层网络不再必须一层层重新总结信息,而是有了更顺畅的信息通道。


九、从"爬楼梯"理解 ResNet

普通深层 CNN 像是从一楼爬到很高的楼层。

每一层都必须一级一级走:

text 复制代码
1 楼 → 2 楼 → 3 楼 → 4 楼 → ...

如果中间某一层走偏了,后面的层都会受到影响。

ResNet 像是在楼梯不同楼层之间的电梯,让你可以直接到达目标楼层。

这些通道不能直接让你飞到终点,但可以让信息更顺畅地跨层流动。
也就是说:
普通 CNN 是"层层传递";ResNet 是"层层传递 + 适当抄近道"。
这使得网络变深以后,信息不至于在漫长的层间传递中逐渐丢失。


十、为什么 ResNet 不是简单"作弊"?

有同学可能会想:

text 复制代码
既然输入可以直接绕过去,那网络是不是没有认真学习?

不是。

shortcut 不是让网络跳过学习,而是让网络可以选择:

text 复制代码
需要修改的地方,交给 F(x) 学;
不需要修改的地方,允许 x 直接保留。

这更像是一种灵活机制。

如果当前特征已经不错,残差块可以少改。

如果当前特征还不够好,残差块就可以学习更多修正量。

所以 ResNet 不是偷懒,而是把学习目标从:

text 复制代码
重新构造全部特征

变成了:

text 复制代码
在已有特征上做有效修正

十一、ResNet 到底解决了什么?

现在我们可以回答一个核心问题:
ResNet 到底解决了什么?

它主要解决的是:

text 复制代码
深层 CNN 难以优化的问题

更具体地说:
第一, 普通深层网络加深后可能出现退化问题。
第二, ResNet 让网络学习残差 F(x),而不是直接学习完整映射 H(x)。
第三, shortcut connection 让输入 x 可以直接参与输出。
第四, 当某些层暂时不需要改变特征时,只需要让 F(x) 接近 0,输出就接近 x。
**第五,**残差连接让信息流和梯度流更加顺畅。


十二、上篇总结

这一篇讲清了 ResNet 出现的原因。

普通 CNN 简单堆深以后,可能出现退化问题。

ResNet 的解决思路是:

text 复制代码
不直接学习 H(x)
而是学习 F(x) = H(x) - x
最后输出 F(x) + x

这就像:

text 复制代码
不要每次从头重写答案;
而是在已有答案上不断修正。
相关推荐
码农阿强9 小时前
OpenCode 快速配置指南:三步完成部署与接口对接
人工智能·ai·aigc·ai编程·gpu算力
z小猫不吃鱼9 小时前
08 BERT 论文精读:双向 Transformer 如何学习语言表示?
学习·bert·transformer
月光船幽幽9 小时前
四层门禁+自愈机制
人工智能·科技·动态规划·拓扑学
无忧智库9 小时前
某能源集团多Agent协同的电力交易策略优化与实时调度决策系统建设方案(WORD)
大数据·人工智能·自动化
乌恩大侠9 小时前
X5G:一个基于 NVIDIA ARC 与 OpenAirInterface 的开放、可编程、多厂商私有 5G O-RAN 测试平台
人工智能·5g·o-ru
shuaiqinke9 小时前
【分享】医维度解剖 3D人体模型 解剖学习超直观
学习·3d
学习中.........9 小时前
大语言模型的采样参数与输出控制机制
人工智能·机器学习·语言模型
Agent手记9 小时前
传统工厂的工单自动排程如何用AI解决?从大模型推理到端到端自动化的闭环实战
运维·人工智能·ai·自动化
星秀日9 小时前
rust学习入门
开发语言·学习·rust