Exea LabsBlog
English英語版

2日目 ·

エージェントは話すことを覚えた。モデルは自前の検索拡張を組み立てる

エージェントは 99.8% の割合で、掲示板を通して事実を伝えます。モデルは、見たことのない 1,024 個の事実から正しいものを見つけます。

日付
2026-11-11
読む時間
7分で読めます
トピック
スウォーム, 検索拡張, トークナイザー
執筆
Exea チーム
99.8%

掲示板を通したリレーの正解率。偶然なら 1.6%

100%

見たことのない 1,024 個の事実でのルックアップ正解率

0.012

実テキストでスウォームが少なくとも縮めるバイトあたりビット数。2 シード、リーク補正後(最初の報告は 0.014)

1 日目に、TONN に 2 つの新しい回路を入れました。モデルのコピーが共有するメッセージ掲示板(AG)と、ライブラリからの検索(RG)です。2 日目は、どちらかが何かを学ぶのかを確かめました。以下のテストは、どれも新しい回路でしか解けないように作っています。それぞれに、その回路を取り除いた対照があります。

実行はすべて Mac Studio の GPU 1 つ(Apple M3 Ultra)です。モデルは 0.8M から 13M パラメータと小さいです。そのため、これらの結果が試しているのは仕組みです。最終的なモデルではありません。

01リレー:話さないと正解できない

タスク。 情報はスウォームの中に分けて置かれます。事実役は [FACT, key, value] のようなチャンクを読みます。質問役は、それらの事実についての [ASK, key, ?] のような質問を読みます。採点されるのは質問役だけです。値は例ごとにランダムに引きます。そのため、質問役が偶然(64 分の 1)を上回れるのは、事実役が掲示板で事実を伝えた場合だけです。

事実役には、自分の損失がありません。何を投稿するかは、すべて質問役の誤差から学びます。その誤差は、掲示板を通って逆向きに流れてきます。

全エージェントが最初のチャンクを読みます。

掲示板なしエージェント 1FACT k7 42FACT k2 61エージェント 2FACT k3 19FACT k9 30エージェント 3FACT k5 8FACT k1 5質問役ASK k7 ?ANS …チャンク 1チャンク 2
掲示板の動きを、ゆっくり再生したもの。4 つのエージェントが、それぞれのチャンクを並列に読みます。各チャンクの終わりに、各エージェントがメッセージを 1 つ投稿します(掲示板上の点)。次のチャンクでは、各エージェントが掲示板の過去の投稿をアテンションで読みます。線は、質問役のアテンションの向かう先です。掲示板の一番上にある空のエントリは、何も読まないという選択肢です。掲示板を切った表示に切り替えると、対照が見られます。

結果。 スウォームとして学習すると、質問役は 3 つのシードすべてで 99.8% の質問に正解します。テスト時に掲示板を切ると 1.5% に落ちます。これは偶然の水準です。同じモデルを単独で学習させると、偶然の水準のままです(1.4% から 2.2%)。

スウォームで学習、掲示板あり同じモデル、テスト時に掲示板を切断単独で学習
0%25%50%75%100%05001,0001,5002,0002,5003,000偶然(1.6%)100%
学習中のリレー正解率。シード 0、エージェント 2 つ、事実 4 つ。掲示板を共有すると、質問役はステップ 250 までに 98% を超えます。テスト時に掲示板を切ると、同じモデルは偶然の水準です(1.6%、破線)。単独で学習したモデルは、偶然の水準から一度も抜け出しません。

掲示板は、少し規模を広げても機能します。エージェント 4 つで、事実役 3 つが事実を 4 つずつ持ち、質問役 1 つが 12 個すべてについて尋ねると、正解率は 99.8% です。エージェントあたり事実 16 個では 99.9% です。

これは、掲示板が普通のテキストで役立つことまでは示していません。それには別のテストが必要です。

02実テキストでのスウォーム

