三、大模型(LLM)内部核心机制解析
我们将深入探讨基于Transformer架构的大型语言模型(LLM)的核心工作原理。这类模型通过复杂的神经网络结构实现文本生成,其关键在于自回归机制与高效的信息处理流程。
Transformer模型的基本运作方式
从整体来看,一个典型的LLM接收用户输入的提示词(prompt),并逐步生成相应的文本内容。整个过程并非一次性完成,而是逐个词元(token)进行预测和输出。
每一个新词元的生成都依赖于前一次的输出结果。具体来说,在模型生成一个词元后,该词元会被追加到原始提示词的末尾,作为下一轮推理的新输入。这一循环过程由外部程序控制,持续扩展已生成的文本序列,直至达到预设长度或终止条件。
这种利用先前输出作为后续输入的建模方式,在机器学习中被称为自回归模型(autoregressive model)。这也是为什么像GPT、Phi等文本生成模型被归类为自回归系统,以区别于BERT这类非自回归的双向编码模型。
输入与输出流程详解
在实际操作中,首先需要加载预训练的语言模型和对应的分词器,并构建用于文本生成的流水线(pipeline):
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=False,
)
# 创建文本生成流水线
generator = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
return_full_text=False,
max_new_tokens=50,
do_sample=False,
)
前向传播机制剖析
每一次词元生成的过程称为一次前向传播(forward pass)。它包含两个核心组件:分词器和语言建模头(LM head)。
完整的Transformer LLM通常由以下部分构成:输入端的分词器、中间堆叠的多个Transformer块,以及末端的语言建模头。
分词器负责将原始文本切分为模型可识别的词元,并映射为高维向量(即词元嵌入)。常见的词表规模可达数万个词元,每个都被赋予唯一的嵌入表示。
数据流沿着网络结构自上而下传递。对于每一个待生成的词元,输入会依次经过所有Transformer块的处理,最终到达语言建模头,输出下一个可能词元的概率分布。
通过打印模型结构,我们可以清晰地看到各层的组织形式:
print(model)
输出示例:
Phi3ForCausalLM(
(model): Phi3Model(
(embed_tokens): Embedding(32064, 3072, padding_idx=32000)
(layers): ModuleList(
(0-31): 32 x Phi3DecoderLayer(
(self_attn): Phi3Attention(
(o_proj): Linear(in_features=3072, out_features=3072, bias=False)
(qkv_proj): Linear(in_features=3072, out_features=9216, bias=False)
)
(mlp): Phi3MLP(
...
)
)
)
)
)
Transformer块内部结构
每个Transformer块主要由两个子模块组成:
- 自注意力层块(Self-Attention Block):负责捕捉输入序列中各个词元之间的依赖关系。
- 前馈神经网络层块(Feed-Forward Network Block):对每个位置的表示进行非线性变换和特征增强。
注意力机制详解
自注意力机制是Transformer的核心,其计算过程主要包括以下几个步骤:
- 相关性评分:通过查询(Query)、键(Key)和值(Value)三者之间的点积运算,衡量不同词元间的关联强度。
- 信息组合:根据计算出的注意力权重,对值向量进行加权求和,从而聚合上下文信息。
这种机制使得模型能够在长距离依赖中有效提取语义信息,而不受传统RNN结构的顺序限制。
并行词元处理与上下文长度管理
尽管生成阶段是逐词元进行的,但在训练过程中,模型可以并行处理整个输入序列的所有词元,大幅提升计算效率。同时,模型支持的最大上下文长度决定了其能处理的最长文本范围。
为了加速推理过程,系统通常采用缓存键-值对(KV Cache)技术。在生成后续词元时,无需重新计算历史词元的键值状态,只需复用之前的结果,显著减少重复计算开销。
Transformer架构的优化演进
随着模型规模扩大,研究人员提出了多种改进方案以提升效率和性能:
- 更高效的注意力机制:
- 稀疏注意力:仅关注局部或重要位置,降低计算复杂度。
- 多查询/分组查询注意力(Multi/Grouped Query Attention):共享或分组查询向量,减少内存占用。
- Flash Attention:一种优化的注意力实现方法,结合GPU内存层级设计,大幅加快注意力计算速度。
位置编码创新:RoPE
为了使模型感知词元的位置顺序,传统做法使用绝对位置嵌入。而现代LLM更多采用旋转位置嵌入(Rotary Position Embedding, RoPE),通过复数旋转的方式将位置信息融入注意力计算中,既支持长序列,又具备良好的外推能力。
实际生成示例
执行如下代码生成一段文本:
prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened." output = generator(prompt) print(output[0]['generated_text'])
由于设置了 max_new_tokens=50,模型最多生成50个新词元。若增加该值,生成过程将继续,直到完整表达邮件内容为止。

