Back
Home / Blogs / 技術とトレンド / GRPOによるファインチューニングでパスポートデータ抽出の精度向上

GRPOによるファインチューニングでパスポートデータ抽出の精度向上

2025/03/20
2025/03/20
GRPOによるファインチューニングでパスポートデータ抽出の精度向上

AIモデルを使ったパスポートデータの抽出をより正確に行うことはできないのでしょうか?

その場合、単なるデータの詰め込みではなく、問題を論理的に考えられるモデルが必要です。そこで注目したいのがGroup Relative Policy Optimization(GRPO)というファインチューニング手法です。

GPROは、DeepSeekMath論文で紹介された強化学習(RL)のポストトレーニング技術で、大規模言語モデル(LLM)の推論能力を向上させるために設計されています。従来の教師あり学習(SFT)では対応しきれない入力の微妙な変化にも対応できる適応型の推論能力を身につけられるのが特徴です。

結論から申し上げると、GRPOを活用することで、パスポートデータ抽出の精度を66.58%から94.21%に向上させることができました。

実は、OpenAI o1やo3モデルなどの最新の推論型AIモデルも、同様のトレーニングアプローチを採用していると言われています。

この記事では、Rabiloo AIエンジニアチームが、GRPOを使ってパスポートデータ抽出モデルをファインチューニングする方法をステップバイステップで解説します。

今回は以下を使用します:

  • ベースモデル: Qwen/Qwen2.5-1.5B-Instruct

  • データセット:カスタムパスポート EN データセット

  • トレーニング方法:SFT + GRPO

すべてのコードはGithubで公開しています。

この記事でわかること
  • GRPOが従来のSFTよりも優れている理由

  • パスポートデータ抽出用のデータセット作成方法

  • 教師あり学習(SFT)から強化学習(RL)へのステップアップ方法

  • GRPOを実装するためのコードと設定

  • モデル精度を大幅に向上させるためのポイント

GRPOとは?従来の教師あり学習との違いを解説

GRPOとは?

GRPOとは「Group Relative Policy Optimization(グループ相対ポリシー最適化)」の略で、大規模言語モデル(LLM)の推論能力を向上させるための強化学習手法です。この手法はDeepSeekMath論文で導入され、話題のDeepSeek-R1モデルで実際に活用されています。

従来の教師あり学習(Supervised Fine-Tuning:SFT)は、特定のタスクにモデルを適応させる基本的な方法です。しかし、SFTには「汎化能力の限界」という課題があります。特に構造化データを抽出する場合、入力形式のわずかな違いでエラーが発生することがあります。

例えば、パスポートデータ抽出のような厳密な形式が求められるタスクでは、日付の形式(「DD-MM-YYYY」vs「DD/MM/YYYY」)や名前の表記方法(「Smith John」vs「John Smith」)などの微妙な違いに対応できないケースが多いのです。

GRPOは、これらの限界を克服するために、従来のヒューリスティック検索法に頼らず、強化学習のみを使って最適化します。これにより、モデルは未知の入力バリエーションにも適応できるようになり、より柔軟な推論が可能になります。

Hugging Faceのサイエンスチームは、DeepSeek-R1のトレーニングプロセスを再現するOpen-R1プロジェクトに取り組んでおり、GRPOについての理解をさらに深めることができます。

実装には、TRL(Transformer Reinforcement Learning)ライブラリを使用し、パスポートからの構造化データ抽出を改善することに焦点を当てていきます。

GRPO(Group Relative Policy Optimization) とは、AIが より賢く考えられるように訓練する方法 のひとつです。たとえば、AIにクイズを出して、より良い答えを出せるように何度も学習させるイメージです。この方法を使うと、AIがパスポートの情報を正しく読み取る力をぐっと高めることができます。

GRPOの直感的な理解:迷路を解くロボットの例

GRPOの仕組みを理解するには、具体的な例を見てみるのが一番です。ここでは、迷路を解くロボットを例に説明しましょう。

想像してみてください。あなたは迷路を解くロボットをトレーニングしています。このロボットは目標に到達するために、3つの道(パスA、B、C)から選択できます。

  1. 異なるパスのサンプリング:ロボットは各パスを複数回試して結果を記録します。

    • パスA:3回中2回ゴールに到達

    • パスB:3回中1回ゴールに到達

    • パスC:3回中3回ゴールに到達

  2. パフォーマンス評価:成功率を計算します。

    • パスA → 66.67%の成功率

    • パスB → 33.33%の成功率

    • パスC → 100%の成功率

  3. パスの比較:パスCが最良の選択肢だと特定しますが、他のパスも完全には無視しません。

  4. 戦略の調整:ロボットはパスCを選ぶ確率を増やしますが、一つの解決策に過剰適応するのを避けるため、パスAとBも時々試します。

  5. 制御された更新:パスCを100%選好するのではなく、探索を維持しながら徐々に確率をシフトします。

これがGRPOの本質です。個々の観察ごとにモデルを更新するのではなく、複数の観察を集めてから戦略を調整します。これは、ディープラーニングにおけるミニバッチ勾配更新に似ています。

LLMにおいても同様のプロセスが適用されます。モデルはさまざまな回答を生成し、それらを評価して、最も効果的な回答パターンを学習していきます。ただし、一つの「正解」に固執するのではなく、状況に応じて柔軟に対応できるようバランスを取りながら学習を進めるのです。

GRPOの数学的な仕組み

GRPOの数学的な仕組みは少し複雑ですが、段階的に説明していきます。

  1. ポリシーとアクション

    • ポリシー(πθ)は、モデルの意思決定戦略を定義します。θはトレーニング可能なパラメータです。

    • 状態(s)が与えられると、ポリシーはπθ(a|s)として表される可能なアクションの確率分布を出力します。

    • 目標は、期待累積報酬J(θ)を最大化するようにポリシーパラメータθを最適化することです。

      GRPOの数学的な仕組み:ポリシーとアクション
  2. グループサンプリング

    • 状態(s)に対して、現在のポリシーπθを使って(N)個のアクション{a1,a2,…,aN}をサンプリングします。

    • 各アクションa_iは、ポリシー分布からπθ(ai|s)に従って独立に抽出されます。

  3. 報酬スコアリング

    • 各サンプリングされたアクションa_iは、報酬関数R(a_i)を使って評価されます。

    • この関数は、アクションの質を定量化するものです。

  4. アドバンテージ計算

    • アドバンテージA(a_i)は、アクションa_iがサンプリングされたグループ全体の平均パフォーマンスと比較してどれだけ良いか悪いかを測定します。

    • 正のアドバンテージは平均以上のアクション、負のアドバンテージは平均以下のアクションを示します。

      GRPOの数学的な仕組み:アドバンテージ計算
  5. ポリシー更新

    • GRPOは、アドバンテージが正のアクション(確率を増加)と負のアクション(確率を減少)に基づいてポリシーパラメータθを調整します。

    • この最適化は通常、勾配ベースの方法で行われます。

  6. KLダイバージェンス制約

    • 更新されたポリシーπθが元のポリシーから大きく逸脱しないように、KLダイバージェンス制約が課されます。

    • これにより、安定的かつ段階的なポリシー改善が保証されます。

      GRPOの数学的な仕組み:KLダイバージェンス制約
  7. GRPO目標

    • GRPOの包括的な目標は、ポリシー更新の安定性を維持しながら、期待累積報酬J(θ)を最大化することです。

    • これは、アドバンテージによって導かれる報酬改善とKLダイバージェンス制約のバランスを取ることによって達成されます。

      GRPO目標

これらの数学的な要素が組み合わさることで、GRPOはモデルの推論能力を段階的に向上させ、より正確な結果を生成できるようになります。

従来のPPOとGRPOの違い

PPO(Proximal Policy Optimization)とGRPO(Group Relative Policy Optimization)は両方とも強化学習のアルゴリズムですが、いくつかの重要な違いがあります。以下に主な違いをまとめました:

特徴

PPO

GRPO

更新戦略

アクションごとの更新

グループでのアクション評価

ポリシー調整

クリップされた更新

制御された確率シフト

探索の扱い

エントロピー正則化

適応的な確率シフト

安定性

安定だが適応性に制限あり

安定性と柔軟性のバランス

PPOは個々のアクションを評価して報酬に基づいてモデルを更新しますが、GRPOはアクションのグループを評価し、相対的なパフォーマンスに基づいて更新します。これにより、より安定した学習と、より広範な探索が可能になります。

また、PPOは「絶対的な正しさ」に基づいて学習しますが、GRPOは「相対的な成功」に焦点を当てています。これは、「完璧な回答」が必ずしも明確でない複雑なタスク(文書からの情報抽出など)に特に有効です。

GRPOの相対的な評価アプローチは、モデルがより柔軟な回答戦略を開発し、様々な入力バリエーションに適応することを可能にします。これは、パスポートデータ抽出のような構造化データタスクにおいて特に価値があります。

このような違いから、GRPOはより洗練された推論能力を必要とするタスクに対して、PPOよりも優れたパフォーマンスを発揮する可能性があります。

パスポートデータ抽出へのGRPO適用方法

パスポートからのデータ抽出は、OCR(光学文字認識)技術の進歩によって大きく改善されてきましたが、抽出されたテキストから構造化情報を正確に取り出すことは依然として課題です。パスポート番号、氏名、国籍、発行日など、各フィールドの正確な抽出は、入国管理や本人確認システムなどの重要なプロセスにおいて必須です。

GRPOのようなファインチューニング技術は、ロボットが迷路を学習するのと同様に、LLMがパスポートデータから情報を抽出する方法を段階的に改善します。パスポートデータ抽出におけるGRPO適用は、まさに「ロボットが複数の経路を試し、最良の道を学ぶ」ように、モデルが複数の抽出戦略を評価し、最も効果的なアプローチを学習していく過程です。

パスポートデータ抽出の課題

