lf.wtf
ラボレポート 01

AI研究 · SmolLM2-135M

回路グラフト

Claude Opus 5.5 との共同で執筆・制作

135Mパラメータのモデルのニューロンに、勾配学習なしで小さな回路をグラフトしました。モデルはSmolLM2-135Mで、元の重みは一つも変えていません。封印したホールドアウト問題で、掛け算のスコアは21.3%から83.1%になりました。

SmolLM2-135Mの中でグラフトがある場所テキストはトークンとして入り、30層のニューロンを通って、出力ヘッドが次のトークンを選びます。グラフトは層の横に追加した小さな回路です。20層を読み取り、出力ヘッドの直前にある最終層、29層に後押しを加えます。元のニューロンは変更していません。0142021290から29層。点は各層の一部で、縮尺どおりではありません。トークン入力出力ヘッド次のトークングラフト25,270から121,198個の重みを追加、0.1%未満132元のニューロン、変更なしグラフト、層の横に追加 SmolLM2-135Mの中でグラフトがある場所テキストはトークンとして入り、30層のニューロンを通って、出力ヘッドが次のトークンを選びます。グラフトは層の横に追加した小さな回路です。20層を読み取り、出力ヘッドの直前にある最終層、29層に後押しを加えます。元のニューロンは変更していません。トークン入力014202129出力ヘッド次のトークングラフト25,270から121,198個の重みを追加、0.1%未満132元のニューロン、変更なしグラフト、層の横に追加点は各層の一部で、縮尺どおりではありません。
グラフトの位置。SmolLM2-135Mには30の層があり、各層はアテンションブロック(9ヘッド)とそれに続くMLPブロックでできていて、幅576個の数からなる隠れ状態を処理します。重みは全部で約134.5M個です。グラフトは、バイパスのように層の横に追加した小さな回路です。元のニューロンや重みは一つも変わりません。
  1. 読み取りと2つのスイッチは、モデルが次の答えの桁を書こうとしている位置で、20層のMLPの入力にある隠れ状態を取り出します。
  2. グラフトの後押しは、同じ位置で、最終層である29層のMLPの出力に加えられます。出力ヘッドが次のトークンを選ぶ直前です。
  3. 3桁の足し算では、読み取りに14層と21層もつなげます(合計1,728個の数)。書き込みはやはり最終層に入ります。
掛け算(ホールドアウト)
21.3% → 83.1%
変更した元の重み
0
最大のグラフトがモデルに占める割合
0.09%
同サイズの勾配グラフトとのポイント差
+57.9

出発点

1つのルールが多くの事実に使える

小さなオープンモデルを、重い学習を回さずに、重みを直接編集して新しいパーツを接ぎ木することで、どこまでフロンティアレベルに近づけられるかを知りたいと思っています。ふつうの方法は学習です。何十億もの質問と答えをモデルに流し込み、勾配降下法が自力でルールを見つけ出します。でも、モデルを開いて、問題を解いている途中で何を持っているかを読み取り、それを書き換えることもできます。では、そうしたルールの一部を手で書き込むことはできるのでしょうか。

私の作業仮説は、推論の多くがルールセットで動いていて、1つのルールが多くの事実に使われている、というものです。いちばん単純な例は1の繰り上がりです。すべての足し算を暗記する人はいません。1つの繰り上がりのルールが、どの桁でも、すべての足し算をカバーするからです。メモにはこう書きました:

もしかすると、ある事実のルールが、別の事実のルールと一致するのかもしれない。

小さなモデルにとって、事実を覚えるのは高くつき、ルールは安く済みます。このレポートで最初に作った掛け算の回路は、2 × 10から9 × 99までのすべての問題に対応するように作られていて、重みは25,270個です。

同じ会話から、最初の考えと対になる2つ目のアイデアも出てきました。すでに知っていることを使うための論理ルールと並んで、新しいことを身につけるための学習ルールセットがある、というものです。このレポートは論理の側についてです。

モデルがすでに持っているもの

数字はもう中にある

