DUICUO

DeepSeek R1パラダイム再現ノート

著者 | yulei

DeepSeek R1の技術レポートが公開されて以来、オープンソースコミュニティから数多くの「再現」作品が生まれています。このR1再現ノートでは、複数のオープンソースプロジェクトを再現し、相互検証することで、R1/R1-zeroの強化学習ステップによってもたらされるモデル性能の向上を検証し、モデル学習とビジネスアプリケーションにおけるR1技術の将来的な展望を探ることを目的としています。

I. R1オープンソースプロジェクトの概要

表1は、現在主流となっているR1シリーズの複製手法を示しています。データ領域(数学問題、論理問題など)とフレームワークを考慮し、SimpleRL、OpenR1、LogitRL、TinyZeroの4つのプロジェクトを選択し、R1に類似した学習パラダイムに関する実験を行いました。

表1. 主流のオープンソースR1の再現方法:

ギットハブ

トレーニングセット

テストセット

モデル

RLフレームワーク

アドバンテージ

欠点

使いやすい評価

単純なRLの理由

数学 8K(レベル3~5)

AIME 2024

数学500

AMC


ミネルバ数学


オリンピアドベンチ

クウェン2.5-7B

オープンRLHF

1) 実装が簡単

2) PRM/ORM/R1などをサポートします。

3) RL フレームワークは複数のマシンと複数のカードに対応します。

1) RL アルゴリズムは現在 GRPO をサポートしていません。

⭐️⭐️⭐️

オープンR1

DigitalLearningGmbH/MATH-lighteval

AI-MO/NuminaMath-TIR

AIME 2024

数学500

GPQAダイヤモンド

ディープシーク-R1-ディスティル-Qwen-7B

Qwen2.5-数学-7B

Qwen2.5-1.5B-インストラクト

TRL

1) 実装が簡単

2) R1シリーズジョブの完全なワークフローサポート(sft/rl/sft+rl)

1) マルチマシントレーニングは現在サポートされていません。

⭐️⭐️

怠惰でない

GSM8K

GSM8K[テスト]

ラマ 3.1(8B)

ファイ4

クウェン2.5-1.5B

TRL

1) 生殖においてR1に最も近いとされる公式の方法

2) シンプルなインターフェース

1) 複数のカードでの支払いが必要です。

⭐️

ロジットRL

KK 正直者と嘘つき lv3&5

KK正直者と嘘つき

Qwen2.5-7B-インストラクト

veRL

1) RL フレームワークは複数のアルゴリズムをサポートします。

2) 再発率が高い

1) マルチマシントレーニングは現在サポートされていません。

⭐️⭐️⭐️

タイニーゼロ

カウントダウン

カウントダウン

クウェン2.5-3B

veRL

1) RL フレームワークは複数のアルゴリズムをサポートします。

2) 再発率が高い

1) マルチマシントレーニングは現在サポートされていません。

⭐️⭐️⭐️

オートゼロ

8K数学

数学500

Qwen2.5-数学-7B/1.5B

クウェン2.5-7B/3B

Microsoft-Rho-Math-7B

DeepSeek-Math-7B-ベース

オート麦

1) tinyzeroと他のコードの統合

1) マルチマシントレーニングは現在サポートされていません。

⭐️⭐️

神秘性を解き明かす

数学

ウェブインストラクト

数学500

定理QA

MMLU-Pro-1k

ラマ3.1-8B

Qwen2.5-数学-7B

オープンRLHF

1) 実装が簡単

2) 論文自体は非常にしっかりしている(十分なトレーニングと検証)。

1) 実験設定はR1と若干異なります。

⭐️⭐️

II. 実験のセットアップ

1. トレーニングデータ

(1)数学の問題

① シンプルRL

  • データセット: MATH8K simpleRL-reason/train/data/math_level3to5_data_processed_with_qwen_prompt.json (メイン) · hkust-nlp/simpleRL-reason · GitHub
  • データ量: 8.5K
  • 出典: 難易度レベル 3 ~ 5 の MATH データセットの問題。

② オープンR1

  • データセット: MATH-lighteval https://huggingface.co/datasets/DigitalLearningGmbH/MATH-lighteval
  • データ量: 7.5K
  • ソース: ステップごとのソリューションを含む、lighteval 形式で再構築された MATH データセット。
  • データセット: MATH-numina https://huggingface.co/datasets/AI-MO/NuminaMath-TIR
  • データ量: 72.4K
  • 出典: ツール統合推論を使用して GPT4o 推論チェーン (Python ソリューション、コード実行プロセス、複数ラウンドのインタラクションを含む) を取得する NuminaMath-CoT の問題。

③ タイニーゼロ

  • データセット: カウントダウン (目標数値までの加算、減算、乗算、除算) https://huggingface.co/datasets/Jiayi-Pan/Countdown-Tasks-3to4
  • データ量: 490K
  • ソース: 演算子を使用して、指定された 3 桁または 4 桁の数字から目標値を計算する古典的なゲーム。

(2)論理問題

ロジックRL:

  • データセット: Knights and Knaves (正直者と嘘つき) https://huggingface.co/datasets/K-and-K/knights-and-knaves
  • データ容量: 3PPL (3人) 1K; 5PPL (5人) 1K
  • 出典:論理パズル:正直者は真実だけを語り、嘘つきはいつも嘘をつきます。正直者と嘘つきをすべて特定してください。

2. ベースモデルの選択

再現性(オープンソース プロジェクトとの整合性)を考慮して、次の基本モデルを採用しました。

  • Qwen2.5-7B-Math(ベース):SimpleRL、OpenR1
  • Qwen2.5-1.5B-Instruct:OpenR1
  • Deepseek-R1-Distill-Qwen-7B(指示):OpenR1
  • Qwen2.5-3B(ベース):TinyZero
  • Qwen2.5-7B(ベース):LogicRL、TinyZero
  • Qwen2.5-7B-命令: LogicRL

Qwen-Math シリーズの基本モデルは、RL 以前からさまざまな難易度の数学的問題を解決する能力をすでに備えており、それがその後のモデルの遅い思考と長い CoT を刺激する能力の強固な基盤を築きました。

計算リソースの制限と様々なオープンソースRLフレームワークの可用性により、ほとんどのオープンソース研究ではモデルサイズが15億から70億の範囲に制限されています。一方で、小規模モデルはR1類似モデルの迅速な複製を容易にしますが、小規模モデルの論理的推論能力の限界により、より包括的で実用的な(単なるおもちゃの研究ではない)R1類似モデルの複製は制限されます。したがって、今後の研究では、RLフレームワークの最適化(マルチマシン、マルチGPUトレーニング、ロールアウトなどのトレーニング中のステップによるバブル生成の削減)は、R1類似モデルの大規模トレーニングへの道のりで取り組むべき重要な課題です。

3. RL基本設定

(1)報酬関数の定義

① フォーマット報酬

RL トレーニング中に厳密な書式設定制約が設定され、通常はシステム プロンプトとしてトレーニング データに表示されます。

■ シンプルRL

  • システムプロンプト
Please reason step by step, and put your final answer within \boxed{}.
  • 報酬関数の定義(抜粋)
 if "boxed" not in model_output: box_match = -1.0

■ オープンR1

  • システムプロンプト
    A conversation between User and Assistant. The user asks a question, and the Assistant solves it. The assistant first thinks about the reasoning process in the mind and then provides the user with the answer. The reasoning process and answer are enclosed within <think> </think> and <answer> </answer> tags, respectively, ie, <think> reasoning process here </think><answer> answer here </answer>
  • `reward`関数の定義(スニペット)
     def format_reward(completions, **kwargs): """Reward function that checks if the completion has a specific format.""" pattern = r"^<think>.*?</think>\s*<answer>.*?</answer>$" completion_contents = [completion[0]["content"] for completion in completions] matches = [re.match(pattern, content, re.DOTALL | re.MULTILINE) for content in completion_contents] return [1.0 if match else 0.0 for match in matches]

■ ロジックRL

  • システムプロンプト(ベース)
     The user asks a question, and the Assistant solves it.The assistant first thinks about the reasoning process in the mind and then provides the user with the final answer. The reasoning process and answer are enclosed within <think> </think> and <answer> </answer> tags, respectively, ie, <think> reasoning process here </think><answer> answer here </answer>. Now the user asks you to solve a logical reasoning problem. After thinking, when you finally reach a conclusion, clearly state the identity of each character within <answer> </answer> tags. List the identity of each person one by one, for example, <answer> (1) Zoey is a knight\n(2) Oliver is a knight\n(3)... </answer>.
  • システムプロンプト(指示)
     You are a helpful assistant. The assistant first thinks about the reasoning process in the mind and then provides the user with the answer. The reasoning process and answer are enclosed within <think> </think> and<answer> </answer> tags, respectively, ie, <think> reasoning process here </think><answer> answer here </answer>. Now the user asks you to solve a logical reasoning problem. After thinking, when you finally reach a conclusion, clearly state the identity of each character within <answer> </answer> tags. ie, <answer> (1) Zoey is a knight (2) ... </answer>.
  • `reward`関数の定義(スニペット)
     answer_score = 0 if format_correct and answer_text: pred_status = parse_model_answer(answer_text, expected_names) if pred_status: if pred_status == gt_status: answer_score = 2 print(" Content validation: FULL MATCH") else: answer_score = -1.5 print(" Content validation: MISMATCH") else: answer_score = -2 print( "Fail to parse answer") else: answer_score = -2 print("\n[Content Validation] Skipped due to format errors or missing answer")

■ タイニーゼロ

  • システムプロンプト(抜粋)
     Show your work in <think> </think> tags. And return the final answer in <answer> </answer> tags, for example <answer> (1 + 2) / 3 </answer>.
  • `reward`関数の定義(スニペット)
     answer_pattern = r'<answer>(.*?)</answer>' match = re.finditer(answer_pattern, solution_str) matches = list(match) if matches: final_answer = matches[-1].group(1).strip() else: final_answer = None return final_answer

② 正確性報酬

回答の検証にはさまざまな種類があること (文字列では通常 exact_match が使用されますが、浮動小数点数では特定の精度以下のエラーが許容されます) を考慮して、さまざまなオープンソース プロジェクトでもトレーニング セットに適応した回答の検証関数が使用されています。

■ シンプルRL

精度報酬の定義(抜粋):

 if qwen_math_equal_subprocess(prediction=extract_answer, reference=answer): box_match = 1.0 else: box_match = -0.5

■オープンR1

精度報酬の定義(抜粋):

 # Reward 1 if the content is the same as the ground truth, 0 otherwise reward = float(verify(answer_parsed, gold_parsed))

■ ロジックRL

精度報酬の定義(抜粋):

 answer_score = 0 if format_correct and answer_text: pred_status = parse_model_answer(answer_text, expected_names) if pred_status: if pred_status == gt_status: answer_score = 2 print(" Content validation: FULL MATCH") else: answer_score = -1.5 print(" Content validation: MISMATCH") else: answer_score = -2 print( "Fail to parse answer") else: answer_score = -2 print("\n[Content Validation] Skipped due to format errors or missing answer")

