大模型训练的一些坑点和判断
在没有完全复现chatgpt之前,这些东西都是包大人根据公开资料和实践经验收敛出来的判断,仅供参考,所有的论断都有可能被新技术推翻。
1.冷启动可能是一个很重要的东西。
大模型的训练过程就是一步一步从全网数据得到的语言模型逐渐逼近接近人的语言习惯。
pretraining是给SFT冷启动,SFT是给RL冷启动。
在每一个独立环节里,冷启动的也是需要的,比如LLama2里面提到了一个SFT的bootstrap的方法,RL中的迭代式和拒绝采样的方法。
pretraining让大模型具有基本的知识储备和语言模型的泛化,这样给SFT一个很好的初始化,降低SFT阶段的数据消耗,让他初步对齐人的习惯。
SFT更像是给RL阶段的采样一个冷启动的能力,防止采样到的东西超出了RM的判别能力圈,让他尽量的接近RM限定的好的和坏的的范围之内。
但是SFT的数据构造成本是很高的,比如国内有扒gpt数据,想去通过SFT蒸馏gpt的能力,这个思路挺符合直觉,如果没有很好的人力物力的话,也不失为一种方法。
SFT相比RL训练过程,其达到的泛化能力上限是比较差的,因为数据总有尽头,高质量的数据更是难上加难,直接的训练更像是方向上的指引,SFT阶段的冷启动可能也是必要的。
最后在RL阶段,把无限的数据生成交给采样的过程,把判别好坏的过程交给RM。这个过程中,LLM和RM的能力需要同步匹配进化,防止LLM太强之后,RM丧失判断力,这就是我们看到的llama2迭代式更新。
2.RM的水很深
RL的过程大家的目的性很明确,像经典的PPO的思路就很符合直觉,解决的问题关键就是RL用在LLM的稳定性上的问题。
稳定性算是有一些明确的技术导向的东西,比如学习过程中加入“正常的参考”,防止学习的过程太激进等,让他尽量保持较好LLM的能力,而不是单纯拟合高分。
但在RM这里,却有很多深坑,有一种叫做reward hacking的现象,经常出现。
LLM的策略空间太开放了,不像RL打游戏,只有上上下下AABB几个键的组合。
LLM的词表下选哪个词,词组成什么序列,都是一个策略。
开放的决策对于模拟打分环境来说难度太大了,对RM的泛化程度有极其高的要求。
假设一个场景,如果你的LLM有badcase,你想把所有已知的badcase在RM中设置为差,随便标点数据的正常的话设置为好。
然后把判别badcase的rm用来做强化学习,妄图消灭所有的badcase,这个很符合直觉的思路有巨大的坑。
你会发现你的RL最终学习到的是一种未知的高分模式,在你badcase之外又找到了另外一种badcase当成了高分。
就像蚂蚁在白纸上走路,四周都是大坑,只有一小块地安全,他随机游走,你不停地在他经过的不好的方向上打X。
结果发现不好的方向无穷尽,根本打不完。
最终大概率你的模型学习到了输出一堆没什么用的东西,但是RM分数很高。
这就是reward hacking。
如果你不在本质上提升RM全知全能的打分能力,仅仅靠加大KL散度惩罚,value裁剪等方式,都是缓解问题的发生而不是根本解决。
最后一头包。。
这个在LLama2的论文的过程中有所体现,meta团队很重注保持RM的能力,当发现RM丧失判断力的时候,及时更新迭代它。
防止让RL鼓励出一些奇奇怪怪的东西。
RM的能力除了体现在泛化性,也体现在区分度上,所以我们看到了meta把人脸里面的margin搬过来了。。
3.效率与效果的权衡
除了硬件和流水线上的优化,样本的构造,learning的过程中有很多这样的优化点。
比如之前提到的多轮对话的构造trick大模型微调样本构造的trick,这就是能极大提高学习效率的方法,我们在LLama2中也看到了同样思路的操作。
不过llama做的更离谱和激进一些,把不同session也搞到一起了。通过的special token让模区分开,这个细节要确认下。
这里认为有一种特殊的结束符分割了不同的session,普通结束符号类似<eos>分割轮次。
除了在数据构造上,learning的过程中,也有一些效率和效果的权衡,像DPO这种方法,可以省掉PPO采样的时间。
DPO在对齐的时候,把RM和采样的压力,转化为标注数据的压力。
这样的方法也可以提高训练效率,不过在对齐阶段,追求数据的绝对的量似乎太困难了,大家基本都用了相对数据比较少的质量高数据,通过已有LLM的基础得到的RM来训练。
DPO这种方法似乎走了反方向,需要你你充足够多的钱,标足够多的数据,效果能否达到PPO的天花板有待考证。
效率和效果永远是个权衡,LLama2在最后一个阶段就选取了牺牲效率获取质量,使用了拒绝采样的方法,防止 RL过程中学习到一些未知的惊喜。
这个多次采样选一个基本把资源的消耗提升了采样次数的倍数。
整体看起来,越靠近pipelin的后面,越要关注质量,当然越靠近后面的实际上在整体中的资源耗费是比较小的,所以可以相对牺牲一些效率。
这样看起来DPO就不是很科学了,反而拒绝采样是一个相对合理的解法。
4.大模型评估很关键,水很深。
这个前面写过大模型评测,也太难了吧,和大模型训练太难了!里面总结过一些原因,其中关键的观点就是评估做不好的话,会影响实验效率,实验效率可以折算成单位时间的算力消耗,
可以推导出评估做不好 = 费钱费时。
所以你做实验慢了,相当于比别人少了GPU,足够触目惊心吧。
openai不仅仅卡多,还有实验效率倍增的buff,相当于 卡 * 效率倍数。
至今也没有一个公开的特别靠谱的自动化评估方
5.下游微调的水很深。
大家都想着的是我通过标一些领域数据,然后在领域数据上进行SFT和对齐,使它用于领域额外的能力。
这里我们分两种情况,如果你把他当成一个场景单一模型的话,当成bert T5这么用的话还好。
如果你想着让他保持原有大模型的能力,再嵌入一些额外的知识,这里难度是非常大的。
实践发现你就会完全不是那么回事,基本上就是捡了芝麻丢了西瓜,除非你你只在乎捡芝麻这一件事。
试过就发现要只用领域数据非常容易过拟合到领域数据上,对OOD的处理会表现的非常差。
如果想保持原有的能力的话,对各个环节的数据配比要求会很高,最好是在原来规模程度的数据上,增加额外的场景数据,重新走部分流程。
但是困难的是,原有数据保持分布的采样,你拿到的模型是个黑盒,别人并没有给你原始的数据分布,更何况海涉及到了惊细的清洗。
所以最终的领域大模型,也几乎只是一个丧失了通用能力,基础能力的领域生成模型。
至于你想让他在某一个方向加深能力,并且保持原有的能力不下降,整体要付出的成本不下于重新塑造一个通用大模型。
相关文章
其他精彩文章翻阅公众号历史文章
包包算法笔记是包大人在班车通勤上,进行知识,职业,经验分享的地方。最白的话讲专业的知识。
回复“刷题”获取高效刷题经验,回复“面试”获取算法校招面试宝典。
想进讨论群的同学,加微信号logits,备注进群