パスポートデータ抽出は一見シンプルな作業に思えるかもしれませんが、実際には多くの課題があります:

  1. レイアウトの多様性:世界各国のパスポートはデザインや情報の配置が異なり、統一されていません。

  2. フォーマットの不一致:日付、名前、国籍などの表記方法は国ごとに異なります(例:「DD-MM-YYYY」vs「MM/DD/YYYY」)。

  3. OCRエラー:OCRによるテキスト認識の段階でエラーが発生する可能性があります。

  4. 特殊文字と言語:非英語圏のパスポートには、特殊文字やアクセント記号などが含まれることがあります。

  5. MRZ(機械読取領域)の複雑さ:パスポートの下部にある機械読取可能な文字列(MRZ)は厳密な形式に従っており、この解析には高い精度が求められます。

  6. データの一貫性確認:パスポート上の複数の場所に記載された同じ情報(例:名前がヘッダーとMRZの両方に表示される)の一貫性を確認する必要があります。

これらの課題に対して、従来の教師あり学習(SFT)モデルでは、学習データに含まれていない新しいフォーマットやバリエーションに適応することが難しいという限界がありました。

GRPOによる解決アプローチ

GRPOはこれらの課題に対して、以下のようなアプローチで解決を図ります:

  1. 多様な抽出戦略の評価

    • モデルは様々なパスポート形式でのデータ抽出戦略を試行し、それぞれの成功率を評価します。

    • 例えば、「日付を先に抽出するか、名前を先に抽出するか」といった抽出順序の戦略を比較し、最適なアプローチを学習します。

  2. 相対的成功に基づく学習

    • 絶対的な正解だけでなく、部分的に正解した抽出結果も評価対象とし、モデルの学習に活用します。

    • 例えば、10項目中8項目が正しく抽出された場合、完全に失敗とはみなさず、80%の成功として評価します。

  3. 制御された更新プロセス

    • 学習の過程で急激な変更を避け、段階的にモデルを改善することで、過学習を防ぎます。

    • これにより、様々なパスポートフォーマットに対する汎化能力が向上します。

  4. ステップバイステップの推論過程

    • GRPOを通じて、モデルは単に結果を出力するのではなく、推論過程を明示的に表現することを学びます。

    • これにより、「なぜこの情報をこのように抽出したのか」という理由付けが可能になります。

実際のGRPO適用では、モデルは以下のような具体的な能力を獲得します:

  • MRZコードの正確な解析:機械読取領域の複雑な文字列を正確に抽出し、その構造を理解する能力

  • 一貫性チェック:パスポート内の異なる場所に記載された同じ情報の整合性を確認する能力

  • 欠損データの処理:特定の情報が欠けている場合に適切に「null」と判断する能力

  • 日付形式の標準化:様々な形式で記載された日付を統一された形式に変換する能力

これらの能力は、単純なSFTでは十分に獲得できないものであり、GRPOのような強化学習アプローチが特に効果を発揮する部分です。次のセクションでは、このGRPOを実際にモデルに適用するための具体的なトレーニングプロセスについて説明します。

トレーニングプロセス:教師あり学習から強化学習へ

パスポートデータ抽出のための推論モデルを構築するには、段階的なアプローチが効果的です。まず教師あり学習(SFT)でベースとなるモデルを構築し、その後GRPOによる強化学習でモデルの能力をさらに高めていきます。この二段階アプローチにより、モデルはより正確かつ柔軟なデータ抽出能力を獲得できます。

今回の実験では、下記の構成でトレーニングを行いました:

  • ベースモデル:Qwen/Qwen2.5-1.5B-Instruct

  • データセット:カスタムPassport ENデータセット

  • トレーニング方法:SFT + GRPO

それでは、各ステップの詳細を見ていきましょう。

パスポートデータセットの作成方法

高品質なパスポートデータ抽出モデルを構築するためには、多様で豊富なパスポートサンプルのデータセットが必要です。今回は、データの構造化と推論過程の学習を重視した独自のデータセット作成アプローチを採用しました。

まず、生のパスポート画像やテキストを機械学習モデルが効率的に処理できる構造化形式に変換する必要があります。そのために、トークンベースの表現システムを開発し、重要な詳細情報を機械可読形式でエンコードしました。

さらに、単純な構造化だけでなく、この形式をモデルが効果的に処理できるような直感的な推論ベースの表現に変換しました。これにより、情報抽出タスクのステップバイステップのナビゲーションシーケンスを生成できるようになりました。

Camel-AIからインスピレーションを得て、データ生成のためのマルチエージェントフレームワークを活用し、Gemini APIを使ってデータセットの推論部分を生成しました。その結果、400例からなるデータセットを作成し、GitHubで公開しています。

データセットの構造は以下の通りです:

フィールド抽出:パスポートから以下の重要情報を体系的に抽出します。

  • パスポート番号

  • 氏名

  • 性別

  • 国籍

  • 生年月日

  • 出生地

  • 発行日

  • 有効期限

  • 発行地(利用可能な場合)

  • 機械読取領域(MRZ)

トークンベース表現:フリーテキスト抽出に頼るのではなく、パスポートデータを構造化トークンにエンコードし、すべてのエントリ間で統一性を確保します。

エンティティトークン:各抽出フィールドは特殊なトークンでラップされ(例:"passport_number": "200858064")、モデルが重要な詳細を識別・処理しやすくなります。

日付フォーマット:すべてのサンプルで一貫性を維持するため、日付は統一された形式(DD-MM-YYYY)に標準化されます。

MRZエンコーディング:機械読取領域(MRZ)は主要な機能として保存され、抽出された詳細のクロス検証が可能になります。

データセット構造:データセット内の各パスポートエントリは以下の構造化形式に従います:

{
    "passport_number": "200858064",
    "full_name": "Daniel Warren",
    "gender": "M",
    "nationality": "United Kingdom",
    "dob": "06-05-1945",
    "place_of_birth": "Gloucestershire",
    "place_of_issue": null,
    "issue_date": "12-12-2020",
    "expire_date": "06-05-2032",
    "mrz": "PAGBRDANIEL<<WARREN<<<<<<<<<<<<<<<<<<<<<<<<<\\nB1137484W7GBR4505064M3205068200858064<<<<<50"
}

このように構造化されたデータセットにより、ドキュメント分析、本人確認、自動データ抽出のためのAIモデルのトレーニングが最適化され、実世界のアプリケーションに高い信頼性とスケーラビリティをもたらします。

ステージ1:教師あり学習(SFT)でベースモデルを構築

パスポートデータ抽出用の教師あり学習(SFT)の目標は以下の2点です:

  1. 生のOCRテキストから構造化されたパスポート情報を正確に抽出するようモデルをトレーニングする

  2. 後の強化学習やファインチューニングの段階のための強力なベースラインを確立する

今回は、2つのトレーニング戦略を検討しました:

  1. 直接抽出モデル:モデルが生のOCRテキストから直接すべてのパスポートフィールドを予測するようトレーニング

  2. ステップバイステップ抽出モデル:モデルが各フィールドを順番に抽出し、情報の一貫性を検証するための中間推論を組み込む(例:MRZデータと抽出されたフィールドのクロスチェック)

SFTのハイパーパラメータ設定:

パラメータ

model_name_or_path

Qwen/Qwen2.5-1.5B-Instruct

disable_gradient_checkpointing

true

finetuning_type

lora

deepspeed

ds0

cutoff_len

4096

train_on_prompt

true

per_device_train_batch_size

32

gradient_accumulation_steps

1

learning_rate

1.0e-5

num_train_epochs

1.0

lr_scheduler_type

cosine

warmup_ratio

0.1

bf16

true

モデルのトレーニングには、llama-factoryを使用しました。ファインチューニングのパフォーマンスをベンチマークするため、2つのRTX 3090 GPUを搭載したシステムでモデルをトレーニングしました。トレーニング時間は以下の通りです:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

2x RTX 3090

2

約7分45秒

約3.10秒

比較のため、A100 GPUでもモデルをファインチューニングして効率を評価しました:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

1x A100

1

約4分30秒

約1.80秒

ステージ2:GRPOで推論能力を強化

教師あり学習(SFT)を完了した後、グループ相対ポリシー最適化(GRPO)を適用して、モデルの抽出能力をさらに洗練させました。GRPOは、モデルが自身の生成した抽出結果から学習し、精度と堅牢性を反復的に向上させるのに役立ちます。

GRPO報酬関数の構築 強化学習には適切に設計された報酬関数が不可欠です。パスポート抽出の精度を評価する複合報酬関数を開発しました:

  1. フォーマット報酬

    • 目的:モデルが構造化形式で出力するよう保証

    • メカニズム:事前定義された構造(例:<think>...</think> <answer>...</answer>)に従っているか正規表現で検証

    • 報酬:正しくフォーマットされた出力で+1.0、それ以外は0.0

  2. 精度報酬

    • 目的:モデルの出力が真値と一致するか確認

    • メカニズム:

      • モデルのJSON出力をラベル付きデータと比較

      • 抽出されたフィールドが真値と完全に一致する場合、モデルは満点の報酬を受け取る

      • 一部のフィールドのみが一致する場合、報酬は正しく抽出されたフィールドの数に比例

    • 報酬:完全一致で+1.0、部分的な正解には部分スコア、無効なJSONには0.0

  3. 総報酬計算

    • 最終報酬 = フォーマット報酬 + 精度報酬

    • 最大可能報酬:2.0

GRPOトレーニングのハイパーパラメータ

パラメータ

learning_rate

1e-6

alpha

32

r

8

weight_decay

0.1

warmup_ratio

0.1

lr_scheduler_type

cosine

optim

paged_adamw_8bit

per_device_train_batch_size

8

gradient_accumulation_steps

1

num_generations

4

max_prompt_length

2048

max_completion_length

2048

max_grad_norm

0.1

GRPOを活用することで、モデルは抽出精度を継続的に向上させながら、構造化された検証済みの出力を維持し、実世界のパスポートデータ抽出アプリケーションに非常に効果的なものになりました。

ファインチューニング結果の比較:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

2x RTX 3090

2

約38分24秒

約24.25秒

ポリシー最適化の複雑さのため、GRPOのファインチューニングは他のモデルよりも時間がかかります。比較のため、単一のA100 GPUでのファインチューニング時間の推定値を示します:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

1x A100

1

約22分

約13.9秒

教師あり学習と比較して、GRPOによるファインチューニングがより計算集約的であることがわかります。これは、複数の生成と評価を行うことによる計算オーバーヘッドを反映しています。しかし、このコストに見合う精度の向上が得られることを次のセクションで見ていきます。

GRPOの実装方法とコード解説

GRPOを実際に実装するためには、データの準備から報酬関数の設計、効率的なファインチューニングまで、いくつかの重要なステップがあります。ここでは、パスポートデータ抽出タスクに適用したGRPOの具体的な実装方法を解説します。

データ準備と会話形式の構造化

トレーニング前に、データセットを適切に整形する必要があります。各データサンプルは、ユーザーのクエリ(パスポートデータ)とアシスタントのレスポンス(抽出された構造化詳細)で構成されます。モデル用に会話をストラクチャ化するためのヘルパー関数を使用します:

def make_conversation(example):
    """トレーニング用の会話データを準備する"""
    conversation = example["conversations"]

    user_content = next((msg["content"] for msg in conversation if msg["role"] == "user"), "")
    assistant_content = next((msg["content"] for msg in conversation if msg["role"] == "assistant"), "")

    SYSTEM_PROMPT = """
        Respond in the following format:
        <think>
        Explain the steps taken to extract the requested information from the provided data. Mention any challenges, assumptions, or decisions made (e.g., date formatting, handling missing data). Ensure confidence in the extracted data and avoid guessing.
        </think>
        <answer>
        Provide the extracted information in JSON format based on the specified schema. Include only the fields listed in the schema and return null for any missing data.
        </answer>

        Task:
        Extract information from the provided document ONLY if you are confident. Do not guess or make up answers. Return the extracted data in JSON format according to the schema below. List the extracted information in the order it appears in the document.

        Output schema:
        {
            "id_number": "ID number of the person",
            "passport_number": "Passport number of the person",
            "full_name": "Full name of the person",
            "gender": "Gender of the person",
            "nationality": "Nationality of the person",
            "dob": "Date of birth of the person (format: DD MMM YYYY, e.g., 26 JUL 1969)",
            "place": "Place of birth of the person",
            "place_issue": "Place of issue of the passport",
            "issue_date": "Date of issue of the passport (format: DD MMM YYYY)",
            "expire_date": "Date of expiry of the passport (format: DD MMM YYYY)",
            "mrz": "Machine Readable Zone (full two-line code)"
        }
    """

    return {
        "prompt": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_content},
        ],
        "response": assistant_content
    }

この関数をデータセットに適用して、トレーニング用の入力を構造化します。

システムプロンプトには、モデルが従うべき出力形式が指定されています。この例では、モデルに以下の2つの部分からなるレスポンスを生成するよう指示しています:

  1. <think> セクション:情報抽出のプロセスを説明する推論部分

  2. <answer> セクション:抽出した情報をJSON形式で提供する部分

これにより、モデルは単に結果を出力するだけでなく、どのようにその結果に到達したかの推論過程も示すことができます。

報酬関数の設計:形式と正確性

GRPOはモデルを報酬信号を使って最適化します。ここでは2つの報酬関数を定義します:

  1. フォーマット報酬:モデルが特定の構造化された形式で出力するようにする

  2. 精度報酬:モデル出力を正解データと比較する

フォーマットベースの報酬関数

import re

def format_reward(completions, **kwargs):
    """レスポンスが特定のフォーマットに従っているかを確認する報酬関数"""
    pattern = r"^<think>[\\s\\S]*?</think>\\s*<answer>\\s*\\{[\\s\\S]*?\\}\\s*</answer>\\s*$"
    completion_contents = [completion[0]["content"] for completion in completions]
    print("format completion: ", completion_contents)
    return [1.0 if re.match(pattern, content) else 0.0 for content in completion_contents]

この関数は、モデルが出力内で構造化された推論プロセスを維持することを確認します。モデルの回答が<think>...</think><answer>...</answer>の形式に従っている場合、1.0の報酬が与えられます。

精度ベースの報酬関数

def accuracy_reward(prompts, completions, **kwargs):
    """モデル出力が正解と一致するかをチェックする報酬関数"""
    rewards = []

    conversations_list = kwargs.get("conversations", [])
    for completion, conversations in zip(completions, conversations_list):

        try:
            # アシスタントのレスポンスから正解を取得
            assistant_response = next(
                (msg["content"] for msg in conversations if msg["role"] == "assistant"),
                ""
            )

            # モデル出力を取得
            model_output = completion[0]["content"]
            json_match = re.search(r"</think>\\s*<answer>\\s*(\\{[\\s\\S]*\\})\\s*</answer>\\s*$", model_output, re.DOTALL)

            assistant_match = re.search(r"</think>\\s*(\\{[\\s\\S]*\\})\\s*$", assistant_response)

            if json_match:
                json_str = json_match.group(1)
            else:
                rewards.append(0.0)
                continue

            assistant_response = assistant_match.group(1)

            # 比較のためにJSON辞書に変換
            parsed_solution = json.loads(assistant_response)
            parsed_output = json.loads(json_str)

            # 完全一致(1.0)または一致フィールド比率を計算
            if parsed_solution == parsed_output:
                rewards.append(1.0)
            else:
                matching_keys = sum(
                    1 for key in parsed_solution if key in parsed_output and parsed_solution[key] == parsed_output[key])
                total_keys = len(parsed_solution)
                rewards.append(matching_keys / total_keys)
        except Exception:
            rewards.append(0.0)  # JSONやフォーマットエラーの場合は0を返す

    return rewards

