语言模型发展历程#
涌现能力(Emergent Ability) 指的是当模型扩展到一定规模时,模型的特定任务性能突然出现显著跃升的趋势。具体来说包括三种 - 上下文学习、指令遵循和逐步推理的能力。
扩展法则#
扩展法则(Scaling Law) 指的是在大语言模型中,模型的性能随着模型规模(N)、数据规模(D)和计算算力(C)的增长而呈现可预测的提升趋势。也就是在给定算力(FLOPs)的情况下,如何对其余参数进行合理的分配能够使得模型的性能最好。
记住几个核心结论:1) 对于仅编码器的模型来说,三种因素满足 ;2) 固定模型的总参数量,调整层数/深度/宽度对模型的性能影响很小;3) 当单个因素不受另外两个因素制约的时候,模型的性能与每个因素都呈现 幂律关系;4) 为了提升模型性能,模型规模和数据规模需要 同步放大。
推理阶段扩展法则#
增加并行搜索计算量 - 模型采样多个输出,通过奖励模型(Verifier)来选择最优的输出。训练奖励模型有两种方法:结果奖励模型(ORMs)、过程奖励模型(PRMs)。PRMs 通常游优于 ORMs,但是需要逐步的反馈;
增加串行修改计算量 - 模型给出一个初始输出,然后基于该输出进行修正/调整输出的概率分布,直到得到一个最佳输出。
预训练任务#
语言建模(NTP)#
给定一个词元序列 ,语言建模的任务为基于当前位置之前的词元序列 以自回归的方式对目标词元进行预测,形式化表达为:
代表性的模型为 GPT 和 LLaMA 等。
前缀语言建模(Prefix LM) - 专为前缀解码器架构而设计,本质是利用前缀信息来预测后缀的词元,并且只有后缀中的词元计入总损失。形式化表达为:
该架构对因果解码器的掩码机制进行了修改,即对输入(前缀)部分采用双向注意力机制进行编码,而对输出部分利用单向的掩码注意力进行自回归地预测。与编码器-解码器架构不同的是,其在编码和解码的过程中是参数共享的,代表性的模型为 ChatGLM 和 U-PaLM。
去噪自编码(DAE)#
输入序列经过一系列的随机替换和删除操作之后形成损坏的文本 ,模型的目标就是根据损坏的文本来恢复被替换或删除的词元片段 。形式化表达为:
代表性的模型为 BERT 和 T5 等。
混合去噪器(MoD)#
混合去噪器将语言建模任务和去噪自编码任务进行了统一,包括三种去噪器(Denoiser):S-去噪器、R-去噪器、X-去噪器。其中 S 与前缀语言建模任务一致。而 R 和 X 与去噪自编码任务一致,区别在于屏蔽片段(Span)的跨度和损坏比例上有所区别。R 屏蔽序列中约 15% 的词元,且每个被屏蔽的片段仅包含 3 到 5 个词元。而 X 则采用更长的片段(12 个词元以上)或更高的损坏比例(50%)。
为了引导模型针对不同类型的输入选择相应的去噪器,输入句子会以特殊词元([R], [S], [X])作为开头。这种标记方式引导模型识别输入中使用的去噪器,并对该去噪器损坏的词元进行还原。代表性的模型为 UL2 和 PaLM2 等。
指令微调#
指令微调(Instruction Tuning) 指的是用自然语言形式的数据对预训练模型进行参数微调,目的是更好地泛化到未见过的任务上,即 零样本的学习能力。
指令微调最重要的一环是指令数据的构建,即 [指令+输入+输出] 对,例如下面的翻译任务:
指令:将下述中文翻译为英文输入:中国的首都是北京。输出:China's capital city is Beijing.
主要有三种构建方式 - 在已有的 NLP 数据集上添加指令、人类专家编写的指令数据集以及通过大模型来生成指令数据集(Self-Instruct)。借助大模型是因为人类专家编写的指令数据集在质量、多样性、创造性等方面存在限制。
适配器学习#
LoRA#
LoRA 指的是在预训练模型的 参数矩阵上添加低秩分解矩阵 来近似每层的参数更新。形式化表示为:
其中 、、、 。
具体来说,模型在前向传播的过程中,原始参数矩阵保持不变,而引入的低秩矩阵会被更新,训练完成之后将二者合并得到新的参数矩阵。推理阶段,由于原始参数矩阵没有变化,因此不会增加额外开销。
AdaLoRA#
AdaLoRA 在 LoRA 的基础上根据模块重要性的不同为参数矩阵动态分配不同的秩。形式化表示为:
其中 和 分别是 的左右奇异向量、 是 的奇异矩阵,因为是对角阵,所以可以使用向量进行存储。这里利用了 SVD 的思想,即利用最大的 个奇异值和矩阵对应的左右奇异向量来近似描述矩阵。
具体来说,模型在训练的过程中将秩视为一组可学习的超参数,通过评估左右奇异向量 和 的重要性来对 进行剪枝来得到来得到最优的奇异矩阵,其中重要的元素使用 替换,不重要的元素置零。
QLoRA#
提示学习#
Adapter Tuning#
Adapter Tuning 指的是在模型中引入适配器(瓶颈网络架构)从而不需要训练整个模型,只需要更新适配器参数即可。不同的任务可以使用不同的适配器。形式化表示为:
其中 、、。
具体来说,首先将特征向量压缩到较低维度,然后使用激活函数进行非线性变换,最后恢复到初始维度。并且使用残差连接来保证梯度的传递。
Prompt Tuning#
首先需要知道两个比较重要的概念:
- Soft/Continuous Prompt - 可学习的 Prompt,将人工设计的真实词元替换为可微的虚拟词元从而进行更新。有不同的学习方法(P-Tuning、Prefix Tuning);
- Hard/Discrete Prompt - 人工设计的 Prompt,依赖领域知识。可通过启发式或生成方法得到,具备次优性,且不同的设计对模型的影响非常大。
Prompt Tuning 指的是在输入序列的词向量中拼接可学习的提示向量,通过仅训练提示向量来实现下游任务的微调。主要分为以下步骤:
- 设置提示模版 - 将任务转换为与预训练任务相似的模版格式(例如生成任务);
- 拼接提示向量 - 在输入词向量中拼接提示向量(随意拼接),反向传播的时候仅更新提示向量参数。
该方法仅将每个下游任务的可更新的词元前置到输入文本中,没有使用额外的编码层或任务特定的输出层,并且使用原始预训练模型进行混合任务推理。
Prefix Tuning#
Prefix Tuning 指的是在每个 Transformer 层的注意力机制的 Query 和 Key 前端拼接可学习的前缀向量。这些向量不是实际的输入文本,而是模型在特定任务上学习到的。形式化表示为:
其中 表示矩阵拼接、 为前缀向量, 为前缀向量长度,一般取 10 到 100 之间。
为了保证训练的稳定性,使用了 重参数(Reparametrization) 的技巧。即通过神经网络来生成前缀向量而非直接优化前缀向量。具体来说,将随机初始化的低维向量(前缀种子)通过轻量级 MLP 映射到高维前缀空间,通过优化前缀种子和 MLP 的权重来获得最优的前缀向量。
P-Tuning#
P-Tuning 指的是通过 Prompt Encoder 来融合词与词之间的依赖关系,从而学习提示向量并拼接到输入向量中。其中提示编码器由 Bi-LSTM 和双层 MLP 构成。
假设提示向量为 [P1]、[P2]、[P3],训练任务为分类任务。则 Prompt Tuning 与 P-Tuning 的输入为:
# Prompt Tuning[P1][P2] "这部电影很棒。" [P3] 总体评价是[MASK]。# P-Tuning[H1][H2] "这部电影很棒。" [H3] 总体评价是[MASK]。
其中 [H] 是经过 Prompt Encoder 编码得到的向量。
P-Tuning v2 效仿 Prefix Tuning 拼接可学习的前缀向量,允许不同层捕捉不同粒度的任务特征。
人类对齐#
人类对齐(Human Alignment) 指的是大语言模型的行为与人类价值观、人类真实意图和社会伦理相一致。我们希望对齐之后的大模型是有用的、诚实的、无害的(3H 标准)。
RLHF#
基于人类反馈的强化学习通过人类偏好数据训练奖励模型,再使用强化学习优化策略模型,使得优化后的模型生成的文本在奖励模型中的期望奖励最大化。
监督微调 - 使用标注数据(Demonstration dataset)训练基于 GPT-3 的微调模型
奖励模型训练 - 收集人类对模型输出的偏好数据(Comparison data)训练奖励模型
定义概率偏好模型(Bradley-Terry):
采用交叉熵损失定义目标函数,希望偏好/非偏好输出之间的奖励差值较大:
其中 为人类非偏好的输出、 为人类偏好的输出。且使用最后一个词元的标量奖励值作为当前句子的奖励值。
PPO 优化 - 初始策略为 ,结合奖励模型 和 KL 惩罚优化策略从而最大化奖励模型的输出期望
注意这是自回归模型,需要将之前时刻的输出词元与当前时刻的输入拼接,共同提供给奖励模型计算奖励值。
加入 KL 惩罚是希望模型的优化目标不会太过偏离微调结果,减少奖励模型对 OOD 数据的敏感性以及避免尝试 Reward Hacking 问题。需要注意分布之间的 KL 散度是逐词元计算(Per-Token KL Penalty)。加入预训练目标函数是希望模型能够保留基础能力,避免遗忘预训练知识(减轻对齐税)。
但是 KL 散度的优化是二阶问题。通过引入 Clip 机制裁剪策略更新的概率比,直接限制策略变化范围,将它转换为一阶优化问题。此时目标函数变为:
其中 是优势函数,定义为实际奖励与基准奖励的差值:
其中实际奖励通过奖励模型输出得到,而基准奖励则由可学习的价值模型提供,价值模型用于降低方差并稳定策略更新。通过引入广义优势估计(GAE),单步优势函数进一步扩展为多步优势的指数加权平均:
当 的时候等价于蒙特卡洛估计,当 的时候退化为单步 TD 误差。
在实践中,通常使用奖励模型来初始化价值模型,并且采用时序差分误差作为目标函数:
引入 Clip 机制的好处是可以通过优势函数的正负来判断是否更新策略,而优势函数通过对比模型回答内容的实际奖励是否高于基准奖励来实现策略更新的定向调节。如果高于基准奖励,则指导模型增在当前输入下增大相应输出的概率(增大策略在这个状态下采取对应动作的概率),反之亦然。
GRPO#
由于价值模型是与策略模型是类似规模的,且都要进行参数更新,因此会引入较大的内存和计算负担。且价值模型本身的作用就是输出基准奖励用来调整策略。
GRPO 的思想是消除价值模型,并将相同问题不同输出的归一化奖励作为基准奖励。形式化表达为:
使用无偏差估计方法来计算 KL 散度:
此时优势函数有两种估计方法:
结果奖励模型(ORMs) - 使用每个输出的最后一个词元计算奖励值,然后使用下述公式更新:
过程奖励模型(PRMs) - 使用每个输出的每个词元计算奖励值,然后使用下述公式更新:
DPO#
上述两种对齐方法都依赖显式奖励模型,且需要复杂的策略优化过程(多阶段)。而 DPO 提出我们可以直接绕过奖励模型直接优化人类偏好策略,从而将多阶段学习转换为端到端学习。
根据 KL 约束下的最优策略表达式反解得到关于策略的奖励函数:
其中 是配方函数。然后将关于策略的奖励函数 代入奖励模型目标函数得到(奖励模型的重参数化):
从上述公式可以看出 DPO 通过隐式定义奖励函数 使其与策略函数 关联,将强化学习的策略优化问题转换为直接优化策略参数 的监督学习问题。
RLAIF#
提示工程#
提示工程(Prompt Engineering) 指的是通过设计合理的提示词来引导大语言模型完成特定任务的过程。提示工程指南 ↗收集了非常多的方法。
上下文学习#
上下文学习(In-Context Learning) 指的是大语言模型在推理阶段无需参数更新,仅通过在输入中添加任务示例即可快速适应并完成新任务的能力。
好的示例设计能够增模型的上下文学习能力,我们可以选取代表性的示例,并使用 CO-STAR 等框架输入给模型。
思维链#
思维链(Chain-of-Thought) 指的是在给定示例中添加具体推理步骤使得模型能够应对复杂推理问题。
如果仅是使用 “Let’s think step by step.” 而不提供示例,则为 Zero-shot CoT。
思维链的生成方法
- 基于采样的方法(CoT-SC) - 使用模型生成多条推理路径和对应的答案,然后选取多数答案为最终答案;
- 基于验证的方法 - 比对真实答案和生成答案训练分类器,并对整个推理路径和中间推理步骤进行验证。
通过思维链的生成方法,能够有效避免单一推理路径不稳定以及推理错误累积现象。
拓展的推理结构
- 思维树(ToT) - 在每个推理步骤(节点)中,“前瞻” 剩余的步骤并计算分数,“后验” 已生成内容的一致性;
- 思维图(GoT) - 生成中间推理步骤的同时汇聚其他节点的推理步骤,通过交叉验证来得到最终输出。
检索增强生成#
检索增强生成(Retrieval-Augmented Generation) 指的是通过检索与问题相似的外部数据来增强提示词,指导模型生成正确结果。有助于解决大模型知识的局限性、幻觉以及数据安全性问题。主要包含三个步骤:
- 索引 - 将文档库进行拆分并分块,转换成嵌入向量并存储到向量数据库中,从而构建向量索引;
- 检索 - 将输入内容和向量数据库中的内容进行相似度检索,选取若干最优相关片段;
- 生成 - 将选取到的片段拼接到输入中提供给大模型,生成回答。
检索系统#
检索过程中可能存在的问题:用户查询和召回文档不匹配、用户查询语义匮乏、用户查询过于具体/长尾。
查询分析(Query Analysis)
- 查询检索
- 多路查询(Multi-Query)
- 查询分解(Decomposition)
- Step-Back
- HyDE
- RAG-Fusion
- 查询构造
- 结构化数据
- 非结构化数据
信息检索(Information Retrieval)
- 词法检索(Lexical Index)
- 向量检索(Vector Index)
- 关系数据库
- 图像数据库
生成系统#
增强架构#
智能体#
智能体(Agent) 指的是基于大语言模型的智能代理,能自主理解任务、规划步骤并调用工具以完成复杂目标。它主要包含四个部分:
- 规划 - 子任务分解、反思与完善(ReAct、Reflexion);
- 记忆 - 长期记忆(RAG)、短期记忆(上下文学习);
- 工具使用 - 调用外部 API 补全模型权重信息、使用预训练模型;
- 行动 - 与环境交互并更改环境的状态。
多智能体系统是指通过多个自主或半自主的AI代理进行协作、竞争或角色分工,以动态交互和互补能力解决复杂任务,并提升生成结果的可靠性、一致性和创造性。常见的框架有 AutoGen、CrewAI。
工作流#
构建元素 / 增强型大模型
构建元素 / 自主智能体
工作流 / 提示链 - 每一次模型调用都会使得任务更加细化与简单
工作流 / 路由器 - 对任务进行分类,并将其定向到专门的后续节点
工作流 / 并行化 - 分段与投票两种模式,即将任务进行分解并执行,或重复运行同一任务得到多样化的结果
工作流 / 协调者 - 工作者 - “协调者”动态拆分任务,并将任务分发给”工作者”,最后将结果进行整合
工作流 / 生成器 - 优化器 - “生成器”响应任务,“优化器”对响应进行评估,二者交替循环运行
协议#
MCP(Model Context Protocol)
A2A(Agent to Agent)
模型部署#
模型量化#
后训练量化(PTQ) - 量化已经训练好的模型参数
- GPT-Q - 通过分层优化和 Hessian 矩阵补偿,在量化过程中动态调整权重(对某一权重量化后,需要调整其他权重来补偿误差)。开销较高,适用超大参数模型;
- AWQ - 通过分析激活分布识别权重的重要性,对关键权重通道保留更高精度。并采用逐通道缩放技术确定最佳缩放因子。开销较低,能够低资源部署。
量化感知训练(QAT) - 在训练过程中将量化模块添加到模型中
- LLM-QAT 同时量化权重、激活和 KV Cache,旨在增强吞吐量的同时支持更长的序列。
投机采样#
在自回归模型的 token-by-token 模式中,串行输出会导致推理较慢。投机采样(Speculative Decoding)的思想就是通过小模型生成候选序列,大模型评估候选序列是否符合自身分布。通过批处理概率计算,有效减少了自回归模型对于词元生成的串行依赖(生成 39 个词元只前向计算了 9 次)。
- 候选序列 - 小模型生成候选序列 ,概率为 ;
- 并行验证 - 把候选序列和前缀拼接输入给大模型,大模型并行计算每个位置的条件概率 ;
- 接受规则 - 对每个位置 ,大模型以概率 拒绝采样。并从 分布中重新采样。如果接受小模型输出,则用大模型采样下一个词元。重复候选序列的步骤(注意进行拼接)。
若 ,则表示小模型和大模型的输出分布不同,需要一定概率拒绝采样。并从正常分布 中重新采样使结果符合大模型输出分布。
多模态基础模型#
多模态的核心是在语言模型中通过可训练的连接模块来注入视觉特征,通过自回归预测下一个令牌。
CLIP#
CLIP(Contrastive Language-Image Pretraining)是由 OpenAI 提出的第一个多模态预训练算法。它首次将图像和文本映射到同一个高维空间(多模态嵌入空间),使得跨模态的相似度计算成为可能。
具体来说,CLIP 采用对比学习预训练,即训练两个编码器 - 图像编码器、文本编码器。
在训练过程中,将每个批量的 图像-文本对 传入模型,得到若干个图像特征向量和文本特征向量。我们希望正确的图像-文本对的特征向量相似度尽量高(对角线),而不是一对的相似度尽量低。这里相似度的计算方式为余弦相似度。此外由于不同编码器输出的特征向量长度不一样,因此使用线形映射统一向量长度。训练完成后可以通过 Prompt 实现零样本推理能力(在庞大数据集的基础上,对没有见过的样本效果还是不行)。
在推理过程中,以 ImageNet 为例,对一千个类别标签,分别生成一千个对应的文本,比如 A photo of a #Class,然后通过 CLIP 匹配相似度最高的图像和文本。
Flamingo#
Flamingo 是由 DeepMind 提出的多模态大模型,它的核心目标是实现 跨模态的少样本学习,即通过大量图文交织的数据来确保模型的少样本、上下文学习能力。
感知重采样器 - 类似于 DETR,学习一组固定数量的潜在输入查询,这些查询通过交叉注意力机制与视觉特征进行交互。从而 将变长的视觉向量压缩为定长的多模态语义向量。
门控交叉注意力单元 - 在原先固定的模型结构的每一层上添加门控交叉注意力单元,它通过门控机制控制视觉和文本的信息流,使得浅层提取基础特征,深层提取丰富特征(随着训练过程和层数的加深,门控值也逐渐变大)。
BLIP-2#
BLIP-2(Bootstrapping Language-Image Pre-training)是由 Salesforce Research 在提出的多模态预训练模型,它的核心目标是通过 轻量级模块连接冻结的视觉编码器与大语言模型,实现跨模态理解与生成任务。
Q-Former - 将视觉特征映射到语言模型的语义特征。并通过两阶段学习方式弥补视觉和语义的模态差距。
一阶段进行模态对齐,二阶段通过对齐后的视觉特征指导大语言模型输出。
表示学习阶段 - 引入可学习的 Query 与视觉编码器输出特征进行交互,通过联合优化三个预训练目标(ITM、ITG、ITC)、采用不同的注意力掩码机制提取与文本相关的视觉特征。
生成学习阶段 - 将一阶段提取的视觉特征映射到大模型输入特征的相同维度,作为前缀传入大模型,指导模型生成与图像相关的文本。
LLaVA#
LLaVA 的核心是通过多模态对齐和协同推理,来实现端到端的生成式学习系统(基于多模态输入,生成连贯的问答、描述、推理输出)。并且通过指令微调的方式来增强模型的零样本、少样本学习能力。
它的主要架构为 LLama、CLIP-ViT-L、线形投影层。训练阶段分为两步:
- 预训练阶段用来进行模态特征对齐 - 只更新线形投影层,其余层冻结;
- 端到端微调阶段用来适应用户多样化的指令要求 - 只更新 Llama 和线形投影层,其余层冻结。
指令跟随数据集构建过程 - 将带有 Caption 和 Bounding boxes 信息的 COCO 数据集提供给 GPT-text-only 让它输出三种指令数据,分别是对话数据、描述数据和复杂推理数据。形成 LLaVA-Instruct-158K 数据集。
大模型幻觉#
大模型评估#
传统评估指标#
LLM-as-Judge#
高效训练技术#
3D 并行训练#
3D 并行包含三种并行技术 - 数据并行(Data Parallelism)、流水线并行(Pipeline Parallelism)、张量并行(Tensor Parallelism)。
数据并行 - 该方法将完整的模型参数和优化器状态同步至所有参与训练的 GPU,将训练数据均匀地划分成多个批次,每个 GPU 处理一个批次。然后各 GPU 同步执行前向/反向传播。计算完成后通过 All-Reduce 操作对各 GPU 的梯度进行平均,确保所有设备基于统一的梯度进行更新。
流水线并行 - 该方法将模型的不同层的参数分配到不同的 GPU 上,通过梯度累积(Gradient Accumulation)的方式来提高设备的利用率,即计算单个批次的梯度后不立即更新参数,而是累积多个批次后再进行更新。目的是为了减少设备之间参数更新的等待延迟。
张量并行 - 该方法将计算过程中的参数矩阵进行按列分块,分别分配到不同的 GPU 上,然后并行地执行矩阵乘法,最后将结果进行合并。
零冗余优化器(ZeRO)#
该方法由 DeepSpeed 团队提出,旨在解决数据并行中的模型冗余问题,其通过 分片存储 策略,将模型参数、优化器状态和梯度分散到不同的 GPU 上,从而减少单设备的显存需求。具体来说有三种划分方案:
- ZeRO-1 - 将优化器状态平摊到每台设备上,而模型参数和梯度各自保留;
- ZeRO-2 - 在 ZeRO-1 的基础上,将梯度也平摊到每台设备上;
- ZeRO-3 - 在 ZeRO-2 的基础上,将模型参数也平摊到每台设备上。
激活重计算#
激活重计算也称为梯度检查点(Gradient Checkpointing),该技术在前向计算的过程中保留部分激活值,在反向传播的过程当中重新激活需要的激活值,从而达到节约显存的目的。
混合精度训练#
混合精度训练指的是同时使用半精度浮点数(2 个字节)和单精度浮点数(4 个字节)进行运算,以实现显存开销减半、训练效率翻倍的效果。具体来说在前向/反向传播中使用半精度计算,然后在参数更新的时候使用单精度计算。
常见的半精度浮点数表示方式为 FP16,包含 1 位符号位、5 位指数位、10 位尾数位。进一步 Google 研究人员开发出了 BF16,其包含 1 位符号位、8 位指数位、7 位尾数位,表示范围可以达到 数量级,在模型训练中被广泛使用。
模型效率分析#
参数量估计#
考虑仅解码器架构的模型。假设词表大小为 ,模型包含 层解码器,中间状态的维度大小为 ,前馈神经网络的中间状态维度为 ,则参数量为:
训练运算量估计#
训练运算量指的是模型在训练过程中,需要进行的浮点运算次数(FLOPs)。
训练时间估计#
在训练过程中,训练时间包括浮点数运算(最耗时)、数据读取和多进程同步等。因此可以根据训练运算量估计公式以及 GPU 的浮点运算能力来大致估计训练时间,形式化表示为:
需要注意 GPU 每秒浮点运算数通常是理论浮点运算能力的 30% 到 70%,而这一比例通常会受到多种实际因素的影响。