写在前面
大家好,我是刘聪NLP。
今天给大家带来一篇dikw大佬(@知乎dikw)的今天给大家带来一篇dikw大佬(@知乎dikw)的中文HH-RLFH数据集上的PPO实践文章。
知乎:https://zhuanlan.zhihu.com/p/652044120
大型语言模型(LLMs)如ChatGPT由于其出色的遵循用户指示的能力而得到了广泛的应用。开发这些LLMs涉及一个复杂且尚未被深入理解的工作流程。被公认为是和chatgpt3.5是子妹模型的instruct gpt的论文指出了SFT模型在强化模型PPO算法进行迭代过后,相比之前在指令理解、幻觉等问题上面得得到了明显的提升。同时由从open ai出来创业而成立的anthropic公司的Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback 论文指出强化学习是他们让模型去对齐人类价值的核心方法。这些都意味着强化学习至少是一个确实非常重要的方法在让大模型对齐人类价值的时候。
笔者因此想实践RLHF流程,验证ppo算法是否确实能让模型得到比较大的性能提升,但是在实验过程发现目前公开的可以用来训练偏好模型(奖励模型)的中文数据几乎是没有的,而目前开源的数据基本都是英文。anthropic公司开源了他们论文的hh-rlhf数据集(helpluf 和harmless) ,并且这个数据也被很多工作用到比如llama2也有提到。所以笔者萌发了翻译这个数据的想法。
实验
数据
基于anthropic的《Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback》论文开源的关于有助和无害的人类偏好数据。这些数据旨在为后续的RLHF训练训练偏好(或奖励)模型。
- helpful训练集4w条,测试集2k条。
- harmless训练集4w条。测试集2k条。
使用的翻译模型翻译,难以避免的存在一些数据翻译质量不高,期待有更好的翻译结果数据。 完整的翻译过后的中文数据以及对应的英文数据目前都已经发布在huggingface datasets上面。
https://huggingface.co/datasets/dikw/hh_rlhf_cn
- SFT数据:为了验证PPO和SFT的效果对比,所以这里选择了目前比较小量的开源数据集alpaca-gpt4数据,包括了5万条中文和5万条英文,一共使用了10万条SFT数据。使得微调过后的模型同时具备比较好的中英文指令理解能力。
- RM数据:基于hh-rlhf划分出来的6万条中文数据集+6万条对应的英文数据。使得同时能够识别中英文偏好。
- PPO数据:从hh-rlhf划分出来的2万条prompt数据,作为ppo训练时候的环境交互数据。
训练过程
SFT阶段
只计算response部分的loss, 基础模型选用的Baichuan7B. 学习率设置1e-5, weight_decay设置0.001,训练了3个epoch. 训练阶段loss曲线如下,使用fp16混合精度训练。
RM奖励模型阶段
基于hh-rlhf数据训练,在训练的几次试验中,发现模型基本在2个epoch就收敛了,所以这里epoch一般设置在3个epoch以内就够了。学习率也使用的是1e-5.训练的loss,以及验证集结果如下:
验证集准确率0.7和llama2里面提到的结果很接近。 值得注意的llama2使用的是70B奖励模型,在rlhf数据上面的准确率并没有明显好于我们7B训练的奖励模型,这一点值得思考。
PPO阶段
ppo相关的推导以及细节在专栏里面ppo介绍的文章已经专门讲过了,这里讲一下实践过程中的Trick,由于强化学习存在训练不稳定的情况在使用PPO训练的时候一般会加上pretrain任务或者SFT任务做多任务学习防止ppo阶段训练过程导致模型过度优化失去了SFT阶段学习到的指令对话能力,比如instruct gpt论文里面提到的ppo-ptx算法,就是ppo训练阶段加上pretrain任务一起做多任务训练。同时为了保证在rollout时候采样生成的轨迹多样性这里的temperature设置的是1.0, actor模型的学习率设置的是1e-5,ppo-clip里面的clip_range_ratio设置的0.2。
在PPO训练过程中一般我们关注的是actor模型的reward 是不是持续上升的趋势。
效果分析
SFT模型表现
先分析SFT模型,使用一些harm的句子去诱导模型输出有害的回答时候,能观察到SFT模型有一部分比例的拒绝回答这些有害的指令,这应该是SFT使用alpaca-gpt4数据里面包含了一些攻击性指令,从数据里面学习到了。
PPO模型表现
在经过ppo优化过后的actor模型,在helpful和harmless上面表现出了明显的提升。 对于有害的指令会直接的拒绝,并且准确率提升明显。
对比PPO与SFT模型
从hh-rlhf测试集里面分别从helpful 和harmless 随机采样了50个样本,进行效果评测。
在helpfulness data 上面 50个测评样本里面人工评测二者效果打平的样本是28个,ppo更好的16个, SFT更好的6个。
具体的case,ppo过后的模型在更多的情况下表现的比SFT模型回答的更加细致,能够给出更全面更直接的回复。
在harmless data上面,PPO好于SFT模型表现的更加明显。尽快SFT模型已经具备了一定的拒绝回答有害指令的能力。在50个测试样本里面22个打平,23个PPO表现的更好,5个SFT模型表现的更好。
总结
笔者基于翻译的hh-rlhf数据集上面,跑完了SFT-RM-PPO 的流程,总结了PPO训练中需要注意的一些问题,并且在测试集上面分别从helpful和harmless两个维度对比了PPO优化的模型和SFT模型的效果,在这两个维度上面PPO模型都明显好于SFT的模型,并且在 harmless维度上面表现的更为明显。 后续还会基于该数据对DPO算法进行验证,对比DPO和PPO的效果。
请多多关注知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。PS:交流2群已经成立,欢迎加入。
往期推荐: