ドキュメント

自分の意思決定で Laya をファインチューニングする

自分の意思決定で Laya をファインチューニングする

typed-decisions ベンチマークでは、ベースのチェックポイントはゼロショットで偶然と同水準です(0.318 のランダムベースラインに対して 0.36 と 0.35)。一方、ファインチューニング後のチェックポイントは同じ 2,000 件の意思決定で 0.766 に達し、TypeSafe Jev の公表値 0.727 と教師の自己一致の上限 0.735 を上回ります。価値の大半はファインチューニングにあり、公開されているファインチューニングノートブックが Kaggle の無料 2xT4 GPU でループ全体を実行します。データセットを構築し、RLCD で学習し、キャリブレーション用の temperature を当てはめ、評価し、結果を Hub にプッシュします。このページはそのノートブックを辿り、データを自分のものに差し替えたときも要になる部分を指します。

もう 1 つの実例 —— 有料 API なしで 16 GB の GPU 1 台に載せるブラウザエージェントの意思決定ヘッド —— はブラウザエージェントの意思決定ヘッドとしての Laya のファインチューニングにあります。

ノートブックの手順

# ステップ 起きること
1 環境 2 台の T4 GPU が見えていて割り当てられていることを確認します
2 インストール laya、transformers、datasets と学習用の依存関係
3 前処理 1,200 件の学習ケース(6,000 件の型付き意思決定)がソフトターゲット付きのトークン化済みアイテムになり、両方の DDP ランク用にディスクへ書き出されます
4 学習 torchrun --nproc_per_node=2 の下で train_ddp.py を 4 エポック
5 キャリブレーション 型ごとに 1 つの temperature を、学習前に取り分けたスライスで当てはめます(学習スクリプト内、最終エポックの後)
6 評価 公式の test スプリットをファインチューニング済みチェックポイントで解答(400 ケース、2,000 件の意思決定)。ケースごとのレイテンシ付き
7 指標 accuracy、soft accuracy、Brier、ECE、score MAE、within-one-level、KL/TV、レイテンシのパーセンタイル。Jev と教師の上限に対する直接対決の表
8 公開 (任意)実行自身の数値から作ったモデルカード。フォルダを Hub へアップロード
9 レポート 指標表とワークフローごとの accuracy を含む benchmark_report.json

Kaggle の設定:Accelerator は GPU T4 x2、Internet は On。出力は /kaggle/working/laya_finetuned_typed_decisions に置かれます。

学習レシピ

RLCD はベンチマークの正解分布で学習し、ハードラベルでは学習しません。各アイテムは教師が各選択肢に割り当てた確率を持ち、損失の両方の半分がそのターゲットを読みます。

  • サンプリングしたノイズ付きロジット射影に対する方策勾配の項(GRPO 風:アイテムあたり 4 サンプル、探索ノイズを 0.4 → 0.1 にアニーリング)。適切なスコアリングルール(球面 0.75、順位確率 1.0)で報酬付けします。
  • 同じ分布に対する全重みのソフトクロスエントロピーの項。

16 GB のカード向けにノートブックが設定するつまみ:

エポック 4
実効バッチ 64 系列(マイクロバッチあたり 8、GPU 2 台、蓄積 4 ステップ)
学習率 encoder 2.5e-5、head 1e-4 —— AdamW、コサインスケジュール
メモリ fp16 autocast、encoder と head の勾配チェックポインティング、勾配ノルムのクリップ 1.0
系列予算 max_len 1024、head_max_len 256、max_tokens_per_batch 4096

2xT4 での実行時間は、デモなら分単位、実データなら時間単位です。デモの 6,000 件の意思決定で約 4〜6 分、約 30k 問で 4 エポックならおよそ 4〜5 時間です。

自分のデータに向けるには、2 つの load_dataset 呼び出しを差し替え、行のスキーマを保ってください。各ケースは state・questions・gold(質問ごとの教師確率)を持ち、前処理器がそれらをアイテムに変えます。質問の型は choice・score・noul です。state に対してこれらで表現できるものは何でも対象になります。

キャリブレーションは実行の一部

これはループをコピーするときに最も落とされやすいステップで、誰かが信頼度でゲートした瞬間に要になります。