この関数は、全か無か(all-or-nothing)のアプローチではなく、一部のフィールドが一致する場合に部分的なクレジットを提供します。例えば、10のフィールドのうち8つが正確に抽出されていれば、0.8の報酬が与えられます。

これらの報酬関数の組み合わせにより、モデルは適切な形式と高い精度の両方を持つ出力を生成するよう促されます。

LoRAを使った効率的なファインチューニング

データセットと報酬関数の準備ができたら、LoRA(Low-Rank Adaptation)ファインチューニングを使用してGRPOでモデルをトレーニングします。

LoRAは、大規模言語モデルの効率的なファインチューニングを可能にする手法で、リソース制約のあるシナリオ(限られたGPUメモリなど)でも高品質なファインチューニングを実現できます。

トレーニングスクリプト

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model
from trl import GRPOTrainer, GRPOConfig
from datasets import load_dataset
import wandb
import torch

def train_model(args):
    """GRPOを使用してモデルをトレーニングする"""
    # wandbの初期化
    wandb.init(project="grpo")

    # データセットの読み込みと前処理
    dataset = load_dataset("json", data_files=args.dataset, split="train")
    dataset = dataset.map(make_conversation)

    # データセットの分割
    train_test_split = dataset.train_test_split(test_size=0.1)
    train_dataset = train_test_split["train"]
    test_dataset = train_test_split["test"]

    # モデルの読み込み
    model = AutoModelForCausalLM.from_pretrained(
        args.model_id,
        torch_dtype="auto",
        device_map="auto",
    )

    # LoRAの設定
    lora_config = LoraConfig(
        task_type="CAUSAL_LM",
        r=8,
        lora_alpha=32,
        lora_dropout=0.1,
        target_modules=["q_proj", "v_proj"],
    )

    model = get_peft_model(model, lora_config)
    model.print_trainable_parameters()

    # トレーニング引数の設定
    training_args = GRPOConfig(
        output_dir=args.output_dir,
        learning_rate=args.learning_rate,
        remove_unused_columns=False,
        gradient_accumulation_steps=args.batch_size,
        num_train_epochs=args.epochs,
        bf16=True,
        max_completion_length=2048,
        num_generations=4,
        max_prompt_length=2048,
        report_to=["tensorboard"],
        logging_steps=10,
        push_to_hub=True,
        save_strategy="steps",
        save_steps=10,
    )

    # GRPO Trainerの初期化とトレーニング
    trainer = GRPOTrainer(
        model=model,
        reward_funcs=[format_reward, accuracy_reward],
        args=training_args,
        train_dataset=train_dataset
    )

    trainer.train()
    trainer.save_model(training_args.output_dir)
    trainer.push_to_hub(dataset_name="passport_en_grpo")

このスクリプトは以下の操作を行います:

✅ データセットの読み込みと処理

✅ 効率的なファインチューニングのためのLoRAの適用

✅ 定義された報酬関数を使用したGRPOでのモデルトレーニング

✅ モデルの保存とアップロード

2つのRTX 3090 GPUを搭載したシステムでのGRPOのファインチューニング結果は以下の通りです:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

2x RTX 3090

2

約38分24秒

約24.25秒

ポリシー最適化の複雑さから、GRPOはファインチューニングに時間がかかります。

比較のため、単一のA100 GPUでのファインチューニング時間の見積もりも示します:

ハードウェア

GPU数

総トレーニング時間

ステップあたりの時間

1x A100

1

約22分

約13.9秒

GRPOは標準的なSFTよりも計算負荷が高いですが、後のセクションで見るように、精度の向上によってこのトレードオフが正当化されます。

実装のポイント

  1. LoRAパラメータの選択r=8およびlora_alpha=32という設定は、パラメータ効率とパフォーマンスのバランスを取るために選ばれています。

  2. 報酬関数の重み付け:このサンプルでは、フォーマット報酬と精度報酬は同じ重みで扱われていますが、タスクの要件に応じてこれらの重みを調整することも可能です。

  3. 生成数num_generations=4は、各プロンプトに対して4つの異なる回答を生成し、それらを比較評価することを意味します。この数を増やすとより多様な解をサンプリングできますが、計算コストも増加します。

  4. コンテキスト長max_prompt_length=2048max_completion_length=2048は、長いパスポートテキストと詳細な抽出を処理するのに十分な長さを確保します。

GRPOを使用する際の主な課題は、報酬関数の設計です。報酬はモデルの行動を直接形作るため、慎重に設計する必要があります。また、コールドスタート(SFTなしで直接GRPOから始める)も難しいため、SFTでモデルを初期化してからGRPOを適用する二段階アプローチが推奨されます。

結果と考察:GRPOの効果

パスポートデータ抽出タスクにおけるGRPOの効果を評価するため、200ファイルのテストデータセットで包括的な評価を行いました。教師あり学習(SFT)とGRPOの両方のアプローチを比較し、各モデルの強みと限界を分析しました。ここでは、その結果と重要な知見を共有します。

モデル精度の比較検証

