跳转至

04_LLM 原理

01 什么是 LLM⭐⭐⭐

LLM(Large Language Model,大语言模型)本质上是一种基于海量文本训练得到的文本生成模型,可以看作是一个规模非常庞大、包含了海量参数的概率函数。

大体现在参数规模量大、训练规模大、能力强大。

02 传统 NLP 模型和 LLM 有什么区别?

传统 NLP 模型是每个任务都要专门训练一个模型,比如翻译,实体识别,词性标注;

而 BERT 时代走通了预训练 + 微调这一流程,通过海量文本数据的训练,可以得到一个预训练的模型,该模型具备通用的语言表示能力,通过适当微调即可快速的适配到不同领域,比起传统 NLP 模型,适配性更强。

LLM 则通过统一的文本生成范式,使用同一个模型完成问答、翻译、总结和代码生成等多种任务。

一句话:传统 NLP 是“一个任务一个模型”,BERT 是“一个预训练模型 + 多个任务头”,LLM 则是“一个生成模型完成多种任务”。

03 Transformer ⭐⭐⭐

1. Transformer 概述

Transformer 诞生的主要原因,是 RNN、LSTM 和 GRU 这些传统序列神经网络在处理长序列时难以有效捕捉远距离依赖,并且只能按时间顺序处理,无法充分利用并行计算

Transformer 的核心是自注意力机制。它将每个 Token 映射为 Query、Key 和 Value,通过 Query 与其他 Token 的 Key 计算注意力分数,再对 Value 加权求和,从而让每个 Token 都能融合序列中其他位置的信息。相比 RNN,Transformer 可以直接建模任意位置之间的依赖关系,并支持并行计算。

2. Transformer 基本架构

原始 Transformer 由编码器和解码器组成。

  • 编码器:由输入嵌入、位置编码和多个编码器层组成。每个编码器层包含:

  • 多头自注意力;

  • 前馈神经网络;
  • 残差连接和 LayerNorm。

  • 解码器:由输出嵌入、位置编码和多个解码器层组成。每个解码器层包含:

  • Masked Multi-Head Self-Attention,防止看到后面的 Token;

  • Cross-Attention,读取编码器输出;
  • 前馈神经网络;
  • 残差连接和 LayerNorm。

现代 LLM 通常不会完整使用原始 Transformer,而是根据任务选择不同结构:

  • BERT 主要使用 Encoder;
  • GPT 主要使用 Decoder;
  • 原始 Transformer 主要用于机器翻译等 Encoder-Decoder 任务。

3. Transformer 为什么需要位置编码?

自注意力机制本身不能感知到 Token 的顺序,它只关注 Token 之间的相互的依赖关系。如果不加入位置信息,模型可能无法区分词相同但顺序不同的句子。

因此,Transformer 需要额外向每个 Token 中加入位置信息,让模型知道“每个 Token 位于什么位置”,从而理解句子的顺序和结构

4. Transformer 自注意力机制计算流程是什么?

首先,将输入序列 X 分别经过三个不同的线性变换,得到 QKV

然后,用 QK 计算每个 Token 与其他 Token 的相关性,得到注意力分数;再通过缩放和 Softmax 将分数转换为注意力权重,最后使用注意力权重对 V 进行加权求和,得到融合上下文信息的新表示

5. Transformer 为什么 self-attention 要除以 d_k

d_k 较大时,Q·K^T 的方差会变大,导致 softmax 输出进入饱和区(梯度极小)。除以 √d_k 可以保持方差为 1,让训练更稳定。

6. 每个 Transformer 块中的 FFN 的作用?

它的结构式两层全连接网络 + 一个激活函数,FNN 可以对每个位置独立的做非线性变换,补充注意力层学不到的信息,因为注意力层本质就是线性加权,FNN 则可以引入非线性,以增强模型的表达能力。

7. 为什么需要多头注意力?

如果只有一个注意力头,模型只能在同一个向量空间中学习、捕捉 Token 之间的依赖关系。

多头注意力会将特征映射到多个不同的子空间,让每个注意力头从不同视角关注 Token 之间的关系,例如语法、指代、位置和语义等。最后将多个头的结果融合,从而获得更丰富、更全面的特征表示。

