93 lines
3.7 KiB
Markdown
93 lines
3.7 KiB
Markdown
# REINFORCE Leave-One-Out (RLOO)
|
||
|
||
[REINFORCE Leave-One-Out (RLOO)](https://arxiv.org/abs/2402.14740) 基于经典的 REINFORCE 策略梯度方法,通过留一法(Leave-One-Out)构造无偏的优势函数基线。
|
||
|
||
## 算法原理
|
||
|
||
为便于理解,我们基于 GRPO(Group Relative Policy Optimization)算法进行对比说明。
|
||
|
||
GRPO 和 RLOO 都采用组内对比的方式来估计优势函数,避免了全局基线估计带来的高方差问题。两者的核心区别主要体现在以下两个方面:
|
||
|
||
### 区别1:优势函数基线的构造方法
|
||
|
||
**1. GRPO (Group Relative Policy Optimization)**
|
||
|
||
GRPO 对每个 prompt 生成 $G$ 个响应样本,使用**组内所有样本的均值和标准差**进行标准化:
|
||
|
||
$$
|
||
\hat{A}_{i} = \frac{R_i - \text{mean}(\{R_j\}_{j=1}^G)}{\text{std}(\{R_j\}_{j=1}^G)}
|
||
$$
|
||
|
||
其中:
|
||
- $R_i$ 是第 $i$ 个样本的奖励值
|
||
- $\text{mean}(\{R_j\}_{j=1}^G) = \frac{1}{G}\sum_{j=1}^G R_j$ 是组内均值
|
||
- $\text{std}(\{R_j\}_{j=1}^G)$ 是组内标准差
|
||
|
||
**2. RLOO (REINFORCE Leave-One-Out)**
|
||
|
||
RLOO 对每个 prompt 生成 $K$ 个响应样本,使用 **留一法(Leave-One-Out)** 构造基线,即第 $i$ 个样本的基线为除自己外的其他 $K-1$ 个样本的均值:
|
||
|
||
$$
|
||
\hat{A}_{i} = R_i - \frac{1}{K-1}\sum_{j \neq i} R_j
|
||
$$
|
||
|
||
这个公式可以等价地改写为:
|
||
|
||
$$
|
||
\hat{A}_{i} = \frac{K}{K-1} \left(R_i - \bar{R}\right)
|
||
$$
|
||
|
||
其中 $\bar{R} = \frac{1}{K}\sum_{j=1}^K R_j$ 是组内所有样本的均值。
|
||
|
||
> **说明**:这里使用 $K$ 对齐论文符号,与 GRPO 中的 $G$ 含义一致,均对应配置参数 `num_generations`
|
||
|
||
**为什么使用留一法?**
|
||
|
||
留一法的关键优势在于**无偏性**。对于第 $i$ 个样本,其奖励 $R_i$ 和基线 $\frac{1}{K-1}\sum_{j \neq i} R_j$ 是独立的,因此优势估计是无偏的。相比之下,如果使用包含自身的均值作为基线,会引入偏差。
|
||
|
||
### 区别2:KL 散度正则化项的处理方式
|
||
|
||
为防止策略偏离参考策略过远,两种算法都引入了 KL 散度正则化,但处理方式不同:
|
||
|
||
**GRPO**:将 KL 散度作为独立的正则化项添加到[损失函数](../GetStarted/GRPO.md#算法原理)中:
|
||
|
||
$$
|
||
\mathcal{L}(\theta) = -\mathbb{E}\left[\hat{A}_i \log \pi_\theta(a_i|s_i)\right] + \beta \cdot \text{KL}(\pi_\theta || \pi_{\text{ref}})
|
||
$$
|
||
|
||
**RLOO**:将 KL 散度直接整合到奖励项中,构造修正后的奖励:
|
||
|
||
$$
|
||
R'_i = R_i - \beta \cdot \text{KL}(\pi_\theta || \pi_{\text{ref}})
|
||
$$
|
||
|
||
其中 $\beta$ 是 KL 散度的权重系数(对应参数 `beta`),$\pi_{\text{ref}}$ 是参考策略(通常是 SFT 模型或初始策略)。
|
||
|
||
## 参数设置
|
||
|
||
我们可以基于 `GRPOTrainer`,通过设置以下参数实现 RLOO 训练:
|
||
```bash
|
||
# 基本 RLOO 配置
|
||
--advantage_estimator rloo # 使用 RLOO 的留一法优势函数计算
|
||
--kl_in_reward true # 将 KL 散度项整合到奖励中(RLOO 默认方式)
|
||
```
|
||
|
||
训练可以参考该[脚本](https://github.com/modelscope/ms-swift/tree/main/examples/train/grpo/internal/rloo.sh)
|
||
|
||
### 重要参数说明
|
||
|
||
- **`--advantage_estimator`**:选择优势函数估计方法
|
||
- `grpo`(默认):使用组内均值和标准差进行标准化
|
||
- `rloo`:使用留一法(Leave-One-Out)构造基线
|
||
|
||
- **`--kl_in_reward`**:控制 KL 散度正则化项的处理位置
|
||
- `false`:KL 散度作为损失函数的独立正则化项(GRPO 方式)
|
||
- `true`:KL 散度直接从奖励中扣除,构造修正后的奖励(RLOO 方式)
|
||
|
||
- **`--num_generations`**:每个 prompt 生成的样本数量 $K$
|
||
|
||
- **`--beta`**:KL 散度正则化系数 $\beta$
|
||
- 控制策略更新的保守程度
|
||
|
||
其他参数与 [GRPO参数](../../Command-line-parameters.md#grpo参数)一致
|