Transformer 相比 RNN 和 CNN 有什么优势?

为什么 Transformer 能取代 RNN 和 CNN?
前几天我翻译一句话时被震了一下。
输入的是:"The old man sitting in the corner of the coffee shop, reading a book about quantum physics, nodded approvingly."
翻译质量出奇地好。我就开始琢磨,这背后是什么技术在支撑?
RNN 看这句话的方式很慢,从左往右一个词一个词地读,读到"man"的时候,可能已经忘了"the"在说啥。CNN 像拿着放大镜,每次只能看到几个相邻的词,全局信息要靠层层堆叠才能拼出来。
Transformer 不一样,它一眼扫完整句话,所有词的关系同时呈现。这才是真正的"全局视角"。
序列处理的"老大难"问题
RNN 早在1986年就出现了,主要解决序列数据处理——语言、语音、时间序列都能用。
但它有个致命缺陷:梯度消失。
我之前训练过一个文本生成模型,用的LSTM。100个词以内的句子还好,但当句子长度超过50个词的时候,模型就开始"失忆"了,开头说的啥后面完全接不上。
这就是梯度消失——信息在传递过程中逐渐衰减,就像玩传话游戏,第一个人说"今天天气真好",传到第十个人可能就变成"今天下鸡蛋"了。
LSTM和GRU算是给RNN打了个补丁,加入了门控机制,让网络学会筛选信息——哪些该记住,哪些该忘掉。我在实际项目中用过LSTM,效果确实比普通RNN好不少。
但根本问题没解决。长距离依赖始终是RNN的软肋。
CNN呢?它本来不是为序列任务设计的。图像处理才是主场,CNN通过卷积核扫描图片提取局部特征,这个设计对像素关系很友好。
但语言不一样。词语之间的关系可以是任意的,可以跨很远。把CNN用在文本上,像用渔网捕蝴蝶——不是不行,但效率低。
我试过用TextCNN做情感分析,句子短的时候效果还行,但遇到那种需要理解全文逻辑的长句子,准确率就明显下降。

Transformer的"一眼看全局"
RNN的问题归根结底是信息传递太慢,CNN的问题是局部感知太局限。
Transformer的解决方案是引入自注意力机制。
我第一次看到这个名字的时候觉得很玄乎,后来才明白原理很简单:让任意两个位置直接建立关联,不受距离限制。
这就像发微信朋友圈点赞,你可以直接给任何一个好友点赞,不需要通过共同好友层层传递。自注意力机制就是这个道理——每个词都能直接"看"到其他所有词,然后决定谁更重要。
具体怎么实现的?
每个词会被转换成三个向量:Query(查询)、Key(键)、Value(值)。你可以把它们想象成三个角色在对话:
- Query是"我在找什么"
- Key是"我能提供什么"
- Value是"我实际代表什么"
通过Query和Key的匹配程度,系统计算出每个词对其他词的"关注度"。这个关注度乘以Value,就得到了每个词的"加权表示"。
拿"老人读量子物理书"这句话来说,"老人"和"读"的关系很强,"老人"和"量子"的关联就弱一些。自注意力机制能自动学会这种关系权重,不需要人工设置。
我在调试BERT模型的时候看过attention热力图,"老人"这个词确实在"读"那里亮了最亮的颜色,跟我的直觉完全一致。

并行计算:效率的质的飞跃
效率问题是RNN的另一块硬伤。
RNN的计算是严格按时间步顺序进行的。第10个时间步必须等第9个算完,第9个要等第8个……这叫"链条依赖"。
链条依赖意味着什么?GPU大部分时间只能闲着。
我之前跑过一个实验,用LSTM训练一个翻译模型,batch_size设为32,序列长度128。GPU利用率长期在30%以下,大部分时间都在等待。
Transformer不一样,所有词一起进attention计算,一起出结果。这就像把厨房改成流水线:洗菜、切菜、炒菜同时进行。
实际效果?BERT用16块TPU训练3天就收敛了。同等规模的RNN模型,我估计要跑一个月都不止。
GPT-3有1750亿参数,如果用RNN训练,以现在的算力可能算到下辈子。但有了Transformer的并行能力,大模型训练从不可能变成了可能。
这不是10倍的差距,是100倍甚至更多。