8. Encoder-only、Decoder-only 和 Encoder-Decoder

  • Encoder-only:只使用编码器,例如 BERT。每个 Token 可以双向关注上下文,擅长理解类任务,如文本分类、命名实体识别和语义匹配。
  • Decoder-only:只使用解码器,例如 GPT、Qwen 等。通过因果掩码限制信息只能从前往后流动,并以“预测下一个 Token”为主要训练目标,因此天然适合文本生成,是当前生成式 LLM 的主流架构。
  • Encoder-Decoder:同时使用编码器和解码器,例如 T5、BART。Encoder 双向理解输入,Decoder 根据 Encoder 的输出逐步生成结果,适合翻译、摘要和文本转换等任务。

一句话:Encoder 擅长理解,Decoder 擅长生成,Encoder-Decoder 适合“理解输入后生成另一段文本”。

9. 为什么 Decoder-only 成了主流?

简单来说:Decoder-only 训练目标统一数据获取容易扩展性强,并且能够用同一种生成范式完成大量任务,因此成为当前生成式 LLM 的主流架构。

04 什么是 K-V Cache? ⭐⭐⭐

在 Decoder-only 模型进行自回归生成时,每生成一个新的 Token,都需要关注前面已经生成的 Token。

如果每次都重新计算历史 Token 的 KV,会产生大量重复计算。KV Cache 会将历史 Token 在每一层注意力计算中得到的 KV 缓存起来,后续生成新 Token 时直接复用,只计算新 Token 的 Q、K、V

05 MHA 有哪些局限性?MQA,GQA,Flash-Attention 怎么解决?

MHA 的局限性

在训练过程中,Self-Attention 需要计算序列中 Token 两两之间的关系,会产生一个 n * n 的注意力权重矩阵,占据大量显存。

其次,在推理阶段,MHA(Multi-Head Attention)会为每个注意力头分别生成并缓存一组 KV,随着注意力头数和序列长度的增加KV Cache 会占据大量的显存,同时也增加了读取开销。

MQA:Multi-Query Attention

MQA 保留多个 Query 头,但让所有注意力头共享同一组 KV

这样可以大幅减少 KV Cache 的大小,从而提升推理速度降低显存占用。但由于所有头共享相同的 K、V,模型表达能力可能有所下降。

GQA:Grouped-Query Attention

GQA 是 MHA 和 MQA 之间的折中方案。它将多个注意力头分成若干组,每组共享一组 K、V

相比 MHA,GQA 能减少 KV Cache;相比 MQA,它保留了更多独立的 K、V 表示,因此通常能够在推理效率模型效果之间取得更好的平衡。

FlashAttention

传统 Attention 通常需要先计算并保存完整的 n × n 注意力矩阵,再进行 Softmax 和加权求和,带来较大的显存读写开销

FlashAttention 不再显式保存完整的注意力矩阵,而是将 Q、K、V 切分成多个小块,加载到 GPU 的片上高速存储中进行分块计算,并通过 Online Softmax 完成归一化。每次计算得到一部分输出,最后拼接成完整结果

因此,FlashAttention 并不是减少了注意力的数学计算,而是避免了 n × n 注意力矩阵在显存中的读写,从而显著降低显存占用并提升计算效率。

FlashAttention 通过分块计算优化显存访问降低实际运行成本,但不会改变理论复杂度。

其他方案

降低时间复杂度的方案主要有:

  • 局部注意力 / 滑动窗口注意力:每个 Token 只关注附近的一部分 Token,将复杂度降到 O(nw),其中 w 是窗口大小;
  • 稀疏注意力:只计算部分 Token 之间的关系,例如块稀疏、局部 + 全局注意力;
  • 线性注意力:通过改变注意力计算顺序,尝试将复杂度降到 O(n),但通常会牺牲部分表达能力;
  • 低秩近似:用较低维度的表示近似完整注意力矩阵,减少计算量;
  • 分块或压缩上下文:先压缩历史信息,再进行注意力计算,降低有效序列长度。

06 位置编码 ⭐⭐⭐

自注意力机制本身不能感知到 Token 的顺序,它只关注 Token 之间相互的依赖关系。如果不加入位置信息,模型就难以区分“我爱你”和“你爱我”这类 Token 相同但顺序不同的句子。