何かを作る前に、SmolLM2が答えを書き始める瞬間に何を持っているかを調べました。答えの位置の隠れ状態を、最小二乗法でフィットした線形の読み取りにかけると、2つの数の各桁がほぼ完璧に取り出せます。3桁の足し算では1つの層では足りませんでしたが、14、20、21層をつなげると、新しい問題ですべての桁を99%で読み取れます。

桁の情報はどこにあるか

3桁の足し算。線形の読み取りが2つの数の6桁すべてを正しく取り出せた、新しい問題の割合です。1層ずつ読んだ場合と、14、20、21層をつなげた場合を示しています。どの読み取りも1,500問でフィットしています。

76.6% 単独で最も良い層、21層

11.8% 最終層、29層

97.9% 14、20、21層をつなげた場合。その読み取りを3,000問でフィットすると99.2%

全30層を表にしたもの
層6桁すべて正解
00.0%
14.3%
226.0%
350.1%
452.2%
547.1%
631.4%
720.4%
818.8%
918.2%
1027.1%
1127.9%
1239.1%
1347.2%
1474.8%
1570.1%
1664.0%
1763.0%
1864.2%
1963.5%
2072.9%
2176.6%
2271.5%
2362.9%
2448.8%
2530.5%
2619.0%
2713.9%
2811.7%
2911.8%

つまり、モデルは問題を読めています。確実にできないのは、桁を組み合わせることです。繰り上がり、繰り下がり、九九。その組み合わせの部分を私たちが補います。

グラフトの仕組み

4つのパーツ、どれも勾配降下法では学習していない

  1. 読み取り2つの数の各桁ごとに、モデル自身の隠れ状態から取る線形の読み取り。
  2. ルール答えの各桁ごとの小さなルックアップテーブル。一の位は2つの一の位から決まり、十の位は2つの十の位と繰り上がりから決まります。その上の桁も同じです。
  3. 書き込みモデルの最終層で、正しい数字トークンへの後押しを加えます。返答を書くのはモデル自身のままです。グラフトは次に来る数字を少し傾けるだけです。
  4. スイッチフィットさせた2つのスイッチが、グラフトをいつオンにするかを決めます。この種の問題の答えを書いている間だけ作動し、ほかの数学、文章題、コード、ふつうの文章ではオフのままになるようにフィットしています。

読み取りとスイッチは閉形式の最小二乗法でフィットし、ルール表はプログラムで書き出しています(最初の掛け算グラフトは手で書きました)。ベースモデルのファイルには一切触れません。各グラフトはその横に追加します。

グラフトの中身、38 + 47の場合桁を読み取り、ルールを当てはめ、正しい数字を後押しします。後押しをいつオンにするかは2つのスイッチが決めます。後押しは29層で加えられ、モデルは85と書きます。1読み取り1つ目の数: 3, 82つ目の数: 4, 7残りの答えの桁: 22ルール一の位: 8 + 7 = 155を書き、1繰り上がり十の位: 3 + 4 + 1 = 83書き込み答えの1桁目:8を後押し答えの次の桁:5を後押し4スイッチ後押し × スイッチ2つオン: この答えを書く間オフ: ほかの文章29層で加算。モデルは85と書きます。 グラフトの中身、38 + 47の場合桁を読み取り、ルールを当てはめ、正しい数字を後押しします。後押しをいつオンにするかは2つのスイッチが決めます。後押しは29層で加えられ、モデルは85と書きます。1読み取り1つ目の数: 3, 82つ目の数: 4, 7残りの答えの桁: 22ルール一の位: 8 + 7 = 155を書き、1繰り上がり十の位: 3 + 4 + 1 = 83書き込み答えの1桁目: 8を後押し答えの次の桁: 5を後押し4スイッチ後押し × スイッチ2つオン: この答えを書く間オフ: ほかの文章29層で加算。モデルは85と書きます。
グラフトの中身。38 + 47を例にしています。読み取りは3、8、4、7と、答えの桁が2つ残っていることを見つけます。ルールから8 + 7 = 15となるので、一の位は5で1繰り上がり、十の位は3 + 4 + 1 = 8です。答えの最初の位置でグラフトは8を後押しし、次の位置では5を後押しします。後押しの強さは桁の位ごとに調整されています。2つのスイッチが後押しに掛け合わされるので、後押しがオンになるのは、モデルがこの種の問題の答えを書いている間だけです。返答を書くのはモデル自身のままです。

