参考图文解读内容: https://zhuanlan.zhihu.com/p/338817680
李宏毅老师讲解的Transformer: https://www.youtube.com/watch?v=n9TlOhRjYoc
序
在深度学习的世界里,有些论文不仅仅是技术文档,更像是时代转折处的一块路标。2017年,Google Brain与Google Research团队发表的《Attention Is All You Need》就是这样一篇作品。它提出的Transformer架构,在今天看来几乎已经成为现代人工智能的基础设施之一:BERT、GPT、T5、ViT,以及大量多模态大模型,都可以在某种意义上追溯到这篇论文所开启的技术路线。
这篇论文的标题非常大胆:"Attention Is All You Need",直译过来就是"注意力就是你所需要的一切"。它的核心观点是:在序列到序列任务中,模型并不一定非要依赖RNN或CNN,只靠注意力机制,也可以完成高质量的序列建模,而且还能更容易并行训练、更好捕捉长距离依赖。
我最近重新阅读了这篇论文,并结合一些图文解读和李宏毅老师对Transformer的讲解,对其中的关键概念做了系统梳理。本文不是单纯翻译论文,而是尝试用"从问题出发"的方式,把Transformer为什么出现、它解决了什么问题、每个模块到底在做什么、实验结果说明了什么,以及这篇论文给今天AI研究带来的启示讲清楚。
希望这篇笔记能够让非NLP方向的读者也能理解Transformer的基本思想;同时,对已经熟悉深度学习的读者,也能提供一些结构化的复盘和思考。
一、背景与概述
1.1 Transformer出现之前:序列建模的主流范式
2017年之前,对于自然语言处理任务,尤其是机器翻译、文本摘要、语言建模等序列任务,主流模型大多依赖RNN、LSTM、GRU或CNN。
以机器翻译为例,输入是一句话,例如:
I love machine learning.
输出可能是:
我喜欢机器学习。
这类任务的特点是:输入和输出都是序列,而且长度通常不固定。传统的seq2seq模型通常采用Encoder-Decoder结构:
- Encoder负责读取输入序列,把原句编码成隐藏表示;
- Decoder根据Encoder的表示,一个词一个词生成目标句子;
- Attention机制用于帮助Decoder在生成每个词时,关注输入句子中最相关的部分。
在早期seq2seq模型中,Encoder和Decoder往往由RNN或LSTM构成。RNN的直觉很自然:语言是有顺序的,所以我们从左到右读一句话,每读一个词,就更新一次隐藏状态。这个隐藏状态理论上记录了前文信息,然后继续向后传递。
但这种方式有一个根本问题: 它是串行的。
假设一句话有100个词,RNN必须先处理第1个词,再处理第2个词,然后第3个词......第100个词的表示依赖前面所有步骤的计算结果。这样做符合人类阅读顺序,却不符合GPU擅长的大规模并行计算方式。
也就是说,RNN的计算路径天然很长。对于长句子,模型既难以高效训练,也容易遗忘远距离信息。虽然LSTM和GRU通过门控机制缓解了长期依赖问题,但并没有从根本上消除串行计算的限制。
CNN用于序列建模时能够并行处理不同位置,但卷积的感受野通常是局部的。如果要让句子中相距很远的两个词发生信息交互,就需要堆叠很多层卷积,或者使用扩张卷积等技巧。相比之下,这仍然不是最直接的建模方式。
Transformer正是在这样的背景下出现的。它提出了一个非常激进的想法:既然Attention可以让模型直接关注序列中任意位置的信息,那为什么还要依赖RNN或CNN呢?
1.2 论文的核心贡献
《Attention Is All You Need》的核心贡献可以概括为三点。
第一,提出了完全基于注意力机制的Transformer架构。它不使用循环结构,也不使用卷积结构,而是用Self-Attention和Feed Forward Network组成Encoder和Decoder。
第二,显著提升了并行计算能力。由于Self-Attention可以一次性计算序列中所有token之间的关系,因此相比RNN更适合GPU并行训练。
第三,在机器翻译任务上取得了当时非常强的效果。论文在WMT 2014英德翻译和英法翻译任务上取得了新的优秀结果,同时训练成本相比一些已有模型更低。
从今天回看,这篇论文真正重要的地方并不只是"机器翻译分数更高",而是它改变了人们对序列建模的基本想象:序列不一定必须按时间步一步处理;只要给模型足够好的位置表示和全局交互机制,它也可以直接从整体上理解序列。
1.3 用一句话理解Transformer
如果用一句话概括Transformer,我会这样说:
Transformer是一种通过注意力机制让序列中每个位置直接与其他位置交互,并通过多层堆叠不断更新表示的神经网络架构。
这里有三个关键词:
- 每个位置:句子中的每个词、每个token都会被表示成一个向量;
- 直接交互:任意两个位置之间都可以通过attention建立联系;
- 多层更新:每一层都会让token吸收上下文信息,逐渐形成更高层语义表示。
例如,对于句子"苹果发布了新手机,它的性能很强",模型需要知道"它"指的是"新手机"还是"苹果"。Self-Attention允许"它"这个位置直接关注"新手机"这个位置,从而帮助模型建立指代关系。
这就是Transformer的核心直觉: 理解一个词,不能只看它本身,而要看它和上下文中其他词的关系。
二、技术方法
2.1 整体结构
Transformer整体上仍然采用Encoder-Decoder结构,这一点和传统seq2seq模型是一致的。不同之处在于,Transformer把Encoder和Decoder内部的RNN/CNN模块全部换成了注意力模块。
原论文中的标准Transformer包含:
- 6层Encoder;
- 6层Decoder;
- 每层中包含Multi-Head Attention;
- 每层中包含Position-wise Feed Forward Network;
- 每个子层外部都有Residual Connection和Layer Normalization;
- 输入端加入Positional Encoding来表示顺序信息。
可以把Transformer想象成一个由多个"信息交换层"堆叠起来的系统。每经过一层,序列中每个token都会重新思考:我应该关注谁?我应该从谁那里吸收信息?我当前的表示是否应该更新?
2.1.1 Encoder负责理解输入
Encoder的任务是理解输入序列。以机器翻译为例,如果输入是英文句子,Encoder就负责把英文句子中的每个token转换成上下文相关的表示。
注意这里的"上下文相关"很重要。普通词向量中,"bank"可能只是一个固定向量。但经过Transformer Encoder之后:
- 在"river bank"中,bank更接近"河岸";
- 在"central bank"中,bank更接近"银行"。
这是因为Self-Attention会让bank根据上下文重新调整自己的表示。
每个Encoder层包含两个主要子层:
- Multi-Head Self-Attention;
- Position-wise Feed Forward Network。
Self-Attention负责让不同位置之间交换信息,Feed Forward Network负责对每个位置的表示进行非线性变换。两者配合起来,一个偏向"信息聚合",一个偏向"特征加工"。
2.1.2 Decoder负责生成输出
Decoder的任务是生成目标序列。仍以机器翻译为例,Decoder要根据Encoder提供的输入句子表示,逐步生成中文译文。
Decoder每层包含三个主要子层:
- Masked Multi-Head Self-Attention;
- Encoder-Decoder Attention;
- Position-wise Feed Forward Network。
其中,Masked Self-Attention用于建模目标序列已经生成的部分。之所以要加mask,是因为在训练时,完整答案是已知的,但模型在真实生成时不能偷看未来词。比如生成"我 喜欢 机器 学习"时,在预测"机器"时,模型只能看到"我"和"喜欢",不能提前看到"学习"。
Encoder-Decoder Attention则让Decoder在生成每个目标词时,去关注输入句子的相关部分。例如生成"学习"时,模型可能会重点关注英文输入中的"learning"。
2.1.3 Transformer不是一个单独模块,而是一套组合设计
很多人在学习Transformer时,会把注意力机制看作唯一重点。Attention当然是核心,但Transformer真正强大的地方在于它是一套完整工程化架构:
- Self-Attention解决全局信息交互;
- Multi-Head机制增强表达能力;
- Positional Encoding补充顺序信息;
- Residual Connection缓解深层网络训练困难;
- Layer Normalization稳定训练;
- Feed Forward Network提供非线性变换;
- Mask机制保证自回归生成的因果性;
- Encoder-Decoder Attention连接输入和输出。
也就是说,Transformer不是简单地把Attention放进模型里,而是围绕Attention重新设计了一套适合并行训练、深层堆叠和序列生成的架构。
2.2 Transformer的输入
2.2.1 Token与Embedding
神经网络不能直接处理文字,所以输入文本首先要被切分成token,然后每个token被映射成向量。
例如句子:
I love deep learning
可能被切成:
I / love / deep / learning
每个token会被转换成一个embedding向量。这个向量可以理解为词的数值化表示。Transformer论文中,模型的embedding维度为512,也就是每个token会被表示成一个512维向量。
但仅有词向量还不够。因为Self-Attention本身并不天然知道顺序。
比如下面两个句子:
狗咬了人。
人咬了狗。
如果只看词集合,它们都包含"狗""咬了""人",但意思完全不同。语言中的顺序决定了语义。如果模型不知道位置,就无法区分这两句话。
因此Transformer必须引入位置编码。
2.2.2 为什么需要Positional Encoding
RNN天然带有顺序信息,因为它按时间步从左到右处理序列。CNN也包含局部位置信息,因为卷积核在相邻位置上滑动。
但Self-Attention不同。它在计算时本质上会比较序列中任意两个token之间的关系。如果不额外加入位置编码,模型看到的更像是一个"词袋",而不是一句有顺序的话。
因此Transformer在输入embedding上加上Positional Encoding:
输入表示 = Token Embedding + Positional Encoding
这样,每个token的输入向量既包含"这个词是什么",也包含"这个词位于哪里"。
2.2.3 正弦余弦位置编码
原论文使用的是固定的正弦余弦位置编码。其形式大致是:
- 偶数维使用sin函数;
- 奇数维使用cos函数;
- 不同维度使用不同频率。
这种设计有几个好处。
第一,它不需要学习额外参数。位置编码是按照公式直接生成的。
第二,它可以表达不同尺度的位置信息。有些维度变化快,适合区分近距离位置;有些维度变化慢,适合表达长距离位置。
第三,它可能帮助模型学习相对位置关系。论文作者认为,对于固定偏移量k,位置pos+k的编码可以由pos的编码通过线性方式表示,这有利于模型学习"相隔几个位置"的关系。
不过论文也做了实验,发现学习式位置编码和正弦余弦位置编码效果非常接近。作者最后选择正弦余弦编码,一个重要原因是它理论上更容易外推到比训练时更长的序列。
2.2.4 输入进入模型之前发生了什么
总结一下,Transformer输入部分可以分成三步:
- 第一步,把文本切成token。
- 第二步,把token映射成embedding向量。
- 第三步,给embedding加上positional encoding。
得到的向量序列才会送入Encoder或Decoder。
这个过程看似简单,但非常关键。因为Transformer没有RNN的时间步结构,也没有CNN的局部滑动结构,位置编码就是它理解顺序的基础。
2.3 Self-Attention
Self-Attention是Transformer的灵魂。理解了Self-Attention,基本就理解了Transformer最核心的思想。
2.3.1 从"查资料"理解Attention
可以先用一个生活化比喻理解Attention。
假设你正在写一篇文章,遇到一个问题:某个概念应该如何解释?你不会把所有资料平均看一遍,而是会根据当前问题,有选择地查找最相关的资料。
这个过程包含三个角色:
- Query:我现在想找什么?
- Key:每份资料的索引或标签是什么?
- Value:每份资料真正包含的信息是什么?
Attention做的事情就是:用Query去和所有Key计算相关性,然后根据相关性对Value加权求和。
换句话说,Attention不是简单地取某一个信息,而是根据相关程度,把多个信息混合起来。
2.3.2 Q、K、V到底是什么
在Transformer中,每个输入token都会通过三个不同的线性变换,生成三个向量:
- Query向量,简称Q;
- Key向量,简称K;
- Value向量,简称V。
这三个向量来自同一个token表示,但承担不同角色。
如果把一句话中的每个词都看成一个人,那么: - Q表示"我想找什么信息";
- K表示"我能被别人如何匹配";
- V表示"如果别人关注我,我能提供什么内容"。
对于序列中的某个token,它会用自己的Q去和所有token的K做匹配,得到注意力分数。分数越高,说明当前token越应该关注那个位置。然后模型再用这些分数对所有token的V加权求和,得到新的表示。
2.3.3 Scaled Dot-Product Attention
Transformer使用的注意力形式叫Scaled Dot-Product Attention,即缩放点积注意力。
其核心公式是:
Attention(Q, K, V) = softmax(QKᵀ / √dₖ) V
可以分成四步理解。
第一步,Q和K做点积,计算相关性。
如果某个Query和某个Key方向相近,点积就大,说明它们更相关。
第二步,除以√dₖ进行缩放。
这里的dₖ是Key向量的维度。为什么要缩放?因为当向量维度很大时,点积结果可能变得很大,导致softmax进入梯度很小的区域,训练不稳定。除以√dₖ可以缓解这个问题。
第三步,通过softmax变成权重。
softmax会把一组相关性分数转换成概率分布。权重越大,表示越关注对应位置。
第四步,用权重对V加权求和。
最终得到的新向量,就是当前token融合上下文信息后的表示。
2.3.4 Self-Attention中的"Self"是什么意思
Self-Attention中的"Self"表示Q、K、V都来自同一个序列。
也就是说,句子中的每个词都在和同一句子中的其他词进行交互。它不是Decoder关注Encoder那
种跨序列注意力,而是序列内部自我关联。
例如句子:
The animal didn't cross the street because it was too tired.
这里的"it"指代"animal",而不是"street"。Self-Attention可以让"it"这个位置直接关注"animal",从而帮助模型理解指代关系。
这正是Self-Attention的优势:它可以让远距离词之间直接建立联系,而不需要像RNN那样经过很多时间步传递。
2.3.5 Self-Attention的优势
Self-Attention相比RNN和CNN有三个重要优势。
第一,路径短。
在RNN中,如果第1个词要影响第100个词,中间要经过99个时间步。而在Self-Attention中,第1个词和第100个词可以在一层中直接交互。路径越短,长距离依赖越容易学习。
第二,容易并行。
RNN必须按顺序处理,而Self-Attention可以一次性计算所有位置之间的注意力矩阵。这非常适合GPU并行。
第三,解释性更强。
注意力权重可以一定程度上反映模型关注了哪些位置。虽然不能把attention权重简单等同于完整解释,但它至少提供了观察模型行为的窗口。
2.3.6 Self-Attention的代价
Self-Attention也不是没有缺点。它的计算复杂度与序列长度平方相关,即O(n²)。因为每个token都要和其他token计算关系。
如果序列长度是n,那么注意力矩阵大小就是n×n。当n很大时,比如处理长文档、长视频、长音频,标准Self-Attention的成本会非常高。
这也是后来很多Transformer改进工作的出发点,例如稀疏注意力、局部注意力、线性注意力、长上下文建模等。可以说,Transformer解决了RNN的串行瓶颈,但也带来了长序列计算的新挑战。
2.4 Multi-Head Attention
2.4.1 为什么需要多个头
如果只有一个attention head,模型每次只能在一个表示空间中计算注意力。但语言关系是复杂的,不同词之间可能存在多种关系。
例如一句话中,一个词可能需要同时关注:
- 语法主语;
- 宾语;
- 修饰词;
- 指代对象;
- 局部搭配;
- 长距离语义关联。
一个attention head未必能够同时捕捉所有关系。因此Transformer引入Multi-Head Attention。
Multi-Head Attention的思想是:不要只做一次注意力,而是把Q、K、V投影到多个不同的子空间中,并行做多次attention。每个head可以学习关注不同类型的信息。
2.4.2 Multi-Head Attention的计算过程
Multi-Head Attention大致包含以下步骤:
第一,将输入分别映射成多组Q、K、V。
第二,每一组Q、K、V独立计算Scaled Dot-Product Attention。
第三,把多个head的输出拼接起来。
第四,再通过一个线性变换得到最终输出。
原论文中,base模型使用8个attention heads。模型总维度是512,每个head的维度是64。这样做的好处是:虽然有多个head,但每个head维度较小,所以总计算量和单头大维度attention接近。
2.4.3 多头机制的直觉
可以把Multi-Head Attention理解为多人从不同角度读同一句话。
一个人关注语法结构,一个人关注代词指代,一个人关注局部短语,一个人关注长距离依赖。最后大家把各自的理解汇总,形成更完整的句子表示。
这也是为什么Multi-Head Attention往往比Single-Head Attention效果更好。它不是简单增加参数,而是给模型提供多个"观察视角"。
论文中的消融实验也显示,单头attention的效果明显不如多头attention。不过head数量也不是越多越好,如果head太多,每个head的维度过小,表达能力也可能下降。
2.5 Encoder
2.5.1 Encoder层的组成
Transformer Encoder由N个相同结构的层堆叠而成。原论文中N=6。
每个Encoder层包含两个子层:
- Multi-Head Self-Attention;
- Position-wise Feed Forward Network。
每个子层外部都有:
- Residual Connection;
- Layer Normalization。
因此,一个Encoder层可以简化表示为:
输入 → Multi-Head Self-Attention → Add & Norm → Feed Forward → Add & Norm → 输出
这里的Add指残差连接,Norm指层归一化。
2.5.2 Residual Connection:让深层网络更容易训练
Residual Connection来自ResNet的思想。它的形式可以理解为:
输出 = x + Sublayer(x)
也就是说,子层不需要完全重新学习一个表示,而只需要学习在原有表示基础上应该增加什么变化。
这对深层网络非常重要。如果没有残差连接,模型层数加深后容易出现梯度消失、训练困难等问题。残差连接让信息可以更顺畅地跨层流动。
在Transformer中,每个attention层和FFN层外面都有残差连接,这是模型能够稳定堆叠多层的重要原因之一。
2.5.3 Layer Normalization:稳定训练过程
Layer Normalization用于对每个样本内部的特征进行归一化,使训练更加稳定。
深度神经网络训练过程中,不同层的输入分布可能不断变化,这会使优化变得困难。Layer Normalization可以缓解这种问题,让模型更容易收敛。
Transformer中使用的是:
LayerNorm(x + Sublayer(x))
也就是说,先做子层计算,再加残差,然后做LayerNorm。
需要补充的是,后来的很多Transformer变体对LayerNorm的位置进行了调整,比如Pre-LN Transformer会把LayerNorm放在子层之前,以改善更深模型的训练稳定性。但原始论文采用的是Post-LN结构。
2.5.4 Position-wise Feed Forward Network
Encoder中的FFN是逐位置前馈网络。它对每个位置单独作用,而且所有位置共享同一组参数。
它的形式是:
FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
其中包含两层线性变换,中间使用ReLU激活函数。原论文中,输入和输出维度是512,中间隐藏层维度是2048。
Self-Attention负责在不同token之间交换信息,而FFN负责对每个token自己的表示进行更复杂的非线性加工。可以理解为:
- Attention解决"我应该从别人那里拿什么信息";
- FFN解决"我拿到这些信息后,如何加工成更有用的特征"。
2.5.5 Encoder最终输出什么
经过多层Encoder后,输入序列中的每个token都会得到一个上下文相关的表示。这个表示包含:
- token自身语义;
- 位置信息;
- 与其他token的关系;
- 多层抽象后的语义信息。
这些Encoder输出会作为Decoder进行翻译或生成时的"记忆库"。Decoder在生成每个目标token时,会通过Encoder-Decoder Attention去读取这份记忆。
2.6 Decoder
2.6.1 Decoder层的组成
Transformer Decoder同样由N个相同结构的层堆叠而成,原论文中N=6。
每个Decoder层包含三个子层:
- Masked Multi-Head Self-Attention;
- Encoder-Decoder Multi-Head Attention;
- Position-wise Feed Forward Network。
每个子层外部同样有Residual Connection和Layer Normalization。
可以简化表示为:
输出端输入 → Masked Self-Attention → Add & Norm → Encoder-Decoder Attention → Add & Norm → Feed Forward → Add & Norm → 输出
2.6.2 为什么Decoder需要Mask
Decoder是自回归生成的。也就是说,它生成第t个词时,只能依赖第t个词之前的内容。
例如目标句子是:
我 喜欢 机器 学习
在训练时,模型其实能看到完整句子。但为了模拟真实生成过程,预测"机器"时不能让模型看到后面的"学习"。否则模型就相当于作弊。
因此Decoder中的Self-Attention必须加mask,把当前位置之后的token屏蔽掉。具体做法是在softmax之前,把非法位置的注意力分数设为负无穷。这样softmax之后,这些位置的权重就接近0。
这就是Masked Self-Attention。
2.6.3 Encoder-Decoder Attention的作用
Decoder中第二个注意力子层是Encoder-Decoder Attention。它和Self-Attention不同:
- Query来自Decoder上一子层的输出;
- Key和Value来自Encoder的输出。
也就是说,Decoder用当前生成状态作为Query,去输入句子的编码结果中查找相关信息。
在机器翻译中,这一步非常关键。例如Decoder正在生成中文词"学习",它可能会通过attention关注英文输入中的"learning"。生成"机器"时,则可能关注"machine"。
这个机制类似传统seq2seq中的attention,但Transformer用Multi-Head Attention实现,并且完全融入了深层并行架构中。
2.6.4 Decoder最后如何生成词
Decoder最后一层输出后,会经过一个线性层和softmax,得到词表中每个token的概率。
例如在某一步,模型可能输出:
- "机器":0.70;
- "学习":0.10;
- "语言":0.05;
- 其他词:剩余概率。
训练时,模型会根据真实答案计算损失。推理时,模型会根据概率选择下一个token。常见方法包括greedy search、beam search、top-k sampling、top-p sampling等。
原论文在机器翻译实验中使用了beam search,并加入长度惩罚,以避免模型偏向生成过短句子。
三、实验与结果
3.1 实验任务
论文主要在机器翻译任务上验证Transformer的效果,尤其是两个经典数据集:
- WMT 2014 English-German;
- WMT 2014 English-French。
机器翻译是检验序列到序列模型的重要任务,因为它要求模型同时具备:
- 对源语言句子的理解能力;
- 对目标语言句子的生成能力;
- 长距离依赖建模能力;
- 对齐能力;
- 语法和语义转换能力。
如果Transformer能在机器翻译上取得强结果,就说明它不仅是一个概念上优雅的架构,也具备实际竞争力。
3.2 训练设置
原论文中的Transformer base模型主要配置如下:
- Encoder层数:6;
- Decoder层数:6;
- 模型维度d_model:512;
- Feed Forward隐藏层维度d_ff:2048;
- Attention head数量:8;
- 每个head维度:64;
- Dropout:0.1;
- Label smoothing:0.1;
- 优化器:Adam;
- warmup steps:4000。
论文还训练了Transformer big模型,主要扩大了模型维度和FFN维度: - d_model:1024;
- d_ff:4096;
- heads:16;
- 参数量更大;
- 训练步数更多。
这种base/big设置后来也影响了很多后续模型的命名习惯,例如BERT-base和BERT-large。
3.3 学习率策略
论文使用了一个特殊的学习率调度策略:训练初期先warmup,也就是学习率逐渐升高;达到一定步数后,再按步数的平方根反比逐渐下降。
这种策略很符合深度模型训练的直觉。
训练初期,模型参数还很不稳定,如果学习率太大,可能导致训练震荡甚至崩溃。因此先用较小学习率起步,再逐渐增大。
训练中后期,模型已经学到基本模式,此时降低学习率有助于更细致地优化参数。
Transformer训练中的warmup策略后来也成为大模型训练中非常常见的做法。
3.4 正则化方法
论文中使用了几种正则化方法。
第一是Dropout。它被应用在子层输出、embedding与positional encoding之和等位置,用于降低过拟合。
第二是Label Smoothing。普通分类训练中,正确类别的标签通常是1,其他类别是0。Label Smoothing会把标签变得不那么绝对,比如正确类别不是1,而是0.9,剩余概率分给其他类别。
这会让模型不要过度自信。论文指出,Label Smoothing可能会让困惑度变差,因为模型不再极端相信某个答案,但它能提升准确率和BLEU分数。
这也提醒我们:不同指标不一定完全一致。一个模型的概率校准、困惑度、生成质量之间可能存在微妙差异。
3.5 主要结果
在WMT 2014 English-German任务上,Transformer big取得了28.4 BLEU,超过了此前很多强模型,包括一些ensemble模型。
在WMT 2014 English-French任务上,Transformer big取得了41.0 BLEU,也达到了当时非常强的单模型效果。
更重要的是,Transformer不仅效果好,训练成本也相对更低。论文强调,Transformer可以显著并行化,在较短训练时间内达到强性能。
这说明Transformer的优势不是单一维度的。它同时改善了:
- 表达能力;
- 训练效率;
- 长距离依赖建模;
- 并行计算能力。
3.6 消融实验带来的启发
论文还做了模型变体实验,分析不同组件对效果的影响。
3.6.1 Attention head数量
实验显示,单头attention效果不如多头attention。8个head是base模型中的较优设置之一。但head数量太多也未必更好,因为每个head维度会变小,可能影响单个head的表达能力。
这说明多头机制的价值在于提供多视角表达,但这种表达也需要足够的维度支撑。
3.6.2 Key维度
论文发现,如果降低attention key的维度,模型效果会下降。这说明计算token之间的匹配关系并不是一件特别容易的事,模型需要足够的表示空间来判断"谁应该关注谁"。
这也解释了为什么后来的大模型通常会使用较大的hidden size和attention维度。
3.6.3 模型规模
实验结果符合预期:更大的模型通常效果更好。增加模型维度、FFN维度和参数量,可以提升模型能力。
当然,这也带来一个持续至今的问题:模型效果提升和计算资源消耗之间如何平衡?Transformer打开了大模型时代的大门,也让算力、数据、能耗和效率优化成为越来越重要的问题。
3.6.4 Dropout的重要性
论文显示,Dropout对避免过拟合很有帮助。特别是模型变大后,如果没有适当正则化,模型可能更容易记住训练数据,而不是学习可泛化的规律。
这说明Transformer虽然结构强大,但训练技巧同样关键。一个模型的成功往往不是单个模块决定的,而是架构、优化、正则化、数据处理和工程实现共同作用的结果。
3.6.5 位置编码方式
论文比较了正弦余弦位置编码和学习式位置编码,发现两者效果接近。这一点很有意思,因为它说明Transformer并不依赖某一种固定位置编码才能工作。
不过,位置编码本身是不可或缺的。没有位置编码,Self-Attention就缺少顺序感。至于位置编码如何设计,则成为后来大量研究继续改进的方向,例如相对位置编码、RoPE、ALiBi等。
四、总结
4.1 Transformer解决了什么核心问题
Transformer解决的核心问题不是"如何做机器翻译"这么简单,而是重新定义了序列建模方式。
在RNN范式中,序列建模依赖时间步递推。信息从前往后逐步流动,长距离依赖需要经过较长路径。
在CNN范式中,序列建模依赖局部窗口。远距离信息交互需要多层卷积堆叠。
而Transformer通过Self-Attention让任意两个位置可以直接交互。它把序列建模从"顺序传递"变成了"全局关系建模"。
这就是Transformer的革命性所在。
4.2 Transformer为什么适合大规模训练
Transformer非常适合大规模训练,主要有三个原因。
第一,它并行友好。Self-Attention可以一次性处理整个序列,不需要像RNN那样按时间步串行计算。
第二,它路径短。任意两个token之间的信息交互可以在一层attention中完成,这有助于建模长距离依赖。
第三,它结构统一。无论是文本、图像、语音还是多模态数据,只要能表示成token序列,就有机会用Transformer处理。
这也是为什么Transformer后来从NLP扩展到计算机视觉、语音识别、蛋白质结构预测、多模态理解和生成等领域。
4.3 Transformer的局限
当然,Transformer不是完美架构。
它最明显的问题是标准Self-Attention的计算复杂度是O(n²)。当序列很长时,注意力矩阵会迅速变大,显存和计算成本都会上升。
此外,Transformer本身并没有天然的归纳偏置。CNN天然适合图像局部结构,RNN天然适合时间顺序,而Transformer更像一个通用关系建模器。这种通用性带来强大能力,但也意味着它往往需要大量数据和算力来学习结构。
还有一点需要注意:attention权重虽然提供了一定解释性,但不能简单等同于模型决策的完整原因。模型内部表示是复杂的,attention只是观察窗口之一。
4.4 这篇论文的历史意义
从今天看,《Attention Is All You Need》的意义至少体现在三个层面。
第一,它提出了一个高效、可扩展的序列建模架构。
第二,它推动NLP从任务专用模型走向预训练大模型。BERT、GPT等模型都建立在Transformer基础之上。
第三,它改变了AI研究的工程范式。过去很多模型设计强调复杂结构和任务特定模块,而
Transformer展示了另一条路线:用相对统一的架构,通过大数据、大算力和规模化训练获得通用能力。
这也是为什么Transformer不仅是一篇NLP论文,更是现代AI发展的分水岭。
五、灵感
5.1 好的创新往往来自对"默认假设"的重新提问
Transformer最打动我的地方,不只是它提出了一个新模块,而是它挑战了一个当时很自然的默认假设:处理序列就必须按顺序来。
语言确实是有顺序的,但模型计算是否也必须是顺序的?Transformer的答案是否定的。
这给我的启发是:很多领域中的"常识"可能只是历史路径形成的惯性。RNN之所以长期占据序列建模主流,是因为它直观、合理、符合人类对时间序列的理解。但直观不一定最适合计算。
真正重要的不是模仿人类逐词阅读,而是找到更适合机器学习和硬件计算的表示方式。
5.2 架构创新不是单点突破,而是系统设计
Transformer的成功不是因为某一个公式单独起作用。Scaled Dot-Product Attention很重要,但如果没有Multi-Head机制、位置编码、残差连接、LayerNorm、FFN、mask机制和合适的训练策略,模型未必能达到论文中的效果。
这说明深度学习中的创新往往是系统工程。一个想法要真正变成可用模型,需要考虑:
- 表达能力;
- 训练稳定性;
- 计算效率;
- 可并行性;
- 可扩展性;
- 与硬件的适配;
- 与任务目标的匹配。
Transformer之所以影响深远,正是因为它在这些方面达到了很好的平衡。
5.3 "简单"往往比"复杂"更有力量
Transformer论文的标题很简洁,模型思想也很直接:不要循环,不要卷积,只要attention。
当然,真正实现细节并不简单,但它的核心原则非常清晰。这种清晰性使得它容易被理解、复现、扩展和迁移。
很多重要技术并不是因为复杂才重要,而是因为它们提供了一种足够简单、足够通用、足够可扩展的抽象。Transformer就是这样的抽象。
5.4 从Transformer看大模型时代
Transformer最初是在机器翻译任务中提出的,但它真正释放威力是在预训练大模型时代。
当我们把海量文本输入Transformer,让模型通过语言建模任务学习预测下一个token,它就能逐渐学到语法、语义、事实知识、推理模式和一定程度的世界知识。
这背后的逻辑与Transformer本身高度契合:Self-Attention适合捕捉上下文关系,多层堆叠适合形成抽象表示,并行计算适合扩大训练规模。
可以说,没有Transformer,就很难有今天的大语言模型浪潮。
5.5 对研究和学习的启示
阅读这篇论文让我感受到,真正值得学习的不只是Transformer结构本身,还有它背后的研究思维:
第一,要抓住核心瓶颈。RNN的问题不是不能用,而是串行计算限制了效率和扩展性。
第二,要敢于简化问题。Transformer不是在RNN上不断加复杂模块,而是直接移除了RNN。
第三,要用实验验证设计。论文不仅提出架构,还通过主实验和消融实验说明每个设计的作用。
第四,要关注硬件友好性。一个理论上优雅但难以高效训练的模型,很难成为基础架构。Transformer从一开始就与矩阵乘法、GPU并行高度匹配。
第五,要保留开放性。论文结尾提到未来希望将Transformer扩展到文本之外的图像、音频和视频等模态。今天看来,这个方向已经成为现实。
结语
《Attention Is All You Need》之所以经典,不只是因为它提出了Transformer,也不只是因为它刷新了机器翻译结果,而是因为它改变了人们对智能模型结构的基本想象。
它告诉我们,序列建模可以不依赖循环;长距离依赖可以直接建模;统一架构可以跨任务迁移;简单清晰的设计在足够数据和算力下可以爆发出惊人的能力。
从Attention到Transformer,再到今天的大语言模型,我们看到的是一条不断扩展的技术脉络:模型越来越通用,结构越来越统一,能力越来越依赖规模化训练和高效表示。
但回到最初的问题,Transformer的核心仍然非常朴素:当理解一个词、一个图像块、一个声音片段或一个符号时,我们都需要知道它与其他部分的关系。
也许这正是"Attention Is All You Need"这句话真正有力量的地方。注意力不是全部智能的答案,但它提供了一种极其有效的方式,让模型学会在复杂信息中寻找关联、分配重点,并在关系中形成理解。
这就是Transformer带给我的最大启发。