我们观察到该模型由多个嵌套结构组成,其核心部分被标记为 model,此外还包含一个独立的输出层 lm_head。
在 Phi3Model 内部,首先可以看到词元嵌入层 embed_tokens,它负责将输入词元映射为向量表示。该嵌入矩阵的规模为 32064 个词元,每个词元对应一个维度为 3072 的向量。
接下来是若干 Transformer 解码器层的堆叠结构,共包含 32 个 Phi3DecoderLayer 模块。每一个解码器层均由两个关键子模块构成:注意力机制部分和前馈神经网络(即 MLP 或多层感知器)。这种设计使得模型能够捕捉长距离依赖并进行复杂的特征变换。
每个解码层内部还集成了归一化组件:
- input_layernorm 和 post_attention_layernorm 均采用 Phi3RMSNorm,配置参数为 (3072,),epsilon 值为 1e-05;
- 残差连接后设置了 dropout 层:resid_attn_dropout 和 resid_mlp_dropout,但当前设置为 p=0.0,意味着在实际运行中不启用随机失活,以避免信息丢失。
模型整体的最终输出由 norm 层进一步归一化,并通过 rotary_emb 实现旋转位置编码(Phi3RotaryEmbedding),从而支持序列位置信息的有效建模。
随后的数据流进入输出投影层 lm_head,其结构为线性变换层:Linear(in_features=3072, out_features=32064, bias=False)。这表示它接收维度为 3072 的隐藏状态向量,输出维度与词汇表大小一致(32064),用于生成每个词元的未归一化 logits。
具体来看各线性层的参数配置:
- gate_up_proj: Linear(in_features=3072, out_features=16384, bias=False)
- down_proj: Linear(in_features=8192, out_features=3072, bias=False)
这些层配合 SiLU 激活函数(activation_fn)共同构成 MLP 子模块,增强了模型的非线性表达能力。
解码策略与采样机制
在完成前向传播后,模型会为词汇表中的每一个词元输出对应的 logit 分数,经 softmax 转换后形成概率分布。如何从该分布中选择下一个词元,取决于所使用的解码策略。
最基础的方法是贪心解码——始终选取当前概率最高的词元作为输出。这种方法等价于将温度(temperature)参数设为零。虽然确定性强,但在多数应用场景下容易导致生成结果过于单调或重复。
更灵活的方式是引入随机性,依据各个词元的概率进行采样。例如,若“Dear”作为下一词元的概率为 40%,则它有 40% 的机会被选中,而非绝对优先。这种方式允许次高概率词元也有机会参与生成,提升文本多样性。
代码示例:生成流程解析
以下是一个典型的推理过程演示:
prompt = "The capital of France is"
# Tokenize the input prompt
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
# Move input to GPU
input_ids = input_ids.to("cuda")
# Obtain hidden states from the model backbone
model_output = model.model(input_ids)
# Apply lm_head to get logits
lm_head_output = model.lm_head(model_output[0])
lm_head_output.shape
输出结果为:
torch.Size([1, 5, 32064])
其中批次大小为 1,序列长度为 5,词表维度为 32064。
为了获取最后一个位置的预测结果,可使用:
lm_head_output[0, -1]
此操作提取出最后一个词元位置上的所有词元得分。接着通过 argmax 找出最高分对应的词元 ID:
token_id = lm_head_output[0, -1].argmax(-1)
再通过 tokenizer 解码:
tokenizer.decode(token_id)
得到输出结果:
Paris
并行处理与上下文建模
尽管每个词元在计算路径上看似独立处理,但实际上它们在注意力机制中会发生交互。通过自注意力结构,模型能够在不同位置之间建立关联,实现上下文感知的表示学习。
目前,Transformer 模型在处理输入时存在一个限制:它只能处理有限数量的词元,这一上限被称为模型的上下文长度。例如,一个上下文长度为4K的模型最多可处理约4000个词元,相当于4000条独立的处理流。
每一条处理流接收一个向量作为输入,并输出一个同样维度的结果向量(该维度通常称为模型维度)。尽管在文本生成过程中,只有最后一条流的输出被用于预测下一个词元,但前面各流的中间结果对最终输出至关重要。虽然这些流的最终输出不会直接使用,但它们在每个 Transformer 块的注意力机制中所生成的早期输出会被保留并参与后续计算。
以代码为例,lm_head 层的输出形状为 [1, 5, 32064],这是因为其输入张量的形状是 [1, 5, 3072](
即(lm_head): Linear(in_features=3072, out_features=32064, bias=False)
),表示一个批次中包含一条输入序列,共5个词元,每个词元由一个3072维的向量表示,这些向量来自堆叠的 Transformer 块处理后的输出。
键值缓存加速机制
在生成第二个词元时,常规做法是将前一步生成的词元追加到原始输入末尾,然后重新进行一次完整的前向传播。然而,如果模型能够缓存此前计算过程中的关键中间结果——尤其是注意力机制中的某些特定向量——就可以避免重复计算之前所有步骤,仅需处理最新的那一条流即可。这种优化策略被称为 键-值缓存(Key-Value Cache,简称 KV 缓存),它能显著提升文本生成效率。其中,“键”和“值”是注意力机制中的核心组成部分。
在实际生成过程中,缓存先前词元的计算状态比反复执行相同运算更为高效:
在 Hugging Face Transformers 库中,KV 缓存默认处于启用状态,可通过设置 use_cache=False 来关闭。我们可以通过对比开启与关闭缓存时的生成时间来验证其效果。
prompt = "Write a very long email apologizing to Sarah for the tragic gardening mishap. Explain how it happened."
# Tokenize the input prompt
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
input_ids = input_ids.to("cuda")
接下来测量生成100个新词元所需的时间。在 Jupyter 或 Colab 环境中,可以使用 %%timeit 魔法命令进行精确计时(多次运行取平均值):
%%timeit -n 1
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=100,
use_cache=True
)
输出结果:4.65 s ± 377 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit -n 1
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=100,
use_cache=False
)
输出结果:30.6 s ± 109 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
由此可见,启用 KV 缓存带来了显著的速度提升。
Transformer 块的内部结构解析
大型语言模型(LLM)中的 Transformer 架构由多个连续堆叠的 Transformer 块构成。原始论文中使用了约6个这样的块,而现代多数 LLM 则包含超过100个。每个块依次处理输入数据,并将其输出传递给下一个块,形成逐层抽象的信息流动。
每个 Transformer 块主要由两个顺序连接的组件构成:
- 自注意力层:负责整合来自其他位置词元的相关信息,实现上下文感知的特征提取。
- 前馈神经网络层:承担模型的主要非线性变换能力,是参数密集的部分。
前馈神经网络层的作用
当模型在大规模语料上完成训练后,它会学习并存储大量知识(如对“The Shawshank Redemption”的频繁引用模式等),这些知识主要被编码在分布在各个层中的前馈神经网络中。可以说,前馈网络层承载了模型大部分的记忆功能以及基于已有信息的插值推理能力。
自注意力层的功能
语言建模离不开上下文理解。仅依赖前一个词元进行预测的方式远远不足以捕捉复杂的语言结构。自注意力机制通过动态关注历史输入中与当前词元相关的部分,有效整合远距离依赖信息,从而增强模型对当前词元的理解能力。
注意力机制的工作流程
注意力机制主要分为两个关键阶段:
- 计算当前待处理词元(如图中粉色箭头指示)与之前所有输入词元之间的相关性得分;
- 利用这些权重分数,对不同位置的表示进行加权融合,生成一个综合性的输出向量。

