🧩高级强化学习文档

在将 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 当设置时。如果 None(无),则使用标准 GRPO 裁剪。建议在启用时 > 1 + ε (根据 INTELLECT-2 报告)。

  • epsilon_high(高 ε) (浮点数,可选):上界 epsilon;若未设置则默认为 epsilon(ε) 。DAPO 建议 0.28.

  • importance_sampling_level(重要性采样级别) (“token” | “sequence”,默认 "token"):

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

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

  • reward_weights(奖励权重) (list[float],可选):每个奖励一个权重。如果 None(无),则所有权重 = 1.0。

  • scale_rewards(奖励缩放) (str|bool,默认 "group"):

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

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

    • False(假)"none"(无): 不缩放。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(vLLM 重要性采样校正) (布尔值,默认 True): 应用 截断重要性采样 (TIS) 以在生成(例如 vLLM / fast_inference)与训练后端不同时修正离策略效应。 在 Unsloth 中,当您使用 vLLM/fast_inference 时,此项会 自动设置为 True ;否则 False(假).

  • vllm_importance_sampling_cap(vLLM 重要性采样上限) (浮点数,默认 2.0): 截断参数 C(截断常数) 用于 TIS;对重要性采样比值设置上界以改善稳定性。

  • dtype(数据类型) 在选择 float16 或 bfloat16 时,请参阅 FP16 与 BF16 用于 RL

不受支持模型上的 RL:

您也可以在不被 vLLM 支持的模型上使用 Unsloth 运行 RL,例如 Qwen3.5。只需在加载模型时将 fast_inference=False(快速推理关闭) 设置即可。

生成参数

  • temperature(温度,浮点数,默认 1.0): 采样的温度。温度越高,完成的随机性越大。确保使用相对较高(1.0)的温度以在生成中获得多样性,这有助于学习。

  • top_p(浮点数,可选,默认 1.0): 控制要考虑的最高概率令牌的累积概率的浮点值。必须在 (0, 1] 内。设置为 1.0 可考虑所有令牌。

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

  • min_p(浮点数,可选): 最小令牌概率,该值将按最可能令牌的概率进行缩放。必须在 0.0 到 1.0 之间。典型值在 0.01-0.2 范围内。

  • repetition_penalty(重复惩罚,浮点数,可选,默认 1.0): 对新令牌进行惩罚的浮点值,基于它们是否出现在提示和迄今生成的文本中。值大于 1.0 会鼓励模型使用新令牌,而小于 1.0 会鼓励模型重复令牌。

  • steps_per_generation(每次生成步数):(整数,可选): 每次生成的步数。如果为 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 会生成一个新数据批次;反向传播的时机取决于 steps_per_generation(每次生成步数) num_processes(进程数) gradient_accumulation_steps(梯度累积步数).

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

  • gradient_accumulation_steps(梯度累积步数) gradient_accumulation(梯度累积) ):要累积的微批次数量,应用反向传播和优化器更新之前。 有效批次大小

  • effective_batch_size = steps_per_generation * num_processes * train_batch_size:

    每次生成的优化器步数

  • optimizer_steps_per_generation = steps_per_generation / gradient_accumulation_steps:

    :每个提示生成的数量 4 / 2 = 2.

  • num_generations(生成数量)每个提示 (在计算 effective_batch_size(有效批次大小) 之后应用)。 在一个生成周期中独特提示(unique prompts)的数量为: unique_prompts = effective_batch_size / num_generations 必须 > 2

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

示例 1

num_gpus = 1(GPU 数量)

per_device_train_batch_size = 3(每设备训练批次大小)

批次

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[0,0,0]

1

[1,1,1]

生成周期 B

2

[2,2,2]

3

[3,3,3]

示例 2

steps_per_generation = gradient_accumulation_steps = 4

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[4,4,4]

1

[5,5,5]

生成周期 B

2

[6,6,6]

3

[7,7,7]

示例 2

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

批次

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[0,0,0]

1

[1,1,1]

2

[2,2,2]

3

[3,3,3]

num_generations = 4(生成数量)

steps_per_generation = gradient_accumulation_steps = 4

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[4,4,4]

1

[5,5,5]

2

[6,6,6]

3

[7,7,7]

num_generations = 4(生成数量)

unique_prompts = effective_batch_size / num_generations = 3(独特提示数量)

批次

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[0,0,0]

1

[0,1,1]

2

[1,1,3]

3

[3,3,3]

num_generations = 4(生成数量)

steps_per_generation = gradient_accumulation_steps = 4

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

[4,4,4]

1

[4,5,5]

2

[5,5,6]

3

[6,6,6]

num_generations = 4(生成数量)

steps_per_generation = gradient_accumulation_steps = 2

批次

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

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

1

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

unique_prompts = effective_batch_size / num_generations # 必须 > 2

steps_per_generation = gradient_accumulation_steps = 4

说明
→ 优化器更新(已达 accum = 2)
优化器更新

0

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

1

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

unique_prompts = effective_batch_size / num_generations # 必须 > 2

(此条目保留用于与原文对应)

最后更新于

这有帮助吗?