どう発展したか

1つのグラフトからパイプラインへ

  1. ニューロングラフト最初の試みでは、2桁の足し算の繰り上がりを補うために、最終層に新しいニューロンを24個追加しました。封印した問題でも効果は保たれ、+19.7ポイントでした。これはモデル自身の計算をそっと押す形で効いていたので、次の段階は計算そのものを直接行うことでした。
  2. 手で配線した回路掛け算では、ルール表を手で書き、モデル自身の桁の読み取りを入力にしました。最初のバージョンは封印したホールドアウト問題で83.5%で、元は21.3%でした。スイッチを改良した2つ目のバージョンは83.1%で、ほかの数学で最も大きく下がったのは−0.75ポイントでした。
  3. プログラムが見つけたルールルールを探すプログラムに、解答付きの問題340問を桁と答えの形で渡しました。プログラムは答えの各桁について、それを決める最小の入力の組を探します。足し算の繰り上がり、引き算の繰り下がり、掛け算の繰り上がりの連鎖を、自力で見つけました。さらに、十の位は一の位のルールを十の位の数字に使い回し、繰り上がりのステップを足したものだということも見つけました。1つのルールが複数の桁に使われているわけで、これはこの研究の出発点になった考えそのものです。このプログラムの掛け算回路はホールドアウトで82.7%となり、手で配線したものとの差は0.5ポイント以内でした。
  4. 同じパイプラインで新しいスキルへ引き算と2桁の足し算は、掛け算の設定をそのまま使い、調整なしで同じスクリプトに通しました。3桁の足し算には3つの修正が必要で、それぞれホールドアウトのセットを開ける前にテストしました。3つの層をつなげた読み取り、2つ目のスイッチ、そして桁の位ごとに設定した後押しの強さです。
ルール探索プログラムの仕組み解答付きの問題340問を入力します。プログラムは答えの各桁について、それを決める最小の入力の組を見つけ、十の位が一の位のルールの使い回しに繰り上がりを足したものだと見つけ、ルールをルックアップテーブルにコンパイルします。解答付きの問題340問38 + 47 = 8516 + 29 = 4552 + 31 = 83...答えの各桁を決める最小の入力一の位 ← 2つの一の位十の位 ← 2つの十の位+ 一の位からの繰り上がり一の位のルールを1つ上の位で使い回しルックアップテーブル8, 7 → 5, 繰り上がり16, 9 → 5, 繰り上がり12, 1 → 3, 繰り上がり0... ルール探索プログラムの仕組み解答付きの問題340問を入力します。プログラムは答えの各桁について、それを決める最小の入力の組を見つけ、十の位が一の位のルールの使い回しに繰り上がりを足したものだと見つけ、ルールをルックアップテーブルにコンパイルします。解答付きの問題340問38 + 47 = 8516 + 29 = 4552 + 31 = 83...答えの各桁を決める最小の入力一の位 ← 2つの一の位十の位 ← 2つの十の位+ 一の位からの繰り上がり一の位のルールを1つ上の位で使い回しルックアップテーブル8, 7 → 5, 繰り上がり16, 9 → 5, 繰り上がり12, 1 → 3, 繰り上がり0...
ルール探索プログラム。解答付きの問題340問を、桁と答えの形で受け取ります。答えの各桁について、それを決める最小の入力の組を見つけます。一の位は2つの一の位だけで決まります。さらに、十の位が一の位のルールの使い回しに繰り上がりを足したものだと見つけ、ルールをルックアップテーブルにコンパイルします。例の行は説明のためのものです。

うまくいった理由