为了增强Transformer模型的注意力能力,引入了多份并行执行的注意力机制。这些并行处理单元被称为注意力头(attention head),通过同时计算多个注意力分布,使模型能够更有效地捕捉不同类型的信息关联,从而提升大语言模型(LLM)的表现力和表达能力。
在进行注意力计算之前,输入数据会首先与三个独立的投影矩阵相乘,生成对应的查询矩阵、键矩阵和值矩阵。这三个矩阵将原始输入映射到不同的语义空间,为后续的两个核心步骤——相关性评分与信息组合——提供基础组件:
- 查询投影矩阵
- 键投影矩阵
- 值投影矩阵
这一过程可表示为:输入经过线性变换后分别形成查询(Q)、键(K)和值(V)三组向量,用于实现注意力机制中的交互运算。
相关性评分机制
在生成式Transformer中,模型逐个生成词元,因此每次仅聚焦于当前待处理的位置,并评估该位置与此前所有位置之间的语义关联程度。相关性评分通过将当前位置的查询向量与整个序列的键矩阵进行点积运算来完成,得到一组反映各历史位置相关性的分数。
随后,使用softmax函数对这些分数进行归一化处理,使其总和为1,形成一个概率分布,用以指导后续信息的加权融合。
信息组合过程
在获得归一化的相关性权重之后,每个位置对应的值向量会被乘以其相应的权重系数。然后将所有加权后的值向量相加,最终输出一个聚合了上下文信息的向量,作为该位置的注意力输出结果。
多注意力头的实现结构
通过对每个位置进行独立的相关性打分并组合信息,多头机制允许模型从多个视角同时关注不同类型的依赖关系。这种并行结构显著增强了模型对复杂语言模式的理解能力。
Transformer架构演进:注意力机制优化
稀疏注意力与滑动窗口设计
随着模型规模扩大,传统全注意力机制面临计算开销过大的问题。为此,“稀疏注意力”(参见论文“Generating Long Sequences with Sparse Transformers”)和“滑动窗口注意力”(参见论文“Longformer: The Long-Document Transformer”)被提出以提高效率。
稀疏注意力限制模型只关注有限数量的历史位置,而非全部上下文,从而降低计算复杂度。例如GPT-3就在其架构中交替采用全注意力与稀疏注意力的Transformer块,实现性能与效率的平衡。
下图展示了全注意力与稀疏注意力在处理某一词元时可访问的上下文范围差异。每一行代表一个目标词元,颜色编码指示其能关注到的其他位置:
多查询与分组查询注意力(GQA)
近年来,一种更高效的注意力变体——分组查询注意力(Grouped-Query Attention, GQA)被广泛应用,如Llama 2和Llama 3等模型均采用了该技术(详见论文“GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints”)。
以下是三种主要注意力结构的对比:
- 多头注意力:每个注意力头拥有独立的查询、键和值矩阵。
- 多查询注意力:所有头共享同一组键和值矩阵,仅保留各自的查询矩阵,提升了推理速度。
- 分组查询注意力:介于两者之间,将注意力头划分为若干组,每组共享一组键和值矩阵,在保持较高效率的同时减少质量损失。
具体而言,在多头注意力中,每个头都具备完整的参数配置:
而在多查询注意力中,键和值矩阵在所有头间共享,仅查询矩阵保持独立:
当模型规模进一步增大时,完全共享可能导致表达能力下降。因此,分组查询注意力采用折中策略,按组共享键和值矩阵,既控制了内存消耗,又维持了较高的建模精度:
Flash Attention:硬件感知的加速方案
Flash Attention是一种针对GPU架构优化的注意力实现方法,通过精细调度SRAM(共享内存)与HBM(高带宽内存)之间的数据流动,减少I/O开销,显著加快注意力计算速度并降低显存占用。相关研究详见论文“FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness”及其升级版本“FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning”。
Transformer块的结构演进
最初的Transformer块结构源自原始论文中的设计,包含标准的注意力子层、前馈网络以及层归一化和残差连接。
而到了2024年,现代Transformer模型(如Llama 3)对其进行了多项改进,包括:
- 采用预归一化机制(如RMSNorm),提升训练稳定性;
- 集成分组查询注意力以优化效率;
- 引入旋转位置嵌入(Rotary Position Embedding)以更好地建模序列顺序。

