4、融合动机分析:CNN的局部性与自注意力的全局性如何互补?各自的瓶颈在哪?
好,咱们今天聊点实在的。
做模型融合,不能光看效果涨了点就完事。你得搞清楚——为什么CNN和Transformer放一起能干活? 它们各自的优势到底在哪,短板又在哪?
我个人习惯,动手之前先想清楚动机。不然调参调到怀疑人生,都不知道在调什么。
4.1 CNN的局部性:看得近,但看得清
CNN的核心优势,说白了就是局部感受野。
一个3×3的卷积核,每次只看周围9个像素。这带来了两个好处:
- 平移等变性:猫在图片左边还是右边,卷积都能认出来
- 参数高效:权重共享,参数量远小于全连接
但问题也在这——它看不到远处的东西。
举个例子。你有一张图,左边是狗头,右边是狗尾巴。CNN要堆十几层卷积,才能把这两个位置的信息关联起来。为什么?因为每层只能看一小块,信息得一层层传过去。
CNN的瓶颈:
- 感受野增长慢:靠堆深度才能看到全局
- 长距离依赖弱:两个远距离像素的关系,需要很多中间层传递
- 下采样丢失细节:池化或步长卷积会丢掉空间信息
我在项目中遇到过一件事。做医学图像分割,病灶很小,但需要结合整个器官的上下文来判断。纯CNN模型,小病灶经常漏掉。后来分析发现,就是感受野不够,模型只看到了局部纹理,没看到整体结构。
4.2 自注意力的全局性:看得远,但看不清细节
自注意力机制,一上来就看整张图。
每个像素跟所有其他像素算相似度,然后加权聚合。这带来了全局感受野——任何两个位置,一步就能交互。
但代价也很明显:
- 计算复杂度是O(n²):n是像素数。一张256×256的图,n=65536,计算量直接爆炸
- 缺乏局部先验:它不知道相邻像素应该更相关,全靠数据学
- 小数据容易过拟合:全局交互的参数太多,数据不够就学偏
注意:自注意力的全局性,有时候反而是缺点。
比如做边缘检测,你只需要看局部梯度变化,不需要知道远处是什么。强行做全局注意力,反而引入噪声。
我曾经试过用纯Transformer做图像分类,小数据集上效果还不如ResNet。后来加了个卷积stem(就是开头几层用卷积),效果立马好了。为什么?因为卷积帮它先提取了局部特征,注意力再去做全局建模,分工明确。
4.3 互补性:一个看树,一个看林
现在你应该明白了。
CNN擅长局部纹理、边缘、形状这些底层特征。自注意力擅长全局关系、长距离依赖、上下文理解。
它们不是谁替代谁的关系,而是互补的。
| 维度 | CNN | 自注意力 |
|---|---|---|
| 感受野 | 局部(小) | 全局(大) |
| 计算复杂度 | O(k²·n)(线性) | O(n²)(平方) |
| 参数效率 | 高(权重共享) | 低(每个位置独立) |
| 平移等变性 | 天然具备 | 需要位置编码 |
| 长距离依赖 | 弱(需堆层) | 强(一步到位) |
| 小数据表现 | 好 | 差(易过拟合) |
所以融合的思路很清晰:让CNN负责局部特征提取,让自注意力负责全局关系建模。
你想想看,这就像团队合作。一个人擅长细节,一个人擅长大局观。两个人配合,才能把事做好。
4.4 核心逻辑图
下面这张图,我画了CNN和自注意力的互补关系。你看一眼就懂了。
我的建议:
做融合时,别想着「哪个更好」。要想「哪个阶段用哪个」。
浅层用CNN,深层用注意力。或者并行分支,一个走局部,一个走全局,最后融合。这都是经过验证的好方案。
4.5 避坑指南
最后说几个我踩过的坑:
- 别盲目堆注意力:我曾经在浅层就加全局注意力,结果计算量翻倍,效果没涨。后来发现,浅层特征分辨率高,注意力算不过来,而且局部信息更重要。
- 注意分辨率:自注意力在16×16或更小的特征图上用,性价比最高。再大就扛不住了。
- 别忘了位置编码:自注意力本身没有位置信息。不加位置编码,模型分不清「左上角」和「右下角」的区别。
- 小数据集慎用:数据少于10万张,纯Transformer容易翻车。加个卷积stem能救回来。
嗯,关于动机分析就聊到这。记住一句话:CNN看细节,注意力看全局,两者配合才是王道。