因此,Transformer 需要额外向每个 Token 中加入位置信息,让模型知道“每个 Token 位于什么位置”,从而理解句子的顺序和结构

常见的位置编码方案主要有:

  1. 绝对位置编码:直接为每个位置生成位置向量,再与 Token Embedding 相加。如:正余弦位置编码可学习位置编码

  2. 相对位置编码:不直接表示绝对位置,而是建模 Token 之间的相对距离。比如说 REPOALiBi

1. 正余弦位置编码

为每个位置生成固定的正弦和余弦向量,再加到 Token Embedding 上。它不需要额外训练参数,实现简单,但外推能力差。

\[ \begin{aligned} PE(pos, 2i) &= \sin\left(\frac{pos}{10000^{2i/d}}\right) \\[4pt] PE(pos, 2i+1) &= \cos\left(\frac{pos}{10000^{2i/d}}\right) \end{aligned} \]

2. 可学习的位置编码

为每个位置维护一个可训练的向量,与 Token Embedding 相加。表达能力更强,但这种方案没有长上下文拓展能力,因为每个位置的表示本质就是位置权重矩阵的一行,如果当前长度超过了权重矩阵的行数,那么就无法表达了。

3. RoPE

RoPE 不直接将位置向量加到输入上,而是根据 Token 的位置旋转 QK,使注意力分数能够体现相对位置信息。它兼顾了绝对位置和相对位置建模能力,同时具备不错的长上下文外推能力,被许多现代 Decoder-only 模型采用。

4. ALiBi

ALiBi 不修改 Token 表示,而是直接在注意力分数中加入与相对距离相关的线性偏置,让距离较远的 Token 受到一定惩罚。它实现简单,并具有较好的长度外推能力,但位置表达能力相对有限。

07 大模型的分词器是什么?⭐⭐⭐

Tokenizer(分词器)负责在文本Token ID 序列之间进行转换,是连接自然语言大模型的桥梁。

模型本身不能直接处理文字,只能处理数字。因此,Tokenizer 会先将输入文本切分成一个个 Token,再将每个 Token 映射为词表中的数字 ID,模型根据这些 ID 进行计算。模型生成结果后,Tokenizer 再将 Token ID 还原成文本。

这里的 Token 不一定等于一个词,它可能是:

  • 一个完整的词;
  • 一个词的一部分;
  • 一个汉字;
  • 标点符号;
  • 空格或特殊控制符号。

1. 分词是什么?算法有哪些呢?

分词(Tokenization)是将原始文本切分成一个一个Token 的过程。

常见分词粒度包括词级字符级子词级:词级分词语义完整但词表大、容易出现未登录词;字符级分词词表小但序列较长;子词级分词在词表规模序列长度语义表达之间取得平衡,是现代大模型的主流方案。常见算法包括 BPE、WordPiece 和 Unigram,其中英文通常按词或子词切分,中文既可以使用 jieba、HanLP 等工具进行传统词级分词,也可以使用 BPE 等子词算法进行处理。

2. BPE 算法的思路是什么?

BPE(Byte Pair Encoding)的核心思路是从较小的基本单元开始,统计语料中相邻单元的出现频率,每次选择频率最高的一对进行合并,并不断重复,直到词表达到预设大小。

low
lower
lowest
开始时可以拆成:
l o w
l o w e r
l o w e s t

3. 为什么不直接按字符或按词切分?

如果按单个字符切分,每个 token 的语义非常不完整,序列会变得很长,计算成本较高;如果按完整单词切分,词表会非常大,而且容易遇到生僻词未登录词

因此,主流大模型通常采用子词分词(Subword Tokenization),在词表规模序列长度未登录词处理能力之间取得平衡。

08 大模型是怎么训练出来的? ⭐⭐⭐

大模型训练通常可以分为三个阶段:预训练、SFT 和 RLHF

第一阶段是预训练(Pre-training)。模型在海量文本数据上执行“预测下一个 Token”的任务。这一阶段赋予了大模型通用的语言建模能力世界的广泛知识基本的推理能力,但也是训练成本最高的阶段。

第二阶段是监督微调(SFT,Supervised Fine-Tuning)。预训练模型虽然具备语言建模能力,但不一定理解用户指令,也不一定按照问答格式输出。SFT 使用人工整理的“指令—回答”数据继续训练模型,让它学会理解指令遵循要求,并生成更符合人类预期的回答

