第 12 章 Transformer(Transformers)
本章一句话:Transformer 用一种叫“自注意力”的机制,让序列里的每个词都能“关注”到其他词,从而以共享参数、处理变长输入的方式建模文本(以及图像等)——它是 BERT、GPT 等现代大模型的共同骨架。
读这章的收获:把自注意力彻底讲透(query / key / value、注意力权重、缩放、多头、位置编码),看懂一个 Transformer 层长什么样,并分清 encoder(BERT)/ decoder(GPT)/ encoder-decoder(机器翻译) 三种范式各自的训练目标与适用场景。
本章速览
- 为什么需要 Transformer:文本输入超长(一句话编码后动辄几万维)、变长(每句长度不同)、且语义依赖远距离的词(“它”指代前文的“餐厅”)。全连接网络处理不了,需要共享参数 + 词与词之间的可变连接。
- 核心机制——自注意力:每个词算出 value、query、key 三个向量;用 query 与所有 key 的点积衡量相似度,softmax 归一化成注意力权重,再用这些权重对 value 加权求和。本质是“把各个词的信息按不同比例路由”给每个输出。
- 三个必备扩展:① 位置编码(自注意力本身对词序不敏感,需额外注入位置信息);② 缩放(点积除以 \(\sqrt{D_q}\),防止 softmax 饱和、梯度消失);③ 多头(多组注意力并行,再拼接融合)。
- Transformer 层 = 多头自注意力 + 逐词 MLP,两者都套上残差连接和 LayerNorm;真实网络是一摞这样的层。
- 三种范式:编码器(BERT) 学通用表示,用掩码语言模型(猜被遮住的词)预训练,再微调做下游任务;解码器(GPT) 是自回归生成模型,用下一词预测训练(靠掩码自注意力防作弊);编码-解码器做序列到序列(如机器翻译),解码器额外用交叉注意力关注编码器输出。
- 复杂度瓶颈:自注意力随序列长度平方增长,限制了可处理的长度;可通过稀疏化注意力(卷积式、全局 token 等)来缓解。
- 不止文本:Transformer 已被搬到图像上(ImageGPT、ViT、SWin),靠超大规模和海量数据反超卷积网络。
12.1 处理文本数据
先看一段文本,体会难点:
The restaurant refused to serve me a ham sandwich because it only cooks vegetarian food. In the end, they just gave me two slices of bread. Their ambiance was just as good as the food and service.
我们想把这段话处理成一个适合下游任务(判断好评/差评、回答“这家店卖牛排吗?”)的表示。由此能得到三点观察:
- 编码后的输入非常大。这段 37 个词,若每个词用长度 1024 的嵌入向量表示,输入就有 \(37 \times 1024 = 37888\) 维。真实文本动辄几百上千词——全连接网络完全不现实。
- 每段输入长度都不同。NLP 的一个本质特点就是句子有长有短,连“怎么套用全连接网络”都不清楚。这提示我们:网络应当在不同位置的词之间共享参数(就像卷积网络在图像不同位置共享参数一样)。
- 语言有歧义、且依赖远距离。光看语法分不清 “it” 指的是“餐厅”还是“火腿三明治”。要理解文本,“it” 必须和 “restaurant” 连起来——用 Transformer 的话说,前者要关注(pay attention) 后者。这意味着词与词之间必须有连接,连接的强弱取决于词本身,而且要能跨越很长的文本距离(最后一句的 “their” 同样指代餐厅)。
12.2 点积自注意力(Dot-product self-attention)
上一节得出两个诉求:(i) 共享参数以应对变长的长文本;(ii) 词表示之间存在取决于词本身的连接。Transformer 用点积自注意力同时满足这两点。
先回忆普通神经网络层:输入一个 \(D \times 1\) 向量 \(x\),做线性变换再过激活函数(如 ReLU):
\[f[x] = \mathrm{ReLU}[\beta + \Omega x]\]
而一个自注意力块 \(\mathrm{sa}[\cdot]\) 接收 \(N\) 个输入 \(x_1, \dots, x_N\)(每个 \(D \times 1\),在 NLP 里代表一个词),输出同样是 \(N\) 个 \(D \times 1\) 的向量。
12.2.1 计算并加权 value
第一步,给每个输入算一个 value(值) 向量:
\[v_m = \beta_v + \Omega_v x_m\]
注意:同一套 权重 \(\Omega_v\) 和偏置 \(\beta_v\) 作用在每个输入上(参数共享),所以参数量与序列长度 \(N\) 无关。
第二步,第 \(n\) 个输出是所有 value 的加权和:
\[\mathrm{sa}_n[x_1,\dots,x_N] = \sum_{m=1}^{N} a[x_m, x_n]\, v_m\]
其中标量权重 \(a[x_m, x_n]\) 就是“第 \(n\) 个输出对第 \(m\) 个输入投入的注意力”。对固定的 \(n\),这 \(N\) 个权重非负且加起来等于 1。
图示直觉(路由):把每个输入想成先变成一个 value 向量。输出 1 可能是“0.1 份 value1 + 0.3 份 value2 + 0.6 份 value3”,输出 2 是“0.5 / 0.2 / 0.3”,输出 3 又是另一种配比。自注意力就是把各个 value 按不同比例“路由”出去,组成每个输出。
12.2.2 计算注意力权重
到目前为止是两步线性变换。但整体是非线性的——因为注意力权重本身是输入的非线性函数。要算它,再对输入做两组线性变换,得到 query(查询) 和 key(键):
\[q_n = \beta_q + \Omega_q x_n, \qquad k_m = \beta_k + \Omega_k x_m\]
然后计算每个 query 与所有 key 的点积,过 softmax 归一化:
\[a[x_m, x_n] = \mathrm{softmax}_m\!\left[k_\bullet^\top q_n\right] = \frac{\exp\!\left(k_m^\top q_n\right)}{\sum_{m'=1}^{N}\exp\!\left(k_{m'}^\top q_n\right)}\]
这就是 点积自注意力 名字的由来。
query / key / value 怎么理解? 名字来自信息检索。点积衡量两个向量的相似度:第 \(n\) 个输出的权重,取决于它的 query 与所有 key 的相似程度。softmax 让各个 key 互相“竞争”——谁和当前 query 越像,谁的 value 就被路由得越多。query 和 key 的维度必须相同(才能点积),但它们可以和 value 的维度不同;value 维度通常等于输入维度,这样表示的大小保持不变。
12.2.3 自注意力小结
第 \(n\) 个输出 = 对所有输入施加同一个线性变换 \(v_\bullet = \beta_v + \Omega_v x_\bullet\) 得到的 value 的加权和,权重非负且和为 1,由 \(x_n\) 与其他输入的相似度决定。没有显式的激活函数,但点积 + softmax 让它整体非线性。
它正好满足开头两个诉求:① 全部参数只有一套 \(\phi = \{\beta_v, \Omega_v, \beta_q, \Omega_q, \beta_k, \Omega_k\}\),与输入个数 \(N\) 无关,所以能处理任意长度的序列;② 词与词之间有连接,连接强弱由注意力权重(即词本身)决定。
12.2.4 矩阵形式
把 \(N\) 个输入 \(x_n\) 堆成 \(D \times N\) 的矩阵 \(X\),则 value / query / key 可一次算出:
\[V = \beta_v \mathbf{1}^\top + \Omega_v X, \quad Q = \beta_q \mathbf{1}^\top + \Omega_q X, \quad K = \beta_k \mathbf{1}^\top + \Omega_k X\]
整个自注意力写成(softmax 对每一列独立做):
\[\mathrm{Sa}[X] = V \cdot \mathrm{Softmax}\!\left[K^\top Q\right]\]
这种矩阵形式可以高效并行计算,是 Transformer 实现的关键。
12.3 自注意力的扩展(缩放、多头、位置编码)
下面三个扩展几乎总是一起使用。
12.3.1 位置编码(Positional encoding)
细心的读者会发现:上面的自注意力完全没用到词的顺序——它对输入的排列是等变(equivariant) 的,打乱输入顺序,输出只是跟着换位置。但 “The woman ate the raccoon” 和 “The raccoon ate the woman” 含义截然不同。两种主流补救办法:
- 绝对位置编码:构造一个矩阵 \(\Pi\) 加到输入 \(X\) 上,每一列都不同,从而携带“这是第几个位置”的信息。\(\Pi\) 可以手工设计(如经典的正弦/余弦模式,便于外推到更长序列),也可以学习得到。可以只加在输入层,也可每层都加;有时只加进 query 和 key 的计算而不加进 value。
- 相对位置编码:很多时候两个词的相对距离比绝对位置更重要。它直接为每个“偏移量”学一个参数 \(\pi_{a,b}\),在注意力矩阵上以加、乘等方式修正。
12.3.2 缩放点积自注意力(Scaled dot-product self-attention)
点积的数值可能很大,把 softmax 推到“最大值一家独大”的饱和区——这时输入的微小变化几乎不改变输出(梯度极小),模型难以训练。解决办法是把点积除以 query/key 维度 \(D_q\) 的平方根:
\[\mathrm{Sa}[X] = V \cdot \mathrm{Softmax}\!\left[\frac{K^\top Q}{\sqrt{D_q}}\right]\]
这就是大名鼎鼎的缩放点积注意力。(注:Vaswani 等人原论文采用另一种行/列约定,写作 \(\mathrm{softmax}(QK^\top/\sqrt{d_k})V\),与本书 \(V\cdot\mathrm{Softmax}[K^\top Q]\) 等价。)
12.3.3 多头(Multiple heads)
实践中会并行跑多套自注意力,称为多头自注意力。第 \(h\) 个“头”有自己独立的一组 \(\{\beta_{vh}, \Omega_{vh}\}\)、\(\{\beta_{qh}, \Omega_{qh}\}\)、\(\{\beta_{kh}, \Omega_{kh}\}\):
\[\mathrm{Sa}_h[X] = V_h \cdot \mathrm{Softmax}\!\left[\frac{K_h^\top Q_h}{\sqrt{D_q}}\right]\]
通常若输入维度是 \(D\)、有 \(H\) 个头,则每个头的 value/query/key 维度取 \(D/H\)(便于高效实现)。把所有头的输出纵向拼接,再过一个线性变换 \(\Omega_c\) 融合:
\[\mathrm{MhSa}[X] = \Omega_c \left[\mathrm{Sa}_1[X]^\top, \mathrm{Sa}_2[X]^\top, \dots, \mathrm{Sa}_H[X]^\top\right]^\top\]
多头看来是让自注意力真正好用的必要条件。一种猜测是:它让网络对糟糕的初始化更鲁棒。
12.4 Transformer 层
自注意力只是一个更大的 Transformer 层 的一部分。一个完整的层包含:
- 多头自注意力单元(让各词的表示互相交互);
- 一个逐词的全连接网络 \(\mathrm{mlp}[x_\bullet]\)(分别作用在每个词上)。
两个单元都是残差结构(输出再加回原输入),并且在两者之后各做一次 LayerNorm。LayerNorm 类似 BatchNorm,但它是对每个词嵌入自身的 \(D\) 个维度统计后归一化(而非跨 batch)。整层操作如下:
\[ \begin{aligned} X &\leftarrow X + \mathrm{MhSa}[X] \\ X &\leftarrow \mathrm{LayerNorm}[X] \\ x_n &\leftarrow x_n + \mathrm{mlp}[x_n], \quad \forall n \in \{1,\dots,N\} \\ X &\leftarrow \mathrm{LayerNorm}[X] \end{aligned} \]
直觉:多头自注意力负责“词与词之间横向交流信息”,逐词 MLP 负责“对每个词的表示做纵向加工”;残差 + LayerNorm 让深层网络稳定可训。真实网络就是把许多这样的层串起来。
12.5 NLP 中的 Transformer
典型 NLP 流水线分三步:分词器(tokenizer)→ 词嵌入(embedding)→ 一摞 Transformer 层(Transformer 模型)。
12.5.1 分词(Tokenization)
分词器把文本切成词表里的最小单位(token)。直接用“整词”有麻烦:① 总有词(如人名)不在词表里;② 标点不好处理但又重要(句末问号是关键信息);③ 同一个词的各种变形(walk / walks / walked / walking)要分别占一个 token,还无法体现它们相关。
直接用“单个字母”又太碎,逼着后续网络重新学字母间的关系。实践折中:词表里既有常见整词、也有词片段,让生僻长词由片段拼出。常用算法是字节对编码(BPE)——贪心地反复合并出现频率最高的相邻 token 对,直到词表达到预设大小。
12.5.2 嵌入(Embeddings)
词表 \(V\) 里每个 token 对应一个唯一的词嵌入,整个词表的嵌入存在矩阵 \(\Omega_e \in \mathbb{R}^{D \times |V|}\) 里。把 \(N\) 个输入 token 先编成 one-hot 矩阵 \(T\)(每列只有对应 token 处为 1),则输入嵌入 \(X = \Omega_e T\)。\(\Omega_e\) 和其他参数一样靠训练学到。典型 \(D = 1024\)、\(|V| = 30000\),光是 \(\Omega_e\) 就有海量参数。
12.5.3 Transformer 模型——三种范式
嵌入矩阵 \(X\) 过 \(K\) 个 Transformer 层,构成 Transformer 模型,共有三种类型:
- 编码器(encoder):把文本嵌入转成一个通用表示,支撑多种下游任务(→ 12.6 BERT)。
- 解码器(decoder):预测下一个 token 以续写文本(→ 12.7 GPT3)。
- 编码-解码器(encoder-decoder):用于序列到序列任务,把一段文本转成另一段(如机器翻译,→ 12.8)。
12.6 编码器示例:BERT
BERT 是一个编码器模型:词表 3 万,token 转成 1024 维嵌入,过 24 个 Transformer 层,每层 16 个头,每个头的 query/key/value 维度 64,逐词 MLP 隐层 4096 维,总参数约 3.4 亿(在当年算很大,如今已不算大)。
编码器靠迁移学习工作,分两阶段:
- 预训练(pre-training):用自监督在海量文本上学习语言的一般统计规律(无需人工标注)。
- 微调(fine-tuning):在小得多的有标注数据上,把网络适配到具体任务。
12.6.1 预训练——掩码语言模型(Masked Language Model)
BERT 的自监督任务是预测被遮住的词。做法:在序列开头加一个特殊 <cls> token,再随机把一小部分输入 token 替换成 <mask>;嵌入过完所有 Transformer 层后,对 masked 位置的输出过 softmax,用多分类交叉熵损失去预测原词。
预测缺失词迫使网络理解一些语法(形容词 red 常在名词前、不会在动词 shout 前),也学到一点常识(“The
<mask>pulled into the station” 里填 train 比 peanut 概率高)。优点:能同时利用左右两侧上下文来猜词。缺点:数据利用率低——处理 7 个 token 可能只往损失里加 2 项。(BERT 还有个“判断两句是否相邻”的次要任务,但提升有限。)
12.6.2 微调
微调时,在 Transformer 网络后接一层把输出转成需要的格式:
- 文本分类(如情感分析):用
<cls>token 的输出向量映射成一个数、过 sigmoid,配二元交叉熵损失。 - 逐词分类(如命名实体识别):把每个词的嵌入映射成 \(E\) 维(人名/地名/机构/非实体),过 softmax,配多分类交叉熵。
- 文本片段预测(如 SQuAD 问答):把问题和含答案的段落拼起来,让每个 token 输出“答案在此处开始 / 结束”的两个分数,分别过 softmax,组合出最可能的答案片段。
12.7 解码器示例:GPT3
GPT3 是解码器模型。架构和编码器极其相似(一摞作用在词嵌入上的 Transformer 层),但目标不同:编码器是建表示供微调,解码器只干一件事——预测序列里的下一个 token,从而能把生成的内容喂回去,源源不断地续写文本。
12.7.1 语言建模——自回归(Autoregressive)
GPT3 是自回归语言模型。一句话的概率可按链式法则分解,例如:
\[ \Pr(\text{It takes great courage}\dots) = \Pr(\text{It}) \times \Pr(\text{takes}\mid\text{It}) \times \Pr(\text{great}\mid\text{It takes}) \times \cdots \]
一般地,自回归模型预测每个 token 在所有前文条件下的分布,从而间接得到整句的联合概率:
\[\Pr(t_1, t_2, \dots, t_N) = \Pr(t_1)\prod_{n=2}^{N}\Pr(t_n \mid t_1, \dots, t_{n-1})\]
这就把“最大化联合概率”和“下一词预测”任务连在了一起。
12.7.2 掩码自注意力(Masked self-attention)
训练时我们想一次前向算出整句所有位置的损失,而不是每个词跑一遍。但若直接喂入整句,预测 \(\Pr(\text{great}\mid\text{It takes})\) 时模型就能看到答案 great 以及右侧后文——这是作弊,学不到真本事。
幸好,token 之间只在自注意力层交互。于是只要让“对答案和右侧后文的注意力为 0”即可:在过 softmax 之前,把对应的点积设成 负无穷。这就是掩码自注意力——每个位置只能关注自己和更早的 token。
整个解码器:文本分词→嵌入→过若干掩码自注意力 Transformer 层→每个输出嵌入经一个线性层映射到词表大小、过 softmax 得到下一词分布。训练时用多分类交叉熵,最大化每个位置上真实下一词的对数概率。
对比 BERT:解码器数据利用率高(每个词都贡献一项损失),但只用左侧上下文;BERT 用双向上下文但数据利用率低。
12.7.3 从解码器生成文本
自回归语言模型是本书第一个生成模型:既然它定义了文本序列上的概率分布,就能采样出新文本。从一段输入(甚至只有 <start>)出发,网络给出下一 token 的分布,取最可能的或按分布采样,把扩展后的序列再喂回去……如此循环生成长文本。由于掩码自注意力让前面的嵌入不依赖后面的,大量计算可复用,生成很高效。
让输出更连贯的常用策略:
- 束搜索(beam search):同时保留多个候选续写,找整体最可能的序列(贪心逐词不一定最优)。
- Top-k 采样:只从最可能的 K 个候选里随机抽,避免误入低概率长尾词导致跑偏。
12.7.4 GPT3 与少样本学习(few-shot learning)
GPT3 把这套思路做到极致:序列长 2048,总 batch 320 万 token,96 层、嵌入维度 12288、每层 96 个头(部分用稀疏注意力),训练 3000 亿 token,1750 亿参数。
一个惊人现象:这种规模的模型无需微调也能做很多任务。只要在上下文里给几对“问题/答案”示例,再问一个新问题,它往往能续写出正确答案(改语法、写代码、做算术、翻译、问答等)。因此说超大语言模型是少样本学习者。不过实践中表现不稳定,它到底是在“外推泛化”,还是只是“内插/照搬”,仍不清楚。
12.8 编码-解码器示例:机器翻译
翻译是典型的序列到序列任务。常用 编码器(理解源句)+ 解码器(生成目标句)的组合,即编码-解码器模型。
以英译法为例:
- 编码器接收英文句,过若干 Transformer 层,给出每个 token 的输出表示。
- 解码器训练时接收真值法文句,过若干用掩码自注意力的层,预测每个位置的下一词;但它的层里额外关注编码器的输出。这样每个法文输出词既条件于已生成的法文词,又条件于整句英文。
实现上,在解码器原有的“掩码自注意力 + 逐词 MLP”之间新插入一层注意力,让解码器嵌入去关注编码器嵌入——这叫编码-解码器注意力 / 交叉注意力(cross-attention):
交叉注意力:流程和普通自注意力一样,唯一区别是 query 来自解码器 嵌入,而 key 和 value 来自编码器 嵌入。直觉上,编码器掌握源语言的统计信息,解码器掌握目标语言的统计信息,交叉注意力在两者间架桥。损失函数和纯解码器一样:最大化输出序列下一词的概率。
12.9 长序列的 Transformer
编码器里每个 token 都和其他所有 token 交互,计算量随序列长度平方增长;解码器里每个 token 只看前文,交互约减半,但仍是平方级。这可以用交互矩阵直观理解(编码器是满矩阵,解码器是下三角)。
平方复杂度限制了可处理的长度。许多方法通过稀疏化交互矩阵来扩展长序列:
- 卷积式结构:每个 token 只和邻近几个 token 交互;多层叠加后感受野扩大,远处的 token 仍能间接交互。和图像卷积一样,核可有不同大小和膨胀率(dilation)。
- 选定 token 关注全局:让某些 token(如每句开头)关注所有其他 token(编码器)或所有前文(解码器),加速长距离信息整合。
- 全局 token:引入少数“全局 token”(类似
<cls>,不代表任何词),它们与所有 token 以及彼此相连,专门提供长距离连接。
12.10 图像中的 Transformer(Transformers for images)
Transformer 原为文本而生,巨大成功后被搬到图像上。这本不被看好,原因有二:① 图像像素远多于句子里的词,平方复杂度成了瓶颈;② 卷积网络有很好的归纳偏置(每层对平移等变、天然利用 2D 结构),而 Transformer 得从头学这些。尽管如此,图像 Transformer 如今在图像分类等任务上已反超卷积网络——靠的是巨大的模型规模和海量预训练数据。
12.10.1 ImageGPT
ImageGPT 是个 Transformer 解码器:对图像像素建自回归模型,吃进部分图像、预测下一个像素值。受平方复杂度所限,最大模型(68 亿参数)也只能处理 64×64 图像,且要把 24 位 RGB 量化到 9 位色彩(每个位置 512 选 1)。它给每个像素学一个 1D 位置编码,自行学到“某像素与其前邻、以及上一行邻近像素相关”。其内部表示也可用于分类(对所有像素的最终嵌入取平均,过线性层 + softmax)。在 48×48 的 ImageNet 上 top-1 错误率 27.4%,逊于同期卷积网络,但考虑到输入这么小已很可观。
12.10.2 视觉 Transformer(Vision Transformer, ViT)
ViT 用“切块”绕开分辨率问题:把图像切成 16×16 的图块(patch),每块经一个学到的线性变换映射成一个 patch 嵌入,再送进 Transformer。位置编码仍是学到的 1D 编码。
这是一个带 <cls> token 的编码器模型。但和 BERT 不同,它用有监督预训练(3.03 亿张、1.8 万类的标注图像):<cls> token 映射到 softmax 出类别概率;下游分类时换掉最后一层再微调。在 ImageNet 上 top-1 错误率 11.45%。不过在没有超大规模有监督预训练时,它打不过最好的卷积网络——卷积的强归纳偏置只有用极大量数据才能被超越。
12.10.3 多尺度视觉 Transformer
ViT 只在单一尺度上工作、感受野直接覆盖全图。多尺度方案模仿卷积网络:从高分辨率小块、少通道起步,逐步扩大感受野、降低分辨率、增加通道。
代表是 移位窗口(SWin)Transformer:把图像分成网格状窗口,自注意力只在每个窗口内部进行;相邻层把窗口移位,使不同 patch 子集互相交互,信息得以跨窗传播。每隔几层把 2×2 块 patch 表示拼接、降分辨率、增通道;最终全图成为单一窗口。它不用 <cls>,而是对末层特征取平均再分类,ImageNet top-1 错误率约 9.89%。
另一思路是周期性整合全图信息,如 DaViT 交替两类 Transformer:一类让图块互相关注(用全部通道),一类让通道互相关注(用全部图块),ImageNet top-1 错误率约 9.60%,接近当时的最先进水平。
本章小结
- 本章引入了自注意力与 Transformer 架构。Transformer 操作在一组高维嵌入上:每层计算复杂度低、可用矩阵形式大规模并行,且因为每个嵌入都与其他所有嵌入交互,能刻画长距离依赖。代价是复杂度随序列长度平方增长,可用稀疏化交互矩阵来缓解。
- 自注意力的核心:每个词算出 query/key/value;用 query 与所有 key 的缩放点积过 softmax 得到注意力权重,再对 value 加权求和。三大扩展是位置编码、缩放、多头。一个 Transformer 层 = 多头自注意力 + 逐词 MLP,外加残差与 LayerNorm。
- 三种范式各司其职:编码器(BERT) 用掩码语言模型预训练、学通用双向表示供微调;解码器(GPT) 用下一词预测做自回归生成(靠掩码自注意力防作弊),是本书第一个生成模型;编码-解码器用交叉注意力做序列到序列(如翻译)。
- 用超大无标注数据训练 Transformer,是本书第一个无监督学习的例子。这套思路还成功迁移到图像(ImageGPT、ViT、SWin)等领域。
- 下一章(图神经网络)与 Transformer 有渊源:图的节点在每层里也互相“关注”。
关键术语对照
| 中文 | English | 一句话含义 |
|---|---|---|
| 自注意力 | Self-attention | 序列内每个词按相似度对其他词加权聚合信息 |
| 查询 / 键 / 值 | Query / Key / Value | 算相似度的“问” / “被比对项” / 被路由的“内容” |
| 注意力权重 | Attention weights | 非负、和为 1 的路由比例,由 query·key 的 softmax 得到 |
| 缩放点积注意力 | Scaled dot-product attention | 点积除以 \(\sqrt{d_k}\) 再 softmax,防止饱和 |
| 多头自注意力 | Multi-head self-attention | 多组注意力并行后拼接融合 |
| 位置编码 | Positional encoding | 给等变的自注意力补上词序信息 |
| Transformer 层 | Transformer layer | 多头自注意力 + 逐词 MLP(含残差与 LayerNorm) |
| 分词器 / 字节对编码 | Tokenizer / BPE | 把文本切成词或词片段 |
| 编码器 | Encoder (BERT) | 学通用表示,掩码语言模型预训练 |
| 解码器 | Decoder (GPT) | 自回归生成,下一词预测 + 掩码自注意力 |
| 编码-解码器 | Encoder-decoder | 序列到序列,含交叉注意力 |
| 掩码语言模型 | Masked language model | 遮住部分词让模型预测(BERT 预训练目标) |
| 下一词预测 / 自回归 | Next-token prediction / Autoregressive | 基于前文逐个预测下一个 token(GPT 训练目标) |
| 掩码自注意力 | Masked self-attention | 只能关注自己和更早的 token,防止生成时作弊 |
| 交叉注意力 | Cross-attention | query 来自解码器、key/value 来自编码器 |
| 少样本学习 | Few-shot learning | 仅凭上下文中的几个示例完成新任务 |
| 视觉 Transformer | Vision Transformer (ViT) | 把图像切成 patch 当作 token 喂给编码器 |
返回目录 | 上一章:第 11 章 残差网络 | 下一章:第 13 章 图神经网络