🧩高级强化学习文档

在将 Unsloth 与 GRPO 一起使用时的高级文档设置。

关于使用 Unsloth 进行批处理、生成和训练参数的 GRPO 详细指南:

训练参数

  • beta (浮点,默认 0.0):KL 系数。

    • 0.0 ⇒ 未加载参考模型(更少内存,更快)。

    • 更高的 beta 将策略约束得更接近参考策略。

  • num_iterations (整数,默认 1):每个批次的 PPO 轮数(算法中的 μ)。 在每个梯度累积步骤内重放数据;例如, 2 = 每个累积步骤两次前向传播。

  • epsilon (浮点,默认 0.2):用于令牌级别对数概率比的裁剪值(典型比值范围 ≈ [-1.2, 1.2] 使用默认 ε)。

  • delta (浮点,可选):启用 上限 的裁剪界限用于 双向 GRPO 当设置时。如果 ,使用标准 GRPO 裁剪。建议 > 1 + ε 在启用时(根据 INTELLECT-2 报告)。

  • epsilon_high (浮点,可选):上界 epsilon;如果未设置,默认为 epsilon 。DAPO 建议 0.28.

  • importance_sampling_level (“token” | “sequence”,默认 "token"):

    • "token":原始逐令牌比值(每个令牌一个权重)。

    • "sequence":将逐令牌比值平均为单个序列级比值。 GSPO 显示在序列级奖励下序列级采样通常能提供更稳定的训练。

  • reward_weights (float 列表,可选):每个奖励一个权重。如果 ,则所有权重 = 1.0。

  • scale_rewards (字符串|布尔,默认 "group"):

    • True"group":按以下方式缩放 每组内的标准差 (组内单位方差)。

    • "batch":按以下方式缩放 整个批次的标准差 (按照 PPO-Lite)。

    • "无": 不缩放。Dr. GRPO 建议不进行缩放以避免来自标准缩放的难度偏差。

  • loss_type (字符串,默认值 "dapo"):

    • "grpo":按序列长度归一化(长度偏差;不推荐)。

    • "dr_grpo":按一个 全局常数 归一化(由 Dr. GRPO 引入;消除长度偏差)。常数 ≈ max_completion_length.

    • "dapo" (默认):按以下项归一化 在全局累积批次中的活动标记 (由 DAPO 引入;消除长度偏差)。

    • "bnpo":按以下项归一化 仅按本地批次中的活动标记 (结果会随本地批次大小而变化;当 per_device_train_batch_size == 1 时等同于 GRPO).

  • mask_truncated_completions (布尔值,默认 False): 当 True时,截断的完成会从损失中排除(DAPO 为稳定性推荐)。 注意:此标志存在一些与 KL 相关的问题,因此我们建议禁用它。

    # 如果启用了 mask_truncated_completions,则在 completion_mask 中将截断的完成置零
    if self.mask_truncated_completions:
        truncated_completions = ~is_eos.any(dim=1)
        completion_mask = completion_mask * (~truncated_completions).unsqueeze(1).int()

    当许多完成被截断时,这可能会将所有 completion_mask 条目置为零,从而使 n_mask_per_reward = 0 并导致 KL 变为 NaN。 参见arrow-up-right

  • vllm_importance_sampling_correction (布尔值,默认 True): 应用 截断重要性采样(TIS) 以在生成(例如 vLLM / fast_inference)与训练后端不同时校正离策略效应。 在 Unsloth 中,这会 自动设置为 True 如果你使用的是 vLLM/fast_inference;否则 .

  • vllm_importance_sampling_cap (浮点数,默认 2.0): TIS 的截断参数 C ;为重要性采样比率设定上限以提高稳定性。

  • 数据类型 在选择 float16 或 bfloat16 时,参见 FP16 与 BF16 用于 RL