設定。 FineWeb-Edu を生のバイト列として使います。分割スウォームでは、4 つのエージェントが、ひと続きのテキストの連続する 4 つの窓を読みます。そのため、各エージェントは、前のエージェントが読んだ内容を使える可能性があります。対照は同じバッチを使い、学習中に掲示板を切ったものです。どのモデルも、同じ評価用のスウォームで、(bpb)により採点します。

TONN だけのモデル(5.2M パラメータ)では、掲示板による改善はバイトあたりビット数で 0.006 です。2 日目の後半に標準構成になったでは、改善幅が 2 倍以上になります。

スウォーム(掲示板あり)スウォーム(テスト時に掲示板を切断)対照(学習中も掲示板を切断)
1.6101.6201.6301.6401.6501 番目2 番目3 番目4 番目対照との差: 0.014
実テキストでのスウォーム。ハイブリッドモデル、4,000 ステップ。値は評価用テキストでのバイトあたりビット数で、低いほど良い値です。スウォームは両方のシードで、条件をそろえた対照を 0.015 と 0.012 上回ります。掲示板を切っても、スウォームで学習したモデルは対照を平均 0.010 上回ります。
  • スウォームは、両方ので、条件をそろえた対照をバイトあたりビット数で平均 0.014(約 0.8%)上回ります。
  • スウォーム内のどの位置のエージェントも改善します。
  • スウォームで学習したモデルは、掲示板を切っても対照より 0.010 良い値です。スウォームとしての学習は、掲示板から読む内容とは別に、各エージェント単体の性能も上げています。

分割したバッチには代償があります。32 行のバッチを 4 つずつのスウォームで読むと、独立したテキストは 32 本ではなく 8 本になります。TONN だけのモデルでは、分割バッチで学習した対照は、通常の学習より 0.021 悪くなります。事前学習では、バッチあたりの行数を増やす必要があります。あるいは、ひと続きのテキストではなく、関連する文書を読むスウォームが必要です。

03モデルが自前の検索拡張を組み立てる

タスク。 事実 [FACT, k1, k2, value] のライブラリを使います。2 トークンのキーと値は、学習ステップごとに新しく引きます。そのため、重みには何も記憶できません。モデルは質問 [ASK, k1, k2] を読み、次のチャンクで答え [ANS, value] を出さなければなりません。偶然の正解率は 64 分の 1 です。

偶然を上回るには、モデルは検索のすべてを自分で学ぶ必要があります。ライブラリ用の自前の埋め込み、何を探すか、どの結果を信じるか、そして結果から答えをどう読み出すかです。

結果。 ライブラリをつなぐと、モデルは見たことのない 1,024 個の事実についての質問に 100% 正解します。ライブラリを外すと 1.5% に落ちます。同じモデルをライブラリなしで学習させると 2.3% です。

ライブラリありライブラリなしで学習したモデル
0%25%50%75%100%01,0002,0003,0004,00032 件64 件128 件256 件1024 件
学習中のルックアップ正解率。学習用ライブラリは事実 16 個から始まり、400 ステップごとに 2 倍になって 1,024 個に達します。各点は、そのステップで達した大きさの新しいライブラリで採点しています。モデルはステップ 1,000 までに 93%、ステップ 2,000 までに 99.6% に達します。

04検索が学ぶまでに必要だった 3 つの修正

最初の設計は、まったく学びませんでした。4,000 ステップの間、正解率は偶然の水準のままでした。小さな診断用の実行で、3 つの別々の障害が見つかりました。どれか 1 つだけでも、学習を止めるのに十分でした。

  1. クエリと保存されたキーが、無関係な空間にありました。 クエリは回路自身のストリームから来ていました。キーは別のエンコーダから来ていました。検索はランダムと変わりませんでした。修正:チャンク c のクエリを、同じエンコーダをチャンク c-1 に適用したものにします。そこに、回路自身のストリームを、学習で決まる割合だけ加えます。この割合はゼロから始めます。
  2. 出力ゲートが、取り出した値をかき乱していました。 読み取った結果に、読んでいる位置から計算したゲートを掛けていました。線形プローブで値を復元できた割合は、ゲートの前で 68%、後で 2.5% でした。修正:ゲートをなくしました。
  3. ゼロ初期化した行列が、取り出したトークンがどれかという情報をかき消していました。 この行列は、エンコーダのチャンク内の状態を、取り出した各トークンに加えていました。Adam は、勾配がどうであれ、ゼロ行列のすべての要素を 1 ステップあたり学習率ほど動かします。そのため 100 ステップ以内に、加わったノイズが、照合の頼りであるトークンの情報を埋もれさせました。修正:取り出したトークンは素のトークン埋め込みにして、層自身の入力射影で読みます。