■ タイニーゼロ

精度報酬の定義(抜粋):

 # Evaluate equation try: result = evaluate_equation(equation) if result is None: if do_print: print(f"Could not evaluate equation") return format_score if abs(result - target) < 1e-5: # Account for floating point precision if do_print: print(f"Correct equation: {equation} = {result}") return score else: if do_print: print(f"Wrong result: equation = {result}, target = {target}") return format_score ......

まとめると、DeepSeek R1のフォーマット制約は主に「{思考プロセス}{回答}」という形式で実装されていますが、ほとんどのオープンソースソリューションも同じ形式を使用しています。最適化の観点から見ると、両者の違いはごくわずかです。正規表現に基づいてモデル出力を構築し、それが標準形式であるかどうかを判断する際には、「^.?\s.*?$」のようなより厳格な制約が、開始と終了を制約するためによく使用されます。一部の数学問題では、フォーマット報酬は回答に\box{}ボックスが含まれているかどうかを考慮します。

精度報酬に関しては、さまざまな研究の実装方法は、基本的に以前の強化学習アルゴリズムのORMのコードに従っています。ここでは主に2つの課題があります。1)モデルの出力から最終結果を正常に解析するには、大量の後処理コードが必要です。2)等価性を判断するための条件(数値、文字列など)を考慮する必要があり、異なるドメインデータに対して異なる報酬方法を設計する必要があります。前者については、フォーマットされた出力を必要とする一部の問題では、対象のキーと値のペアを正しく一致させる必要があります。後者については、予測と真実が等しいかどうかを判断し、報酬を返す定義も慎重に検討する必要があります。最も厳密な完全マッチングでは、正しい場合と間違った場合のみを区別するため、一部のタスクでトレーニングの収束速度に影響を与える可能性があります。

(2)ペナルティ関数の定義(オプション)

ほとんどのオープンソースプロジェクトではペナルティとその実装は重視されていませんが、最近の記事では繰り返しペナルティと長さペナルティの重要性が強調されています。繰り返しベースのペナルティ関数を適用することで、CoTにおける繰り返しコンテンツを削減できます。具体的には、繰り返しペナルティはn-gramに基づいて実装され、nのスライディングウィンドウサイズで訪問済みのn-gramセットを維持します。ウィンドウを最初から最後までスライドさせ、同じn-gramが複数回出現するかどうかを確認し、それに応じてペナルティを適用します。実装リファレンス(抜粋):

 ngrams = set() total = 0 for ng in zipngram(generation, ngram_size): ngrams.add(ng) total += 1 scaling = 1 - len(ngrams) / total return scaling * max_penalty

正解がAとBの2つある場合、解答Aが解答Bよりも短いと、思考プロセスを効率化するために解答Aに高い報酬が与えられるのが一般的です。逆に、不正解がAとBの2つある場合、解答Aが解答Bよりも短いと、解答Aにペナルティが与えられ、モデルがさらなる解決策を模索し、思考プロセスにおける反省と分岐を改善するよう促します。実際のトレーニングでは、このペナルティ設計によって予期せぬハッキングが発生する可能性があります。例えば、短い正解を奨励すると、モデル本来の分岐思考が阻害される可能性があります(あるいは…)。R1を再現する際には、簡単な質問にすべて正解した場合に思考プロセスが悪化するのを防ぐために、難易度の異なるデータの混合比率も考慮する必要があります。

(3)最適化手法

ほとんどのオープンソースプロジェクトはPPOアルゴリズムをサポートしています。現在、TRLライブラリとVeRLライブラリの両方がGRPOアルゴリズムをサポートしています。

  • SimpleRL (OpenRLHF) -> PPO
  • OpenRL (TRL) -> GRPO
  • LogitRL (VeRL) -> GRPO
  • TinyZero (VeRL) -> PPO & GRPO

(4)トレーニングプラットフォーム

すべての再現は、1~4基のGPUを使用してTIONEプラットフォーム上で実行されました。前述のオープンソースの再現のうち、OpenRLHFのみがマルチマシン、マルチGPUのトレーニングをサポートしています。他の再現はシングルマシン、マルチGPUのトレーニングのみをサポートしており、GPU数に制限がある場合が多いです。TinyZeroとLogitRLのトレーニングでは、GPU数を増やした後、初期化中にトレーニングが停止するという問題が発生しました。

ほとんどのプロジェクトは、4 枚、8 枚、または 32 枚のカード (SimpleRL) を使用して再現するのに約 2 ~ 3 日かかります。

III. 実験結果と分析

1. オープンなトレーニングプロセス

(1) SimpleRL SimpleRL - 結果の再現

(2)OpenR1の再現結果

(3)ロジットRL

  • ステージ1 LogicRL-stage1(3ppl) 再現結果
  • ステージ2 LogicRL-Stage2 (5ppl) 再現結果
  • ステージ3 LogicRL-Stage3 (5ppl) 再現結果

(4)タイニーゼロ

  • PPO TinyZero-R1の複製結果
  • GRPO TinyZero-R1(GRPO)の再現結果

2. 詳細な結果

(1)シンプルRL

32基のGPUを搭載した複数のマシンを用いてトレーニングプロセス(合計160ステップ)を完了しました。同時に、比較のために8基のGPUを搭載した1台のマシンを用いて、半分の時間でトレーニングを行いました。コアとなるトレーニングプロセスを以下に示します。

褒美

応答の長さ

図3.2.1(1) SimpleRLトレーニング中のトレーニングセット報酬(左)と応答長(右)の変化。