生成参数

  • 温度(float,默认值为 1.0): 用于采样的温度。温度越高,生成的结果越随机。请确保使用相对较高(1.0)的温度以在生成中获得多样性,这有助于学习。

  • top_p(float,可选,默认值为 1.0): 控制要考虑的累计概率的浮点值,适用于排名前列的标记。必须在 (0, 1] 之间。设置为 1.0 以考虑所有标记。

  • top_k(int,可选): 保留用于 top-k 过滤的最高概率词汇标记的数量。如果为 None,则禁用 top-k 过滤并考虑所有标记。

  • min_p(float,可选): 最小标记概率,将按最可能标记的概率进行缩放。它必须是介于 0.0 和 1.0 之间的值。典型值在 0.01-0.2 范围内。

  • 重复惩罚(repetition_penalty)(float,可选,默认值为 1.0): 根据新标记是否出现在提示和到目前为止生成的文本中,对新标记进行惩罚的浮点值。大于 1.0 的值鼓励模型使用新标记,而小于 1.0 的值鼓励模型重复标记。

  • 每次生成步骤(steps_per_generation):(int,可选): 每次生成的步骤数。如果为 None,则默认为 gradient_accumulation_steps. 与以下参数互斥 generation_batch_size.

circle-info

弄这个参数有点令人困惑,建议编辑 per_device_train_batch_size 并对批次大小进行梯度累积

批次与吞吐量参数

控制批次的参数

  • train_batch_size: 样本数量 每个进程 每步。 如果该整数为 小于 num_generations, 它将默认为 num_generations.

  • steps_per_generation: 数量 微批次 对以下项有贡献 一次生成的 损失计算(仅前向传递)。 每隔 steps_per_generation 步会生成一个新数据批次;反向传播的时序取决于 gradient_accumulation_steps.

  • num_processes: 分布式训练进程的数量(例如 GPU/工作节点)。

  • gradient_accumulation_steps (又名 gradient_accumulation):要累积的微批次数量 应用反向传播和优化器更新之前。

  • 有效批次大小:

    在更新之前对梯度有贡献的总样本数(跨所有进程和步骤)。

  • 每次生成的优化器步数:

    示例: 4 / 2 = 2.

  • num_generations:生成的代数 每个提示 (应用于 之后 计算 effective_batch_size)。 代数中 唯一提示 在一次生成循环中为:

    必须 > 2 以使 GRPO 生效。

GRPO 批处理示例

下面的表格说明了批次如何通过步骤流动、何时发生优化器更新以及如何生成新批次。

示例 1

生成循环 A

步骤
批次
备注

0

[0,0,0]

1

[1,1,1]

→ 优化器更新(达到 accum = 2)

2

[2,2,2]

3

[3,3,3]

优化器更新

生成循环 B

步骤
批次
备注

0

[4,4,4]

1

[5,5,5]

→ 优化器更新(达到 accum = 2)

2

[6,6,6]

3

[7,7,7]

优化器更新

示例 2

生成循环 A

步骤
批次
备注

0

[0,0,0]

1

[1,1,1]

2

[2,2,2]

3

[3,3,3]

优化器更新(达到 accum = 4)

生成循环 B

步骤
批次
备注

0

[4,4,4]

1

[5,5,5]

2

[6,6,6]

3

[7,7,7]

优化器更新(达到 accum = 4)

示例 3

生成循环 A

步骤
批次
备注

0

[0,0,0]

1

[0,1,1]

2

[1,1,3]

3

[3,3,3]

优化器更新(达到 accum = 4)

生成循环 B

步骤
批次
备注

0

[4,4,4]

1

[4,5,5]

2

[5,5,6]

3

[6,6,6]

优化器更新(达到 accum = 4)

示例 4

生成循环 A

步骤
批次
备注

0

[0,0,0, 1,1,1]

1

[2,2,2, 3,3,3]

优化器更新(达到 accum = 2)

生成循环 B

步骤
批次
备注

0

[4,4,4, 5,5,5]

1

[6,6,6, 7,7,7]

优化器更新(达到 accum = 2)

快速公式参考

最后更新于

这有帮助吗?