🧩高度な強化学習ドキュメント

Unsloth を GRPO と併用する際の高度なドキュメント設定。

バッチ処理、生成、トレーニングパラメータに関するUnslothを使ったGRPOの詳細ガイド:

トレーニングパラメータ

  • beta (float、デフォルト 0.0):KL係数。

    • 0.0 ⇒ 参照モデルが読み込まれていない(メモリが少なく、より高速)。

    • より高い beta はポリシーを参照ポリシーにより近づける制約となる。

  • num_iterations (int、デフォルト 1):バッチあたりのPPOエポック数(アルゴリズム中のμ)。 勾配蓄積ステップ内でデータをリプレイします。例: 2 = 各蓄積ステップでの2つのフォワードパス。

  • epsilon (float、デフォルト 0.2):トークンレベルの対数確率比のクリッピング値(デフォルトεでは典型的な比率範囲 ≈ [-1.2, 1.2])。

  • delta (float、オプション):を有効にします upper のクリッピング上限(境界)を 両側GRPO に設定したとき。もし Noneなら、標準のGRPOクリッピングが使用されます。推奨は > 1 + ε が有効なとき(INTELLECT-2レポートによる)。

  • epsilon_high (float、オプション):上限イプシロン;未設定の場合のデフォルトは epsilon 。DAPOはを推奨します 0.28.

  • importance_sampling_level (「token」 | 「sequence」、デフォルト "token"):

    • "token":生のトークンごとの比率(トークンごとに1つの重み)。

    • "sequence":トークンごとの比率を平均して単一のシーケンスレベル比率にする。 GSPOはシーケンスレベルのサンプリングがシーケンスレベルの報酬に対してより安定したトレーニングを与えることが多いと示している。

  • reward_weights (list[float]、オプション):報酬ごとに1つの重み。もし Noneなら、すべての重み = 1.0。

  • scale_rewards (str|bool、デフォルト "group"):

    • True または "group":でスケーリングする 各グループ内の標準偏差で (グループ内の単位分散)。

    • "batch":でスケーリングする :バッチ全体にわたる標準偏差でスケーリング (PPO-Liteに準拠)。

    • False または "none": スケーリングなし。Dr. GRPOは、標準偏差スケーリングによる難易度バイアスを避けるためにスケーリングしないことを推奨します。

  • loss_type (str、デフォルト "dapo"):

    • "grpo":シーケンス長で正規化する(長さバイアス;推奨されない)。

    • "dr_grpo":によって正規化する global constant (Dr. GRPOで導入;長さバイアスを取り除く)。定数 ≈ max_completion_length.

    • "dapo" (デフォルト):で正規化する グローバルに蓄積されたバッチ内の有効トークン (DAPOで導入;長さバイアスを取り除く)。

    • "bnpo":で正規化する :ローカルバッチ内の有効トークン のみ(結果はローカルバッチサイズによって変動する可能性がある; per_device_train_batch_size == 1).

  • のときGRPOと等しくなる) mask_truncated_completions(bool、デフォルト 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 (bool、デフォルト True): を適用する 切り詰め重要度サンプリング(TIS) は、生成(例:vLLM / fast_inference)がトレーニングバックエンドと異なる場合のオフポリシー効果を補正するために用いられる。 Unslothでは、これは vLLM/fast_inferenceを使用している場合は自動的にTrueに設定される 。そうでなければ False.

  • vllm_importance_sampling_cap (float、デフォルト 2.0): TISの切り詰めパラメータ C :重要度サンプリング比率の上限を設定して安定性を向上させる。

  • dtype float16またはbfloat16を選択する際は、次を参照してください RL における FP16 と BF16 の比較

サポートされていないモデルでのRL:

vLLMでサポートされていないモデル(例: Qwen3.5など)でもUnslothでRLを実行できます。 fast_inference=False fast_inference=False

fast_inference=False,

  • 生成パラメータ temperature(float、デフォルト 1.0):

  • サンプリングの温度。温度が高いほど生成のランダム性が増します。学習を助ける多様性を得るために比較的高め(1.0)の温度を使用することを確認してください。 top_p(float、オプション、デフォルト 1.0):

  • 上位トークンの累積確率を制御する浮動小数点値。値は (0, 1] の範囲でなければなりません。すべてのトークンを考慮するには1.0に設定します。 top_k(int、オプション):

  • トップKフィルタリングで保持する最も高い確率の語彙トークン数。Noneの場合、トップ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、オプション): 1回の生成あたりのステップ数。Noneの場合、デフォルトはgradient_accumulation_steps になります。 と相互排他的です.

circle-info

generation_batch_size per_device_train_batch_size per_device_train_batch_size

と勾配蓄積を編集することを推奨します

バッチ & スループットパラメータ

  • バッチを制御するパラメータtrain_batch_size :サンプル数 プロセスあたり ステップあたり。 この整数が より小さい場合num_generations より小さい場合.

  • 、デフォルトはsteps_per_generation :に寄与する マイクロバッチ数 の1つの生成の 損失計算(フォワードパスのみ)。 新しいデータバッチは毎 、デフォルトは stepsに生成される;バックプロパゲーションのタイミングは 1回の生成あたりのステップ数。Noneの場合、デフォルトは.

  • num_processesに依存する:分散トレーニングプロセスの数(例:GPU / ワーカー)。

  • 1回の生成あたりのステップ数。Noneの場合、デフォルトは (別名 gradient_accumulation):適用する前に蓄積するマイクロバッチの数 バックプロパゲーションとオプティマイザ更新を行う。

  • 有効バッチサイズ:

    更新前に勾配に寄与する総サンプル数(全プロセスとステップを通じて)。

  • 生成あたりのオプティマイザステップ数:

    例: 4 / 2 = 2.

  • より小さい場合:生成される世代数 プロンプトあたり (次の計算を適用した後 計算後 に適用) effective_batch_size)。 1つの生成サイクルにおける ユニークなプロンプト数 は次の通り:

    GRPOが機能するには > 2 でなければならない。 GRPOバッチ例

以下の表は、ステップを通じてバッチがどのように流れるか、オプティマイザの更新がいつ行われるか、および新しいバッチがどのように生成されるかを示します。

例 1

num_gpus = 1

ステップ

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[0,0,0]

1

[1,1,1]

オプティマイザ更新

2

[2,2,2]

3

[3,3,3]

生成サイクル B

例 2

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[4,4,4]

1

[5,5,5]

オプティマイザ更新

2

[6,6,6]

3

[7,7,7]

生成サイクル B

steps_per_generation = gradient_accumulation_steps = 4

ステップ

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[0,0,0]

1

[1,1,1]

2

[2,2,2]

3

[3,3,3]

例 3

例 2

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[4,4,4]

1

[5,5,5]

2

[6,6,6]

3

[7,7,7]

例 3

num_generations = 4

ステップ

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[0,0,0]

1

[0,1,1]

2

[1,1,3]

3

[3,3,3]

例 3

例 2

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

[4,4,4]

1

[4,5,5]

2

[5,5,6]

3

[6,6,6]

例 3

per_device_train_batch_size = 6

ステップ

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

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

1

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

クイック数式リファレンス

例 2

バッチ
注意事項
→ オプティマイザ更新(蓄積 = 2 に達した)

0

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

1

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

クイック数式リファレンス

unique_prompts = effective_batch_size / num_generations # must be > 2

最終更新

役に立ちましたか?