Llama 2:开放基础和微调的聊天模型
摘要
评论
介绍了下一代 LLaMa (LLaMa 2) 自回归 Transformer:更好的数据清理、更长的上下文长度(更多 tokens)和分组查询注意力 (GQA - K 和 V 投影在多个头之间共享)。在预训练数据上进行自监督学习以获得 LLaMa 2,为初始 LLaMa-2-chat 进行监督微调,通过 RLHF(使用 PPO 的拒绝采样)迭代改进聊天模型 - 人工反馈用于安全和奖励模型。与 LLaMA-1 相同的分词器(BPE SentencePiece,32k tokens)。优于 Falcon 和 MPT 等开源模型,但与 GPT-4 和 PaLM-2-L 性能(闭源模型)不匹配。LLaMA-2-chat 的微调:监督微调 (SFT) 使用高质量微调数据(众包/标注)- 训练时将用户提示归零(仅在答案 tokens 上反向传播);以及 RLHF。具有人类反馈的强化学习 (RLHF) 具有:使用聊天模型(带有分类头,用于自回归下一个 token 预测,替换为用于标量奖励预测的回归头)制作的奖励模型、修改后的(用于响应区分的可变边距)二元排序损失、用于 70B 模型的拒绝采样微调(提炼为较小的模型),然后是 PPO(随着标注奖励批次的到来),奖励具有安全性和帮助性。为 RLHF 后的多轮一致性提出幽灵注意力 (GAtt)(上下文蒸馏以记住先前/初始指令)。测试,除了传统的安全性、帮助性、偏见和真实性分析外,还包括红队演练(模拟真实世界的攻击和专业演员利用安全威胁)数据 - 用于微调(反馈训练)。与 MPT、Vicuna、Falcon、PaLM 和 ChatGPT 相比,违规百分比更低,安全性和帮助性评级更高。在 MMLU(大规模多任务语言理解)、问答、Human-Eval 和 MBPP(代码生成)、自然问题、SQUAD(理解)、AGI Eval 和数学推理方面优于其他开源模型。附录中有进一步的分析和模型卡。来自 Meta。
> 链接: 网站, Meta AI 博客文章, arxiv, Meta 新闻, GitHub (旧版 LLaMA - v1)
Meta 新发布的 LLM Llama 2 不是开源的
https://www.theregister.com/2023/07/21/llama_is_not_open_source/
我对论文中的 RL 调优方法有一些疑问,其中一位作者 (@louismartin) 友好地提供了富有洞察力的答案,这些答案可能对其他进行 RLHF 的团队有用。以下内容经他允许转载。
问: 您能分享有关用于 RL 调优的数据集的任何细节吗?特别是,它是否由人类与您的中间 RLHF 检查点交互的多轮对话组成,还是其他内容?我也很想知道您是否使用了任何开放的偏好建模数据集作为 RL 调优的提示来源以及数量。
答: 我们确实使用了人类与我们的中间 RLHF 检查点交互的多轮对话。我们使用了一些开放的偏好建模数据集作为提示来源,但我们意识到大部分收益来自我们收集的数据。可能是因为它与我们的模型有关。
[Lewis 注] 我认为这部分解释了为什么我们至今没有看到大量开源 RLHF 模型 - 收集与分布相关的偏好标签本质上是昂贵的,尤其是在 Meta 所做的规模上。
问: 关于您用于 RL 调优的数据集的一个后续问题:它的大小与您的 SFT 数据集相似还是大得多?
答: 我们在拒绝采样中使用了所有奖励建模提示,并在 PPO 中使用了大部分,但我没有确切的比例。
[Lewis 注] 很高兴看到人们可以以这种方式重复使用偏好数据进行 RL 调优。相比之下,InstructGPT 论文煞费苦心地确保所有提示在 SFT/RM/RL 中都是唯一的,但这对于对话应用程序可能不是必需的。
问: 在您的拒绝采样方法中,您说您“使用选定的输出进行梯度更新”。我是否理解正确,您以“在线”方式执行此操作,即获取一批提示,生成/排名 K 个样本,然后进行反向传播?如果这是正确的,您能分享有关您的批量大小的任何细节吗?
答: 不,对于拒绝采样,我们在整个数据集上使用相同的检查点进行采样,为每个提示选择最佳输出,然后在整个数据集上使用最佳输出对检查点进行一次微调。
[Lewis 注] 这非常令人兴奋,因为拒绝采样调优比 PPO(及其所有不稳定性 🙃)的实现要简单得多!
我正在分享与 Kevin Stone (@kevinleestone) 通信中的更多见解,这次是关于 PPO 的。与之前一样,以下内容经他允许转载。
问: Louis 提到您在 Meta Safety / Helpfulness 奖励建模语料库上进行了微调。您是否只是简单地使用每个对话的 N-1 轮作为提示,并在 Meta Safety / Helpfulness 的全部约 150 万个示例上进行训练?此外,我很好奇您在 Meta 和开源数据集之间使用了什么样的混合(如果有的话) - 这是否与您描述的奖励建模的比例相同?
答: 我们使用了与我们用于奖励建模的分布大致相同的 N-1 轮。
[Lewis 注] 这与 InstructGPT 和 Anthropic 的论文等现有文献大相径庭,后者通常在小得多的规模上运行 PPO,即约 10 万个提示与 Meta 语料库中的 150 万个提示相比!
问: 在生成过程中,您是否使用了无偏采样(即 T=1,无核采样)?我们发现偏离无偏采样可能会导致负 KL 散度等病理,我很好奇您是否也观察到了这一点。
答: 对于生成,我们使用了 temp=1,没有其他采样技巧。我运行了一些关于这些的小实验,并没有看到任何收益。我的直觉是,在线 RL 擅长以一流的方式“修复”采样,而不是更像启发式的 top-p 和重复惩罚。我这么说是因为我能够使用 PPO 训练一个 4b 模型,并修复所有重复问题,即使使用简单的 t=1 采样也是如此。
[Lewis 注] 有趣的故事:PPO 对(看似)无害的事物(如文本生成启发式方法)的敏感性是我失眠了很多晚的许多“bug”之一 🤪。我们真的需要 NLP 版本的 Andy Jones 关于调试 RL 系统的优秀博客文章:https://andyljones.com/posts/rl-debugging.html
问: 对于 KL 惩罚,您是否尝试过 Schulman 的博客文章 (http://joschu.net/blog/kl-approx.html) 中提出的替代估计?我们没有发现这些替代方案有太大的积极影响,但我们从其他团队那里听说它确实有。
答: 我在小规模实验中使用较低方差的 KL 估计时遇到了稳定性问题,所以我默认使用论文中描述的简单 KL 近似。
问: 在 PPO 期间,您注意到生成是一个瓶颈(我们的经验也是如此!),并且您“通过在生成之前将模型权重整合到每个节点一次,然后在生成后释放内存来缓解这种情况”。我是否理解正确,您基本上在每个 PPO 步骤后保存一个检查点,释放内存以运行推理,然后从检查点恢复训练?由于保存/加载大型模型本身也有开销,我很好奇这比您报告的朴素生成 20 倍的减速有多大的增益?
答: 关于我们的 PPO 训练的一些更多细节:
- 对于 70b 模型,我们使用 8 的张量并行性
- 我们使用 FSDP 进行梯度步骤,它依次收集每层的权重,然后释放内存
- 使用 NCCL 通过 4x100gbps EFA 互连将所有权重收集和释放到所有节点大约需要 5 秒
- 我们编写了一个小函数,该函数使用与训练步骤中使用的类似 NCCL 代码,将非 FSDP(整合)模型逐层直接初始化到 GPU 内存中
- 一旦所有权重都本地化到每个节点,生成速度就快了大约 20 倍 - 我们不必在生成过程中的每个前向传递中支付 5 秒的税,而只需预先支付一次。
- 除了使用 bf16(我们在训练期间也使用)之外,我们没有使用任何其他量化方案。
- 生成完成后,我们释放整合模型,并继续使用标准 FSDP 进行评分和初始策略对数概率(这些每个只需要一次前向传递)和 ppo 梯度更新(这只需要 8 次前向和后向传递)。
[Lewis 注] 据我所知,没有开源 RLHF 框架应用这种巧妙的优化类型 - 他们应该这样做!
> Meta 新发布的 LLM Llama 2 不是开源的
> https://www.theregister.com/2023/07/21/llama_is_not_open_source/
关于许可限制,每月 7 亿用户仍然是一个非常高的目标。
我对 Gatt 方法有一些疑问。我相信它没有得到清楚的解释。如果任何对 Gatt 方法有适当理解的人能够回答以下问题,我将不胜感激,社区也会感激:
- 实际上如何应用“使用最新的 RLHF 模型从此合成数据中采样”?我们有用户和助手消息的对话。RLHF 模型需要用户消息来采样答案,但没有用户消息。如果上下文对话用于采样用户问题,那么提示会是什么样的?采样的用户问题是否会包含指令?
- 所述过程如何类似于拒绝采样?
- 在给定数据集中将指令连接到用户消息,例如表现得像某人,不会改变给定的答案。这不是问题吗?
有足够的资源来理解上下文蒸馏和拒绝采样。因此,任何好心回答这些问题的人都不需要费心解释它们。
提前感谢!
我可以回答这些问题。
> 实际上如何应用“使用最新的 RLHF 模型从此合成数据中采样”?
具体来说,您定义您的系统提示,例如“表现得像拿破仑,他喜欢打板球”。您进行对话,对于每个用户输入,您都以您的系统提示“表现得像拿破仑,他喜欢打板球”开始,因此助手的回复受到条件限制,以遵循用户指令。
用户:表现得像拿破仑,他喜欢打板球。<用户_消息_1>
助手:<回复_1>
用户:表现得像拿破仑,他喜欢打板球。<用户_消息_2>
助手:<回复_2>
...
用户:表现得像拿破仑,他喜欢打板球。<用户_消息_N>
助手:<回复_N>
在训练时,您将数据集定义为如下:
系统:表现得像拿破仑,他喜欢打板球。
用户:<用户_消息_1>
助手:<回复_1>
用户:<用户_消息_2>
助手:<回复_2>
...
用户:<用户_消息_N>
助手:<回复_N>
助手的每个回复都按设计以系统提示为条件;模型将学习在每个步骤关注系统提示
上下文对话指的是我认为的系统提示,在这种情况下,我们有 N 个样本:
[系统:](系统:表现得像拿破仑,他喜欢打板球。
用户:<用户_消息_1>
助手:<回复_1>
[系统:](系统:表现得像拿破仑,他喜欢打板球。
用户:<用户消息1>
助手:<回复1>
用户:<用户消息2>
助手:<回复2>
```
[系统:](系统:表现得像拿破仑,他喜欢打板球。
用户:<用户消息1>
助手:<回复1>
用户:<用户消息2>
助手:<回复2>
...
用户:<用户消息N>
助手:<回复_N>
```
对于每个样本 S,在训练时,我们传递上下文:
[系统:](系统:表现得像拿破仑,他喜欢打板球。
用户:<用户_消息_1>
助手:<回复_1>
用户:<用户_消息_2>
助手:<回复_2>
...
用户:<用户_消息_S-1>
助手:<回复_S-1>
用户:<用户_消息_S>
我们训练 助手:<回复_S> 上的概率:所有之前的 tokens 的损失都归零,然后您计算 ground-truth(实际的 <回复_S>)和预测的 tokens P(t>k|t0, ..., tk) 之间的交叉熵,其中 k 是序列的长度
👉 订阅: https://www.youtube.com/@Arxflix
👉 推特: https://x.com/arxflix
👉 LMNT (合作伙伴): https://lmnt.com/
作者:Arxflix


