第一章 从序列建模到 Transformer
Transformer 首先是一种组织信息处理的神经网络结构。理解它,需要先理解模型在解决什么问题:一个位置的预测如何利用其他位置的信息,长序列中的依赖怎样传递,以及这种计算怎样在硬件上执行。
本章从语言模型的概率目标讲起,经由循环网络和编码器—解码器,说明注意力机制与 Transformer 的设计背景。这里的演进脉络用于解释不同设计解决的约束,不意味着每一种结构都被后一种全面取代。
1 语言为什么是序列问题
考虑“这本书我已经读过了”。如果预测“读”后面的 token,模型不能只看当前位置的编号,还需要利用前文。“读过”“读完”哪个更合理,取决于上下文以及模型在训练数据中学到的规律。
设分词后的序列为 $x_1,x_2,\ldots,x_n$。概率的链式法则给出:
$$ p(x_1,\ldots,x_n)=\prod_{t=1}^{n}p(x_t\mid x_1,\ldots,x_{t-1}) $$
这是任意联合分布都满足的分解,并没有规定神经网络结构。语言模型要做的是用带参数的函数 $p_\theta$ 去近似这些条件分布。RNN、Transformer 等结构,是计算条件分布的不同方法。
这里要区分两层问题。概率建模决定“预测什么”;网络架构决定“如何根据上下文得到预测”。自回归是前者的一种分解方式,Self-Attention 是后者的一种计算机制,两者不是同义词。
翻译则是条件生成:给定源序列 $x$,建模目标序列 $y$:
$$ p_\theta(y\mid x)=\prod_t p_\theta(y_t\mid y_{<t},x) $$
这多出了一份始终可见的源信息。它自然引出编码器负责表示源序列、解码器负责逐步产生目标序列的设计。
2 从 token ID 到可学习表示
token 不必等于一个汉字或英文单词。Tokenizer 决定文本如何拆分、每个片段对应哪个整数 ID;词表是这些 ID 的集合。分词结果影响序列长度和词表规模,但整数 ID 本身没有可利用的几何语义:ID 1000 不天然比 ID 10 “更大”。
设词表大小为 $V$,表示维度为 $d$,Embedding 表为 $E\in\mathbb{R}^{V\times d}$。ID 为 $i$ 的 token 对应向量:
$$ e_i=E[i,:] $$
若用 one-hot 行向量 $u_i$ 表示该 ID,数学上也可写成 $e_i=u_iE$。实际实现通常直接索引行,不真的构造一个巨大 one-hot 矩阵做稠密乘法。
Embedding 是模型参数的一部分,通过训练更新。同一个 token 在输入层查到相同向量,但经过上下文处理后,不同位置的 hidden state 可以不同。例如“苹果公司”和“吃苹果”中,“苹果”的初始向量可能相同,而深层表示会受上下文影响。
把长度为 $S$ 的序列排列成矩阵 $X\in\mathbb{R}^{S\times d}$:每一行代表一个位置,每一列代表一个特征通道。后续所有结构都可以理解为对这个矩阵进行信息交换与特征变换。
3 循环神经网络如何表示历史
一个简单 RNN 用隐藏状态保存过去的信息:
$$ h_t=\phi(W_xe_t+W_hh_{t-1}+b) $$
这个公式使用列向量记号:$h_t$ 由当前输入和上一时刻状态共同决定。模型可以从 $h_t$ 产生下一 token 的分布,因此理论上过去的输入都可以通过状态影响预测。
它有两个与系统密切相关的特征。首先,$h_t$ 必须等 $h_{t-1}$ 算完。即使整个训练句子已知,沿时间轴的状态更新仍存在串行依赖。其次,久远信息要经过很多状态变换才能到达当前位置。
把这些变换的局部导数记为 $J_j=\partial h_j/\partial h_{j-1}$,则长距离梯度包含矩阵乘积:
$$ \frac{\partial h_t}{\partial h_{t-r}}=J_tJ_{t-1}\cdots J_{t-r+1} $$
反复相乘可能使梯度缩小或放大;具体行为依赖这些矩阵,而不只是某一个标量。LSTM、GRU 通过门控和更直接的状态通路改善信息保持,但时间递归关系仍然存在。
这不表示循环网络没有价值。固定大小的状态本身就是一种紧凑的历史压缩,对流式处理尤其有吸引力。Transformer 选择了另一种权衡:保留可访问的多个位置表示,使当前位置能直接读取它们。
4 早期编码器与解码器的压缩瓶颈
一种基本 Seq2Seq 设计先把整句编码成一个固定长度向量 $c$,再让解码器根据 $c$ 和已生成的目标前缀预测后续内容:
$$ c=\operatorname{Encoder}(x_1,\ldots,x_S),\qquad p(y_t\mid y_{<t},x)=\operatorname{Decoder}(y_{<t},c) $$
这里的困难是,源句所有有用细节都要通过同一份固定表示传递。长句含有多个对象、修饰关系和位置线索,解码到不同目标词时,真正需要的源信息也不同。
Bahdanau 等人的注意力工作提出,在生成目标位置时动态查找源句中的相关部分,缓解固定长度编码的瓶颈。这一背景来自其原始论文。
关键变化是保留源序列的多个表示 $h_1,\ldots,h_S$,并让当前解码状态 $s_{t-1}$ 决定如何读取它们:
$$ e_{tj}=v_a^\top\tanh(W_ss_{t-1}+W_hh_j) $$
$$ \alpha_{tj}=\frac{\exp(e_{tj})}{\sum_r\exp(e_{tr})},\qquad c_t=\sum_j\alpha_{tj}h_j $$
此时每个目标位置都有自己的上下文 $c_t$,不再要求同一个 $c$ 预先打包所有需求。对源位置的选择是连续权重,因而能通过梯度学习,不必给每一步提供人工对齐标注。
5 从跨序列读取到序列内部读取
刚才的 Query 来自目标序列,候选内容来自源序列,是跨序列注意力的直觉。进一步可以问:一个句子内部的每个位置,是否也可以主动读取其他位置?
例如“奖杯放不进箱子,因为它太大了”。“它”的表示应根据前文关系进行更新。可以让“它”所在位置根据当前表示提出 Query,并从所有允许访问的位置读取内容。这就是 Self-Attention 的基本用途:根据内容,在同一序列中建立信息通路。
在一个无稀疏限制的 Self-Attention 层中,一个位置可以直接读取任意允许访问的位置;跨位置的信息传递不必沿着相邻时间步逐个经过。其代价是要评估大量 query-key 配对,长度为 $S$ 时有 $O(S^2)$ 个配对。
6 Transformer 的结构选择
原始 Transformer 将注意力作为主要的序列信息交换机制,结合逐位置前馈网络、残差连接、归一化和位置表示,构造编码器与解码器。论文在机器翻译背景下提出这一架构,强调它不依赖循环或卷积来完成序列变换。Attention Is All You Need
理解它时,可以始终抓住两个交替发生的操作:
- 跨位置的信息交换:Attention 根据当前内容决定从哪些位置读取信息。
- 每个位置内部的特征变换:FFN 对聚合后的向量进行非线性加工。
堆叠多层后,下一层的注意力建立在上一层已经上下文化的表示之上。它并非只做一次词向量相似度搜索,而是反复更新“如何匹配”和“传递什么”。
注意力的并行性有明确边界:在输入位置都已知时,同一层可同时处理多个位置;层与层之间仍存在依赖。生成时,未来 token 尚未采样出来,自回归依赖也仍然存在。后面 Prefill 与 Decode 的性能差异就来自这里。
下一章:注意力机制的数学推导。