HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Jev風モデルのリバースエンジニアリング

Reverse-engineered Jev-like model (github.com)

119 pointsby rochansinha17 コメント

要約

このリポジトリは、変化するテキストオプションのリストから1つを選択する、Jev風のモデルのスターター実装です。TypeSafeの商用モデルJevに触発されていますが、独立した設計です。このモデルは、単語ごとに回答を生成するのではなく、1回のパスで確率を計算するため、高速な処理が可能です。Doomやチェスなどのデモ、インストール方法、データ形式、クイックスタート、カスタムデータや事前学習済みエンコーダーの使用方法などが詳細に説明されています。

全文翻訳

Jevlike

変化するテキストオプションのリストの中から1つを選択する、小規模なモデルをトレーニングします。

Jev風モデルは、テキストと N 個のテキストオプションのリストを受け取り、各オプションに確率を返します。これは、単語ごとに回答を書き出すのではなく、1回のパスで行われます。Jev は、この種のタスクにおけるTypeSafe社の商用モデルです。TypeSafe社はその設計を公開していません。このリポジトリは、同じ入力と出力形状を持つ、独立したスターターモデルです。

デモ

同じオプション・アテンションヘッドは、画像パッチからコントローラーボタンをスコアリングできます。この10秒間の映像 は、選択された2つの5秒間のウィンドウを結合したものです。1つ目は7つのDoomボタンでのライブ deadly_corridor 戦闘、2つ目は5つのキーで移動しプレイするチェスコントローラーです。図は、各決定に使用されるテンソルを示しています。Doomのウィンドウは、提供された共同チェックポイントから取得され、10回の記録されたエピソード全体で平均0.60キル、-97.50の報酬を達成しました。チェスのウィンドウは、より強力なチェス専用チェックポイントから取得され、ランダムなプレイヤーに対して50回のサンプリングゲームで4勝、46引き分け、0敗を記録しましたが、Stockfishレベル0に対しては0勝、2引き分け、48敗でした。これらのウィンドウはアクティブなものが選択されており、典型的なプレイや能力を主張するものではありません。

ゲームの追加コンポーネントをインストールし、リリースされた共同チェックポイントから新たに640x480のDoomトレースを記録します。

uv pip install -e '.[games]'
python examples/doom/play.py examples/checkpoints/joint-imitation.pt --episodes 10 --game-seconds 35.3 --device cpu --capture-resolution 640x480 --output runs/doom.mp4 --trace runs/doom-trace.json

トレースを同じビジュアルレイアウトでレンダリングします。これは、作者所有のサウンドトラックソースがリポジトリに含まれていないため、無音の映像を作成します。

(cd examples/film && npm install && npx playwright install chromium)
examples/film/make-film.sh runs/doom-trace.json runs/doom-film.mp4 10

リリースには、Doomの例、チェスの例、単一ゲームのチェックポイント、および共有12オプションのチェックポイントが含まれています。どちらのゲームも jevlike.vision からビジュアルスコアラーをインポートしており、どちらの例にも2番目のモデルコピーはありません。

アーキテクチャ

各オプションはクエリベクトルになります。これは、そのテキストを表す短い数値リストです。クエリは、コンテキストトークンにアテンションウェイトを割り当てます。これらのウェイトは、そのオプションのために1つのコンテキストベクトルを作成します。共有ドット積は、各オプションとコンテキストのペアを1つのスコアに変換します。スコアを合計が1になる確率に変換するソフトマックス関数が、オプション全体で実行されます。

[画像: Each option queries the context, receives an attended context vector, and becomes one probability.]

デフォルトのエンコーダーは、ゼロからバイト埋め込みを学習します。エンコーダーは、テキストをベクトルに変換する部分です。オプションのHugging Faceパスは、凍結された事前学習済みエンコーダーを使用します。このエンコーダーは、小規模なスコアラーが学習している間、既存の重みを固定します。

データフォーマット

1行につき1つのJSONオブジェクトを使用します。

{"context":"The customer needs a refund.","options":["refund","sales","technical support"],"label":0}

label は、正しいオプションのゼロベースのインデックスです。各行は異なる数のオプションを持つことができ、最小値は2です。

クイックスタート

リポジトリのルートからこれらのコマンドを実行します。ローカルで合成データを生成し、それをトレーニングし、保存されたモデルを評価し、新しいメニューを1つスコアリングします。

uv venv
source .venv/bin/activate
uv pip install -e '.[dev]'

jevlike-data synthetic --output data/synthetic
jevlike-train data/synthetic/train.jsonl \
  --validation data/synthetic/validation.jsonl \
  --output runs/synthetic.pt
