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 局部性 感受野:3×3 / 5×5 擅长:边缘、纹理、形状 瓶颈:看不到远处 复杂度:O(k²·n) 线性 互补 局部 + 全局 自注意力 全局性 感受野:整张图 擅长:长距离依赖、上下文 瓶颈:计算量大、缺局部先验 复杂度:O(n²) 平方 融合后的优势 ✅ 局部特征提取(CNN) + 全局关系建模(注意力) ✅ 计算量可控:CNN降分辨率,注意力做全局交互 ✅ 小数据也能训:CNN提供强先验,注意力做微调

我的建议:

做融合时,别想着「哪个更好」。要想「哪个阶段用哪个」。

浅层用CNN,深层用注意力。或者并行分支,一个走局部,一个走全局,最后融合。这都是经过验证的好方案。

4.5 避坑指南

最后说几个我踩过的坑:

  • 别盲目堆注意力:我曾经在浅层就加全局注意力,结果计算量翻倍,效果没涨。后来发现,浅层特征分辨率高,注意力算不过来,而且局部信息更重要。
  • 注意分辨率:自注意力在16×16或更小的特征图上用,性价比最高。再大就扛不住了。
  • 别忘了位置编码:自注意力本身没有位置信息。不加位置编码,模型分不清「左上角」和「右下角」的区别。
  • 小数据集慎用:数据少于10万张,纯Transformer容易翻车。加个卷积stem能救回来。

嗯,关于动机分析就聊到这。记住一句话:CNN看细节,注意力看全局,两者配合才是王道。