RLHF

参考文献

Papers

  1. Trust Region Policy Optimization

  2. Proximal Policy Optimization Algorithms

从传统的策略方法开始

基于策略的强化学习用参数化概率分布 代替了基于值函数的强化学习中的确定性策略 ,在返回的动作概率列表中对不同的动作进行抽样选择

目标函数——最大化reward:

其中 是 agent 与环境交互产生的状态-动作轨迹 ,该策略涵盖所有可能情况

其中,特定的轨迹 在策略 下发生的概率定义为:

  • 策略 :在状态 下,agent有多大概率选择行为
  • 状态转移概率 :在状态下,进行行为后,环境有多大的概率转移到状态

进行求导:

由蒙特卡洛方法来近似梯度,采样个轨迹样本,其中,那么:

最后,有参数更新公式:

因此,有算法:

image

一些进一步的设计

回合制奖励

若是可以简化奖励形式为回合制,则有通用简化形式:

未来总奖励

定义为未来总奖励,即从第 个步骤开始,直到回合结束能获得的所有奖励之和

如果我们考虑因果关系,那么第 时刻做的动作 只能影响未来的奖励,不能影响过去已经拿到的奖励,因此,用 代替整条轨迹的 能让梯度的指向更加精准

则有:

其中,通过倒序计算的方式计算,来提高计算效率

自然策略梯度算法

传统梯度下降算法:

其局限性:

  • 参数 的小幅度变化会导致策略 的小幅度变化,但是这个前提是处在欧氏空间,往往并不处于欧氏空间中
  • 所以参数 的小幅度变化很可能会导致策略 的剧变
  • 在强化学习中,对于这个事情非常敏感,若是更新错过了奖励峰值并落入了次优策略区域,那么未来的样本批次可能不会提供太多有意义的信息,导致模型陷入了糟糕的正反馈中从而崩溃
  • 适当调小或许可以缓解这个问题,但是的设定非常困难,且过小会导致更新收敛极其缓慢

所以,一个很直觉的事情是,我们需要在限制策略变化量的条件下,最大化奖励

对于,因为:

所以目标转换为:

对于限制条件, 将其定义为, 由于, 我们将其在附近泰勒展开得:

对这个泰勒展开式进行计算:

将其求一阶导得:

进行代入:

由于为一个概率分布,那么:

将其求二阶导得:

得:

进行变形得:

使用Fisher矩阵可以大大减少计算量

所以,原式变为:

那么原优化问题就转化为:

由拉格朗日乘子法,构造拉格朗日函数:

求导并令其为 0:

解得最优更新方向为:

, 带回解出:

所以:

其中,,计算方法可以参照传统策略方法

更新规则替换为:

TRPO (Trust region policy optimization)

自然策略梯度算法仍然有以下的问题:

  • 步长难以进行确定
  • Fisher矩阵的计算成本过高

TRPO 试图寻找一个步长,确保每次更新后的表现一定比之前好

所以,我们尝试采用原策略预期回报添加新策略预期优势的方式来度量更新前后的表现差异

其中,优势函数定义为:, 描述在状态下,动作相对于平均水平的吸引力,优势函数有如下几层含义:

  • 降低方差使得梯度的方向更加稳定
  • 解决“全正奖励”问题,从而做到抑制低于平均水平的动作,而不只是抑制负奖励动作

引入状态的折扣分布,,则原式可以变为:

引入近似误差,使用当前策略近似更新策略:

进行重要性采样:

  • :从旧的经验池里取数据
  • :重要性权重,衡量了“如果用新策略代替旧策略,这个动作出现的可能性变大了还是变小了”
  • :优势函数,衡量这个动作相对于平均水平是好还是坏,其中前一项是Q-Function,而后一项是通过引入一个价值模型评估当前状态的价值

则定义替代优势为:

是在忽略状态分布变化的前提下得到的近似值,真实的性能改进 实际上取决于新策略的状态分布

单调改进定理

定义两者之间的误差项:

误差可以写为:

第一项

由折扣分布:

写成矩阵形式为:

  • 是初始状态分布
  • 是状态转移矩阵,其元素

求和得:

所以有:

对等式两边取范数:

对于:

利用 以及 TV 距离的性质,可以得出算子范数限制:

对于:

所以有:

第二项

注意到在旧策略下,优势函数的期望为零,即

那么第二项可以改写为:

,则:

则总的式子:

其中,,

为了方便优化,我们将总变差距离 转换为 KL 散度,根据 Pinsker 不等式:

所以有:

那么:

所以,我们得到定理:

现在,我们可以找到一个下界函数

只要我们能找到一个新策略,使得 ,那么真实性能就一定会提升

所以说,这是一个理论保证,保证了模型理论提升的下界,并且可以将其用于“改进检查”,至于具体的算法,仍然使用自然梯度法,只是有所改进

自然梯度法改进

优化问题为:

解得:

其中,

更新规则为:

改进1: 共轭梯度法

的计算 是工程上的最大瓶颈,直接求解的复杂度是

观察到,我们要算的都是,所以我们引入共轭梯度法,尝试在不显式计算、不存储 的情况下,直接算出方向向量 ,那么问题就归结为了通过数值算法求解的解

具体算法如下:

  • 初始化: , 残差 , 搜索方向

  • 循环:

    • 计算
    • 计算步长
    • 更新解:
    • 更新残差:
    • 更新搜索方向:

