大语言模型基础:从Transformer到注意力机制
大语言模型基础:从Transformer到注意力机制
当我们与ChatGPT进行对话时,很少会停下来思考支撑这一交互体验的底层技术架构。然而,理解大语言模型的内部运作机制,对于掌握提示工程的核心原理至关重要。提示工程并非凭空产生的技巧,它深深植根于深度学习、自然语言处理和大规模Transformer架构的技术土壤之中。本章将带领读者深入探索这些基础概念,建立对语言模型工作原理的直观理解,从而为后续学习各种提示技术奠定坚实的理论基础。
大语言模型的核心特征在于其庞大的参数规模和基于Transformer的架构设计。要理解为什么一个拥有数百亿参数的模型能够处理自然语言任务,我们首先需要剖析Transformer架构的核心组件——自注意力机制、多头注意力机制以及位置编码等关键技术。这些组件共同构成了现代语言模型的基石,也决定了提示工程的基本约束和可能性边界。
Transformer架构的诞生与演进
从序列建模到注意力机制
在Transformer出现之前,循环神经网络(RNN)及其变体(如LSTM和GRU)长期占据序列建模的主导地位。这些模型通过逐个处理输入序列中的token,维护一个隐藏状态来编码已看到的信息。然而,RNN架构存在两个根本性的缺陷:其一,信息在长序列中传播时需要经过多个时间步,容易出现梯度消失或梯度爆炸问题;其二,序列处理必须是顺序的,无法并行计算,导致训练效率低下。
1997年,Sepp Hochreiter和Jürgen Schmidhuber提出了长短期记忆网络,试图通过门控机制缓解梯度消失问题。随后,Tomas Mikolov等人开发的LSTM变体在多项任务上取得了显著进步。但这些改进并未从根本上解决RNN的序列化处理问题。当序列长度达到数千个token时,即使是LSTM也难以有效地捕获远距离依赖关系。
注意力机制的引入标志着这一困境的突破性转折。2014年,Dzmitry Bahdanau等人提出了用于序列到序列模型的注意力机制,其核心思想是允许解码器在生成每个输出token时,“关注”输入序列中的不同位置。这一创新使得模型能够显式地学习词与词之间的对应关系,而不必依赖于压缩在固定维度隐藏状态中的信息。
然而,真正带来架构范式转变的是2017年Google Brain团队发表的标志性论文《Attention Is All You Need》。这篇论文提出了Transformer架构,完全摒弃了循环结构,仅依靠注意力机制来建模序列内部的依赖关系。Transformer的并行化能力使得在更大规模数据上训练成为可能,同时也为后来的大语言模型革命铺平了道路。
Transformer的整体架构
Transformer采用编码器-解码器(Encoder-Decoder)结构,这一设计最初针对机器翻译任务进行了优化。编码器负责将输入序列转换为连续的向量表示,解码器则基于这些表示逐个生成输出序列。理解这一架构对于掌握现代语言模型的工作方式具有重要意义。
编码器部分由多个相同的层堆叠而成,每一层包含两个核心子组件:多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Network)。每个子组件都采用了残差连接(Residual Connection)和层归一化(Layer Normalization),这些技术对于训练深层网络至关重要。解码器在编码器结构的基础上增加了一个额外的注意力层,用于关注编码器的输出,同时对后续位置的注意力进行了掩码处理,以确保自回归生成的因果性质。
这种模块化设计赋予了Transformer良好的可扩展性。通过增加层的深度和隐藏表示的维度,模型可以学习更复杂的模式;通过增加注意力头的数量,模型可以从不同角度捕获序列中的关系。这种灵活性在后续的BERT和GPT系列模型中得到了充分体现,它们分别选择了仅使用编码器和仅使用解码器的架构变体。
自注意力机制:Transformer的核心
缩放点积注意力
自注意力机制(Self-Attention)是Transformer的灵魂所在。与传统的循环模型不同,自注意力允许序列中的每个位置同时关注序列中的所有其他位置,从而直接建模任意距离的依赖关系。这种“全局感受野”的特性是Transformer能够在长序列上表现出色的关键因素。
缩放点积注意力(Scaled Dot-Product Attention)的计算过程可以形式化地描述如下:给定查询(Query)、键(Key)和值(Value)三个矩阵,分别记为$Q$、$K$、$V$,注意力输出的计算为:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
其中$d_k$是键向量的维度。分母$\sqrt{d_k}$的作用是进行缩放,防止当$d_k$较大时点积结果过大,导致softmax函数进入饱和区域,梯度变得过于微小。这一技术细节对于训练的稳定性具有重要影响,是Transformer作者们的关键洞察之一。
在实际实现中,$Q$、$K$、$V$通常通过对输入的线性变换得到。设输入序列的嵌入表示为$X$,则:
$$Q = XW_Q, \quad K = XW_K, \quad V = XW_V$$
其中$W_Q$、$W_K$、$W_V$是可学习的参数矩阵。通过为每个头设置不同的参数矩阵,模型可以学习多种不同的注意力模式。
从注意力到语言理解
理解自注意力机制如何实现语言理解的一种直观方式是考察其在实际句子上的表现。考虑句子“The animal didn't cross the street because it was too tired”中“it”指代什么的问题。这是一个典型的共指消解(Coreference Resolution)任务,对于人类而言轻而易举,但对于传统NLP系统却极具挑战性。
在Transformer中,自注意力机制通过计算“it”与句子中所有其他词之间的注意力权重来建立关联。模型会为“it”分配较高的注意力权重给“animal”,因为它们在语义上存在指代关系。这种关系是通过学习大量文本中的统计规律而隐式获得的,并非显式编程的结果。当我们进行提示工程时,模型正是基于这种习得的关联能力来理解和响应用户的指令。
注意力权重的可视化为我们提供了理解模型决策过程的重要窗口。研究表明,不同的注意力头会关注不同的语言特征:某些头专注于语法结构,捕捉主语与动词的一致性关系;某些头关注语义关联,建立概念之间的映射;还有一些头擅长处理指代关系。正是这种分工协作的方式,使Transformer能够全面理解输入文本的丰富语义。
多头注意力机制
单一的自注意力机制虽然能够捕获序列中的依赖关系,但其表达能力仍然有限。多头注意力(Multi-Head Attention)机制通过并行运行多个独立的注意力函数,将输入分割成多个子空间,让模型能够在不同的表示子空间中学习关注不同类型的信息。
形式上,多头注意力的计算过程为:
$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O$$
其中每个$\text{head}_i$为:
$$\text{head}_i = \text{Attention}(QW_Q^i, KW_K^i, VW_V^i)$$
原始Transformer论文使用了8个注意力头,每个头的维度$d_k = d_{model}/8 = 64$。这种设计使得总计算量与单头注意力的计算量相当,同时显著提升了模型的表达能力。后续的研究表明,多头注意力中的不同头确实学习到了不同的语义角色,这验证了多头机制的有效性。
值得注意的是,并非所有的注意力头都同等重要。近期研究发现了“注意力头冗余”现象:许多头的输出高度相似,剪枝这些冗余头对模型性能影响甚微。这一发现对于模型压缩和推理优化具有重要启示,也影响了后续模型架构的设计选择——一些更现代的模型采用了更少但更大的注意力头,或者使用了稀疏注意力的变体来提高效率。
位置编码:让序列有序
绝对位置编码
自注意力机制的核心计算——矩阵$QK^T$——对输入序列的顺序是置换等变的。也就是说,如果我们将输入序列中的两个词交换位置,注意力矩阵中对应的两行也会交换,但最终的输出保持不变。这一特性对于某些任务(如集合预测)可能是优点,但对于语言建模而言却是致命的缺陷——自然语言中词的顺序本身就携带语义信息,“猫追狗”与“狗追猫”具有完全不同的含义。
为了解决这一问题,Transformer引入了位置编码(Positional Encoding),将序列中每个位置的顺序信息显式地添加到输入表示中。原始Transformer使用了基于正弦和余弦函数的位置编码:
$$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$
$$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)$$
其中$pos$表示位置,$i$表示维度索引。这种设计的巧妙之处在于,对于任何固定的偏移量$k$,$PE_{pos+k}$可以表示为$PE_{pos}$的线性函数,这一特性有助于模型学习相对位置关系。此外,由于正弦和余弦函数的值域在$[-1, 1]$之间,位置编码不会显著改变输入向量的尺度。
选择正弦/余弦编码而非可学习的位置编码,部分原因是前者能够处理训练时未见过的序列长度(虽然外推性能有限)。尽管后续研究提出了多种改进方案,但这一原始设计至今仍被广泛使用。
相对位置编码与旋转位置编码
绝对位置编码的一个潜在问题是它难以很好地泛化到超出训练序列长度的位置。当我们希望模型处理比训练时更长的序列时,这一限制就变得尤为突出。此外,绝对位置编码在建模相对位置关系(如“当前词前两个位置”)时效率较低,而这种相对位置关系在许多语言任务中往往更为重要。
为了解决这些问题,研究者提出了相对位置编码(Relative Position Encoding)系列方法。这类方法不再编码token的绝对位置,而是显式地建模token之间的相对距离。在计算注意力分数时,相对位置编码会添加一个与相对位置相关的偏置项:
$$\text{score}_{i,j} = \frac{Q_iK_j^T}{\sqrt{d_k}} + R_{j-i}$$
其中$R_{j-i}$是一个可学习的偏置矩阵,仅依赖于相对位置$j-i$。这种方法使模型能够更好地处理位置泛化问题,也为注意力计算引入了更有意义的归纳偏置。
2021年,Su Jianlin等人提出了旋转位置编码(Rotary Position Encoding,RoPE),迅速成为现代大语言模型的标准选择。RoPE的核心思想是将位置信息编码为旋转矩阵,然后将其融入注意力计算中。具体而言,对于第$pos$个位置的查询和键向量,RoPE应用如下旋转变换:
$$R_{pos}(\mathbf{x}) = \mathbf{x} \cdot \begin{pmatrix} \cos(pos \cdot \theta) & -\sin(pos \cdot \theta) \\ \sin(pos \cdot \theta) & \cos(pos \cdot \theta) \end{pmatrix}$$
这种编码方式具有一个重要特性:两个位置编码后的向量之间的点积仅依赖于相对位置,而不依赖于绝对位置。这一特性被称为“远程衰减”(Long-term Decay),意味着随着token之间距离的增加,它们之间的注意力权重会自然衰减,与语言中的实际依赖关系模式相符。
RoPE已被LLaMA、GLM-130B、Baichuan等众多主流大语言模型采用。其计算效率高、实现相对简单,且在长序列任务上展现出良好的外推性能,是近年来位置编码领域的重要创新。
从BERT到GPT:预训练范式的演变
BERT:双向编码器的崛起
2018年,Google发表了BERT(Bidirectional Encoder Representations from Transformers),开启了预训练语言模型的新纪元。BERT的核心创新在于提出了掩码语言建模(Masked Language Modeling,MLM)的预训练任务,以及下一句预测(Next Sentence Prediction,NSP)任务的辅助。这一范式使得模型能够在预训练阶段学习双向上下文表示,而非仅能从左到右生成文本。
BERT的掩码策略采用了一种特殊的设计:以15%的概率将输入中的token替换为特殊的[MASK]标记,然后训练模型预测被掩码的原始token。为了避免预训练与微调阶段之间的不匹配(因为微调时不会出现[MASK]标记),BERT采用了以下策略:80%的情况下用[MASK]替换,10%的情况下用随机token替换,10%的情况下保持不变。这一技巧被后续许多模型沿用。
BERT在多项自然语言理解基准测试中取得了突破性成绩,包括问答、文本分类、自然语言推理等任务。其成功证明了大规模预训练加任务特定微调范式的强大威力,也促使研究社区重新审视预训练模型在NLP中的核心地位。
BERT系列的后续发展包括RoBERTa(移除NSP任务,使用更多训练数据和更长的训练步数)、ALBERT(参数共享以减少模型大小)、ELECTRA(替换token检测任务替代MLM以提高效率)等变体。这些工作从不同角度对BERT进行了改进和探索,丰富了预训练模型的技术生态。
GPT系列:生成式预训练的演进
与BERT的编码器架构不同,OpenAI选择了仅使用Transformer解码器的架构来构建GPT(Generative Pre-Training)系列模型。GPT采用标准的语言建模任务——预测下一个token——这使得它天然适合文本生成任务。这一架构选择也为后来ChatGPT等对话系统的成功奠定了基础。
GPT-1于2018年发布,展示了在无标签文本上预训练,然后在特定任务上微调的有效性。GPT-2在2019年问世,显著扩大了模型规模(从1.17亿参数增至15亿参数),并提出了一个激进的主张:语言模型在足够大规模时可以无需微调就能执行任务,即所谓的“涌现能力”(Emergent Abilities)。GPT-2生成的文章在人类评估中达到了难以区分的水平,引发了对AI生成内容的广泛讨论。
GPT-3进一步将参数规模提升至1750亿,这一数字在当时是前所未有的。GPT-3的核心发现是“上下文学习”(In-Context Learning):通过在提示中提供少量示例,模型可以快速适应新任务而无需权重更新。这一能力对于提示工程的兴起具有决定性意义——它意味着用户可以通过精心设计的提示来“编程”模型行为,而无需进行传统的模型微调。
GPT-4延续了GPT系列的演进路线,虽然OpenAI未公开详细的技术报告,但已知其在推理能力、多模态处理、长上下文理解等方面有显著提升。GPT-4能够处理图像输入,支持更长的上下文窗口,并在多项专业考试中达到人类专家水平。
其他重要的语言模型家族
除了BERT和GPT系列,多个研究机构和组织开发了具有重要影响力的大语言模型。了解这些模型有助于我们全面认识当前语言模型的技术格局。
T5(Text-to-Text Transfer Transformer)由Google提出,其核心思想是将所有NLP任务统一建模为文本到文本的转换问题。无论是翻译、摘要还是问答,都被格式化为“输入文本 → 输出文本”的形式。这种统一框架简化了模型设计,也为预训练提供了多样化的训练信号。T5使用的“跨度去噪”(Span Corruption)目标后来被广泛采用。
LLaMA(Large Language Model Meta AI)由Meta AI开发,是开源社区最具影响力的模型之一。LLaMA的设计理念是在较小的参数规模下,通过更多的训练tokens达到与大型模型相当的性能。LLaMA 7B使用了超过1万亿个tokens进行训练,性能却能与GPT-3 175B相媲美。这一发现对资源受限场景下的模型部署具有重要启示。LLaMA的开源发布也催生了Alpaca、Vicuna、Chinese-LLaMA等一系列衍生模型。
Claude系列模型由Anthropic开发,以其对安全性和有用性的强调著称。Claude采用了被称为“ Constitutional AI”的训练方法,通过一组原则来指导模型行为,减少有害输出。Claude 2在编程、推理等任务上展现出强劲实力,并在长上下文处理方面达到10万tokens的窗口。
参数规模与能力涌现
缩放定律的发现
深度学习的一个关键发现是模型性能与参数规模、训练数据量和计算量之间存在可预测的关系。OpenAI于2020年发表的论文《Scaling Laws for Neural Language Models》系统地研究了这一现象,发现语言模型的交叉熵损失与模型参数量$N$、数据集大小$D$和计算量$C$之间满足幂律关系:
$$L(N) \propto N^{-0.076}$$ $$L(D) \propto D^{-0.095}$$ $$L(C) \propto C^{-0.050}$$
这些发现具有深远的实践意义:给定固定的计算预算,模型参数量和数据量之间存在最优的平衡点。更重要的是,随着模型规模的增大,语言模型的困惑度(Perplexity)稳定下降,这意味着模型对语言的建模能力持续提升。
DeepMind进一步扩展了这一研究,提出了Chinchilla缩放定律。与OpenAI的结论不同,Chinchilla认为此前的大语言模型(如GPT-3)实际上训练得不够充分——在相同的计算预算下,应该训练一个参数量更小但训练tokens更多的模型。具体而言,对于计算预算$C$,最优的参数量$N^*$和训练tokens数$D^*$满足:
$$N^* \propto C^{0.46}$$ $$D^* \propto C^{0.54}$$
这一发现直接影响了后续模型的训练策略。LLaMA系列就是按照Chinchilla缩放定律设计的,在较小的参数规模下使用远多于GPT-3的训练数据。
涌现能力:量变到质变
大语言模型最引人入胜的特性之一是“涌现能力”(Emergent Abilities)。涌现能力指的是当模型规模超过某一临界阈值后,突然展现出之前不存在的能力。这些能力在小规模模型上完全不可见或仅略高于随机水平,但在超大规模模型上却能达到令人惊讶的高水平。
Wei Jason等人于2022年发表的论文《Emergent Abili