# Transformer与语言模型 *Transformer用自注意力取代了循环结构,成为语言理解和生成的主导架构。本文件涵盖BERT、GPT、T5、位置编码(正弦编码、RoPE)、预训练目标(MLM、CLM)、微调、提示工程和缩放定律——这些是现代大语言模型背后的蓝图。* - 在第06章中,我们介绍了Transformer架构:自注意力、多头注意力、位置编码以及编码器-解码器结构。这里我们聚焦于Transformer如何适配特定的NLP范式、定义现代NLP的模型(BERT、GPT、T5),以及让它们在大规模下切实可行的技术。 - 回顾核心操作:**缩放点积注意力**计算 $\text{softmax}(QK^T / \sqrt{d_k}) V$,其中查询、键和值都是输入的线性投影。**多头注意力**并行运行 $h$ 个注意力头,每个头使用不同的学习投影,然后将结果拼接起来。Transformer块通过残差连接、层归一化和逐位置前馈网络(第06章)将这一切包裹起来。 - 一个微妙但重要的架构选择是**层归一化**的放置位置。原始Transformer使用**后归一化**:残差和归一化在子层之后执行,即 $\text{LayerNorm}(x + \text{Sublayer}(x))$。 - 大多数现代模型使用**前归一化**:在子层之前进行归一化,即 $x + \text{Sublayer}(\text{LayerNorm}(x))$。前归一化在训练过程中更加稳定,因为残差连接直接将梯度通过恒等路径传递,不受归一化的影响。这使得训练非常深的模型变得更容易,无需仔细的学习率预热。 - 每个Transformer块中的**前馈子层**是一个两层MLP,独立应用于每个标记位置: $$\text{FFN}(x) = W_2 \cdot \text{GELU}(W_1 x + b_1) + b_2$$ - 内部维度通常是模型维度的4倍(例如,$d_{\text{model}} = 768$,$d_{\text{ff}} = 3072$)。这个FFN约占每个块中参数的三分之二,被认为起到键-值记忆的作用,存储训练过程中学到的事实知识。 - **位置编码**为模型提供标记顺序的信息,因为注意力本身是置换等变的。原始的**正弦编码**(第06章)使用不同频率的固定正弦和余弦函数。**可学习位置嵌入**则简单地为每个位置添加一个可训练向量(用于BERT和GPT-2)。两者都是绝对编码:无论上下文如何,位置5总是得到相同的向量。 - **旋转位置编码(RoPE)**通过在二维子空间中旋转查询和键向量来编码位置。对于一对维度 $(q_{2i}, q_{2i+1})$,按角度 $m\theta_i$ 的旋转(其中 $m$ 是位置,$\theta_i = 10000^{-2i/d}$)应用如下: ```math \begin{bmatrix} q'_{2i} \\ q'_{2i+1} \end{bmatrix} = \begin{bmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{bmatrix} \begin{bmatrix} q_{2i} \\ q_{2i+1} \end{bmatrix} ``` ![RoPE:每个位置在二维子空间中以不同角度旋转查询和键向量,使注意力分数仅依赖于相对位置](../images/rope_rotation.svg) - RoPE的精妙之处在于,旋转后的查询和键之间的点积 $q'^T k'$ 仅依赖于相对位置 $m - n$,而非绝对位置。 - 为了理解原因,将旋转写为 $q' = R_m q$ 和 $k' = R_n k$,其中 $R_m$ 是一个块对角旋转矩阵。注意力分数变为: $$q'^T k' = (R_m q)^T (R_n k) = q^T R_m^T R_n \, k = q^T R_{n-m} \, k$$ - 最后一步利用了旋转群性质:$R_m^T R_n = R_{n-m}$(先向后旋转 $m$ 再向前旋转 $n$,等价于旋转 $n - m$)。 - 这意味着注意力分数仅依赖于相对距离 $n - m$,而非绝对位置 $m$ 和 $n$ 本身。 - 模型无需任何学习的位置参数就能获得自然的距离概念,并且可以泛化到训练时未见过的序列长度。 - **ALiBi**(带线性偏置的注意力)采用了一种更简单的方法:它根据距离向注意力分数添加一个固定的线性惩罚,即 $\text{score}_{ij} = q_i^T k_j - m \cdot |i - j|$,其中 $m$ 是每个头特定的斜率。不同的头使用不同的斜率,使一些头可以关注局部信息,另一些头关注全局信息。ALiBi不需要任何可学习的位置参数,并且能够很好地泛化到比训练时更长的序列。 - 基于Transformer的语言模型的三种主导范式是**仅编码器**、**仅解码器**和**编码器-解码器**。它们在模型能看到的范围(注意力掩码)以及训练方式上有所不同。 ![三种Transformer范式:仅编码器(BERT)使用双向注意力进行分类,仅解码器(GPT)使用因果注意力进行生成,编码器-解码器(T5)结合两者用于序列到序列任务](../images/transformer_paradigms.svg) - **BERT**(来自Transformer的双向编码器表示,Devlin等人,2019)是典型的仅编码器模型。它使用完全的双向注意力处理文本:每个标记可以关注所有其他标记,包括左右两侧。这赋予了BERT丰富的上下文表示,但意味着它不能自回归地生成文本。 - BERT通过两个目标进行预训练。**掩码语言建模(MLM)**随机遮蔽15%的输入标记,并训练模型去预测它们。在被选中的标记中,80%被替换为[MASK]标记,10%被替换为随机词,10%保持不变(以防止模型只学会在看到[MASK]时才进行预测)。训练目标如下: $$\mathcal{L}_{\text{MLM}} = -\sum_{i \in \mathcal{M}} \log P(w_i \mid w_{\backslash \mathcal{M}})$$ - 其中 $\mathcal{M}$ 是被遮蔽的位置集合,$w_{\backslash \mathcal{M}}$ 是这些位置被遮蔽后的句子。这是一个**去噪**目标:模型学习重建被破坏的输入。 ![BERT掩码语言建模:15%的输入标记被遮蔽,双向Transformer在遮蔽位置预测原始标记](../images/bert_mlm.svg) - **下一句预测(NSP)**训练BERT预测两个句子在原始文本中是否连续。输入开头的特殊[CLS]标记用于此二分类。NSP的加入是为了帮助理解句子关系的任务(如问答),不过后来的工作(RoBERTa)表明其贡献很小,可以去掉。 - BERT的预训练表示通过在其顶部添加特定任务的头部(一个简单的线性层)并微调整个模型来适应下游任务。对于分类任务,使用[CLS]标记的表示。对于标记级任务(命名实体识别、词性标注),使用每个标记的表示。这种**微调**方法将预训练期间学到的语言知识迁移到新任务上,只需相对较少的标注数据。 - **GPT**(生成式预训练Transformer,Radford等人,2018)是典型的仅解码器模型。它使用**因果(自回归)注意力**:每个标记只能关注更早位置的标记(以及自身)。这是通过在注意力矩阵中遮蔽未来位置(将其分数设置为 $-\infty$,然后再进行softmax)来实现的。训练目标是简单的**因果语言建模**:根据所有之前的标记预测下一个标记。 $$\mathcal{L}_{\text{CLM}} = -\sum_{i=1}^{n} \log P(w_i \mid w_1, \ldots, w_{i-1})$$ - 这与文件02中的n-gram语言模型目标相同,但采用了Transformer参数化方式,可以基于整个前文进行条件建模,而不仅仅是最后 $k-1$ 个标记。 - **GPT-2**将其规模扩大到15亿参数,并展现了强大的零样本能力:无需任何微调,它就能通过自然语言提示("将英语翻译成法语:……")来执行任务。 - **GPT-3**(1750亿参数)表明,仅凭规模就能实现**上下文学习**:通过在提示中提供几个输入-输出示例,模型无需任何梯度更新就能执行新任务。 - **编码器-解码器模型**如**T5**(文本到文本迁移Transformer,Raffel等人,2020)将每个NLP任务都视为文本到文本:输入是一个文本字符串(可能带有任务前缀,如"将英语翻译成德语:"),输出也是一个文本字符串。编码器使用双向注意力处理输入,解码器则通过交叉注意力自回归地生成输出。 - T5通过**跨度破坏**进行预训练:随机连续标记跨度被替换为哨兵标记,模型需要生成原始标记。例如,"The cat sat on the mat"可能变成输入"The [X] on [Y]",目标输出是"[X] cat sat [Y] the mat"。这是BERT的MLM从单个标记向跨度的泛化。 - **BART**(Lewis等人,2020)是另一种编码器-解码器模型,通过去噪目标进行预训练,但它应用了更广泛的破坏策略:标记遮蔽、标记删除、跨度遮蔽、句子置换和文档旋转。多样化的破坏方式迫使模型学习更鲁棒的表示。 - 随着语言模型变得越来越大,**全量微调**(更新所有参数)变得不切实际:一个175B参数的模型仅存储优化器状态就需要数百GB。**参数高效微调(PEFT)**方法只调整一小部分参数。 - **适配器**在现有Transformer层之间插入小型瓶颈层(通常是两个线性层加一个非线性激活:下投影到小维度,再上投影回来)。只有适配器的权重被训练;原始模型权重被冻结。这增加了不到5%的新参数,同时在大多数任务上匹配全量微调的性能。 - **LoRA**(低秩适配)直接修改权重矩阵,而不添加新层。LoRA不更新完整的权重矩阵 $W$,而是学习一个低秩分解的更新:$W' = W + BA$,其中 $B$ 是 $d \times r$ 矩阵,$A$ 是 $r \times d$ 矩阵,且 $r \ll d$(通常 $r = 4$ 到 $r = 64$)。原始 $W$ 被冻结;只训练 $A$ 和 $B$。在推理时,更新可以合并到原始权重中,不会增加额外延迟: $$W' = W + BA$$ ![LoRA:冻结的权重矩阵W被一个通过小矩阵A和B的低秩路径旁路,可训练参数减少32倍,同时匹配全量微调的性能](../images/lora_decomposition.svg) - **前缀微调**在每个注意力层的键和值矩阵前添加一串可学习的"虚拟标记"。模型像对待真实标记一样关注这些前缀向量,并且只训练前缀参数。这与提示微调类似,但在激活空间而非嵌入空间中操作。 - **提示工程**是设计输入文本的艺术,旨在从预训练模型中引出所需行为,而无需任何参数更新。 - **零样本提示**用自然语言描述任务("对以下评论的情感进行分类:")。 - **少样本提示**在实际查询之前提供输入-输出示例。 - **链式思维(CoT)提示**添加"让我们一步一步地思考"或在示例中包含推理过程,这通过引导模型分解问题,显著提高了算术和逻辑推理任务的性能。 - **上下文学习(ICL)**是大语言模型能够从提示中提供的示例学习执行任务的现象,而无需任何梯度更新。模型的权重没有改变;它将示例作为一种隐式规范来使用。 - ICL在机制上是如何工作的仍然是一个活跃的研究问题;一种假说是注意力层在前向传播中实现了一种梯度下降形式,实际上是在上下文示例上进行"训练"。 - **缩放定律**描述了模型大小、数据大小、计算预算与性能(以损失衡量)之间的可预测关系。Kaplan等人(2020)发现损失在每个变量上都遵循幂律: $$L(N) \propto N^{-\alpha_N}, \quad L(D) \propto D^{-\alpha_D}, \quad L(C) \propto C^{-\alpha_C}$$ - 其中 $N$ 是参数量,$D$ 是数据集大小,$C$ 是计算预算。这些幂律在多个数量级上成立,表明单纯地扩大规模就能带来可预测的改进。 ![缩放定律:损失在对数-对数坐标轴上以幂律递减,Kaplan和Chinchilla的研究结果表明随规模扩大有可预期的改进](../images/scaling_laws.svg) - **Chinchilla缩放定律**(Hoffmann等人,2022)修正了这一点,指出大多数大型模型都训练不足。对于固定的计算预算 $C$,最优分配是同等规模地扩大模型大小和训练数据: $$N_{\text{opt}} \propto C^{0.5}, \quad D_{\text{opt}} \propto C^{0.5}$$ - 这意味着如果计算预算翻倍,应该同时将模型大小和数据集大小增加 $\sqrt{2}$ 倍,而不仅仅是让模型变得更大。 - Kaplan等人曾建议 $N$ 的缩放速度应快于 $D$,这导致了非常大但训练不足的模型。Chinchilla(70B参数,1.4T标记)在相同的计算预算下匹配了Gopher(280B参数,300B标记)的性能,表明早期模型严重缺乏数据。 - 实用的经验法则:大约每个参数训练20个标记。 - **混合专家(MoE)**是一种在不成比例增加计算量的情况下扩大模型容量的架构。MoE不采用单一的大型前馈层,而是使用多个**专家**FFN层和一个**门控网络**(路由网络)来选择每个标记应该激活哪些专家。 - 门控函数计算每个专家的路由分数,并选择前 $k$ 个(通常 $k = 1$ 或 $k = 2$): $$G(x) = \text{TopK}(\text{softmax}(W_g x))$$ - 只有被选中的专家处理该标记,因此计算成本随 $k$(活跃专家数)而非总专家数 $E$ 增长。一个有8个专家且采用top-2路由的模型,参数量是稠密模型的4倍,但计算量仅为2倍。 ![MoE层:输入标记经过路由网络计算每个专家的分数,选择top-2专家,它们的输出按门控分数加权后求和](../images/moe_layer.svg) - MoE中一个关键的挑战是**负载均衡**:如果路由网络将大多数标记发送给少数热门专家,其他专家就被浪费了。训练时会添加一个辅助的**负载均衡损失**,鼓励均匀的专家利用率: $$\mathcal{L}_{\text{balance}} = E \cdot \sum_{i=1}^{E} f_i \cdot p_i$$ - 其中 $f_i$ 是分配给专家 $i$ 的标记比例,$p_i$ 是专家 $i$ 的平均路由概率。当标记比例和概率都均匀(各等于 $1/E$)时,该乘积最小。 - **专家并行**将不同的专家分布到不同的加速器上。在前向传播过程中,通过一个全到全的通信步骤将标记路由到其指定专家所在的设备,然后将结果路由回来。这种通信成本是MoE在大规模部署中的主要工程挑战。Switch Transformer、Mixtral和GShard等模型使用MoE来获得强大的性能,同时保持合理的推理成本。 - 构建模型只是工作的一半;衡量它们是否有效是另一半。NLP评估特别困难,因为语言是模糊的、主观的和开放式的。 - 一个翻译可以有多种正确的表达方式。一个摘要即使与参考摘要没有任何完全相同的词汇,也可能是好的。 - 一个聊天机器人的回复可能既有用、又无害、又诚实,但理性的人仍会对此有不同看法。 - **精确匹配(EM)**是最简单的指标:模型的输出是否与标准答案完全一致?它用于答案简短且无歧义的任务,如抽取式问答(SQuAD)或封闭式数学问题。 - EM是严苛的;"New York City"和"new york city"在不做归一化的情况下无法匹配——但它的简单性使其没有歧义。 - **标记级指标**将NLP视为标记级别的分类问题,使用第06章中的精确率、召回率和F1值。 - **精确率(Precision)**衡量模型预测的标记中正确部分的比例:$P = \text{TP} / (\text{TP} + \text{FP})$。一个预测很少但全部正确的模型具有高精确率。 - **召回率(Recall)**衡量模型找到了多少标准标记:$R = \text{TP} / (\text{TP} + \text{FN})$。一个将所有标记都预测为实体的模型具有完美的召回率但精确率极低。 - **F1**是精确率和召回率的调和平均值: $$F_1 = \frac{2PR}{P + R}$$ - 调和平均值(而非算术平均值)惩罚不均衡:如果 $P$ 或 $R$ 中任何一个较低,F1就会很低。对于命名实体识别(文件02),F1按每个实体类型分别计算,然后跨类型取宏平均。对于词性标注,标记级准确率更常见,因为每个标记都有一个标签。 - **跨度级F1**(用于SQuAD)比较预测跨度中的标记集与标准跨度中的标记集。这比精确匹配更宽容:如果标准答案是"the Eiffel Tower"而模型预测的是"Eiffel Tower",跨度F1很高(5个重叠标记中的4个),即使EM为零。 - **BLEU**(双语评估替补,Papineni等人,2002)是机器翻译的经典指标。它衡量候选翻译与一个或多个参考翻译之间的n-gram重叠。该评分结合了多个n-gram级别(unigram到4-gram)的精确率和一个简短惩罚: $$\text{BLEU} = \text{BP} \cdot \exp\!\left(\sum_{n=1}^{N} w_n \log p_n\right)$$ - 其中 $p_n$ 是**修正的n-gram精确率**:候选翻译中每个n-gram的计数被裁剪为其在任何参考翻译中的最大计数,防止像"the the the the"这样的退化候选获得高分。权重 $w_n$ 通常是均匀的($w_n = 1/N$,其中 $N = 4$)。 - **简短惩罚** $\text{BP} = \min(1, \exp(1 - r/c))$ 惩罚比参考翻译短的候选($c$ 是候选长度,$r$ 是参考长度)。没有这个惩罚,模型可以通过输出很少但非常安全的词来获得高精确率。 - BLEU在语料级别(对多个句子取平均)与人类判断有合理的相关性,但在句子级别相关性较差。 - 它奖励精确的n-gram匹配,但会遗漏有效的释义:"the cat is on the mat"和"a feline sits atop the rug"尽管意思相同,但二元组重叠为零。 - BLEU也完全忽略了召回率——只输出最常见词汇的候选在精确率上得分很高。 - **ROUGE**(面向召回率的摘要评估替补,Lin,2004)是摘要的标准指标。与强调精确率的BLEU不同,ROUGE强调召回率:参考n-gram中有多少比例出现在候选摘要中? - **ROUGE-N**计算n-gram的召回率:$\text{ROUGE-N} = \frac{|\text{n-grams}_{\text{ref}} \cap \text{n-grams}_{\text{cand}}|}{|\text{n-grams}_{\text{ref}}|}$。ROUGE-1(unigram)和ROUGE-2(bigram)最为常用。 - ROUGE-L使用候选和参考之间的**最长公共子序列(LCS)**,这可以捕捉句子级别的词序信息,而不要求连续匹配。 - LCS长度除以参考长度得到召回率,除以候选长度得到精确率,F度量则组合两者。 - LCS通过动态规划在 $O(mn)$ 时间内计算(类似于文件02中的编辑距离): $$R_{\text{LCS}} = \frac{\text{LCS}(X, Y)}{m}, \quad P_{\text{LCS}} = \frac{\text{LCS}(X, Y)}{n}, \quad F_{\text{LCS}} = \frac{(1 + \beta^2) R_{\text{LCS}} P_{\text{LCS}}}{R_{\text{LCS}} + \beta^2 P_{\text{LCS}}}$$ - 其中 $m$ 和 $n$ 分别是参考和候选的长度,$\beta$ 通常设置为偏向召回率($\beta \to \infty$ 给出纯召回率)。 - **METEOR**(带显式排序的翻译评估度量,Banerjee和Lavie,2005)通过引入同义词、词干提取和词序来解决BLEU的弱点。 - 它首先使用精确匹配、词干匹配(通过文件02中的Porter词干提取算法)和同义词匹配(通过文件01中的WordNet)在候选和参考之间对齐词汇。 - 然后计算unigram精确率和召回率的调和平均值(偏向召回率),并应用一个碎片化惩罚,惩罚那些匹配词顺序与参考不同的候选。 - **ChrF**(字符n-gram F值)计算字符n-gram而非词汇n-gram的F值。这使其对形态变化具有鲁棒性(对文件01中的黏着语至关重要),并部分处理了分词差异。ChrF++在字符n-gram的基础上增加了词汇二元组。 - 它已成为机器翻译中与BLEU一起推荐的度量标准,特别是对于形态丰富的语言。 - **困惑度**(文件02)衡量语言模型在保留测试集上的预测效果。这是语言模型的标准内在指标:$\text{PPL} = \exp(-\frac{1}{N} \sum_{i} \log P(w_i \mid w_{