jevlike-eval runs/synthetic.pt data/synthetic/test.jsonl
jevlike-predict runs/synthetic.pt \
  --context "Choose the exact badge amber badger. Badge: amber badger."
  --option "azure crane"
  --option "amber badger"
  --option "gold heron"

評価では、トップ1精度(正しい最初の選択肢の割合)が出力されます。トップ3精度は、上位3つのスコアの中に正解が含まれる割合です。期待キャリブレーション誤差は、信頼度と観測された精度を比較します。コマンドはまた、シャッフルされたコンテキスト制御も出力します。これは、各メニューを間違ったコンテキストとペアにします。有用なモデルはこの制御を上回るはずです。

独自のデータを使用する

  1. 上記のフォーマットで、トレーニング、検証、テスト用のJSONLファイルをエクスポートします。
  2. モデルが予測時に表示するすべてのオプションを各行に含めます。
  3. 関連するレコードはまとめて分割します。例えば、1人の顧客または1つのターゲットページに関するすべてのレコードを1つの分割に含めます。これにより、ほぼ重複するものがテストセットに漏れるのを防ぎます。
  4. jevlike-train を、トレーニングファイルと検証ファイルを使用して実行します。
  5. ホールドアウトされたテストファイルで jevlike-eval を1回実行します。ホールドアウトとは、ファイルがトレーニングやモデル選択に一度も使用されなかったことを意味します。

デフォルトのバイトエンコーダーは、コンテキストを192バイト、各オプションを32バイトに切り捨てます。テキストにもっとスペースが必要な場合は、--context-tokens または --option-tokens を増やしてください。トレーニングは、CPU、Mac GPU用のApple MPS、およびNVIDIA GPU用のCUDAを --device を介してサポートします。

凍結された事前学習済みエンコーダーを使用する

オプションの依存関係をインストールし、Hugging Faceから互換性のあるエンコーダーの名前を指定します。

uv pip install -e '.[transformers]'
jevlike-train data/synthetic/train.jsonl \
  --validation data/synthetic/validation.jsonl \
  --output runs/qwen-head.pt \
  --encoder hf \
  --hf-model Qwen/Qwen2.5-0.5B \
  --rank 256 \
  --batch-size 8

チェックポイントは、トレーニングされたスコアヘッドとエンコーダー名を保存します。凍結されたエンコーダーの重みはコピーしません。したがって、チェックポイントのロードには、同じHugging Faceモデルへのアクセスが必要です。

--rank は、小規模なスコアヘッドの幅を設定します。幅の広いヘッドは、より多くのトレーニング可能な重みとより多くのメモリを使用します。

Wikispeediaの例

scripts/get_wikispeedia.sh は、公開されているSNAPアーカイブをダウンロードし、次のクリックのJSONLファイルを構築します。データはこのリポジトリの外に保存されます。

scripts/get_wikispeedia.sh
jevlike-train data/wikispeedia/jsonl/train.jsonl \
  --validation data/wikispeedia/jsonl/validation.jsonl \
  --output runs/wikispeedia.pt

Robert WestとJure Leskovecの論文「Human Wayfinding in Information Networks, WWW 2012」を引用してください。SNAPデータセットページのソースデータ条件を確認してください:SNAP dataset page。

期待される結果

このスターターモデルにつながった実験では、1パススコアラーは合成メニューで約98%の精度に達しました。ターゲットと無関係なWikispeediaの次クリックデータでは、凍結されたQwen2.5-0.5Bエンコーダーとスコアラーの組み合わせで26%に達し、シャッフルされたエンコーダー制御とランダムエンコーダー制御の約8%と比較されました。40,000クリックでトレーニングされた小規模モデルは29%に達しました。8つのオプションの場合、1パスは400トークンを書き込むことを強制された小規模デコーダーよりも約100倍高速でした。

これらの数値はローカル実験を表しており、このクイックスタートの実行結果ではありません。Jevと同等の品質を達成したり、TypeSafe社のプライベートトレーニング方法を再現したりしたわけではありません。

制限事項

  • これは研究用スターターであり、Jevのコピーではありません。
  • 精度は、データの質、分割の質、エンコーダーに依存します。
  • バイトエンコーダーは安価ですが、言語の意味に対する能力は弱いです。
  • 事前学習済みパスは、大規模なモデルをダウンロードする必要があり、より多くのメモリを必要とします。
  • 1パススコアリングでは、予測前にオプションリスト全体が必要です。
  • 速度比較では、大規模な商用モデルではなく、小規模なローカルデコーダーを使用しました。

ライセンス

コードはMITライセンスの下でリリースされています。ダウンロードされたデータセットと事前学習済みモデルは、独自の条件を維持します。