系列:论文科普手记

Transformer 精读:用「注意力」取代循环,把序列建模变成可并行计算

1. 一句话结论

Transformer 的核心主张是:序列建模不需要「一个字一个字地读」(RNN),也不需要「用滑动窗口看」(CNN),而是让序列里的每个位置直接「抬头看一眼」所有其他位置,用一种叫「自注意力」的机制一次性算出谁和谁相关。 这让它天然可并行、可堆深、可扩展到超长上下文——今天你用的每一个大模型,骨子里都是它。

2. 为什么要换掉 RNN?

在 2017 年之前,处理语言、语音、时间序列的主力是 RNN / LSTM:

CNN(如 PixelCNN / 卷积文本模型)能并行,但感受野受卷积核大小限制,要看远距离依赖得堆很多层。

Transformer 的赌注:直接建模任意两个位置之间的依赖,距离多远都只隔一步计算。

3. 自注意力:每个词「抬头看全场」

自注意力(Self-Attention)的输入是一组向量 X = [x₁, x₂, …, xₙ](每个 token 的嵌入)。它对每个位置算出三个向量:

通过一个线性层从 X 投影得到:Q = XW_Q,K = XW_K,V = XW_V。

然后每个位置对其它所有位置算「相关度」:

score(i, j) = Q_i · K_j / √d_k
attention(i) = softmax_j( score(i, j) ) · V_j

直觉:Q_i 和 K_j 越像(点积越大),第 i 个词就越「注意」第 j 个词,最终输出就是把所有位置的 V 按注意力权重加权求和。

√d_k 的作用:当维度 d_k 很大时点积容易爆掉,除以它的平方根做缩放,让 softmax 梯度更稳定。这是论文里一个不起眼但很关键的小技巧。

关键点:任意一个词看另一个词,都只经过一次矩阵乘法,和第 j 个字距离多远无关。这就是「一步到位的全局依赖」。

4. 多头注意力:不只看一个角度

单一注意力只能学到一种「关系视角」。Transformer 用了 Multi-Head Attention:把 Q/K/V 切成 h 个头,每个头在各自子空间里独立算注意力,最后把结果拼起来再投影:

head_h = Attention(XW_Q^h, XW_K^h, XW_V^h)
MultiHead = Concat(head₁, …, head_h) · W_O

不同头会自然分工:有的盯语法依存、有的盯指代、有的盯语义相似。论文用 h = 8 个头、每个头维度 64(总维度 512)。

5. 位置编码:注意力本身「不认顺序」

自注意力对输入顺序是排列不变的——把句子打乱,每个词算出的加权求和结果只和「出现了哪些词」有关,和「谁在前」无关。但语言明显有顺序。

解决办法是给每个位置叠加一个位置编码 PE(pos):

后来的模型(如 GPT)大多改用可学习的位置嵌入,思路一致:必须把顺序信息喂进去。

6. 编码器–解码器骨架

原始 Transformer 用于翻译,分两半:

7. 为什么它成了大模型底座?

特性RNN/LSTMTransformer
并行度串行,几乎不能并行全序列一次矩阵运算,GPU 友好
长程依赖路径长、易遗忘任意两点一步直达
可扩展性堆深困难残差+LayerNorm 支持堆到上百层
硬件友好不规则循环全是标准矩阵乘(MatMul)

正因为这些,GPT(只用解码器)、BERT(只用编码器)、ViT(把图当序列)、whisper、Sora 乃至 Diffusion Policy 的动作头,底层都是这套注意力机制。可以说 2017 年这一篇,定义了之后八年深度学习的「通用计算原语」。

8. 小结与延伸

下一篇(pp2)我们聊 Diffusion Policy——它把 Transformer 同款的「注意力范式」之外的另一条线(扩散去噪)搬到了机器人动作生成上,正好和本系列的「VLA 解码手记」衔接。

觉得有用?欢迎点赞、收藏,或请作者喝咖啡 ☕️

支付宝收款码

支付宝

微信收款码

微信

💬 留言

评论由 Giscus 驱动(基于 GitHub Discussions)。 当前仓库 NaphJohn/LLM-blog 尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。