SimpleRLブログで報告された最終的な応答の長さと比較すると、私たちの最終的な収束長は短くなっています。SimpleRLは最終的な長さを約700と報告していましたが、私たちの場合は約580です。これには2つの理由が考えられます。1) トレーニング済みのハイパーパラメータが設定と完全に一致しておらず、さらなる最適化が必要であること。2) 現在のフォーマット制約を改善し、CoT思考チェーンと回答部分を区別する必要があること。

シングルマシンマルチGPU(8 GPU)とマルチマシンマルチGPU(32 GPU)のトレーニング結果は基本的に同じですが、マルチマシンのトレーニング速度はシングルマシンの3.2倍です。RLトレーニングではモデルのサンプリング(経験値取得)に多くの時間(80%以上)が必要ですが、VLLMではより多くのGPUを並列に使用することでトレーニング時間を大幅に短縮できます。

表3.2.1(1) SimpleRLトレーニング中のテストセットメトリクスの変化:

モデル名

GSM8K

数学500

ミネルバ_MATH

オリンピアドベンチ

AIME24

AMC23

平均

Qwen2.5-数学-7B-ベース

59.1

53.4

14.0

15.1

13.3

47.5

33.7

PPO - ステップ4

77.4

67.0

19.9

27.7

13.3

60.0

44.2

PPO - ステップ12

80.4

66.2

16.5

26.1

10.0

42.5

40.3

PPOステップ20

84.8

67.2

20.2

29.6

23.3

50.0

45.9

PPOステップ40

88.3

76.8

29.0

35.1

23.3

55.0

51.2

PPOステップ60

90.5

77.2

32.0

38.4

20.0

57.5

52.6

PPOステップ80

89.6

77.0

33.1

38.5

20.0

57.5

52.6

PPOステップ100

89.8

76.0

31.2

37.2

40.0

60.0

55.7

PPOステップ120

90.1

78.6

29.0

35.1

23.3

57.5

52.3

PPOステップ140

90.1

76.6

29.8

38.2

23.3

55.0

52.2

PPOステップ160

89.4

76.6

31.6

37.6

26.7

57.5

53.2

様々な数学テストセットにおけるモデルのパフォーマンスは、概ね着実に向上しました。トレーニングの初期段階(ステップ12)では出力長が急激に減少し、テストセットにおけるモデルのパフォーマンスは変動しましたが、トレーニングが進むにつれて出力長は着実に回復しました。

出力長が安定するにつれて、テストセットのパフォーマンスもほとんど変化しません。step=60以降、出力長は平均値付近で安定し、各テストセットの平均メトリックは53前後を維持します。

強化学習を形式と精度のみに基づいてトレーニングすることで、ある程度の一般化を実現できます。トレーニングセットはMATH500の難易度の高いデータのサブセットですが、モデルは複数のデータセットにわたって一貫してパフォーマンスの向上を示しています。

段階的な思考

反射

図3.2.1(2) SimpleRLのトレーニング中のテストセットにおけるモデルの段階的な思考(左)と反省(右)の変化。

MathBaseモデルは初期段階から段階的な思考能力を示しました。段階的な思考に関連するキーワードの出現頻度を統計的に分析した結果、基本モデルは強力な目標分解能力と段階的な問題解決能力を示すことが明らかになりました。学習が進むにつれて、モデルはまずフォーマット報酬(ステップ12)からの最適化を受け、出力分布に大きな変化が見られました。その後の学習により、モデルは推論のための段階分解能力を再び獲得することができました。

 Step 1, Step2, ... 1., 2., ... First, Second, Next, Finally

MathBaseのリフレクション能力はほとんど変化せず、明らかな多重自己反射は見られませんでしたが、かすかな「なるほど!」という瞬間が見られました。最終ステップ=160におけるモデルの出力を分析すると、モデルは依然として、出力の確認にプレーンテキストを使用するのではなく、コード検証を使用する傾向があります。これは、MathBaseモデル自体の事前学習方法(ステップ=0)に関連していると考えられます。最終的なモデル出力の長さが大幅に増加していないことを考えると、これは自己反射能力の変化と一致しています。MATH500テストセットを例に挙げると、図3.2.1(3)に示すように、モデルは最初から基本的な段階的な推論思考チェーンを既に備えていました。しかし、事前学習段階でのデータの好みの影響により、モデルは検証にPoTを使用し、LLMシミュレーションコンパイラを介して結果を出力しました。この検証方法は、コンパイラなどの外部ツールによる検証には有効ですが、プレーンテキストの思考チェーンの生成には適していません。これは、モデルの出力長が初期段階(検証用コードの記述)で非常に冗長であった理由も説明しています。学習が進むにつれて、モデルの出力長はステップ4とステップ12で急激に減少し、コード検証も減少し始めました。しかし、ステップ100では、モデルはコード検証を出力する傾向にあります。これは、数学的基礎モデルがコードツールに強く依存していることを示しています。最後に、ステップ160では、モデルはアハ体験における再評価ステップを示しています。

図3.2.1(3)は、SimpleRLのトレーニング中にテストセット上でモデルの出力がどのように変化したかを示しています。

MathBaseモデルは、テキスト推論結果とコード検証結果の両方に対する反映を提供することができます。図3.2.1(4)に示すように、モデルはコード検証を使用する傾向を示していますが、シミュレーションによるコンパイル結果に基づいて結果を反映・改良することができます。

図3.2.1(4) SimpleRLテストセットにおける反射特性を示す応答の例

(2)オープンR1

学習中の主要なメトリクスを図3.2.2(1)に示す。注:ここでQwen2.5-1.5BはInstructモデルを指す。

フォーマット報酬

精度ボーナス

