Files
wehub-resource-sync a203934033
Lint test / lint (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:34:58 +08:00

93 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# REINFORCE Leave-One-Out (RLOO)
[REINFORCE Leave-One-Out (RLOO)](https://arxiv.org/abs/2402.14740) 基于经典的 REINFORCE 策略梯度方法,通过留一法(Leave-One-Out)构造无偏的优势函数基线。
## 算法原理
为便于理解,我们基于 GRPOGroup 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参数)一致