Skip to content

第一章 从序列建模到 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 的性能差异就来自这里。

下一章:注意力机制的数学推导。