プログラムがルールを見つけられた理由

ルールはモデルから出てきたものではありません。モデルの外にある別のプログラムが、解答付きの例340個から見つけました。モデルの役割は数を提供することで、グラフトはそれをモデルの隠れ状態から読み取ります。これを可能にしたのは次の4つです。

  1. 問題を桁に分ける整数のままだと、7 × 48 = 336 は720通りある問題のうちの1つの事実にすぎません。桁に分けるとパターンが見えてきます。答えの最後の桁は7と8だけで決まります。これがいちばん重要な選択でした。各桁を1つのトークンとして持つSmolLM2にも合っています。
  2. いちばん単純な説明を求めるプログラムは答えの各桁について、それを必ず決める入力の桁の最小の組を探し、すべての例で成り立つときだけそのルールを採用します。2つの桁で決まるルールなら取りうる項目は約100個で、340個の例でほぼすべて埋まります。そのため、同じ組み合わせを使う新しい問題でも通用します。丸暗記するには入力の桁すべてを使うことになり、組み合わせの数は340個の例ではとても足りません。
  3. 見つけたルールを使い回す1つ上の桁では、一の位のルールをもう一度試し、残った部分を説明する追加の信号が1つあるかを確かめます。その信号が繰り上がりでした。プログラムはこの言葉を教わっていません。データが変数を1つ必要としていたから、それを見つけたのです。百の位で同じ手順を繰り返すと、繰り上がりの連鎖になります。
  4. 見たことのない問題で確かめるルールは、まだ見ていない問題でテストしてから、グラフト内のルックアップテーブルにコンパイルしました。

勾配学習には、いちばん単純な説明へ向かう仕組みが組み込まれておらず、例が少ないと丸暗記しました。掛け算では、同サイズの勾配グラフトは自分の学習問題で72.7%、開発用問題140問では25.1%でした。回路は、構築に使った問題で94.7%、同じ開発用問題で88.7%でした。

桁に分けるという枠組みは私たちが決め、プログラムはその中でルールを見つけます。算数を超えたスキルに向けた次の一歩は、問題の正しい分け方まで自分で見つけるプログラムです。

結果

5つのスキル、調整に一度も使っていない問題で

各スキルのホールドアウト問題は、構築を始める前に取り分けておき、それを使って何かを調整することはしていません。スコアはすべて、シード2つ、1問につき4回の実行によるもので、モデル単体でもグラフトありでも同じサンプリング設定です。掛け算のセットは、最初の手配線バージョンのときに1回、最後の2つのときにもう1回だけ開けました。

ホールドアウト正答率、SmolLM2-135M

完全に正しく答えた問題の割合。掛け算は140問、それ以外は500問。

  • SmolLM2単体
  • グラフトあり
  • 同じグラフト、配線をシャッフル
掛け算7 × 48、ルールは手で配線
21.3% → 83.1%+61.8
掛け算7 × 48、ルールはプログラムが発見
21.3% → 82.7%+61.3
引き算(2桁)83 − 27、ルールはプログラムが発見
11.3% → 68.3%+57.1
足し算(2桁)38 + 47、ルールはプログラムが発見
49.7% → 86.5%+36.8
足し算(3桁)347 + 285、ルールはプログラムが発見
26.1% → 83.7%+57.6
同じ結果を表にしたもの
スキル問題数SmolLM2単体グラフトあり向上幅、ポイント(95%下限)配線シャッフル追加した重み
掛け算、ルールは手で配線7 × 4814021.3%83.1%+61.8 (+56.1)2.4%25,2700.019%
掛け算、ルールはプログラムが発見7 × 4814021.3%82.7%+61.3 (+55.5)6.3%32,5190.024%
引き算(2桁)83 − 2750011.3%68.3%+57.1 (+54.0)7.8%32,4460.024%
足し算(2桁)38 + 4750049.7%86.5%+36.8 (+33.8)16.7%32,4760.024%
足し算(3桁)347 + 28550026.1%83.7%+57.6 (+54.6)21.4%121,1980.090%
  • 元の重みは一つも変えておらず、勾配学習もしていません。各グラフトが追加する重みは25,270から121,198個で、モデルの0.019%から0.090%です。自分たちで決めた上限は0.1%でした。
  • シャッフルの対照は、同じグラフトの配線をシャッフルしたものです。どのスキルでもモデル単体と同じかそれ以下の2.4%から21.4%で、正しいルールがなければ追加の重みは何の役にも立ちません。
  • 2桁の3つのグラフト(掛け算、引き算、足し算)は、1つのモデルで同時に動かすこともでき、重みは合計92,496個です。どれも開発用問題での向上を保ちました。ほかの数学で最も大きく下がったのは−0.25ポイントで、無関係なプロンプト200件中200件で以前と同じ答えが返りました。

