- KM
- Chinchilla
-
上下文学习(ICL):为模型提供一个指令或任务的演示,根据输入生成预期结果而无需单独训练。GPT-1 2无,3有。
-
指令遵循:先进行指令微调,LLM 就能在训练中未出现的指令上也有很好的效果
-
逐步推理:利用 CoT 提示策略,让 LLM 在算术推理基准任务上的性能提高
-
扩展:加大规模
-
训练
-
能力引导:有些潜在能力不会显示展现。要依靠指令、ICL、CoT提示策略展现出来
-
对齐微调:让 LLM 与人类价值观保持一致。
InstructGPT [61] 设计了一种有效的微调方法,使 LLM 能够 按照期望的指令进行操作
-
工具操作:让 LLM 利用 tools(如计算器、搜索引擎)
-
GPT-1:无监督预训练和有监督微调的混合方法;确立了对自然语言文本进行建模的基本原则,即预 测下一个单词
-
GPT-2:架构类似,参数规模 1.5B;无监督语言建模来执行任务,无需使用标记数据进行显式微调
-
GPT-3:参数规模175B;提出 ICL:预测正确的任务解决方案,该解决方案可以被格式化为给定任务描述和示范下的文本序列
pretrain范式:预测给定上下文条件下的后续文本序列
-
用代码数据进行训练:Codex-在 github 代码上微调的 GPT
-
与人类对齐:近端策略优化(Proximal Policy Optimization, PPO)--> InstructGPT 提出 RLHF
OpenAI 的论文和文档中似乎很少使用 “指令微调” 一词,而是用在人类示例上有监督微调来替代(即 RLHF 算法的第一步)
-
Books
-
CommonCrawl
-
Reddit Links
-
Wikipedia
-
Code
-
The Pile
-
GPT-3 (175B) 训练:CommonCrawl、WebText2 、Books1 、Books2、Wikipedia
-
PaLM (540B) 训练:社交媒体对话、过滤后的网页、书籍、Github、多语言维基百科和新闻组成的预训练数据集
-
LLaMA (6B / 13B) 训练:CommonCrawl、C4、Github、Wikipedia、书籍、ArXiv、StackExchange
- Transformers
- ...
- 通用文本:网页、对话、书籍
- 专用文本:多语言、科学文本
- 代码
-
质量过滤
-
基于分类器:使用高质量文本训练选择分类器,识别过滤低质量数据
可能会删除方言、口语和社会语言的高质量文本
-
基于启发式:
-
基于语言过滤:若 LLM 主要用于某项语言,删除其他语言文本
-
基于度量过滤:基于 metrics 如困惑度,检测删除不自然的句子
-
基于统计过滤:利用语料库的统计特征,例如标点符号分布、符号与单词比率和句子长度,来衡量文本质量并过滤低质量数据。
-
基于关键词过滤:例如 HTML 标签、超链接、模板和攻击性词语
-
-
-
去重:
重复数据会降低语言模型的多样性,可能导致训练过程不稳定。三个粒度(句子级、文档级和数据集级)
-
隐私去除
-
分词
- 混合来源
- 数据数量
- 数据质量:重复的数据会降低 LLM 从上下文中复制的能力
-
Encoder-Decoder: T5、BART
-
Causal-Decoder: GPT、BLOOM、Gopher、LLaMA
-
Prefix-Decoder (也称非因果 Decoder): 修正了因果解码器的掩码机制,以使其能够对前缀 token 执行双向注意力代表工作:GLM-130B、U-PaLM
可以考虑通过 MoE 混合上述架构
-
标准化
- LN:最初 Transformer 中使用 post-LN,大多数 LLM 会用 pre-LN 实现更稳定训练,但会带来一定性能损失
- RMSNorm:训练速度和性能方面优越性 Gopher
- DeepNorm:训练稳定性 和 post-Norm 一起被用在 GLM-130B 中
- Embedding 之后加额外的 LN 可以稳定训练,但性能显著下降
-
激活函数
- GeLU
- GLU、SwiGLU、GeGLU
-
位置编码
- 正弦函数(绝对)
- 学习的位置编码(绝对):LLM 中使用更多
- 相对位置编码:根据键和查询之间的偏移量生成嵌入;可以在比训练序列更长的序列上表现良好
- 通过基于绝对位置设置特定的旋转矩阵,RoPE 中的键和查询之间的分数可以使用相对位置信息计算
-
注意力
- Attention
- Flash Attention:高效建模更长序列
- Sparse Attention:GPT-3 更低计算复杂度
- 偏置:大多 LLM 在每个 Linear 和 LN 中保留了偏置。在 PaLM、Galactica 中被移除,认为可以增强稳定行
综合上述讨论,我们总结了现有文献中的详细配置建议。为了有更强的泛化能力和训练稳定性,建议选择前置的 RMS 进行层标准化,并选择 SwiGLU 或 GeGLU 作为激活函数。此外,在位置编码方面,RoPE 或 ALiBi 是更好的选择,因为它们在长序列上表现更好。
- 语言建模(LM):基于序列中前面的 token x<i,自回归地预测目标 token xi
- 去噪自编码(DAE):输入中有一些被随机替换区间的损坏文本,训练语言模型以恢复被替换的 tokens 代表模型:GLM-130B、T5
总结:Causal-Decoder 有更好的 zero/few-shot 能力;广泛观察到扩展法则
- 批量:GPT-3、PaLM 引入动态 batch_size,可稳定 LLM 训练过程
- 学习率
- warm-up:训练初始的 0.1%~0.5% 的步骤中,线性增加 lr 到最大值 [5e-5, 1e-4]。GPT-3 的 lr 为 6e-5
- decay:衰减至最大值的 10%
- 优化器:Adam AdamW
- 稳定训练:weight decay、梯度裁剪。解决 loss 突增:PaLM 和 OPT 从发生徒增前一个 checkpoint 开始重新训练;GLM 发现 embedding 异常梯度通常导致徒增,提出减少 embed 维度缓解
- 3D 并行
- 数据并行
- 流水线并行
- 张量并行
- ZeRO:优化器状态分区、梯度分区和参数分区。PyTorch 中实现的 FSDP 和 ZeRO 类似。
- 混合精度训练:FP32 (BERT) --> FP16 (会导致精度损失) --> BF16 (更多指数位,更少有效位)
- 整体训练建议
构建指令格式 --> 有监督微调
包括:任务描述(即指令)--> 一对输入输出 --> 少量示例(可选)
-
格式化已有数据集:使用人类撰写的任务描述来增广带标注的数据集,这些描述通过解释任务目标来指导 LLM 理解任务。例如,在图 5(b)中,每个问答任务的实例都添加了一个任务描述“请回答下列问题”
-
格式化人类需求:丰富任务多样化,包括开放式生成、开放式问答、头脑风暴和聊天等
-
构建实例的关键因素
- 增加指令:扩大任务数量可以提高 LLM 泛化能力
- 设计格式:添加任务描述和示例可以产生实质性改进;而将避免、原因、建议添加到指令会产生不利影响;为了引出推理能力,一些研究建议将面向数据集的 CoT 实例(如算术推理)。同时使用包含和不包含 CoT 的样本在下游任务中可以获得较好性能。
指令多样性 > 实例数量
优化过程与预训练有一些不同 [64],比如训练目标函数(如序列到序列的损失)和优化参数设置(如更小的批量大小和学习率)
- 平衡数据分布:指令微调涉及到多任务混合
- 按比例采样每种实例
- 结合指令微调和预训练
- OPT-IML 在指令微调中加入与训练数据,可以看作对模型的正则化
- 不采用 pretain -> 指令微调 分阶段,而是直接将预训练数据和指令微调数据混合,从头训练模型 如 GLM-130B
- 性能改进
- 泛化性
- 有用性、诚实性、无害性
- 标注人员
- 人类反馈的收集
- 基于排序
- 基于问题
- 基于规则
三个组件:待对齐的 PLM、奖励模型 RM、RL 算法
-
RLHF 系统
- 第一个主流 RLHF 模型 InstructGPT 使用了 GPT-3 作为 PLM
- RM 提供指导信号,反映人对 LM 生成的文本的偏好,以标量表示。
- RM 的两种形式:经过微调的 LM 或使用人类偏好数据重新训练的 LM
- RM 通常采用与待对齐的 PLM 参数尺度不同的奖励模型:如 OpenAI 使用 6B GPT-3;DeepMind 使用 7B Gopher
- 用 RL 算法用于微调,常用 PPO
-
RLHF 关键步骤
- 监督微调:需要一个包含 指令+所需输出 的数据集,对 PLM 先微调
- 训练奖励模型:使用 人类反馈数据集 训练 RM。
- 向 PLM 输入提示,生成一定数量文本
- 让人工标注员为 输入-输出对 标注偏好(用排序标注减小不同标注者偏好差异)
- 训练 RM 来预测人类偏好输出
- RL 算法微调:RL 问题的策略(policy)由 PLM 给出(将提示作为输入并返回输出文本),行动空间(action space)是 LM 的词表,状态(state)是目前生成的token 序列,奖励(reward)则由 RM 提供
-
Adapter Tuning:bottle-neck 架构串行加入 Transformer 层
-
Prefix Tuning:在 Transformer 层前面添加具有任务特异性的 prefix 向量
-
Prompt Tuning:在输入层添加可训练的提示向量
-
LoRA:近似每层的更新矩阵
![image-20240415112527264](C:\Users\Jeffery Chen\AppData\Roaming\Typora\typora-user-images\image-20240415112527264.png)
![image-20240415113139874](C:\Users\Jeffery Chen\AppData\Roaming\Typora\typora-user-images\image-20240415113139874.png)
ICL 还与指令微调(在5.1中已讨论)有着密切的联系,因为它们都将任务或样例转化为自然语言的形式。然而,指令微调需要微调 LLM 来增强适配,而 ICL 仅仅是以提示的方式来使用 LLM。此外,指令微调可以提高 LLM 执行目标任务的 ICL 能力,尤其是在零样本设置时(仅使用任务描述)
-
示范选择:如何选择 ICL 中的示范样例
- 启发式方法:用 k-NN 匹配语义相近的样例
- 基于 LLM:根据添加样例后的性能提升评估每个样例的信息量
-
示范格式:选择示例后,将其整合及格式化为对 LLM 的自然语言提示
- 用相应的输入-输出对
- 添加任务描述 / CoT 提示
两种生成高质量示范格式的方法:Auto-CoT 利用 LLM 使用零样本提示生成中间推理;least-to-most 首先询问 LLM 来执行问题分解,然后利用 LLM 根据先前解决的中间答案依次解决子问题
-
示范顺序:LLM 有时会收到顺序偏差影响,倾向于重复示范结尾附近的答案。
- 启发式:查询相似度,越高的离结尾放越近
- 预训练如何影响 ICL?
- 训练任务的设计
- 训练语料的来源而非规模
- 训练数据的分布:当训练数据可以被聚类成为许多不常见类别,而不是均匀分布,模型会表现出 ICL 能力
- LLM 如何实现 ICL?
- 通过前向计算,LLM 生成关于示范的元梯度,并通过注意力机制隐式地执行梯度下降
一种改进的提示策略
- few-shot CoT:ICL 的一个特例,将每个示范 ⟨ 输入,输出 ⟩ 扩充为 ⟨ 输入,CoT,输出 ⟩,在 zero/few-shot 上和 ICL 配合使用
- 对每个问题使用多个 CoT
- Auto-CoT:利用 zero-shot CoT,通过特别提示 LLM 生成 CoT
- 为提高性能,Auto-CoT 进一步将训练集中的问题分成不同的簇,并选择最接近每个簇质心的问题,它们应该可以很好地代表整个训练集中的问题
- 增强的 CoT:如何生成多个推理路径,并在其中寻找一致性
- self-consistency:用 LLM 生成多个推理路径,然后对所有答案进行集成 (例如通过在这些路径中进行投票来选择最一致的答案)
- zero-shot CoT:用“Let’s think step by step”提示 LLM 来生成推理步骤,然后通过用“Therefore, the answer is”提示来得出最终答案。他们发现,这种策略在模型规模超过一定大小时可以显著提高性能,但在小规模的模型中效果不佳,这是涌现能力的重要表现。
- CoT 何时适用于 LLM?
- CoT 是一种涌现能力,只适用于大模型
- 效果主要体现在需要推理的任务;对于不复杂的任务,CoT 会比标准提示更差
- LLM 为什么能进行 CoT 推理?
- 思维能力来源:?
- 提示中组成部分的影响:符号(symbols)(例如算术推理中的数值量)、模式(patterns)(例如算术推理中的方程)和文本(text)
- 语言建模:即基于之前 token 预测下一个 token 的能力
- 条件文本生成:机器翻译、文本摘要、问答系统。评分基于准确率、BLEU、ROUGE
- 代码合成
- 主要问题
- 可控生成:全局关系难以捕捉
- 专业化生成:在整合新旧知识发生灾难性遗忘、ICL 能力下降
-
闭卷问答
-
开卷问答
-
知识补全:知识图谱补全、事实补全。InstructGPT 表明指令微调有助于补全。
-
主要问题
-
幻觉:生成的信息与现有来源冲突(内在幻觉),或无法通过现有来源验证(外在幻觉)
-
知识实时性
-
- 知识推理
- 符号推理:在形式化规则设定中操作符号以实现某些特定目标
- 数学推理
- 数学问题求解数据集:SVAMP [274]、GSM8k [273] 和MATH [312]
- 数学问题证明
- 主要问题
- 不一致性:错误的推理仍生成正确答案,或正确推理生成错误答案