RLHF
最后更新于
最后更新于
正式将RLHF算法应用到微调语言模型;
RLHF中包含两个重要的模型需要训练,reward模型和policy模型。
奖励模型的训练与RLHF中的基本一致,基于交叉熵损失函数拟合人类偏好(人类偏好是n选1,文中设置是4选1):
奖励模型的输入是prompt与respond的拼接,输出是一个值score。
策略模型由语言模型搭建,主任务头(actor)负责文本输出(即最终要用的智能体);
辅助任务头(critic)负责估算价值。
首先使用actor进行采样(即强化学习中的episode),假设有M个prompt,每个prompt后采样长度为N的tolen(即执行N次动作),于是能够得到如下三个张量信息:
response:M个字符串,包含N个token;
old_log_probs:一个(M,N)形状的张量,记录了第M条回复的第N个token生成时actor给出的概率值的对数;
old_values:一个(M,N)形状的张量,记录的是第M条回复加上N个token时,此状态下的状态价值,由critic模型给出。
当采样阶段完毕后,手头具备了数条episode,进入反馈阶段计算奖励值。
奖励值在强化学习中指基于当前环境,智能体作出动作后,环境返还的一个奖励值,在llm场景中,智能体就是actor,动作就是输出的下一个token,因此需要为每一个动作返还一个奖励值,奖励函数的整体公式如下:
下面概述每一项的来源:
old_log_prob是采样过程中记录的actor输出每个token时的对数概率;
ref_log_prob是ref model在同样的上文环境中输出该token的对数概率(ref model指最初的语言模型,经过RLHF前最初的语言模型);
score是reward model根据prompt与response给出的偏好分数。
理解:
ref_log_prob是主体,其定义了actor“循规蹈矩”的程度,即输出token j(执行动作j)这个事情,ref model本身给出的概率是比较大的,说明该动作是得到ref model支持的,相应的也应当给予较大的奖励值;
old_log_prob是正则化项,即当actor执行此动作(输出此token)的概率值已经够大了,就把其奖励值适当调小,以保证概率分布有更多的多样性;
只有j=N时奖励值才包含了reward model输出的score值。(直觉上是,在得到奖励模型的认可之前,只需要循规蹈矩得到ref model模型的认可即可)。
至此,每个prompt后执行的每个动作(输出token)的奖励值的计算完成,总结一下:
prompt与完整的response一起给到reward model得到score(代表人类偏好);
prompt与response一起给到ref model,但是此时response被拆成一个一个token,用于测试产生此token时ref model给出的概率,得到ref_log_prob这个张量;
结合old_log_prob就能为每个token(动作)计算其奖励值reward。
拿到反馈后,就可以根据学习以更新policy model的参数了,注意policy model包含了actor与critic,因此这两部分有各自的损失函数。
小tips:critic模型实际上估算的是状态价值,因为模型输出token j 时,其输入是不包含token j的,即critic模型估算value时是不知道actor输出的动作token j的,即critic的输入是state因此认为其估算的是state value即状态价值,而不是动作价值。
所以critic的真值也很好确定,就是基于奖励函数算出来的状态价值:
注意k是从j开始算的,所以是状态价值,
于是critic的训练目标也很清晰了:
其核心是ppo的观念,强化优势动作
优势的计算:
损失函数:
理解:
当该动作有优势时,增大其概率log_prob以减小损失函数;
当该动作无优势时,减小其概率以减小损失函数;
old_log_prob是采样时的统计结果,用于充当正则化项,即如果该动作的概率已经足够大了,让其在损失中的占比小一点,如果该动作的概率比较小,就让它在损失中的占比大一点。