向上幅は問題ごとに対にして比べ、片側95%のブートストラップ下限を使っています。副作用のチェックは、ほかの算数と文章題のセット8種類に、GSM8Kとコードを加えたものです。無関係なプロンプトはIFEvalのプロンプト200件で、貪欲デコードで答えさせました。どの実行も、ルールと予測は結果が出る前に書き留めています。

勾配学習との比較

3つの直接対決

スキルを追加する標準的な方法は勾配学習なので、それを対戦相手として走らせました。勾配グラフトはどれも、テストの前に設定のグリッドで調整しています。

掛け算、封印したホールドアウト

140問、シード2つ、各4回。最初の手配線回路と、調整済みの勾配学習グラフト2つの比較。

SmolLM2単体
21.3%
勾配グラフト、同サイズ14ニューロン
25.6%
勾配グラフト、上限0.1%77ニューロン
23.7%
回路グラフト重み25,270個、勾配学習なし
83.5%

回路は57.9ポイントと59.8ポイント上回りました。

掛け算、LoRAファインチューニングとの比較

開発用問題140問、シード2つ、各4回。LoRAはグリッドサーチで最も良かった設定を使用。

SmolLM2単体
28.5%
LoRAファインチューニング学習した重み115,200個
39.4%
回路グラフト重み25,270個、勾配学習なし
88.7%

49.3ポイント上回り、95%下限は+42.8。使った重みは4分の1未満です。

2桁の引き算

開発用問題500問、シード2つ、各4回。回路の設定は掛け算からコピーし、調整なし。

SmolLM2単体
11.35%
勾配グラフト、14ニューロン
48.15%
勾配グラフト、77ニューロン重み133,056個、調整済み
65.0%
回路グラフト重み32,446個、調整なし
64.98%

4倍の大きさの勾配グラフトとは同点で、14ニューロンのものより約17ポイント上でした。

回路の引き算のルールは340問から得たものです。勾配グラフトは1,500問で学習しました。これは回路の桁の読み取りをフィットしたのと同じ1,500問です。

進行中

大きなモデルからの移植

より大きなモデルからスキルを移す試みも進めています。Qwen3.5-4Bは、私たちのチェックでこの掛け算問題を300問中300問正解したので、そのニューロンの一部をSmolLM2に変換して移そうとしました。それとは別に、小学校レベルの文章題で、Qwen3.5-4Bの補正信号をQwen3.5-0.8Bに写像しました。どちらもまだうまくいっておらず、どちらも継続中です。今のところ、大きなモデルは、小さなモデルがどこでつまずくかを知る手がかりとして一番役に立っています。

グラフトとは何か

モデル自身の読み取りを入力にする電卓

計算はグラフト自身が、モデルがすでに持っている数から行います。SmolLM2が掛け算を覚えるわけではありません。グラフトが働くのは素の形の問題(「347 + 285は?」)で、文章題ではスイッチが意図的にオフにしています。ここまではすべて1つのモデルでの結果です。

この方法は新しいスキルにもそのまま使えます。ルールは340例からプログラムが見つけ、表にコンパイルし、どのスキルでも同じ設定で組み込みます。次は学習の側です。プロンプトで渡された事実をSmolLM2に使わせることに取り組みます。