図3.2.2(1) OpenR1トレーニング中のテストセット形式報酬(左)と精度報酬(右)の変化。

DeepSeek-Distilled Qwen7Bモデルは指示への準拠性が低く、指定された思考プロセスと回答形式を適切に出力できないことが頻繁に見られます。図3.2.2(1)(左)に示すように、等式制約なしでボックス化された結果のみを出力するQwen2.5-7Bを除けば、Qwen2.5-1.5B-InstructとDeepseek-Distill-Qwen2.5-7Bは大きく異なる曲線を示しています。Deepseek-Distill-Qwen2.5-7Bは指定された形式をほぼ完全に学習できません。1.5Bレベルのモデルは、サイズに制限がありますが、形式指示には準拠できますが、精度は大幅に向上しません。

Qwen2.5-Math-7B-Baseの再現結果は、SimpleRLと基本的に一致しています。学習データはMATHソースから選択されていますが、MATH以外のテストセット(GSM8Kなど)では若干の改善が見られます。DeepSeek-Distill-Qwen-7BのGRPO学習は不安定であり、現在のハイパーパラメータ設定は最適ではなく、慎重に微調整する必要があると考えられます。

表3.2.2(1) OpenR1トレーニング中のテストセットにおけるQwen2.5-Math-7B-Baseの変更

モデル名

GSM8K

数学500

ミネルバ_MATH


オリンピアドベンチ

AIME24

AMC23

平均

Qwen2.5-数学-7B-ベース

59.1

53.4

14.0

15.1

13.3

47.5

33.7

GRPOステップ100

84.2

74.4

29.0

35.6

26.7

57.5

51.2

GRPO-ステップ200

85.2

71.6

26.1

35.7

30.0

60.0

51.4

GRPO-ステップ300

86.4

74.2

36.4

32.7

26.7

55.0

51.9

GRPO-ステップ400

84.4

72.0

32.0

33.0

10.0

57.5

48.2

表3.2.2(2) OpenR1トレーニング中のテストセットにおけるDeepSeek-Distill-Qwen-7B-Baseの変更

モデル名

GSM8K

数学500

ミネルバ_MATH

オリンピアドベンチ

AIME24

AMC23

平均

DeepSeek-Distill-Qwen-7B-Instruct

89.6

89.6

36.4

51.1

26.7

87.5

63.5

GRPOステップ100

89.1

85.6

41.5

46.2

46.7

82.5

65.3

GRPO-ステップ200

82.8

75.8

35.3

37.9

6.7

50.0

48.1

GRPO-ステップ300

82.2

78.8

32.7

39.3

40.0

62.5

55.9

GRPO-ステップ400

87.9

81.4

38.2

40.9

30.0

72.5

58.5

(3)ロジックRL

① ステージ1の最適化

このフェーズでは、PPL=3(つまり、3人用のKK問題)を用いてモデルのウォームアップを行い、1epのみのトレーニングを行います。GRPOトレーニングは一般的にPPOよりも安定性が低く、ロールアウト回数やバッチサイズなどの要因の影響を受けやすいため、単純な問題から始めることで、モデルはまずKK問題を解決するための予備的な推論アプローチを開発することができます。

命令アライメント機能は、KK問題の解決に大きなメリットをもたらします。図3.2.3(1)に示すように、アライメントされたQwen2.5-7B-Instructモデルは、当初約0.45の精度を達成しました。

強化学習の第一段階では、モデルの平均応答長がわずかに改善されました。初期段階では、モデルは事前学習機能を用いて約400語の妥当な思考連鎖を生成できましたが、この時点では明らかな反射能力は示されていませんでした。

テストセットのメトリクス

応答の長さ

図3.2.3(1)LogicRLトレーニングの第1段階におけるテストセットメトリック(左)と応答長(右)の変化。

誤答の割合

書式エラーの割合

図3.2.3(2)LogicRLトレーニングの第1段階における誤答率(左)とフォーマットエラー率(右)の変化。

フォーマットエラーの割合は急速に減少しましたが、誤答の割合は依然として高いままでした。Thousand Questions Baseモデルは、数回の反復処理でフォーマットエラーの割合を5%未満に収束させました。Instructバージョンは、指示アライメント後、最初から良好なフォーマット準拠性を示し、正しいフォーマットを出力することができました。一方、この段階ではモデルがリフレクション能力を発揮しなかったため、誤答の割合は60%~70%程度で安定していました。

②ステージ2の最適化

このフェーズでは、PPL=5を使用してモデルをさらに最適化します。フェーズ1の終了時にckptを読み込み、アクターモデルを初期化します。このフェーズでは、サンプルの温度ハイパーパラメータを調整し、ロールアウトサンプル数を増やす必要があります。サンプリング結果の多様性を高めることで、思考連鎖による解答が出現しやすくなり、モデルがそのような思考連鎖による解答を生成するように促します。

第二段階のトレーニングは、温度係数とロールアウトハイパーパラメータのサンプリング数に大きく影響されます。公式プロジェクトで言及されている温度係数1.2~1.5は、Qwen 7Bスケールのモデルとしては依然として少し大きく、トレーニング中にクラッシュが発生しやすいです。図3.2.3(2)は、ハイパーパラメータ設定(温度=1.2、ロールアウトn=32)におけるトレーニングクラッシュの実験曲線を示しています。5人KK問題は3人KK問題よりもはるかに難しいため、第二段階の最適化においては、モデルが積極的にトレーニングされるのではなく、堅牢性を確保する必要があります。トレーニング中に、自己反省的な回答による出力を促す効果的な報酬をモデルに与えないと、一定期間のトレーニング後もモデルは大幅な改善が見られず、非常に簡単にクラッシュが発生します。図3.2.3(2)の応答長変化曲線に示すように、ステップ=140では、モデルは直接停止できません。指示モデルは「<|im_end|>」を出力せず、ベースモデルは「<|end_of_text|>」を出力せず、設定された応答長制限を超えるまで意味のない内容を繰り返し出力します。ステップ140では、モデルは大量の誤答を生成しただけでなく、フォーマットエラーも急増しました。これらの現象は、テストセットのメトリクスの急激な低下を裏付けており、モデルの崩壊を示唆しています。