教師あり学習(SFT)とGRPOポストトレーニングの両方で、ベースとなるQwen2.5-1.5Bモデルに対して大幅な精度向上が見られました。以下の表は、各モデルの精度を比較したものです:

モデル名

精度 (%)

備考

Qwen2.5-1.5B-Instruct

66.58%

ベースのinstructモデル、MRZなどの構造化フィールドで苦戦

Qwen2.5-14B-Instruct

70.00%

大規模モデルだが、1.5B-Instructモデルからの改善はわずか

Qwen2.5-1.5B-SFT-LoRA

87.62%

SFTとLoRAで大幅に改善したが、MRZエラーは残存

Qwen2.5-1.5B-SFT-LoRA-GRPO

94.21%

最高のパフォーマンス、GRPOによりMRZ抽出が改善

教師あり微調整とGRPO後トレーニングの結果

この結果から、いくつかの重要なポイントが見えてきます:

  1. 単純なモデルスケーリングの限界:Qwen2.5-14B-Instructモデル(14Bパラメータ)は、1.5B-Instructモデルと比較してわずか3.42%の精度向上しか見られませんでした。これは、単にモデルサイズを大きくするよりも、目的に特化したファインチューニングの方が効果的であることを示しています。

  2. SFTの効果:教師あり学習(SFT)を適用することで、ベースモデルから21.04%もの大幅な精度向上が実現できました。これは、明示的な教師データによる学習がこのタスクに非常に有効であることを示しています。

  3. GRPOの付加価値:SFTモデルからさらにGRPOを適用することで、追加で6.59%の精度向上が得られました。特に、MRZ(機械読取領域)のような複雑な構造化フィールドの抽出精度が向上しました。

  4. 小規模モデルの可能性:1.5Bパラメータという比較的小さなモデルでも、適切なファインチューニング技術を組み合わせることで94%以上の高い精度を達成できました。これは、計算リソースの制約がある状況でも高品質なモデルを構築できることを示しています。

これらの結果は、構造化データ抽出タスクにおいてGRPOが持つ強化学習の効果を明確に示しています。

各モデルのパフォーマンス差の理由

各モデル間の精度差がなぜ生じたのかを深く掘り下げてみましょう:

  1. ベースモデル(Qwen2.5-1.5B-Instruct)の限界

    • 一般的な言語理解には優れていますが、パスポートのような特殊なフォーマットの構造化データ抽出には最適化されていません。

    • 特にMRZコードのような厳密な形式のデータ抽出で多くのエラーが発生しました。

    • 日付形式の標準化や欠損データの適切な処理が不十分でした。

  2. SFTモデル(Qwen2.5-1.5B-SFT-LoRA)の改善点

    • 多様なパスポートサンプルからのパターン学習により、基本的なフィールド抽出が大幅に向上。

    • システムプロンプトに従った構造化出力の生成が可能に。

    • しかし、「見たことがない」フォーマットバリエーションに弱く、特にMRZのような複雑なフィールドで一貫性に欠ける場合がありました。

  3. GRPOモデル(Qwen2.5-1.5B-SFT-LoRA-GRPO)の優位性

    • 部分的に正しい抽出からも学習できるため、完全に正確でない結果からも改善が可能。

    • 複数の抽出戦略を評価・比較することで、最適なアプローチを学習。

    • モデルが自身の推論過程を明示的に表現することを学び、抽出の一貫性が向上。

    • 特にMRZなどの厳密な形式を持つフィールドでの精度が大幅に向上。

GRPOの主な強みは、「正解か不正解か」という二元的な評価ではなく、「どれだけ正確か」という連続的な評価に基づいて学習できることです。これにより、モデルは部分的な成功からも学び、徐々に性能を向上させることができます。

また、GRPOはモデルに推論過程を明示化させることでより透明性のある抽出プロセスを実現し、最終的な精度向上にも寄与していると考えられます。

残された課題と改善点

GRPOによるファインチューニングで大幅な精度向上が見られましたが、いくつかの課題と改善の余地も残されています:

  1. 一部のフィールドでの抽出エラー

    • 94.21%という高い精度に達したものの、依然として約6%のエラーが存在しています。

    • 特に、非標準的な表記や特殊なパスポート形式での抽出精度に改善の余地があります。

  2. 推論データの品質

    • 無料のGemini APIを使用して生成された「think」データの品質が、必ずしも最適ではない可能性があります。

    • より高品質な推論シーケンスを使用することで、さらなる改善が期待できます。

  3. 計算効率

    • GRPOは標準的なSFTと比較して計算負荷が高く、トレーニング時間が長くなります。

    • 将来的には、Unslothなどの最適化ツールを活用することで、トレーニング効率を向上させることが検討されています。

  4. 評価メトリクスの拡張

    • 現在の評価は主に完全一致や部分一致に基づいていますが、フィールドの重要度を考慮した重み付け評価などの導入も検討できます。

    • 例えば、パスポート番号の正確な抽出は名前の抽出よりも重要かもしれません。

  5. マルチモーダル拡張

    • 現在のアプローチはテキストベースですが、将来的にはVision-Language Models(VLMs)を用いて画像から直接情報を抽出する方向性も考えられます。

    • これにより、OCRエラーの影響を軽減し、エンドツーエンドの抽出精度を向上させる可能性があります。

  6. 多言語対応

    • 現在のモデルは主に英語のパスポートに最適化されています。

    • 多言語パスポートへの対応を拡大することで、より汎用的なソリューションになるでしょう。