如此方法,经过有限常数次之后即可收敛

算法的改进

,则:

对于,由多元微积分性质可以得到:

这样第一步可以计算:

第二步可以计算:

这样的话,这个部分的时间复杂度就从降低为

综上来说,时间复杂度从降为了,其中,为算法的迭代次数

改进2:回溯线性搜索

从最大步长 开始

不断尝试减小步长 (其中

  • 检查条件1——性能提升:

  • 检查条件2——约束满足:

一旦满足条件,立即更新

PPO (Proximal Policy Optimization)

TRPO在计算上尽管已经实现了一定的优化,但是TRPO仍然过于复杂,且兼容性差

所以我们希望避免复杂的二阶计算方式,通过一阶计算(约束)来模拟实现类似的“信任区域”的效果

首先,对于TRPO来讲,有一个根本上的优化目标:

:新旧策略的概率比率,衡量了在参数更新后,同一个动作被选中的概率变化了多少

(Conservative Policy Iteration Objective):保守策略迭代目标,如果不加约束地最大化它,会导致策略更新步长过大,从而破坏训练稳定性

PPO角度1:自适应 KL 散度惩罚系数(Adaptive KL Penalty Coefficient)

利用多轮小批量随机梯度下降,优化如下带 KL 惩罚的目标函数:

计算实际 KL 散度:计算

自适应调整

  • 如果 ,则减小惩罚:
  • 如果 ,则加大惩罚:

更新后的 将用于下一次策略更新,其中是一个超参数

PPO角度2: 剪切目标函数 (Clipped Objective)

  • 公式 通过将比率限制在 之间,移除了当比率超出该区间时继续优化目标的动力
  • 只有在概率比率的变化会让目标函数变好(增加收益)时才忽略多余的变动,而当变动让目标变差时,我们依然会保留这些变化

image

  • 优势为正 ():目标函数在 时进入平台期,防止策略过度偏向某些动作
  • 优势为负 ():目标函数在 时进入平台期,防止策略因过度惩罚某些动作而崩溃

实际算法

结合上面的讨论,我们得到了如下的目标函数:

其中:

  • 是超参数
  • 表示熵奖励(鼓励探索)
  • 是均方误差损失 的产生方式大概有如下两种:
    • Rewards-to-go:计算从 时刻开始到序列结束的所有折扣奖励总和,
    • TD 目标:结合当前的优势估计,

具体实现而言:

运行策略 个时间步,并使用收集到的样本进行更新

将这一选择进行推广,我们可以使用广义优势估计:

其中 ,当时,退化为上式

具体算法如下:

image

PPO算法是典型的Actor-Critic Style架构,需要训练一个策略网络,一个估值网络

RLHF:传统PPO算法在LLM中的具体应用形式

SFT

在下游任务上,用高质量数据集使用监督学习微调预训练好的大模型,由此获得模型

奖励建模阶段

使用 SFT 模型 对提示词 生成两份回答 ,然后由人工标注者对这两个回答进行偏好排序

为胜出的回答,为落选的回答,记作:

假设人类的这种偏好背后隐藏着一个潜藏奖励模型

引入 Bradley-Terry (BT) 模型,人类认为 优于 的概率分布 为:

假设有一组标注数据,根据 BT 模型,这些结果的似然函数为:

由最大似然估计:

训练后,为了确保奖励信号的稳定性,常常对奖励值进行归一化处理,使得奖励总期望为0:

在大模型当中,具体实现过程也有一定的特点:

  • 初始化:直接复用 SFT 模型的参数作为起点
  • 改动:移除原有的输出层,在 Transformer 的最后一层之上添加一个 线性投影层
  • 输出: 最终输出一个标量值代表得分

RL微调阶段

四个组件:

模型 记号 是否训练 核心作用
Actor (策略模型) 生成回答,被 PPO 更新
Reference 约束 Actor 模型
Reward Model 给完整回答打分
Critic (估值模型) 估计期望回报,降低方差

计算流程

  1. Actor模型进行采样

先给定 prompt , Actor 采样一个回答序列:
同时,记录一下每一个token的对数概率:

  1. Reference模型计算 KL 约束项

Reference模型是一个冻结的SFT后的模型:

KL惩罚如下:

  1. Reward模型给最后的、针对于完整回答的奖励:

  1. 在token-level上构造reward:

训练目标

Actor模型的训练目标

对于估值模型来说,我们希望它能够做到如此预测:

那么就有优势函数:

根据传统的PPO Objective:

其中,

那么Actor模型的训练目标就变为:

Critic模型的训练目标

自然地,估值网络的训练目标变为:

估值网络的存在价值

若是不是估值网络,其梯度公式则变为:

从理论上来说,这是完全正确的

但是在 LLM + RLHF 场景下:

  • 序列极长:
  • 奖励稀疏: 真正的奖励几乎只出现在最后一步
  • 惩罚耦合: KL 散度惩罚项强烈耦合整个序列

这导致 极大,模型难以收敛;直观上讲,这样的话,每一个token都会背上同样的“终局”奖励,但是实际上,有的token很有用,有的token很没用,优化因此变得极其困难

所以,我们引入一个只与状态有关,与动作无关的基准值,其期望值为0:

因此梯度改写为:

显然,使得方差最小的值是:

这正是价值函数希望学得的