図3.2.3(2) LogicRLの2段階トレーニング中に不適切なハイパーパラメータ設定によって発生したトレーニングクラッシュ

GRPOの学習プロセスは非常に不安定です。ハイパーパラメータを適切に調整することでモデル崩壊の問題を回避できるものの、モデルの出力長と誤答率は学習プロセス全体を通して劇的に変化しました(図3.2.3(3))。これは、モデルがPPL=5を解く際により大きな課題に直面し、容易な解決策を見つけることが困難であることを意味し、パフォーマンスの向上を非常に困難にしています。

Qwen-Instructと比較して、Qwen-Baseはより詳細で緻密な推論連鎖を示しています。トレーニング終了時のQwen2.5-7B-BaseとInstructの長さの違いを調べるため、ランダムに例を1つ選択して分析を行いました。図3.2.3(4)に示すように、どちらのモデルも質問に正しく回答しましたが、Baseモデルの方がより緻密な推論連鎖を示しました。具体的には、Baseモデルは「Samuel」が騎士か悪党かというケースを議論し、次に残りの「Charelott、Mia、Daniel、Jackson」の発言が各条件において真かどうかを分析します。クロスバリデーションでは、まず「Samuelは騎士である」という前提を排除し、次に2番目の前提の分析を続けることができます。一方、Instructモデルは、まず各人物の発言を要約し、同時に各人物が騎士か悪党かという発言を導き出す傾向があり、1つのステップで包括的な分析結論を導き出します。 Instructモデルは推論チェーンの小さなステップを省略する傾向があり、一部の導出プロセスを省略することで推論チェーンを圧縮し、解釈可能性を低下させます。これは、Instructモデルが、非長いCoT表現を含む広範なSFTデータと、選好アライメントのためのDPO最適化を経た後、推論の詳細を省略し、直接的で簡潔な回答を提供する傾向があるためと考えられます。一方、Baseモデルは、事前学習コーパス内の固有の推論表現を活性化し、綿密な段階的な推論を通じて最終的な結論に徐々に導きます。SFT/Instructモデルに基づいて後続のR1のような学習を実行する場合、詳細な推論チェーンを含む回答を提供できるように、SFTステージに大量の長いCoTデータが含まれていることを確認する必要があります。

図3.2.3(3) LogicRLの2段階学習プロセス:モデルの崩壊を避けるための適切なハイパーパラメータ調整

図3.2.3(4)LogicRLの第2フェーズ終了時のQwen2.5-7B-BaseとInstructによるトレーニングセットの推論例。

③ステージ3の最適化

第3段階では、モデルの思考プロセスの質をさらに向上させるために、長時間のアニーリング段階を実施します。オープンソースプロジェクトでは各段階の具体的なパラメータ設定が提供されていないため、私たちは経験に基づき、この段階で学習率をさらに下げ、温度係数を下げ、モデルのスムーズな収束を実現しました。第3段階で使用するトレーニングデータは第2段階と同じで、学習率はコサイン減衰戦略に従います。

同じ長さにおいて、ベースモデルとInstructモデルの最終精度はほぼ等しくなりますが、ベースモデルの方がわずかに優れています。図3.2.3(5)の左側の曲線を見ると、両モデルはほぼ同程度に収束しています。第3段階、step=0の段階では、Instructモデルの初期精度が低いため、この段階ではInstructモデルの相対的なゲインが大きくなっています。図3.2.3(5)の右側の出力長さの変化からも、Instructモデルがより顕著な長さ増加段階を経ており、出力長さが約700から1200に急速に増加し、完全な長い思考連鎖を形成していることがわかります。初期段階では、Instructモデルは遅く、既存の応答バイアスを取り除くために「構築前に分解する」必要があります。時間が経つと、Instructモデルはすぐにコツをつかみ、思考連鎖の出力パラダイムを習得することができます。

BaseモデルとInstructモデルのエラー率は着実に減少しましたが、フォーマット追従エラー率は低いままでした。図3.2.3(6)に示すように、第3段階のアニーリングのハイパーパラメータを適切に設定することで、スムーズな学習プロセスを実現できました。

テストセットのメトリクス

応答の長さ

図3.2.3(5) LogicRLの3段階の学習過程におけるテストセットメトリクス(左)と応答長(右)の変化

誤答の割合

書式エラーの割合

図3.2.3(6)LogicRLの3段階の学習過程における誤答率(左)とフォーマットエラー率(右)の変化。

ベースモデルとインストラクトモデルはどちらも、段階的な推論、分岐推論、自己反省、検証といった特徴を示し、アハ体験を体験することができます。トレーニング終了時に、図3.2.3(7)に示すように、トレーニングセットからランダムにサンプルが選択されました。両モデルは、複数のケースバイケースの議論において、段階的な推論の思考連鎖を示し、各大前提の議論の後に「再評価」/「再確認」を行い、要約して最終的な判断結果を示しました。

