膨胀卷积聚合多尺度上下文
Multi-Scale Context Aggregation by Dilated Convolutions|Fisher Yu、Vladlen Koltun|arXiv 2015
Ilya 为什么选它
普通卷积有个天生的短视:一层只看紧邻格点。想看得远一点,要么多堆层,要么不断把图缩小再看——可图一缩小,细节就糊了。偏偏很多任务要求「既见树木,又见森林」:比如语义分割,要给图里每个像素贴上类别标签,判断脚下这颗像素属于天空、马路还是行人,既要参考身边的纹理,又要参考整张图的布局。
2015 年,Fisher Yu 和 Vladlen Koltun 给卷积做了个小手术:在采样点之间「跳格」,而且跳距还能按倍数一路扩大。结果是不加一个参数,视野却随层数指数增长。这项技术叫膨胀卷积(Dilated Convolution,也叫空洞卷积),像给卷积装上了望远镜。
把它放进书单也顺理成章:这一板块前两篇解决了「网络深得动」的问题,这篇解决「卷积看得远」的问题。工具箱里既有深度又有视野,卷积网络的能力边界才算摸全。
从生活说起
想象你要检查一块 100×100 的大棋盘,看有没有连成片的花纹。老老实实逐格看,得走上万步;聪明的办法是隔一格看一眼:同样的步数,横竖跨度各翻倍,覆盖范围变成 4 倍。当然,跳格会漏看中间那些格子——那就换别的跳距再扫一遍:跳 1 格扫一遍、跳 2 格扫一遍、跳 4 格扫一遍,几遍咬合起来,又快又无死角。
再想一个望远镜的画面。想看清月亮上的环形山,也想过一眼整片星空,靠的不是换镜头,而是换不同倍率的目镜:镜头还是那一颗,视野却随目镜伸缩自如。膨胀卷积换的正是「看多远」,而不是「用什么看」——模板(参数)一个都不用加。
这两个画面对应同一件事:观察的范围和观察的成本,未必绑在一起。会安排跳格的人,用同样的步数看到更大的世界;会用望远镜的人,用同一颗镜头看到不同的尺度。
核心思想拆解
先看普通卷积的视野有多大。以 3×3 的小模板为例,一次只看得上身边一小圈,这圈地盘叫感受野(Receptive Field)。对识别「图里有没有猫」来说这够用,因为局部花纹最有信息量;但「这颗像素属于天空还是马路」这类问题,光看局部答不了,必须把远处的信息也请进来。
膨胀卷积的改法很轻:模板不变,采样时跳格。跳距为 1 就是普通卷积;跳距为 2,就是每隔一格取一个点;跳距为 4,每隔三格取一个点;跳距按倍数继续扩大,像望远镜一节一节拉出来。单层看,样本变稀了;但多层叠起来,感受野随层数指数增长——视野翻着倍往外扩。
最漂亮的一点是参数量不变:不管跳距是 1 还是 8,模板都还是那 9 个数。视野指数级膨胀,参数原地踏步——等于用零成本买到了「看得远」。这是「不加参数也看得更远」这句话的准确含义。
典型应用是语义分割:给每个像素贴类别标签的任务,天生要求细节与全局同时在场。膨胀卷积让网络不缩小图片也能看得远:小跳距的层管纹理,大跳距的层管布局,层层聚合成「多尺度上下文」。细节不糊,全局也到——这正是标题里「聚合」二字的分量。
动手算一算
先算视野账。从中心点出发数视野半径:某一层向两边各伸 1 格,半径是 1;下一层跳距翻倍,向两边各伸 2 格,半径 1 + 2 = 3;再下一层各伸 4 格,半径 3 + 4 = 7;再来一层各伸 8 格,半径 7 + 8 = 15。四层下来,视野从 3 格宽变成 31 格宽,而层数只用了 4 层——每层的贡献翻着倍往上涨,这就是「指数增长」的直观模样。
再算参数账。跳距 1、2、4、8 的四层,每层模板 9 个数,总共 4 × 9 = 36 个数,与跳距大小毫无关系。要是换成普通逐格卷积想覆盖同样 31 格宽的范围,一层根本不够,得叠很多层或者换大模板。省下的参数,可以拿去学更细的花纹。
最后算补漏账。跳距 4 的扫描会漏掉中间的格子,所以跳距 1、2、4、8 的多层必须配合:各管一个尺度,叠在一起才不留侦察盲区。跳格不是偷懒,是分工——每个人都看少一点,合起来才看得全。
它改变了什么
膨胀卷积很快成为语义分割等需要大视野任务的常用工具。「看得远而不加参数」这条原则,被后来的许多视觉模型继承下去:凡是要在保持细节的同时理解全局的场合,都能看到它的身影。
它和本板块前两篇正好互补:i08 ResNet 解决「深得动」,i09 恒等映射 讲清「深得动」的原理,本篇解决「看得远」,而卷积为什么长这样的地基在 i07 CS231n 里有系统讲解。深度、原理、视野,三条线在这一篇交汇,卷积网络的板块至此收官。
书单下一篇将转向循环神经网络:见 i11 RNN 的惊人有效性。处理图像靠「看」,处理序列靠「记」,工具换了,但「把结构设计讲清楚」的讲究一脉相承。
术语小词典
- 膨胀卷积 / 空洞卷积(Dilated Convolution,也称 Atrous Convolution)
- 在采样点之间跳格取值的卷积,跳距按倍数扩大。
- 感受野(Receptive Field)
- 网络上某一点能「看见」的原图范围,膨胀卷积让它指数增长。
- 语义分割(Semantic Segmentation)
- 给图中每个像素贴上类别标签的任务。
- 多尺度上下文(Multi-Scale Context)
- 从局部纹理到全局布局的多个观察层次,聚合起来才能又细又全。
- 采样跳距(膨胀率)
- 相邻采样点之间隔开的格数,如 1、2、4、8。