これらの課題に対応するために、今後は報酬関数の洗練、カリキュラム学習などの高度な最適化手法の導入、およびVLMとの統合などが検討されています。

GRPOは強力なアプローチですが、より高度な強化学習技術やマルチモーダル拡張との組み合わせにより、さらなる進化が期待できるでしょう。

まとめ:GRPOによる推論モデルのファインチューニング

本記事では、Group Relative Policy Optimization(GRPO)を活用した推論モデルのファインチューニングによるパスポートデータ抽出の精度向上について解説しました。

GRPOは、DeepSeekMath論文で紹介された強化学習(RL)のポストトレーニング技術であり、大規模言語モデル(LLM)の推論能力を向上させるために設計されています。この手法は、従来の教師あり学習(SFT)で対応しきれない入力の微妙な変化にも適応できる柔軟な推論能力をモデルに与えることができます。

主なポイントを振り返ると:

  1. GRPOの仕組み:GRPOは、複数の回答候補を生成・評価し、相対的なパフォーマンスに基づいてモデルを更新するアプローチです。迷路を解くロボットの例のように、モデルは異なる戦略を試し、最も効果的なアプローチを学習します。

  2. 二段階アプローチの有効性:まず教師あり学習(SFT)でベースラインを確立し、その後GRPOでさらに推論能力を強化する二段階アプローチが効果的でした。ベースモデルの66.58%から、SFTで87.62%、最終的にGRPOで94.21%まで精度が向上しました。

  3. LoRAの効率性:Low-Rank Adaptation(LoRA)を用いることで、限られた計算リソースでも効率的にファインチューニングを実現できました。

  4. 報酬関数の重要性:フォーマットと精度の2つの観点から報酬を設計することで、モデルが適切な形式と高い精度の両方を持つ出力を生成するよう促すことができました。

  5. 小規模モデルの可能性:適切なファインチューニング技術を組み合わせることで、1.5Bパラメータという比較的小さなモデルでも94%以上の高い精度を達成できました。単にモデルサイズを大きくするよりも、目的に特化したファインチューニングの方が効果的である場合が多いことが示されました。

今後の課題としては、一部のフィールドでの抽出エラー、計算効率の改善、多言語対応の拡大などがあります。また、VLMとの統合によるエンドツーエンドの抽出精度向上も期待される方向性です。

GRPOのようなファインチューニング技術は、パスポートデータ抽出だけでなく、医療記録の分析、法的文書の処理、財務データの抽出など、様々な構造化データ抽出タスクに応用できる可能性があります。AIモデルの推論能力を高め、より正確で信頼性の高いデータ抽出を実現するこの技術は、今後のAI応用においてさらなる発展が期待されます。

GRPOを活用したファインチューニングに関するさらなる研究や実装の詳細については、公開されているGitHubリポジトリや、関連論文を参照されることをおすすめします。

Rabilooの次世代AIソリューション開発サービス

Rabiloo(ラビロー)では、この記事で紹介したGRPOなどの最先端技術を含む、包括的なAI開発・ソリューションサービスを提供しています。私たちは、お客様のビジネスの成長と課題解決を中心に考えた、カスタムAIソリューションを実現します:

  • AIシステム開発:ビジネスプロセスの自動化、データ分析・予測、知的検索システムなど幅広いAIアプリケーション

  • データ抽出・分析ソリューション:パスポート、請求書、医療記録など、複雑な構造化データの高精度抽出と分析

  • カスタムモデル開発:自然言語処理、画像認識、異常検知など、お客様の固有のニーズに適したAIモデル開発

  • エンドツーエンドAIインテグレーション:要件定義から導入・保守まで一貫したサポート

Rabilooのベトナムを拠点とするエンジニアチームは、先端技術に精通し、ビジネス視点と技術力を兼ね備えたアプローチで、コスト効率の高いソリューションを設計します。私たちはテクノロジーを単なるツールとしてではなく、お客様のビジネス成長を加速させる原動力として活用します。

業務効率化、コスト削減、新しいビジネス機会の創出など、AIを活用したビジネス変革をお考えの方は、ぜひRabilooにご相談ください。お客様と共に成長する信頼できるテクノロジーパートナーとして、長期的な価値を創造します。

Share


Ngo Phong
RabilooのAIエンジニアとして3年以上の経験を持ち、機械学習や自然言語処理(NLP)を活用したソリューション開発に従事。データ分析、モデル設計、システム実装まで幅広い業務を手がけ、ビジネス課題の解決にAI技術を応用している。
Find blog
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
Kakimoto Kota
2024/01/03
2024/10/28
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
Kakimoto Kota
2023/11/28
2025/01/08

We’re here to help you

Please fill in the blank
Please fill in the blank
Please fill in the blank
Please fill in the blank
Find blog
Tags
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
Kakimoto Kota
2024/01/03
2024/10/28
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
Kakimoto Kota
2023/11/28
2025/01/08

Let’s talk

Please fill in the blank
Please fill in the blank
Please fill in the blank
Please fill in the blank