日本語判断器のローカル追加学習

September 18, 2026 · View on GitHub

設計書 §8–11 / G3–G4 に対応する LoRA研究版。本番向けv1の完成を意味しません。 実行結果は reports/RESULTS.md に記録します。

範囲と保留条件

  • 基礎モデル: Qwen/Qwen3-Reranker-0.6B、revision e61197ed45024b0ed8a2d74b80b4d909f1255473。
  • 実行機: Apple M5 / 24 GiB / macOS 26.3。Python 3.12.13、PyTorch 2.10.0、Transformers 4.57.6、PEFT 0.18.1。
  • JNLIの説明付き choice と、未知を偽と混ぜない noul。JSTSは score の補助課題。
  • 問い合わせ分類・緊急度・依頼検出の業務データは未提供。NLI/STSの結果で業務品質を代用しません。
  • Ruri/4B比較、業務校正、採用閾値、安全性の受入試験は別工程。APIは必ず保留します。
  • 重み取得後の学習・推論はローカルファイルのみ。有料API・外部学習サービスは使いません。

データと漏洩防止

prepare_data.py は、評価用の benchmarks/data/ を学習へ転用せず、JGLUE固定コミットの 公式trainのみを新規取得します。

  1. JNLI/JSTS共通の画像IDでグループを作る。
  2. 収集済み評価データと同じ画像グループ・完全一致文対を除外する。
  3. 学習/開発/校正/閾値用に共通ハッシュで70/10/10/10へ分割する。
  4. 異なる分割間の完全一致文対も検査し、発見したら停止する。
  5. pilotは固定SHA順に画像グループを丸ごと選ぶ。モデルの正誤を見て選ばない。

今回の固定pilotは JNLI 506文対 + JSTS 251文対 = 757文対。 JNLIをChoice/Noul両形式へ変換するため 1,263判断例。候補枝を学習例数として水増ししません。 開発用は別画像のJNLI 97文対・JSTS 48文対。校正・閾値用poolは確保のみで未使用です。

画像や文章が同じものの漏洩を抑える検査であり、近似重複や基礎モデルの事前学習汚染がないことの証明ではありません。 注釈は原典のものを継承し、今回独立に全件再判定してはいません。詳細: data_manifest.json / sources.lock.json。

目的関数

  • Choice: 一つの質問の全候補のlogitに対する交差エントロピー。
  • Noul: 含意/矛盾だけにBCE。neutralの真偽損失は 除外。
  • 根拠: Noulは既知=1/未知=0。Choiceは「情報不足」も回答クラスなので全例1、STSは両文が与えられるため1。
    • この根拠ラベルは公開課題からの派生規則で、曖昧な業務入力や攻撃への十分性を教えたことにはなりません。
  • Score: JSTSの小数goldを隣接段階へ線形配分したsoft targetの交差エントロピー。
    • 例: 3.4 → 段階3に0.6、段階4に0.4。平均を保存し、丸めません。
    • これは明示した学習上の補助規則で、人が付けた確率分布でも業務段階の正解でもありません。
  • L_choice + L_noul_known + L_score + 0.2 L_evidence。勾配蓄積区間内で種別ごとに質問数で平均。

LoRAはr=16 / alpha=32 / dropout=.05 / all-linear、学習率1e-4、入力上限1,024。 数値形式はMPSのFP32へ変更。この実行機でBF16は誤出力・ゼロ勾配、FP16はApple GEMVのabortを起こしたためです。 PYTORCH_MPS_PREFER_METAL=1と非reentrant gradient checkpointingを使い、CPU FP32との対照・実勾配・二行採点を確認します。 失敗したBF16試行は成功例として数えず、reports/preflight-failures.json に残します。 元のyes/no出力行は固定し、新規の分類ヘッドは作りません。候補スコアをdetachせず逆伝播します。 実際の対象層・パラメーター数、各更新のloss・勾配norm、校正前の開発成績を保存します。 初回は1 epochの小規模試験であり、十分な収束やデータ量の最適化を主張しません。