位置嵌入:RoPE
自原始Transformer模型提出以来,位置嵌入便成为其核心组成部分之一。这类嵌入机制使得模型能够识别序列中词元的顺序,从而捕捉语言中的时序依赖关系。早期方法普遍采用绝对位置编码方式,即为序列中的每个位置分配一个唯一标识——如第一个词元对应位置1,第二个对应位置2,依此类推。这些编码可以是基于固定数学函数生成的静态向量,也可以是在训练过程中由模型自行学习得到的动态参数。
然而,随着模型规模不断扩展,尤其是在处理长上下文场景时,传统绝对位置编码暴露出效率问题。例如,在训练阶段,若将仅有10个词的短句放入长达4K token的上下文窗口中,会造成大量空间浪费。为提升资源利用率,实践中常将多个较短文档打包至同一个上下文批次中进行联合训练:
与在前向传播初始阶段直接添加的静态绝对编码不同,旋转位置嵌入(RoPE)通过向量在嵌入空间中的旋转来编码位置信息,兼具表达绝对位置和相对位置的能力。该方法的核心思想是利用角度旋转的方式融合位置特征,并且这一操作被安排在注意力计算阶段执行。
具体而言,在计算注意力分数之前,位置信息会被分别注入到查询(Query)矩阵和键(Key)矩阵中。这种融合发生在点积运算之前,确保了位置感知能力能有效影响后续的相关性评分过程:
改进点:归一化策略优化
在结构设计上,新的改进方案将归一化操作前置至自注意力模块和前馈神经网络之前,相较于原始架构中的后置归一化方式,有助于加快模型收敛速度,显著减少训练所需时间。此外,采用了RMSNorm替代传统的LayerNorm,该方法在保持性能的同时简化了计算流程,提升了整体运行效率。
其它应用领域拓展
Transformer架构的应用已远超大型语言模型(LLM)范畴,逐步渗透至多个技术领域。在计算机视觉方向,已有大量研究探索其潜力,相关综述包括《Transformers in Vision: A Survey》与《A Survey on Vision Transformer》。在机器人学领域,如《Open X-Embodiment: Robotic Learning Datasets and RT-X Models》所示,Transformer被用于跨平台的具身智能建模。同时,在时间序列分析方面,《Transformers in Time Series: A Survey》系统总结了其在金融、气象、医疗等序列预测任务中的广泛应用。


雷达卡


京公网安备 11010802022788号







