记录一下关于LLaMA-2的技术要点与洞察,如有理解的不确切的地方,欢迎指正。(如需转载,请署名)
0. TL;DR:
基座模型:开源了LLaMA-2,基于新的数据配比训练的,增加了40%的数据量,上下文长度翻了个倍,现在是4K,采用了Group-Query Attention。开源了7B,13B,和70B的模型,当然还有个34B的,但是没用开源。
对话模型:对基座模型做了对话场景上的优化,也开源了对应的7B,13B,和70B版本的对话模型。这篇技术报告花了很大的篇幅来介绍RLHF,Safety,Alignment上的优化和评估,(以至于有人感觉都优化过头了...,毕竟是大公司,也理解),对做alignment相关方向的同学是个很好的参考。
1. 预训练
做了更鲁棒的数据清洗,更新了数据比例,对包含事实性更多的数据源做了上采样,以此增强模型的知识能力,缓解幻觉问题,增加了40%的训练数据量,增加到了2T的tokens,无论多大的模型都是2T的量,发现也可以进一步提升小模型的能力;
训练细节上大体上与一代差不多,标准的Transformer架构,用Pre-Norm,RMSNorm(T5也用的这个),SwiGLU的激活函数,旋转位置编码(RoPE),采用了Group-Query Attention,在不降低性能的情况下提升效率;
关于Group-Query Attention:自回归解码的一个标准方案是把之前token的K和V缓存起来,空间换时间,随着上下文长度和batch size的上涨,显存占用也在急剧上涨。可能的缓解方案有:multi-query attention (K和V的投影只用一个头,不是多头),group-query attention (K和V的投影用8个头),实验发现,GQA的效果相对于在绝大多数任务上与MHA持平,比MQA稍好;(听上去也比较直觉,毕竟有更多的参数)
分词器用BPE,对于所有的数字都将其切分成一个一个的单独的位(这通常对于一些算术运算相关的任务很重要),词表大小32K;
用的是Meta的超算做的预训练,如果以10000张80G A100为单位,训练7B,13B,34B,70B模型分别需要18h,36h,4.3天,7.2天...
评估结果:
在代码,常识推理,世界知识,阅读理解,数学推理等常见基准上做了评估,相比一代的LLaMA取得了显著的提升,同时也优于开源的MPT和Falcon等模型,70B的LLaMA-2在MMLU和GSM-8K上接近GPT-3.5,但是代码生成任务上性能较差。
2. 微调
为了得到安全的对话模型,作者们在对齐上做出了很大的努力,这一阶段包括SFT和RLHF。
2.1 SFT部分
数据质量很重要。作者发现虽然开源的指令微调数据很多,但是质量和多样性也不够高。作者发现只要数据质量够高,并不一定需要很多,这一点与LIMA的观察相似,最终,自己标了27k条左右的指令数据。
训练过程中prompt部分和answer部分用一个特殊token分隔开,训练过程中只计算answer部分的loss
2.2 RLHF部分
RLHF是周期进行的,reward model和policy model要同步更新,也就是,每次来了最新的perference data,要继续迭代reward model,使得reward model对于policy产生的response要在同一分布内(in-distribution),这样才能迭代出新的更好的policy model。
helpfulness 和 safety(或者说harmfulless)通常是冲突的。比如让LLM告诉我们如何制作一个炸弹,如果想要helpfulness,那么就希望它告诉我们怎么做。如果考虑sefety,则它应该拒绝回答这个问题。一般情况下,我们会选择safaty。为此,作者训练了两个reward模型,分别用于helpfulness和safety。
在preference数据收集的过程中,给定prompt,生成response时候为了增加多样性,用了不同的模型变种,用了不同的温度和超参数。(同一个模型生成两次response通常会差不多...)
目前的preference数据也很多,作者自己构建了一个141w条比较数据,样本更长,更适合对话场景。但是最后作者还发现把现有的开源的preference数据跟自己构建的混合到一起训练一个reward模型可以提升泛化性。
经过大量的实验,最终reward模型的数据混合方案是:对于helpfulness reward模型,50%是自己标注的helpfulness数据,剩下的50%从自己标注的safety数据和开源preference数据中进行均匀采样。对于safety reward模型,90%是自己标注的satefy数据和Anthropic的harmless数据,10%是自己标注的helpfulness数据和开源的helpfulness数据。
reward model也是从policy模型初始化而来,这样reward模型就知道policy模型知道什么,不会导致二者信息不一致,可以避免一些幻觉问题。reward和policy模型的架构和超参数完全一样,除了reward模型用的是一个regression head。
Reward模型的训练过程采用了课程学习的策略,即一开始会用一些简单的prompt,后面会用更复杂的prompt;
作者在标注preference data时候,做了更细粒度的标注,比如一个回复相比另一个significantly better, better,slightly better,neglibibly better,和unsure。为了更充分利用这样细粒度的标注,在reward model训练时融入了一个间隔项,实验发现可以提升helpfulness reward 模型的准确率。
强化学习阶段:随着preference数据的越来越多,可以训练更好的reward模型,因此会一直迭代训练。作者探索了两种强化学习算法:PPO和rejection sampling fine-tuning. 后者相比于前者,在采样时会采样多个输出(PPO会采样一个),然后选择reward最高的进行优化,同时将这个最好的output保留下来用于训练reward模型,相比较于前者是从最新的policy模型上进行采样,后者是从最初的policy模型上进行采样,不过模型都是一直在迭代,或许也近似看作成做法一样。作者最终的方案是前几次迭代采用rejection sampling fine-tuning,后面采用二者结合,即用完它再继续采用PPO。
在最终的奖励函数中,作者综合考虑了safety reward和helpfulness reward,如果是来自satefy preference数据集或者当前的reward小于0.15,则采用safety reward,否则则采用helpfulness reward。最后,作者还对reward分数做了whiten操作,发现可以提升训练稳定性。(注:由于训练不稳定的问题,在InstructionGPT中对于175B的Policy模型,作者只采用了6B的reward模型)
2.3 用于提升多轮对话一致性的System Message和Ghost Attention技术
在对话的场景下,我们通常需要设置system prompt,比如让他扮演xx角色,或者按照什么风格说话,作者发现几轮对话下来,模型容易忘记这样的“系统设定”。
假定有一个多轮对话数据集,用户和assistant之间交替对话,现将这个system prompt插入到每一轮对话中的用户消息中。然后用最新的RLHF模型从这个合成数据中选择样本,(我的理解是用reward模型来选择样本)然后对于选择出来的样本,只在最开始保留system prompt,之前在每一轮对话中都插入了system prompt,现在要都移除掉。不过这个会跟之前模型RLHF以及SFT阶段会与不一致,为此,作者会把之前轮数的上下文的loss置为0(我的理解是依旧类似于SFT中把prompt的loss置为0)
2.4 对齐的效果
对于RLHF后的模型做了评估(包括基于模型的评估和人工评估),结果显示模型超过了开源模型和ChatGPT这种闭源的模型。基于模型评估时,对两个response放的位置做了随机打乱,来避免偏差。
不过作者也提到,评估结果可能存在偏差,比如测试集不够多样,而且没用涵盖代码生成和推理相关的任务。
3. 安全
文章正文花了整整10页的篇幅来解释安全上所做出的努力。
3.1 预训练阶段的安全性
作者首先强调了训练数据的处理符合Meta的隐私和法律规范,也不会使用任何用户的数据,也从数据集中排除了包含很多个人信息的站点。重要一点是,作者对于数据集没做过多额外的处理,这样使得模型具备更好的泛化能力,以及造成更少的偏见(见过的数据源更多,多样性更高,自然“眼界”更开阔)。作者观察到LLaMA-2有一定的毒性上升,作者猜测可能跟数据集没用做额外处理有关。
作者仔细分析了预训练数据中潜在存在的偏见:比如作者发现代词中He的出现频率相比She更高;还考虑了性比,性取向,国家种族等因素,比如在性别的考量中,会发现female出现的频率会比male更高,在国家地区的考量中,西方国家,宗教,耶稣,基督等词汇出现频率很高。(嗯,中国本土化模型势在必行...)
数据的毒性较低。
数据中绝大多数是英语,中文只占0.13%。
3.2 用于安全阶段的微调
为了得到更安全的对话模型,作者采用了以下三个技术:
注:以下的技术都已经在前面的pipeline中做过了,这里只是单独拎出来介绍一下,并不是做完上述的SFT-RLHF之后再做一遍Safety版本的,是上述pipeline过程中用到的数据就包含了用于安全控制的数据。
- Supervised Safety Fine-tuning: 收集了一些“对抗性”“诱导性”的提示,然后做了对应的安全的回复生成。然后将此数据用于SFT中。
- Safety RLHF: 训练安全专用的reward模型,收集更加有挑战的诱导提示,然后做RLHF;
- Safety Context Distillation: 在RLHF的pipeline中融入上下文蒸馏技术,也即在生成response之前,在原有的prompt之前加上一个system prompt比如“You are a safe and responsible assistant.”,然后得到回复之后再把这个system prompt去掉,然后将这个数据用于RLHF的pipeline中。
一些洞察:
安全性问题通常也是长尾的,因为会有各种各样的意想不到的诱导性提示,作者选了RLHF阶段中的两个checkpoint做实验,发现随着RLHF的深入,对齐效果越好,但并不会损失helpfulness。(因为safety和helpfulness通常是“对抗”的)
同时做了也做了safety数据的scaling,发现随着safety数据的提升,helpfulness并不会怎么下降,但是safety会显著提升。
随着更多安全数据的加入,错误拒绝率(也就是可能不算是敏感的prompt,模型也拒绝回答)也会增高。(这大概是为什么有人发现感觉对齐对过头的原因...)
作者发现对helpful的prompt使用context distillation会导致回复的质量变差,带来更多的错误拒绝。作者一开始的方案是只针对对抗样本做context distillation,不过即便如此,有时候也会导致在对抗样本上的回复质量变差,最终的解决方案是如果context distillation的回复相比原来的回复得到了一个更好的reward则采用context distillation的回复。
3.3 红队对抗
关于Red Teaming: 一个通过承担对抗性角色来挑战组织以提高其有效性的独立的团体叫做Red Team。 后来,由于信息安全行业与军方的一些相似性,这个概念被引入到了安全行业,现在国际上一般以如下比较通用的定义来描述信息安全行业中的Red Team: 基于情报和目标导向来模拟攻击者对企业实施入侵的专门的安全团队。
还是之前说的,安全性问题通常是一个长尾问题,有些不太常见的问题但是却能引发灾难,比如ChatGPT的奶奶漏洞。为此,作者们召集了350人左右的团队(涵盖了网安专家,电信欺诈,法律,政策,民权,工程师等等背景)来做红队对抗,对抗过程中发现的一些有用的洞察:
- 早期的模型容易被绕过,回答一些不安全的内容,中期的模型能识别出诱导提示中的问题,最后的模型能够解决这些问题;
- 早期的模型更容易植入一些system prompt,比如以诗歌的形式来回答问题。
- 在积极的上下文中嵌入一些诱导在早期的模型上更容易成功“渗透”。
总而言之,红队对抗可以帮助我们构建更加安全的对话模型。
在安全性评估过程中也发现,多轮对话相比单轮对话更容易产生不安全的回复。
4. 作者们在模型构建中的观察与发现
不止人工标注。过去NLP社区通常会偏好人工标注的数据,强化学习可能有些“神秘莫测”。但是本文发现强化学习能够提高更多有效的高质量的,尤其基于代价和时间成本更低。人工标注总共是有限的,而且非常容易受到标注者的个人偏好等因素影响。此外,模型有潜力能够写出顶级数据标注者都写不出来的内容,但是人类总是能够对内容产生有价值的反馈。同理,虽然不是每个人都是艺术家,但是每个人都可以对艺术作品保持批判能力。作者们认为LLM能够在某些任务上超越人类标注者本质上是由RLHF驱动的。并且随着不断的发展,”监督“的含义可能要发生变化。
视情况而变的温度。作者还发现了之前RLHF相关研究没有揭示的一点,RLHF过程中最好的温度是动态变换的,比如早期可能温度低一点效果较好,后期需要温度高一点。另外,针对不同的prompt可能也需要不同的问题。
LLaMA-2 Chat内化了时间的概念。尽管训练的目标很简单,就是next token prediction,训练数据也是随机打乱的,没有按照时间排序,但是模型依旧理解了时间的概念。
使用工具的涌现能力。LLaMA-2 Chat展现出了零样本使用工具的能力。
写在最后:
从头到尾啃完,断断续续花了好几天的时间。直到今天快读完的时候,发现又出现了新的模型在榜单上又干掉了LLaMA-2... 技术迭代更新之快,可见一斑,当开源模型在努力追赶,一个又一个的模型刷新人们认知的时候,这些模型也在推动我们走出舒适区,在这场与时俱进的竞技场上永不止步。