Exea LabsBlog
English英語版

2日目 ·

Aaron の 7 つのプルリクエスト。ひとつがリークを見つけた

7 つともマージ済みです。そのうち 1 つが、バイトあたりビット数で最大 0.002 に相当するリークを見つけました。

日付
2026-11-11
読む時間
6分で読めます
トピック
貢献, スウォーム, 訂正, データ
執筆
Exea チーム
7

Aaron のプルリクエスト。2 日目にすべてマージ

0.002

バイトあたりビット数。スウォームの改善 0.014 のうち、継ぎ目のリークで説明できる最大値

0.012

リークの起こりえない各スウォームの最後のエージェントが、対照に対して得るバイトあたりビット数の改善(シード 0。シード 1 では 0.009)

Aaron(@aarochu)は、2 日目の朝に 7 つのプルリクエスト(PR)を出しました。3 つは、100B トークンの学習の準備です。2 つは、記憶用の回路の中身を見られるようにします。2 つは、スウォームを試します。そのうちの 1 つが、すでに公開していた実験の欠陥を見つけました。7 つともマージしました。コミットは、彼が書いたままです。テストスイートのテストは 46 個になりました。

017 つのプルリクエストで加わったもの

  1. チェックポイントからの正確な再開(PR #1)。チェックポイントには、オプティマイザ、探索で決まったアーキテクチャ、すべての乱数生成器の状態、探索自身の状態、検索ライブラリのキーが入るようになりました。書き込みはアトミックです。止めてから再開した実行は、一度も止めなかった実行とビット単位で同じ重みで終わります。彼のテストは、探索の 2 つのラウンドの間で実行を止めて、これを確かめます。本番の学習は、数時間でタイムアウトする無料の Colab セッションを何度もまたぎます。それを可能にするのが、この機能です。
  2. データソースをまたいだ、ほぼ重複する文書の除去(PR #6)。exealm/data/dedup.py は、MinHash でほぼ重複する文書を見つけます。CPU 上で、numpy だけで動きます。設定は FineWeb と同じで、単語 5-gram、112 個のハッシュを 8 個ずつ 14 バンドに分けます。日本語には文字 5-gram を使います。何かを削除する前に、シグネチャを厳密に照合します。各重複がどのソースと一致したかも報告します。これで、重なりがどこから来るかがわかります。
  3. 生成を含む速度ベンチマーク(PR #2)。python -m exealm.eval.speed は、学習と貪欲生成の速度を、1 秒あたりのトークン数で測ります。どのプリセットでも、ExeaLM を同じサイズの Llama と比べられます。検索とスウォームのオン・オフも切り替えられます。リポジトリで初めての、生成速度の測定です。
  4. 検索インスペクタ(PR #3)。exealm/eval/show_retrieval.py は、プロンプトの各チャンクについて、各検索回路がライブラリのどのチャンクを取り込んだかを表示します。重み、文書 ID、テキストも一緒に出します。検索が効かないとき、代わりに何を見つけていたのかを、これで確かめられます。
  5. 掲示板の統計(PR #4)。評価のたびに、エージェントがをどう使うかを、層ごとに記録するようになりました。空のエントリ、仲間、自分自身、永続的な掲示板を、それぞれどれだけ読むかを記録します。投稿の強さと、黙っている頻度も記録します。探索の各ラウンドでは、掲示板回路の価値も記録します。
  6. スウォームと単独を比べるハーネス(PR #5)。exealm/eval/swarm_vs_solo.py は、同じ評価用テキストを 3 通りで採点します。として読む、エージェントが単独で読む、別に学習した単独モデルで読む、の 3 つです。これを分割スウォームと、対照としてのランダムなスウォームの両方で、スウォーム内の位置ごとに行います。彼がリークを見つけたのは、これを作る途中でした。
  7. 継ぎ目のリークの修正(PR #7)。この記事の残りで説明します。

02リーク

分割スウォームでは、4 つのエージェントが、ひと続きのテキストの連続する 4 つの窓を読みます(スウォームの記事を参照)。各エージェントは、自分の窓のすべての位置で次のバイトを予測します。この配置の 2 つの性質が組み合わさります。

エージェント 1エージェント 2エージェント 3エージェント 4継ぎ目なし最初の投稿最後の予測で読める継ぎ目
  • エージェント 1 が最後に予測するバイトは、エージェント 2 が最初に読むバイトです。エージェント 2 と 3 も、同じように継ぎ目を共有します。エージェント 3 と 4 も同じです。
  • 64 バイトのごとに、各エージェントは読んだ内容の平均を掲示板に投稿します。どのエージェントも、それより前のチャンクの投稿を読めます。エージェント 2 の最初の投稿は、継ぎ目のバイトで始まるチャンクから計算されます。エージェント 1 は、最後のバイトを予測するときに、その投稿を読めます。

そのため、エージェント 1 から 3 は、原理的には予測対象を 1 つずつ掲示板から読み取れました。エージェントあたり、512 個の対象のうち 1 個です。エージェント 4 には継ぎ目がありません。対照は、掲示板に仲間がいない状態で学習しました。そのため、リークを使う手段がありませんでした。

03どれだけ変わるか

掲示板から得る改善(bpb)、スウォーム内の位置ごと
シード 0
0.00351
0.00442
0.00333
0.00224
4: 継ぎ目なし
シード 1
0.00371
0.00372
0.00353
0.00254
4: 継ぎ目なし

ハイブリッドでのスウォームの結果は、バイトあたりビット数で約 0.012 以上の改善として成り立ちます。公開した数値は、少し高すぎました。TONN だけのモデルでの結果は、見かけより弱いものです。

04修正

  • ローダーは、分割スウォームで継ぎ目の予測対象を隠します(mask_seams)。そのため、仲間がすでに投稿したバイトで学習や採点をするエージェントはいません。
  • experiments/swarm_text.py は、残した予測対象だけで平均を取るようになりました。これがないと、隠した対象が損失ゼロとして数えられます。その結果、すべての条件のスコアが約 0.002 下がってしまいます。
  • リーク、隠した継ぎ目、修正した採点処理を、テストで確かめています。

05この記事が示していないこと

この記事は、訂正後の正確な数値を示していません。ハイブリッドのスウォーム実験(両方のシード)と、TONN だけのモデルの実験(これまでどおり 1 シード)は、修正を入れて再実行するためにキューに入っています。今夜 0.1B の実行が終わったあと、Mac で始まります。結果は次の記事で報告します。スウォームの記事からも、その記事にリンクします。

06次にやること

新しいツールのうち 3 つは、まだ実際に使われていません。どれも、最初に取り組む課題に向いています。

  • 0.1B のプリセットで exealm.eval.speed を実行し、生成の数値を結果のページに加える。
  • Wikipedia の知識タスクで show_retrieval.py を実行し、検索が外れたときに何を返しているかを見る。
  • 候補のデータ配合に重複除去スクリプトをかけ、ソース間の重なりを報告する。

フォームから参加登録するか、プルリクエストを出してください。

07

作業した人

Aaron Chu@aarochu
この記事の 7 つのプルリクエストをすべて書きました。スウォームと単独を比べるハーネスを作る途中で、分割スウォームの継ぎ目のリークを見つけました。
Avneh Bhatia@AvnehSBhatia
プルリクエストをレビューしてマージしました。公開済みのスウォームの結果に対して、リークの影響を確かめました。訂正を公開しました。
08

出典