没有"先入为主"的架构
CNN有个假设:数据具有空间局部相关性。这个假设对图像成立——相邻像素本来就是邻居。但用在文本上,就显得有点牵强。
RNN也有个假设:数据是连续的序列。语言确实是序列,但语义关系不一定跟序列顺序对应。"我爱你"和"你爱我",顺序不同意思完全相反。
这些假设叫"归纳偏置"。你可以理解成架构自带的"偏见"——它提前假设"数据大概长这样",然后在这个框架下工作。
归纳偏置不是坏事。小数据场景下它能起作用,因为模型已经"知道"数据大概的结构。
但它也是枷锁。当数据的实际结构跟假设不符时,模型表现就会受限。
Transformer基本不做假设。它把数据看成是一堆token组成的集合,token和token之间的关系由注意力机制动态学习。给模型看足够多的数据,它自己就能学会关系是什么。
这就像装修房子。CNN是精装修,中式还是欧式已经定好了。Transformer是毛坯房,想怎么装都行。
代价是更大的计算量,更慢的收敛速度。但换来的是更强的通用性和适应性。
我在实际项目里深有体会:用ResNet做图像分类,换个任务可能就要改很多层。但用BERT,只要微调最后几层就能迁移到新任务上。这种灵活性,CNN和RNN都给不了。

多模态时代的"全能选手"
Transformer的野心不只是翻译或分类。
它的架构本质上是通用的序列建模工具。序列可以是一句话、一段音乐、一张图片、一段视频的帧序列。
NLP领域,BERT和GPT系列已经证明了Transformer的实力。我用BERT做过文本分类、命名实体识别、问答系统,基本上换任务就是换个数据集微调,效果都不错。
计算机视觉领域,ViT(Vision Transformer)把Transformer用在了图片分类上。思路很直接:把图片切成小块,每块当一个"词",送进Transformer处理。结果在大数据训练的情况下,ViT超越了传统CNN。
多模态更惊艳。DALL·E能根据文字生成图片,GPT-4能看懂图片内容,Stable Diffusion能生成艺术作品。我用Stable Diffusion生成过产品图,质量确实可以替代部分人工设计。
这些应用背后,核心都是Transformer。
一种架构,能处理文字、图片、声音、视频。这在RNN和CNN时代是不可想象的。
为什么Transformer能做到?因为它足够"笨"。不假设数据长什么样,只是老老实实地学习token之间的关系。这种"笨",反而成就了它的通用。

Transformer也有短板
说完这么多好处,得承认Transformer也有问题。
自注意力机制的计算复杂度是O(n²),n是序列长度。序列越长,计算量增长得越快。一句话处理很快,但处理一本书?GPU可能直接冒烟。
这是Transformer的死穴吗?也不一定。
研究者们正在想办法。稀疏注意力只计算部分token之间的关系。线性注意力把O(n²)降成O(n)。FlashAttention优化了GPU内存访问,让大上下文窗口成为可能。
Mamba等新架构在探索状态空间模型,试图结合RNN的效率和Transformer的表达能力。这些探索还在进行,最终结果如何还不确定。
但有一点是确定的:至少在当下,Transformer仍然是主流。 ChatGPT、Claude、Gemini这些大语言模型,用的都是Transformer架构。它可能不是完美的,但足够好用,生态足够成熟。
总结
Transformer的故事,本质上是效率与灵活性的权衡史。
RNN代表了一种范式:严格按顺序,稳扎稳打。它适合小数据、低算力的场景,但面对长序列和大模型,力不从心。
CNN代表了另一种范式:局部感知,层次提取。它对有空间结构的数据很友好,但处理语言这种非线性关系时,能力受限。
Transformer选择了不同的路:用更高的计算代价,换取更强的通用性和并行效率。这在算力便宜、数据充裕的时代,是正确的选择。
你下次调参BERT或者让ChatGPT帮你写文案的时候,可以想想它背后发生的事。那些attention分数在悄悄计算,那些QKV矩阵在疯狂相乘,那些词与词之间的关系被一点点建立起来。
计算attention的具体过程是怎样的?Query、Key、Value这三个向量到底是怎么工作的?
这,就是下一篇要聊的了。
