MRZN LLM面试基础知识总结笔记
在当前大模型领域的面试或技术探讨中,有一些核心知识点是绕不开的。本文尝试将这些关键模块——从模型结构、训练目标,到背后的数据工程与前沿技术——串联起来,做一个系统性的梳理。这既是一份面试准备指南,也是一份技术备忘。
LLM主流结构
当前围绕大语言模型的主流结构,可以归纳为三种范式:Causal Decoder、Prefix Decoder 和 Encoder-Decoder。它们之间最核心的区别,其实就藏在 Attention Mask 的设计上。不同的掩码策略,决定了模型在生成时能看到多少上下文信息,也直接影响其训练效率和适用场景。
LLM训练目标
训练目标方面,目前最常见的路数是Next Token Prediction——根据已有词预测下一个词,这也是绝大多数大模型采用的主流方式。其核心就是最大化似然函数。在训练效率上,Causal Decoder 一直占据着优势,因为它会在所有 token 上计算损失;而 Prefix Decoder 则只关注输出部分。
另一种方法是去噪自编码器,说白了就是完形填空。模型需要学会恢复被打乱的文本段。这个思路的实现难度相对更高,代表作有 GLM-130B 和 T5 等。
OpenAI-LLM构建流程
OpenAI 的这套流程,可以说是行业标杆。它主要包含四个阶段:预训练、有监督微调、奖励建模和强化学习。每个环节都环环相扣,所需的数据规模和计算资源也天差地别。
1. 预训练:这是打地基的阶段。需要海量的、多样化的文本数据——从互联网网页、维基百科、书籍,到 GitHub 代码、学术论文等等。目标是让大模型掌握长文本的建模和语言生成能力,能够根据提示词(Prompt)进行文本补全。这个阶段最头疼的问题是如何在消耗巨量计算资源的同时,保证训练过程稳定收敛。
2. 有监督微调:也叫指令微调。用少量高质量的“问题-理想答案”数据对,在预训练模型的基础上进行二次训练,得到 SFT 模型。这一步赋予了模型理解指令和上下文的能力,使其能够完成开放域问答、翻译、写代码等任务,甚至还能泛化到一些没见过的新任务上。
3. 奖励建模:目标是训练一个“裁判”模型(RM 模型)。这个模型不直接给用户用,它的任务是对同一个提示词下 SFT 模型输出的多个结果进行质量排序。RM 模型的准确率至关重要,因为它直接影响下一阶段的强化学习效果,因此通常需要大规模的训练数据来支撑。
4. 强化学习:这是最终的“调优”阶段。利用 RM 模型打出的分数作为奖励,在 SFT 模型的基础上调整参数,让模型生成的文本能获得更高的奖励。研究表明,在参数量相同的情况下,经过强化学习训练的模型,其效果往往明显优于仅仅经过有监督微调的模型。
Tokenizer作用
Tokenizer 看起来不起眼,但它是模型理解世界的“入口”。核心就做三件事:分词、扩展词汇表和处理特殊标记。它将字符串切分成 sub-word token,再映射到 ID,并保留来回映射的关系。从字符串到 ID 是编码(encode),反过来就是解码(decode)。常见的映射方法有 BERT 用的 WordPiece,以及 GPT-2 和 RoBERTa 用的 BPE 等。至于 [MASK]、<|im_start|> 这类特殊 token,Tokenizer 会保证它们不被切开,而是作为一个完整的单元存在。
分词粒度-子词分词法
分词粒度方面,最常用的是子词分词法。比如把 “Today is Sunday” 分成 `['To', 'day', 'is', 'S', 'un', 'day']`。如何确定这些“最小可分子词”,有多种算法,包括 BPE、WordPiece、SentencePiece、Unigram 等。WordPiece 和 BPE 很相似,区别在于 BPE 倾向于合并出现频率最高的字符对,而 WordPiece 更偏向于选择能够最大化整体概率的组合。
Embedding编码
Tokenize 之后,下一步就是把 one-hot 编码转换成更稠密的 Embedding 编码。这个过程可以简单理解为一张“查找表”。输入向量是 one-hot 的,所以每次只有一行被激活,模型就可以找到这个单词在嵌入空间中对应的语义向量。流程可以简化为:`input_ids = tokenizer.encode('Hello World!')` -> `model.generate()` -> `tokenizer.decode(output)`。
幻觉(Hallucination)的定义
先回答一个关键问题:为什么大模型会一本正经地胡说八道?这个现象在业内被称为“幻觉”,具体表现为输出要么不遵循原文,要么不符合事实。
为什么LLM会产生幻觉?
产生幻觉的原因可以从数据和模型两个层面来分析。
数据层面:数据质量是根本。如果训练数据本身就包含虚假信息、存在大量重复导致模型产生偏见,或者数据压缩过程本身就有损失,模型就很容易学到错误的知识。
模型层面:即便数据没问题,模型自身的特性也可能诱发幻觉。例如,采用高不确定性的采样算法(如 top-p 采样)会加剧幻觉问题;训练与推理阶段不匹配的“暴露偏差”也可能导致问题,尤其是在生成长文本时。此外,模型在预训练阶段记住的错误参数知识,以及推理过程中固有的抽样随机性,都意味着幻觉问题很难被彻底根除。
如何度量幻觉?
最靠谱的度量方式当然是人工评估。自动化的评估方法也有不少,比如基于信息抽取(IE)、基于问答系统(QA)、基于蕴含率(NLI)、基于事实性分类指标,或者干脆请 GPT-4 来打分。
具体的缓解工作
1. 基于数据的工作:构建高质量数据集
- 人工标注:通过众包等方式构建细粒度的幻觉评估基准(Benchmark),用于分析问题。但这种方法在 LLM 级别的大规模训练数据上成本过高,主要适用于特定任务场景。
- 自动筛选:利用模型给数据打分,剔除可能导致幻觉的“脏数据”。或者在预训练时,给更忠实于事实的数据(如维基百科 vs. 假新闻)赋予更高的权重,或者干脆只使用经过人工审查的可靠数据源(如维基百科)进行训练。
2. 模型层面的工作:优化模型结构
- 结构设计:侧重于设计能更充分编码源信息的结构,例如融入图神经网络(GNN)。
- 解码策略:在解码时减少模型的生成随机性。多样性和忠实度往往是一个“鱼和熊掌”的关系,适当降低多样性可以有效提升事实性。
- 检索增强:被证明是减少幻觉的“杀手锏”,典型代表如 LLaMA-index。
3. 模型层面的工作:优化训练方式
- 可控文本生成:将幻觉程度作为一个可控属性,在生成时进行主动干预。
- 提前规划“骨架”再生成:先生成内容大纲,再填充细节,确保逻辑框架的准确性。
- 强化学习:将减轻幻觉的指标作为强化学习的奖励函数(Reward),引导模型学习。
- 多任务学习:通过设计额外的辅助任务,帮助模型更好地理解事实与逻辑。
- 后处理:在模型生成后,训练一个小模型专门用来“修复”可能存在的幻觉错误。
如何缓解LLM幻觉
总的来说,数据层面的问题理论上可以通过构建高质量的无噪声数据集来解决。其他方法还包括采用事实核心采样,利用外部知识主动检测和对抗幻觉;或者像 SelfCheckGPT 那样,通过采样多个输出并检查彼此之间的一致性来间接验证。
绝对位置编码sinusoidal
位置编码是 Transformer 理解序列顺序的关键。原始 Transformer 提出的 sinusoidal 位置编码,利用不同频率的正弦和余弦函数,让模型能够捕获位置间的复杂关系。它的好处是:正余弦函数值域在 [-1, 1] 之间,与词嵌入相加不会破坏原有语义;同时,根据三角函数的性质,位置 `pos + k` 的编码可以被位置 `pos` 的编码线性表示,这意味着编码中天然蕴含了距离信息。
旋转位置编码RoPE
RoPE 借助了复数的思想,出发点很巧妙:通过绝对位置编码的方式,最终实现相对位置编码的效果。它的思路是,如果能对 Query 和 Key 向量注入位置信息,并让它们的内积结果只依赖于相对位置 `m-n`,不就解决问题了吗?RoPE 的研究正是为这一目标找到了一组解答。在复数域下,这个函数本质上是对向量的旋转,因此被称为“旋转式位置编码”。实际上,任意偶数维的 RoPE,都可以看作是二维情形的拼接。
(注:本文侧重思想介绍,具体的数学推导可以查阅苏剑林老师的博客或 RoFormer 原论文。)
以下是 LLaMA 中 RoPE 的核心代码实现,值得重点关注其 `precompute_freqs_cis` 和 `apply_rotary_emb` 的逻辑。
相对位置编码AliBi
ALiBi 的思路更加直接:它不在 Embedding 层添加位置编码,而是根据 token 之间的距离,给 Attention Score 加上一个预设的偏置矩阵。两个 token 距离越远,这个负数的绝对值越大,代表它们的相互贡献越低。针对注意力机制中的多个头,每个头会乘上一个不同的斜率。ALiBi 最大的优点是长度外推能力强:它允许在较短的序列上训练模型,推理时却能有效地外推到更长的序列。
位置编码的长度外推能力
位置编码的外推能力,归根结底来源于其对相对位置信息的表征能力。理论上,要扩展模型的长文本能力,主要有三条路:一是用更长的上下文窗口直接微调;二是改进位置编码(如 ALiBi);三是通过插值法,将超出训练窗口的位置编码压缩到预训练的上下文窗口内。
图解Transformer最关键模块MHA
Transformer 的核心在于,它提出仅靠 Attention 机制就能一步到位地获取全局信息。在 Transformer 中,Multi-Head Attention 可细分为三种:Self-Attention(Q、K、V 来自同一序列)、Cross-Attention(Q、K、V 来自不同序列),以及 Masked Self-Attention(在 Decoder 中,防止模型看到未来的信息)。
注意力机制的标准计算公式以及多头机制,本质上是让模型从多个不同的表示子空间关注输入,类似于 CNN 中多个卷积核的作用,增强模型聚合上下文信息的能力。
GPT 系列演进
从 GPT-1 到 GPT-3,再到 InstructGPT,这是一条清晰的演进路径。
- GPT-1:开创了“生成式预训练”的先河。核心思想是先在海量无标签数据上进行自监督预训练(Generative Pre-Training),再在特定任务的有标签数据上进行有监督微调(Discriminative Fine-Tuning)。它的模型结构是 Decoder-Only,使用了 12 层 Transformer 和掩码自注意力。
- GPT-2:核心思想是“任何有监督任务都是语言模型的一个子集”。当模型足够大、数据足够多时,仅靠语言模型训练就能完成其他任务。因此,它放弃了微调,转而采用 Zero-Shot 的 Prompt 预测,模型结构从后置层归一化改为前置层归一化,并引入了更大的数据集 WebText。
- GPT-3:进一步将模型和数据规模推向极致,并提出了 In-Context Learning 的概念。它本质上属于 Few-Shot Learning,但在推理时只给几个例子,不进行梯度回传,模型参数不更新。同时,它还引入了 Sparse Attention 来降低计算复杂度。
InstructGPT 与 LLaMA
InstructGPT 是 ChatGPT 的内核,它解决了 GPT-3 输出与人类意图的对齐问题。其技术方案分为三步:有监督微调(SFT)、训练奖励模型(RM)和基于人类反馈的强化学习(RLHF)。核心思想就是“基于人类反馈的指令微调”,让大模型学会理解并迎合“人类偏好”。
LLaMA 系列(V1 & V2)为开源社区做出了巨大贡献。它的模型结构主要由 Attention 和 MLP 堆叠,采用了 RMSNorm、SwiGLU 激活函数和 RoPE 位置编码。LLaMA V2 相比 V1,将预训练语料扩大到了 2 Trillion Tokens,上下文窗口长度翻倍,并引入了 Group Query Attention 来优化推理效率。
此外,MoE(混合专家模型)是一种高效的 Scaling 技术,通过稀疏的激活方式,用较少的计算量实现更大的模型规模。它将传统的前馈网络替换为多个“专家”和一个门控路由器,不同 token 被分配到不同的专家进行处理,在有限算力下实现了模型性能的巨大提升。
数据工程:LLM的基石
数据是决定模型性能的上限。以 GPT-3 为例,其训练数据混合了经过过滤的 CommonCrawl、WebText、Books 等数据集,并通过不同的采样权重,保证高质量数据(如 Wikipedia)得到更充分的训练。不同模型的数据分布差异很大,目前仍没有一个公认的最佳比例。数据规模方面,研究建议模型大小与训练 Token 数应等比例缩放;数据质量至关重要,清洗和去重能显著提升模型性能,而重复数据则可能导致训练损失异常;数据多样性同样是关键,多样化的来源能带来更好的下游任务表现。
在开源数据集中,Pile 以其高度的多样性著称,涵盖了 22 个不同领域的高质量子集。RefinedWeb 则专注于从 CommonCrawl 中过滤高质量文本。而 SlimPajama 是 CerebrasAI 对 RedPajama 进行清洗和去重后得到的版本,最终将 1.21T Tokens 的精炼压缩到了 627B Tokens,并开源了处理脚本。
最后,要让一个以英文为主的模型(如 LLaMA)支持中文,核心路径是:构建中文 Tokenization -> 继续预训练 -> 指令微调。这一步需要利用 SentencePiece 训练中文词库,并将中英文词表合并,再通过预训练让新加入的中文词汇“学会”与原有参数互动,最后使用高质量的中文指令数据对模型进行微调,使其具备出色的中文任务理解和生成能力。