TheThamesflowseastthroughcentralLondonto… 64

検索は 64 トークンのチャンクごとに 1 回です。

修正後の検索回路。直前のチャンクをエンコードしてクエリにします。ライブラリのキーも同じエンコーダから作るので、両者は同じ空間にあります。上位 4 つのチャンクは、現在のエンコーダでもう一度スコアをつけます。そのトークンはそのままの埋め込みとして、ゲートなしで層自身の入力射影から読みます。ボタンで段階を 1 つずつ進められます。

小さな選択が 2 つ効きました。キーは 1 トークン前を見ます。そのため、「キーを見つけて、その次のトークンを取る」が 1 回のアテンションで済みます。また、取り出した 4 つのチャンクの重みづけは、なだらかな状態から始めます。そのため、学習の初期から 4 つすべてに勾配が届きます。

途中の対照実験で、問題の場所を確かめました。同じモデルは、事実を自分の文脈に置けばルックアップを学びました(1,000 ステップで 95%)。つまり、タスク自体は学習できます。失敗していたのは検索でした。固定したライブラリを 2 つ使うと、壊れた設計でも、ライブラリだけが違う答えを当てはめられました。つまり、勾配は流れていました。

05もう 1 つの決定:32k トークナイザー

語彙 32k、49k、64k のバイトレベル BPE を、英語 200 MB、日本語 160 MB、コード 80 MB で学習しました。語彙が大きいほど、1 トークンに多くのテキストを詰め込めます。しかし学習トークン数が一定なら、増えた埋め込みは目にする回数が減ります。パラメータも余分にかかります。

1 トークンあたりのバイト数(多いほど詰め込める)
英語
32k
4.38
48k
4.55
64k
4.66
日本語 Wikipedia
32k
4.28
48k
4.54
64k
4.72
日本語 Web
32k
5.36
48k
5.75
64k
6.03
コード
32k
2.67
48k
2.77
64k
2.83
13M モデルの bpb(低いほど良い)
英語
32k 1.489
48k 1.484
64k 1.487
日本語 Wikipedia
32k 1.575
48k 1.586
64k 1.613
日本語 Web
32k 1.433
48k 1.434
64k 1.446
コード
32k 1.949
48k 1.982
64k 2.062
トークナイザーの大きさと品質の関係。左:1 トークンあたりのテキストのバイト数(高いほど多くのテキストを詰め込めます)。右:各トークナイザーで同じ 49M トークンを学習した 13M モデルのバイトあたりビット数(低いほど良い値です)。32k は、すべての種類のテキストで勝つか引き分けます。コードと日本語 Wikipedia では、はっきり上回ります。

0.1B では、49k の代わりに 32k を使うと 10.5M パラメータが空きます。モデルの約 10% です。トークナイザーは Hugging Face で公開しています。

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

リレーとルックアップは、回路が学習できることを証明しています。検索が実テキストで役立つことは示していません。そのテストと、訂正が必要になった結果は「実テキストでの検索には、より良い探し方が必要」にあります。

07

作業した人

Avneh Bhatia@AvnehSBhatia
リレー、スウォーム、ルックアップ、トークナイザーの実験を Mac Studio で実行しました。検索が学習しなかった 3 つの原因を突き止めました。
Aaron Chu@aarochu
スウォームと単独を比べるハーネス(PR #5)を作る途中で、分割スウォームの継ぎ目のリークを見つけました。PR #7 で修正しました。エージェントが掲示板をどう使うかを示す掲示板の統計(PR #4)を追加しました。
08

出典