ベースモデルとインストラクトモデルが出力する応答トークンの数は基本的に変化していませんが、応答の長さの増加は思考連鎖の増加に起因しています。代表的な応答トークンを選択してトレーニングセットとテストセットを推論し、モデルのトレーニングプロセス中に応答内容をさらに分解しました。図3.2.3(8)に示すように、トレーニングステップ数が増えるにつれて、モデルの思考連鎖の長さは継続的に増加していますが、応答の長さは基本的に変化していません。これは、この段階で思考連鎖が実際に大幅に改善されていることを示しています。

BaseモデルとInstructモデルの段階的推論能力は急速に上昇した後、プラトー期に入り、自己反省能力は当初上昇したものの、その後わずかに低下した。図3.2.3(9)に示すように、キーワードマッチングに正規表現を用い、モデルの思考連鎖(…間のコンテンツ)を詳細に分析した。段階的推論能力については、モデルの出力長が長くなるにつれて、長いCoTコンテンツに段階的およびポイントバイポイントの問題解決のキーワードがますます多く出現する。一方、自己反省能力については、モデルがデータセットに過剰適合するにつれて、自己反省能力は最大値に達した後、わずかに低下する。これは、モデルが比較的自信のある問題(完全に適合した問題)に対しては、自己反省を行わない傾向があることを示している。今後、関連するR1実験を実施する際には、訓練セットに異なる難易度のデータが含まれるようにし、難しいデータを使用することで、モデルの自己反省モードの低下を防ぐ必要がある。

図3.2.3(7) 3段階LogicRLプロセスの終了時のトレーニングセットにおけるQwen2.5-7B-BaseとQwen2.5-7B-Instructの推論例。

トレーニングセット

テストセット

図3.2.3(8)LogicRLの3段階のプロセスにおけるトレーニングセット(左)とテストセット(右)の思考と反応の長さの変化。

段階的な推論

反射

図3.2.3(9) LogicRLの3段階プロセスにおけるCoT段階的推論と反省パターンの変化。

(4)タイニーゼロ

① PPO最適化

Qianwen 2.5-3B-BaseとQianwen 2.5-7B-Baseの両方をベースとして、このオープンソースプロジェクトのメトリクスを基本的に再現しました。コアとなるトレーニングプロセスを以下に示します。

テストセットのメトリクス

応答の長さ

図3.2.4(1) TinyZeroトレーニング中のテストセットメトリック(左)と応答の長さ(右)の変化。

同じ性能の場合、3Bスケールモデルは収束に時間がかかります。3Bモデルは初期段階では7Bモデルよりも約7%遅く、約500回の反復処理を経て、200回の反復処理後には7Bモデルのパフォーマンスにほとんど匹敵しなくなります。

3B 量级模型与7B 量级初始回复长度基本接近,但3B 模型最终达到的回复长度大于7B 模型。训练足够长时间(step > 200)后,3B 模型生成解题过程时需要依靠更多输出token。这也反映了尺寸更小的模型由于推理能力有限,往往需要更长的思维链过程表示中间过程。

トレーニングセット

テストセット

图3.2.4(2) TinyZero 训练过程中训练集(左)与测试集(右)上思考与回答长度的变化

为了分析在几个关键转折点上模型的具体输出内容,我们还选取了起始阶段(step=0,即Base 模型)、长度骤降阶段(step=24)、长度回升阶段(step=72)、平台期阶段(step=120)、缓慢下降阶段(step=300)这几个步骤的模型checkpoints,并分别推理得到了对应训练集、测试集的模型输出。使用、、、关键token 抽取了对应输出中的所有内容进行统计分析。

3B 模型与7B 模型在训练过程中的表现类似,但3B 模型消耗了更多的思考token。这一点与上面整体回复长度变化的结果一致,小尺寸的模型往往需要更多CoT tokens。

模型的输出长度变化主要是由CoT 的变化带来的。模型输出的答案tokens 几乎不变(在8~16 tokens 之间)。思维链的长短显著变化直接影响了最终输出的长度变化。

在相同难度类型的任务下持续训练时,随着模型性能的不断上升,模型解题CoT 中犯错的步骤在减少,整体CoT 的长度在缓慢下降。以7B 模型上的训练为例,当抵达平台期(step=120)后,模型的输出长度不断在变短,一直缓慢下降(step=300)。我们认为这是因为在相同难度的任务(countdown)下,7B 模型逐渐过拟合到该任务上(测试集性能不断上升)。因此,模型逐渐掌握了正确的思维链而提升了推理能力,相应地减少了错误的推理链token。如图3.2.4(3))为示意,当迭代步数从step=24 开始递增时,推理链路开始边长,模型在Step=72 展现出多种表达式计算的探索路径。同时,在每个表达式计算完毕后,模型会根据当前计算指标与目标值之间的差异反思是否满足要求,并在下一次探索中逐步调整。随着进一步训练(step=72 至step300),模型试错的次数在减少,只需若干次尝试即获得了正确答案。

图3.2.4(3) TinyZero 训练过程中模型推理链变化

Base 模型本身即展现出了相当的推理能力,拥有思维链的基础结构。在Step=0 时直接推理Qwen2.5-7B-Base 模型,模型输出的思维链中已经包含了分步骤思考的几个标志性关键词(First, Next, Finally)。我们认为千问的预训练语料中应该也具备大量的含有branching、self-reflection 等特点的数据。这意味着模型在预训练阶段已经掌握了long CoT 的基本结构是激发反思能力的一个必要条件。一个可行的理解是,RL 本身更多地是激发正确的思维链过程,惩罚肤浅的、错误的思维方式。

