0. 前言
本系列主要是对 LLM(Large Language Models) 中涉及到的一些训练方法、技术进行学习.
本篇博客主要对 RLHF(Reinforcement learning from human feedback) 、 PPO (Proximal policy optimization) 、DPO(Direct Preference Optimization) 这 3 个方法以及相应的伪代码进行学习.
内容主要参考 YouTube 上的 Umar Jamil 老师的课程(点击跳转); 老师讲的很不错, 很直观, 建议 follow 学习.
阅读前, 需要你 : 有高数基础知识, 线代基础知识, 统计学习基础知识, 当然还要有 ML 和 DL 的知识背景.
1. PPO
PPO(Proximal policy optimization) 这个方法在之前的 blog 中已经有所介绍, 具体可移步至 Deep-Reinforcement-Learning. 以下仅进行简要回顾.
1.1 PPO 目标
首先回顾 PPO 的目标:

接着, 计算梯度:

在原始的梯度估计公式中,由于过去的回报与当前动作无关,它们在梯度估计中引入了噪声。这种噪声会导致梯度的方差增加,因为过去的回报对当前动作的梯度更新没有提供有用的信息。
引入“Rewards to go”, 每个时间步的梯度更新只依赖于从当前时间步开始的未来回报。这样做的结果是:
-
减少了无关的噪声(过去的回报)。
-
使梯度估计更加专注于当前动作对未来结果的影响。(即让 model 向更加清晰的梯度方向走)

引入 baseline 进一步缓解: 思路是, 找一个 value function 判断当前 state 的情况, 如果不好, 则打一个低分, 反之打高分, 牵引梯度向正确方向, 从而减少 variance.

同时, 使用 Q function 代替奖励得分, 可得到如下的表达形式:


1.2 PPO 提效
在计算 advantage term 的时候, 我们可以多向后看几步, 进而能够一定程度减少 bias (因为拿到了更多的真实奖励), 但一定程度上又增加了 variance (因为每次采取 action 具有不确定性, step 越多, 波动性越大).
我们可以对这些 term 进行加权, 得到迭代公式(注意:是反着迭代):

另外, 在计算梯度的时候, 每个 trajectory 只使用了一次(online-policy), 容易造成资源浪费, 因此引入 Importance sampling 和 offline-policy, 如下:


从而得到 PPO 的 loss function:

1.3 Reward 模型训练
由于语言模型的输出, 比较难做到量化打分, 反而容易做比较. 比如 a = “今天的天气真不错” 和 b = “今天的天气挺好的”, 这 2 个句子很难说它们的分数是多少: 75 分 or 78 分 ? 但是从语感上、拟人化上, 看起来 “今天的天气挺好的” 更加的拟人化一些, 即应该有 R(b) > R(a).
因此, 只需要找一个 loss, 能够评估 reward model 的排序能力即可. 二元对比损失(Pairwise Ranking Loss)即满足条件.
将“优质回答优于劣质回答”的概率 建模为 Bradley-Terry 模型, 然后转换为 loss function 即可:

1.4 怎么实现
- Trajectory
在使用 transformer 模型获取 trajectory 的时候, 对儿如下:

- Log prob of policy

注意: 这里还需要使用 offline-policy 同样计算一次相应的 log probability.
- Reward
直接在 transformer 模型额外加一层输出当前 的 reward:

- V(s)
同理, 额外加一层进行计算即可.

- Advantage term
Advantage term 的计算方式
- Reward Hacking
防止大模型在训练过程中”偷鸡”只输出我们想看的内容(丢失多样性), 可以让训练后的模型和未训练的模型输出计算 KL 散度.

2. RLHF
RLHF(Reinforcement learning from human feedback) 可以使用以下图片概括:

- 首先构造 样本输入(比如一些问题、句子的前半句、半句诗等等), 然后招一批 labeler 对这些问题进行解答, 当然也可以直接找网络上的答案, 总之就是给出相应的结果,得到 (input , output)
- 使用上边得到的 (input , output) 对儿, 对 LLM 进行 supervised fine-tune, 使得 LLM 对结果输出像个样子.(起码输出正常的文字, 而不是乱输出标点符号)
- 给一些 prompt, 使用 fine-tuned LLM 产生大量的答案, 然后人工(human feedback) 给这些答案排序 , 然后使用 (prompt, ans1, ans2,..) 训练 Reward model.
- 使用刚刚训练好的 Reward model 结合 PPO 算法对 LLM 进行更新.
3. DPO
3.1 LLM 目标
LLM 本质想做的事情, 就是想让输出的结果, 有一个高分而已(假设我们有一个很好的 Reward model). 即如下 object

为什么不直接对上边的 进行梯度下降? 因为不能, 上边的输出 不是作为一个整体输出的, 而是一个字一个字蹦出来的, 每个字的选择有很多方案, 比如 greddy, beam search ,top-K 等等, 这个 sampling 的过程不是 differentiable 的. 因此只能使用 PPO 这样的方法: 拆解到每个 step, 虽然每个字的选择方案可能不同, 但是这个字的 prob 是已知的, PPO 只需要获取被选择的 prob of step 就能进行优化.
那有没有一种可能, 通过构造一个直接与 Reward 相关的 loss 去优化模型 LLM ? 答案是有的, 我们在 1.3 节 训练 Reward 模型时使用的二元对比损失(Pairwise Ranking Loss)就可以帮助我们直接优化 LLM.
因为 reward (x,y) 本身就是把 LLM 的输出 放到一个奖励模型中打分, 是与 LLM 的输出有关的. 如果直接用这个损失函数计算梯度, 然后反馈到 LLM 上, 岂不美哉?
3.2 ADVANTAGE-WEIGHTED REGRESSION
问题是怎么把 Reward loss 直接反馈到 LLM 上呢? 首先来看一个方法 advantage-weighted regression 算法. (点击跳转 paper)
这个算法给出满足 时, policy 的解析形式(见 Paper 附录), 这里简要回顾和解释.
Paper 首先回顾最原始的目标, 希望训练一个 能够 以下式子:
其中, 是指随机 sampling 一个 policy, 的定义如下, 最终期望训练得到的 能够有最大的 improvement reward:

(*)式可以得到如下等价表达方式, 从而转换为我们常见的 RL 表达形式:

此外, 上述表达形式还可以写作如下等价形式:

其中, 表达式如下:

但是 和 耦合, 并且 在实时更新, 因此直接优化式(25)比较困难, 但是 是固定的, 因此做一个替代优化:

进而得到以下 constrained policy search problem:

由于, 式(28)是所有的 state 下, 因此考虑替换为期望 + 软约束(with coefficient ) :

使用 Lagrange multipliers 法求解 :

3.3 DPO 求解
的格式和式(30)的区别就是把 换成 , 于是相应的解析解形式为:

现在应该怎么做? 回想 3.1 节的内容(点击跳转), 现在是时候往二元对比损失(Pairwise Ranking Loss)上靠了:

Note: DPO 是跳过 “训练奖励模型” 这个 step , 但是仍然需要人工首先收集一批 label 进行前置性的排序.
3.4 实际操作
