感性地说,我在同花顺训问财 agent 的时候,sft 后的模型经常有回答逻辑乱串在一起的问题。比如“评价基金”和“评价基金经理”,“评价基金”的规划需要调用金融数据查询和搜索工具,回答有比较长的逻辑推理和回复;而“评价基金经理”需要调用百科知识和搜索,回答偏总结向。只做sft 的话经常出现“评价基金”调了百科知识工具,回答又偏总结,不给分析;或是“评价基金经理”调用金融查询乱找数据,回答里开始推理分析。用上 RLHF 之后一切问题消失了,很好地完成业务,对问句级的泛化性也有保证。当然 RLHF 也不是银弹,没强化过的地方还是有些问题,比如两个工具的描述十分接近,而 RLHF 数据里又缺少这两种工具的正负反馈,模型最后还是会混用这两种工具。
<aside> 🎨
评价基金经理 问句:评价一下xxx 背景:{“xxx”: ”基金经理”} 规划:这是一个评价问题,xxx是基金经理,我需要使用百科工具查询xxx的人物信息进行回答。动作:{”百科工具”:”xxx”} 回答:xxx毕业于…[业绩等]
评价基金 问句:评价一下xxx基金 背景:{“xxx”: ”基金”} 规划:这是一个评价问题,xxx是基金名称,我需要使用金融查询工具查询xxx的金融信息,使用搜索工具查询和该基金相关的新闻,最后总结进行回答。动作:{”金融查询”:”xxx”,“搜索”:”xxx”} 回答:xxx是由yyy基金公司….[基本介绍、金融数据等]
</aside>
RLHF 最核心的应该是 reward model。刚起步阶段可以让人来提供 feedback,或者手动构建一些 feedback,本质上都是人当reward model。但是数据积累到一定阶段,必须总结业务,训 reward model,让模型提供反馈,这里可以用人来监督反馈是否正确。用人直接提供 feedback 是无法 scale up的,人的学习能力很差,而且写很长的 feedback 成本非常高。现阶段模型提供 feedback 已经比较成熟了,定义良好的 reward 是远比人好用的。
总的来说,RLHF 相比于 SFT 的必要性如下:
sft 无法提供负反馈
sft 的训练过程,是一个让模型学习条件概率的过程,Prob( E | ABCD )。这也就是说,模型在训练和学习过程中,只知道 next_token 出什么是正确的,而不知道 next_token 出什么是错误的。这也间接解释了另外一个现象:为什么 sft 的数据多样性很重要。因为没办法, 我们无法直接让模型知道错误的 token 是什么,但只要我们把正确的 token 都喂给它学习,孤立那个错误的 token,似乎也能起到类似的效果。可以这么认为,sft 一直在通过“孤立”来降低错误 token 的出现概率。
这就相当于模型没有“错题本”,只会知道正确,而没探索过错误。甚至你越是在 sft 阶段告诉它什么是错误的,它越是容易提高错误 token 的概率。类似“1+1=3,这是错的”,模型一定会学习到“1+1=”下一个 token 是“3”
sft 不具有“向后看”的能力
在 sft 的训练过程中,每一个 token 都只看得见前面的 token。缺少reward会导致模型 greedy decode的时候只能给出当下概率最高的 token,而句子的局部可能是不正确的。但是有了reward 之后,模型会降低对错误的 token 对权重,而更关注“这是错的”,使得“1+1=”后面最大的概率还是“2”,如果你手动拼接“3”到“1+1=”后面,模型就以更大概率输出“这是错的” 。
本质上,sft 的 loss 是平均 loss, rlhf 的 loss 是加权 loss,这个权重从 reward model 和 critic_model 来。
Why reward models are key for alignment - by Nathan Lambert (interconnects.ai)
Reward: 1.344 | Substring: I
Reward: 1.152 | Substring: I love
Reward: 2.174 | Substring: I love to
Reward: -0.385 | Substring: I love to walk
Reward: 0.176 | Substring: I love to walk the
Reward: 2.305 | Substring: I love to walk the dog
Reward: 1.619 | Substring: I love to walk the dog,
Reward: -0.201 | Substring: I love to walk the dog, what
Reward: 1.255 | Substring: I love to walk the dog, what do
Reward: 2.377 | Substring: I love to walk the dog, what do you
Reward: 1.179 | Substring: I love to walk the dog, what do you like
Reward: 1.298 | Substring: I love to walk the dog, what do you like?