为了统计模型在RL 训练过程中的推理链是否得到增强,需分析:1)推理链是否出现了结构化的分步解题,即Reasoning 能力;2)推理链是否表现出了反思,即Self - Reflection 能力。这里依旧采用正则表达式去统计思维链中相应关键词的频数。

对于前者(分步解题),我们考虑以下关键词:

 - Step 1, Step2, ... - 1., 2., ... - First, Second, Next, Finally

对于后者(反思与探索),我们考虑以下关键词:

 rethink, recheck, try again, let's correct it and verify the steps again, recheck, re - evaluate, check again, try again, let's try again, let's think again, too high, too low, close but, try another approach, try different 

分步推理

反射

图3.2.4(4) TinyZero 训练过程中模型CoT 分步推理与反思pattern 变化

如上述图3.2.4(4) 所示,无论是3B 还是7B 的千问Base 模型在step=0 时就已经展现出了一定的分步思考以及反思能力。因此,类R1 的RL 训练方式并不是「凭空创造」了LLM 的CoT 能力,而是在一定程度上引导LLM 偏好正确的、合适的推理链路。在这样的推理链路中,branching/self - reflection 等特性是通过reward function 来鼓励习得的。

相比于分步解题能力,模型的反思能力在训练过程中发生更显著的变化。在Step=0 时,基座模型就已经展现出了比较强的分步骤解题的能力,能够对输入prompt 中"think step by step" 给出较好的响应。但此时模型并不具备较特别强的反思能力,做错的时候模型倾向于重复前序的解法而不去探索新的解法(可能受限于指令理解能力)。虽然使用了分步思考,但出现错误后的反思是无效的,陷入了重复输出的坍塌状态(如图3.2.5(5) 所示)。而且,此时模型似乎忘记了最终的目标是利用这三个数字计算得到目标值(55),探索的解题步骤局限在凑满某个子目标值(19)上,无法跳出次优的路径。

图3.2.4(5) TinyZero 训练过程中Step=0 时基座模型展现的无效反思

随着训练过程的继续,度过输出长度最短(step=24)时刻后,模型逐渐开始具备真正的反思能力。以step=72 时刻为例(图3.2.4(6)),模型输出的推理链路中出现了「Wait, I made a mistake」这样的有效反思状态,针对之前的错误回答进行了有效批判,并继续探索可能的解法,该「高光时刻」预示着模型正经历aha moment。

图3.2.4(6) TinyZero 训练过程递进时反思能力的进化

② GRPO 优化

TinyZero 项目默认使用了PPO 优化算法,我们同时也尝试了替换成GRPO 进行训练。时间有限,我们对于GRPO 的超参没有做过多的调优。在8 GPUs 的算力下设置了rollout 数量为24,并减少train batch size 至8 来避免OOM 问题。我们使用了默认的采样温度系数,训练了约5ep。核心的训练指标如下图3.2.4(7) 所示。

相比于PPO 训练来说,GRPO 的训练更加不稳定。这一点在其他的开源项目复现时也遇到了。无论是千问3B 模型还是7B Base 模型,GRPO 版本的优化呈现出极大的不稳定性,输出长度上的变化幅度比较大。后续优化方向:1)超参的设置得进一步调优;2)GRPO 强依赖采样rollout 的质量,这意味着我们必须尽可能提高rollout 的数量来保证基于组(group)的优势(advantage)估计准确,但是这又会造成单机训练时OOM 问题。后续依赖稳健的多机RL 框架来对超参进行精调,减少训练不稳定的问题。

测试集指标

回复长度

图3.2.4(7) TinyZero (GRPO)训练过程中测试集指标(左)与回复长度(右)的变化

IV. 要約

我们目前基于DeepSeek R1/R1-zero 的大量开源工作从原理上大致还原了DeepSeek 的训练过程,但是需要指出的是,这些尝试大多属于toy dataset 验证性实验,离真正的R1 复现仍有较大的差距。我们认为未来的工作需亟待解决:

  • 支持大规模RL 训练(PPO、GRPO 等)的开源基础框架
  • 用于稳定训练的GRPO 训练超参的自动化调优
  • RL 训练数据的配比(难度、领域、任务等)
  • 基于Instruct 模型训练R1 时,高质量long CoT 的数据获取
  • 合适的惩罚函数设计以保证CoT 思考链质量不退化

应用在业务落地时,我们需要考虑:

  • 模型在给定的prompt 下,结合预训练的基本知识能否正确给出正确的推理结果。任何业务中的「潜规则」都需要显式地定义在prompt 中,并尽可能避免与预训练知识的冲突。
  • 混合通用数据、业务数据与数学、代码类领域任务下的long CoT SFT 数据来给模型先打下一个坚实的思维链范式基础,这有利于提升RL 训练时的稳定性。

希望更多开源社区工作的发布能够促使长思考模型推理能力进一步提升。

五、公开参考资料

  • simpleRL-reason:GitHub - hkust - nlp/simpleRL - reason: This is a replicate of DeepSeek - R1 - Zero and DeepSeek - R1 training on small models with limited data
  • open-r1:GitHub - huggingface/open - r1: Fully open reproduction of DeepSeek - R1
  • [logit - RL](https://github.com/Unakar/Logic - RL):GitHub - Unakar/Logic - RL: Reproduce R1 Zero on Logic Puzzle
  • [tinyzero](https://github.com/Jiayi - Pan/TinyZero):GitHub - Jiayi - Pan/TinyZero: Clean, minimal, accessible reproduction of DeepSeek R1 - Zero
  • [demystify long CoT](https://github.com/eddycmu/demystify - long - cot):GitHub - eddycmu/demystify - long - cot
  • deepscaleR:Notion – The all - in - one workspace for your notes, tasks, wikis, and databases.