再実行(リポジトリのルートから)

uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -r training/requirements.lock.txt
# 依存lockはこのmacOS環境用。CUDA版は対応wheelで別途検証する。
.venv/bin/python -m training.prepare_data --offline
.venv/bin/python -m unittest discover -s training/tests -v

# 出力先は新規ディレクトリ。既存runやcheckpointを上書きしない。
PYTORCH_MPS_PREFER_METAL=1 \
HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 HF_HUB_DISABLE_TELEMETRY=1 \
TOKENIZERS_PARALLELISM=false \
.venv/bin/python -m training.train_judge --device mps \
  --out training/runs/ja-pilot-next

初回のデータ取得時は --offline を外します。初回モデル取得は、このリポジトリの固定revisionを指定します。

.venv/bin/python jev_local_api_starter/scripts/download_model.py \
  --out models/qwen3-reranker-0.6b \
  --revision e61197ed45024b0ed8a2d74b80b4d909f1255473

既存の同名モデルを上書きせず、取得revisionが変わる場合は別実験とします。クローン後の手順はリポジトリ直下の README.md を参照。

validation-history.json の内部開発損失だけでcheckpointを選びます。公開testで選び直しません。 異なる乱数・学習量・入力形式を試したい場合、データ・コード・runの新しい版を作ってください。

実モデルの評価

PYTORCH_MPS_PREFER_METAL=1 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
.venv/bin/python -m training.evaluate_model \
  --dataset benchmarks/data/jnli_test.jsonl.gz --mode choice \
  --adapter artifacts/ja-judge-lora-pilot-v1 --out training/runs/eval-next

--adapter を省略すると未学習ベースモデル。--mode noul またはJSTSに --mode score も指定できます。 指定ファイルを全件評価し、例外・長文超過も分母に残します。正解は採点器だけが読み、API入力には渡しません。 元のベンチマーク全件でなく固定subsetを渡した場合、そのsubsetのみの結果として報告してください。

学習済みモデルをAPIで試す

PYTORCH_MPS_PREFER_METAL=1 \
HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 HF_HUB_DISABLE_TELEMETRY=1 \
PYTHONPATH=jev_local_api_starter BACKEND=qwen DEVICE=mps \
MODEL_PATH=./models/qwen3-reranker-0.6b \
ADAPTER_PATH=./artifacts/ja-judge-lora-pilot-v1 \
MAX_TOKENS=1024 MICROBATCH=8 \
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8000 --workers 1

別ターミナルで:

curl --fail-with-body http://127.0.0.1:8000/v1/decide \
  -H 'Content-Type: application/json' \
  --data-binary @jev_local_api_starter/examples/request.json

backend=qwen-lora とモデル/adapterハッシュを確認します。calibrated=false、status=abstained、value=nullは意図した動作です。 未学習ベースへ戻すには ADAPTER_PATH を指定せず再起動します。壊れたadapterからの自動フォールバックはしません。

baseの全記録ファイル、adapter、tokenizer、ベースとの対応、入力実装のSHAを起動時に照合します。 コード・tokenizer・重み・数値形式を変えた場合は新しい評価が必要です。署名による出所の認証ではなく、ローカル一式の整合性検査です。

出典・配布

JGLUE: Kurihara et al. / Yahoo Japan・早稲田大学、公式、CC BY-SA 4.0。 正規化・分割・選別したデータも同条件として扱います。licenses/ と既存の benchmarks/THIRD_PARTY_NOTICES.md を参照。 基礎モデルはQwen、Apache-2.0。データの利用条件とモデルのライセンスを混同しません。 学習済み重みの外部配布に伴う条件は別途確認し、データ由来の条件を消して一括Apache/MITと表示しません。 重み・キャッシュ・作業runはGit対象外です。ローカルの models/ と artifacts/ を削除すると再取得/再学習が必要です。