强化学习基础:强化学习分类,强化学习表示,值函数,策略迭代/值迭代, 主要的强化学习技术(蒙特卡洛学习/时间差分学习,DQN.REINFORCE,策略梯度/PPO/AC/A2C/TRPO)
强化学习策略更新方法on-policy与off-policy(重要性采样,q-Learning,sarsa)
需要LLM在训练过程中做生成的方法是 On Policy,其余的为Off Policy。
On Policy是包含了反馈机制,Off Policy不包含反馈机制。
若进行环境交互的模型与被更新的模型是相同的模型,通常这种更新策略被称为on-policy的策略。on-policy的方法会有一个问题,使用当前与环境交互的模型1得到的数据,不一定适合被用来更新得到模型2,并且需要每次更新都重新交互得到数据,十分的耗时。
而与之相对应的off-policy,通过使用其他Actor中与环境交互得到的数据来更新被训练的模型,也即进行环境交互的模型与被更新的模型是不同的模型。Off-policy的方式可以使用同一批采样数据多次更新模型。
on-policy: SARSA和REINFORCE算法,TRPO, PPO,GRPO
off-policy:Q-learning和DQN,DPO
一 PPO(Proximal Policy Optimization)
训练AC时需要与环境交互来采样很多轨迹,然后利用这些轨迹训练Actor和Critic;然而,这一过程是十分费时的,这可能导致我们无法高效的采集大量数据,进而充分的训练模型。因此,我们考虑是否能将已有的轨迹数据复用以提高训练效率。
这一思路将我们指向了off-policy RL的道路。具体而言,我们希望有两个策略网络π1和π2,其中π1不断与环境交互收集数据,这些数据可以重复使用以训练π2的参数。
有了这些铺垫,我们终于得到了一个可以高效训练的RL算法:Proximal Policy Optimization(PPO),近期获得很大关注的InstructGPT、ChatGPT便在底层使用了PPO进行强化学习。PPO是一种对上述Off-policy RL目标的实现,分析其优化目标不难发现,它首先最大化原始优化目标A*π2/π1,其次又防止π2/π1偏离1太多,即控制了两个分布的差距。
1.1 训练步骤
- 收集人类反馈,人工标注数据
以summary任务为例,随机从数据集中抽取问题,对于每个问题,生成多个不同的回答
人工标注,判断哪个回答更符合人类期望,给出排名- 训练奖励模型(reward model, RM)
对多个排序结果,两两组合,形成多个训练数据对
奖励模型接受一对输入输出数据,给出评价:回答质量分数 (标量奖励,数值上表示人的偏好)
调节参数使得高质量回答的打分比低质量的打分要高。- 采用PPO强化学习,优化策略(Proximal Policy Optimization,近端策略优化)
从数据集中抽取问题,使用PPO模型(包括ref model、actor model)生成回答(即不需要人工标注),并利用第二阶段训练好的奖励模型打分
把奖励分数依次传递,由此产生策略梯度,通过强化学习的方式更新PPO模型参数,训练目标是使得生成的文本要在奖励模型上获得尽可能高的得分。
1.2 RM模型的训练
人工标注一些偏好数据(例如对于一个输入,我们让模型给出若干输出,并由标注人员对这些输出的好坏程度进行排序),并通过对比学习让RM最大化好输出与坏输出的分数差。
pairwise ranking loss:
RM 模型的目标是使得排序高的答案yw对应的标量分数要高于排序低的答案yl对应的标量分数,且越高越好,也就是使得损失函数中的rθ(x,yw)−rθ(x,yl)这个差值越大越好。’
将相减后的分数通过 sigmoid 函数,差值变成 - 1 到 1 之间,由于 sigmoid 函数是单调递增的函数,因此σ(rθ(x,yw)−rθ(x,yl))越大越好。越接近 1,表示yw比yl排序高,属于 1 这个分类,反正属于 - 1 这个分类,所以这里也可以看成是一个二分类问题。
奖励模型中每个问题对应的答案数量即K值为什么选 9 更合适,而不是选择 4 呢?
进行标注的时候,需要花很多时间去理解问题,但答案之间比较相近,假设 4 个答案进行排序要 30 秒时间,那么 9 个答案排序可能就 40 秒就够了。9 个答案与 4 个答案相比生成的问答对多了 5 倍,从效率上来看非常划算;
K=9时,每次计算 loss 都有 36 项rθ(x,y)需要计算,RM 模型的计算所花时间较多,但可以通过重复利用之前算过的值(也就是只需要计算 9 次即可),能节约很多时间。
奖励模型的损失函数为什么会比较答案的排序,而不是去对每一个答案的具体分数做一个回归?
每个人对问题的答案评分都不一样,无法使用一个统一的数值对每个答案进行打分。如果采用对答案具体得分回归的方式来训练模型,会造成很大的误差。但是,每个人对答案的好坏排序是基本一致的。通过排序的方式避免了人为的误差。
1.3 生成模型训练
“输入-生成模型输出-RM反馈”作为一个只有一步的轨迹(输入是s1,输出是a1,RM的反馈是奖励),并在这些轨迹上利用PPO进行强化学习。
训练过程中,policy model 会不断更新,为了不让它偏离SFT阶段的模型太远,OpenAI在训练过程中增加了KL离散度约束,保证模型在得到更好的结果同时不会跑偏,这是因为Comparison Data不是一个很大的数据集,不会包含全部的回答,对于任何给定的提示,都有许多可能的回答,其中绝大多数是 RM 以前从未见过的。对于许多未知(提示、响应)对,RM 可能会错误地给出极高或极低的分数。如果没有这个约束,模型可能会偏向那些得分极高的回答,它们可能不是好的回答。
RL 模型的优化目标是使得RL模型生成的文本在奖励模型中的得分越高越好,损失函数可以分为三个部分,打分部分、KL 散度部分以及预训练部分。
- 打分部分:将 RL 模型的问题数据集x,通过π_ϕRL模型得到答案y,然后再把这对(x,y)代入 RW 模型进行打分,即损失函数公式中的rθ(x,y)。该分数越高,代表模型生成的答案越好。
- KL 散度部分:在每次更新参数后,π_ϕRL会发生变化,x通过π_ϕRL生成的y也会发生变化,而rθ(x,y)奖励模型是根据π_SFT模型的数据训练而来。如果π_ϕRL和πSFT差的太多,则会导致rθ(x,y)的分数估算不准确。因此需要通过 KL 散度来计算,π_ϕRL生成的答案分布和πSFT生成的答案分布之间的距离,使得两个模型之间不要差的太远。损失函数公式中的log(π_ϕRL(y∣x)/πSFT(y∣x))就是在计算 KL 散度。由于 KL 散度是越小越好,而训练目标是损失函数越大越好,因此在前面需要加上一个负号。
- 预训练部分:预训练部分对应损失函数中的Ex∼Dpretra