Jev風モデルのリバースエンジニアリング
Reverse-engineered Jev-like model (github.com)
要約
このリポジトリは、変化するテキストオプションのリストから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つのスコアの中に正解が含まれる割合です。期待キャリブレーション誤差は、信頼度と観測された精度を比較します。コマンドはまた、シャッフルされたコンテキスト制御も出力します。これは、各メニューを間違ったコンテキストとペアにします。有用なモデルはこの制御を上回るはずです。
独自のデータを使用する
- 上記のフォーマットで、トレーニング、検証、テスト用のJSONLファイルをエクスポートします。
- モデルが予測時に表示するすべてのオプションを各行に含めます。
- 関連するレコードはまとめて分割します。例えば、1人の顧客または1つのターゲットページに関するすべてのレコードを1つの分割に含めます。これにより、ほぼ重複するものがテストセットに漏れるのを防ぎます。
jevlike-trainを、トレーニングファイルと検証ファイルを使用して実行します。- ホールドアウトされたテストファイルで
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ライセンスの下でリリースされています。ダウンロードされたデータセットと事前学習済みモデルは、独自の条件を維持します。