ノートブックはランクに分割する前に学習データからキャリブレーション用のスライスを取り分けます(最大 400 アイテム、または 10%、固定シード、すべてのランクで同一)。実行がすでに学習したアイテムに temperature を当てはめると、キャリブレーションではなく当てはまりを測ってしまいます。モデルはそれらに対してほぼ確信を持ってほぼ正しいので、最適化器は柔らかくする対象がなく、縮退したスケールを返します。

最終エポックの後、ランク 0 が質問の型ごとに 1 つの temperature(choice、score、noul)を、log-temperature に対する LBFGS で当てはめ、[0.1, 10] にクランプします(10 アイテム未満のスライスでは 1.0、当てはめが例外を投げたら 1.2)。値は temperature として rl_agent_config.json に入り、ノートブックは同じ書き込みで継承した temperature_by_options を削除します。それらの古いバケット値は推論時に優先され、新しい当てはめを黙って覆い隠すからです。

Temperature スケーリングは argmax、つまり accuracy を変えません。動くのは信頼度です。出荷時のチェックポイントは過信なので、しきい値に頼る前に当てはめ、改善を主張する前に未見データで結果を評価してください。config 永続化の回帰はダウンロードも学習もなしで走ります。

python tests/test_calibration_persistence.py

信頼する前に評価する

評価は公式の test スプリット全体のパスです。Agent Trace Observability、Customer Service、Invoice Processing、Security Incidents にわたる 400 ケース、2,000 件の意思決定です。accuracy、soft accuracy、Brier、ECE(laya.common.ece_score 経由)、score MAE、within-one-level、レイテンシのパーセンタイルを計算し、参照行が固定された直接対決の表を作ります。

モデル 種別 accuracy ECE
TypeSafe Jev 1.13.0 汎用 0.727 0.144
ModernBERT-base (149M) 専用 0.646 0.179
Teacher Self-Agreement 上限 0.735 —
Laya(公開チェックポイント) ファインチューニング済み 0.766 —

自分の実行の Laya 行も同じ方法で計算されます。ノートブックは実行自身の数値から表を組み直します。真似する価値のある習慣が 2 つあります。気にするスライス(言語、ワークフロー)を未見データの中に保つこと、そしてキャリブレーションを accuracy の隣に報告することです。学習シグナルはラベルだけでなく分布だからです。数値が出たら、リポジトリの Discussions への投稿が共有の場です。ベンチマークと既知の制約はリポジトリ直下の BENCHMARKS.md にあります。

Hub へのプッシュ

公開セルはループの最後の一マイルで、意図的に退屈に作られています。

  1. 書き込み権限のある HF_TOKEN を Kaggle に置きます(Add-ons → Secrets)。欠けていれば、セルは正確な手順とともに例外を投げます。
  2. 宛先リポジトリを設定します。出荷時のセルはプロジェクト自身の名前空間の名前を既定にしているので、実行前に変えてください。
  3. 実行します。この実行の比較表から数値を取ったモデルカードを書き、model.safetensors、encoder/、tokenizer/、rl_agent_config.json、カード、ベンチマークレポートをアップロードします。

結果は他のチェックポイントと同じように読み込めます。ファインチューニング専用の API はありません。

import laya

agent = laya.load("your-org/your-checkpoint")   # the repo you just pushed
result = agent.predict(state, questions)

ローリングする checkpoint_latest/ はエポックごとに上書きされるので、Kaggle のタイムアウトや OOM の代償は実行全体ではなく 1 エポックで済みます。

注意すべきこと

  • ループはターゲット次第です。 RLCD は自分の質問に対して教師の分布を模倣します。学習の前に(または並行して)教師の信頼度を集め、その品質を上限として扱ってください。
  • キャリブレーション用スライスは意図的に小さいです。 最大 400 アイテムまたは 10% —— 型ごとの 3 つのスカラーには足りますが、検証には足りません。自分用の評価データは別に取り分けてください。
  • ラベルは 3 つのプリミティブに合う必要があります。 意思決定が choice でも尺度でも yes/no の確率でもないなら、まずそのどれかに整形してください。鋭い角は 2 つすでに文書化されています。選択肢が多いと信頼度の選択が劣化し(#394)、強制選択の否定は state よりも質問に従うことがあります(#377)。
  • 重みだけでなく config も出荷してください。 削除した temperature_by_options は、コピーした config に残るとキャリブレーションを黙って外してしまう部分です。