第三阶段是人类反馈强化学习(RLHF)。SFT 模型生成多个回答,由人类对回答质量进行排序或打分,再训练奖励模型,让模型学习什么样的回答更符合人类偏好,最后通过强化学习优化模型,使输出更加有用、真实且安全。

简单来说:预训练让模型“学会知识和语言”,SFT 让模型“学会听懂指令”,RLHF 让模型“学会按照人类偏好回答”。

09 什么是 Scaling Law?

Scaling Law(缩放定律)是指:在模型结构数据质量训练方法相对稳定的情况下,模型的损失通常会随着模型参数量训练数据量计算量的增加,按照一定的幂律规律下降。

简单来说,模型越大、训练数据越多、计算量越充足,模型的整体能力通常越强,但提升并不是无限的,后期会出现边际收益递减。因此,训练大模型时需要在参数规模、数据规模和计算预算之间进行平衡。

10. 大模型的“涌现能力”是怎么回事?⭐⭐

涌现能力(Emergent Abilities)是指模型规模扩大到一定程度后,某些能力突然表现得明显更好,例如复杂推理代码生成多步任务处理

不过,这种“突然出现”不一定意味着模型内部发生了神秘的能力跃迁。一方面,模型能力可能确实在规模增长后快速增强;另一方面,有些涌现现象也与评测指标有关:当模型能力逐渐提升并超过某个任务阈值时,准确率可能从“基本做不到”突然变成“能够完成”,看起来就像能力突然出现。

Scaling Law 说明“规模增长通常带来能力提升”,涌现能力则描述“某些能力在达到一定规模后表现得格外明显”。

11. 大模型微调有了解过吗?和预训练的区别?

微调(Fine-tuning)是在预训练模型的基础上,使用特定领域或特定任务的数据继续训练,使模型适应具体场景。例如学习某个领域的专业知识特定的回答风格结构化输出格式

区别就是:预训练让模型“学会通用能力”,微调让模型“适应具体任务”。

12. 微调的方式有哪些?⭐⭐⭐

大模型微调主要有两类:全量微调参数高效微调(PEFT)

全量微调会更新模型的全部参数,效果通常较好,但显存计算存储成本都很高,适合数据量充足、资源充分的场景。

参数高效微调(PEFT)会冻结预训练模型的大部分参数,只训练少量新增参数,从而降低微调所需的显存和计算成本。常见方法包括 Adapter、Prefix Tuning、Prompt Tuning 和 LoRA,其中 LoRA 应用最广泛。

13. LoRA 的原理,除了减少参数量,它还有哪些优点?

LoRA(Low-Rank Adaptation)的核心思想是:不直接更新原始权重矩阵 W,而是冻结 W,只学习一个低秩更新量:

\[ W' = W + ΔW $$ $$ ΔW ≈ AB \]

除了减少训练参数和显存占用,LoRA 还有以下优点:

  • 推理开销低:将 LoRA 权重合并到基础模型后,推理结构与原模型基本一致,不会额外增加推理延迟;
  • 部署灵活:一个基础模型可以挂载多套 LoRA 权重,根据任务快速切换,而不需要部署多份完整模型;
  • 降低灾难性遗忘基础模型参数被冻结,原有的通用能力受到的破坏较小;
  • 训练更稳定:需要更新的参数更少,训练成本和调参难度相对较低;

QLoRA 则是在 LoRA 的基础上,将冻结的基础模型进行一个量化,通常使用 4-bit 量化,再训练 LoRA 适配器。这样可以进一步降低显存占用,同时尽量保持微调效果。

14. 什么是 Post-Training?常见方法有哪些?

Post-Training(后训练)是指预训练完成后,为了让基础模型更好地理解指令、或者生成更符合人类偏好的回答而进行的一系列训练过程。常见的 Post-Training 方法主要有以下几类:

第一类是 SFT(Supervised Fine-Tuning,监督微调)。

使用人工整理的“指令—回答”数据训练模型,让模型学会理解用户意图,并按照指定格式生成回答。SFT 是后训练的基础,但它只能告诉模型“什么样的回答是示范答案”,不能很好地表达多个答案之间的偏好差异。

第二类是偏好优化和强化学习对齐。

给定同一个问题的多个回答,通过人工AI规则对回答进行评价,让模型学习什么样的输出更符合目标。

  • DPO:属于直接偏好优化,使用“偏好回答—非偏好回答”数据直接训练模型,不需要显式训练奖励模型,也不需要在线强化学习;
  • RLHF:是一套基于人类反馈的对齐流程,通常包括 SFT、奖励模型和强化学习。经典流程会使用 PPO 优化语言模型;
  • GRPO:是一种强化学习算法,通过同一问题生成的多个回答之间的相对奖励计算优势,不需要单独的 Value Model。它可以用于 RLHF,也可以用于基于 AI 反馈或可验证奖励的强化学习。

第三类是拒绝采样微调(Rejection Sampling Fine-Tuning)。

让模型生成多个候选回答,使用奖励模型或规则筛选出高质量回答,再将这些数据用于 SFT。它的流程比较简单,本质上是“生成、筛选、再微调”。

第四类是 AI 反馈对齐(RLAIF)。

使用 AI 模型代替人工对回答进行评价,构造偏好数据或奖励信号,再进行 SFT、DPO 或强化学习。它可以降低人工标注成本,但效果依赖评价模型的能力。

实际项目中,这些方法通常不是互斥的,而是组合使用。例如:

预训练 → SFT → 拒绝采样 → DPO / PPO / GRPO

15. 什么是 PPO、什么是 DPO,区别是什么?⭐⭐⭐

PPO(Proximal Policy Optimization,近端策略优化)是 OpenAI 提出的一种策略梯度算法,核心目标是在提升策略表现的同时,限制新旧策略之间的变化幅度,避免一次更新过大导致训练崩溃。

\[ J^{\text{CLIP}}(\theta) = \mathbb{E}\left[ \min\left( r_t(\theta) \cdot A_t,\; \text{clip}(r_t(\theta),\, 1-\varepsilon,\, 1+\varepsilon) \cdot A_t \right) \right] \]

DPO(Direct Preference Optimization,直接偏好优化)是一种直接利用偏好数据优化模型的方法。它使用同一个问题对应的偏好回答 y_w 和非偏好回答 y_l,直接提高模型生成 y_w 的相对概率,同时降低生成 y_l 的相对概率。DPO 基于 KL 约束强化学习目标的数学推导,将奖励模型和显式的在线强化学习过程合并到了偏好损失中。

\[ \mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \left( \log \frac{\pi_\theta(y_w|x)}{\pi_\theta(y_l|x)} - \log \frac{\pi_{\text{ref}}(y_w|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right) \right] \]

PPO 需要模型在线生成回答,再结合奖励模型价值模型通过强化学习进行优化;DPO 则直接使用偏好回答和非偏好回答训练模型,不需要显式的奖励模型和强化学习过程。

大模型每生成一个 Token,都会输出一个词表大小的概率分布。解码策略要解决的问题,就是如何根据这个概率分布选择下一个 Token。

常见策略可以分为两类:确定性解码随机采样

1. 确定性解码

贪心解码(Greedy Decoding):每一步都选择当前概率最高的 Token。它速度快、结果稳定且容易复现,但只关注当前一步,容易生成重复或陷入局部最优。所以它适合代码生成、结构化输出和追求稳定结果的任务。

Beam Search:每一步保留概率最高的 B 条候选序列,继续向后扩展,最后选择整体得分最高的序列。相比贪心解码,它能探索更多路径,但计算成本更高,也容易生成表达单一、缺乏多样性的文本。

它更适合机器翻译、摘要等相对确定的序列生成任务,在开放式对话和创作任务中通常较少使用。

2. 随机采样

随机采样:根据 Token 的概率分布随机选择下一个 Token,因此同一个 Prompt 可能产生不同结果。

常见控制方法包括:

  • Temperature:调整概率分布的平滑程度。温度越低,输出越确定;温度越高,输出越随机;
  • Top-K:只从概率最高的 K 个 Token 中采样;
  • Top-P:从累计概率达到 P 的候选 Token 集合中采样,候选集合会动态变化。

采样策略适合开放式对话、创意写作和需要多样性的任务。

简单来说:贪心解码选择“当前最可能的”,Beam Search 选择“整体最可能的”,随机采样则是在高概率候选中保留一定随机性。