出発点
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桁すべて正解 |
|---|---|
| 0 | 0.0% |
| 1 | 4.3% |
| 2 | 26.0% |
| 3 | 50.1% |
| 4 | 52.2% |
| 5 | 47.1% |
| 6 | 31.4% |
| 7 | 20.4% |
| 8 | 18.8% |
| 9 | 18.2% |
| 10 | 27.1% |
| 11 | 27.9% |
| 12 | 39.1% |
| 13 | 47.2% |
| 14 | 74.8% |
| 15 | 70.1% |
| 16 | 64.0% |
| 17 | 63.0% |
| 18 | 64.2% |
| 19 | 63.5% |
| 20 | 72.9% |
| 21 | 76.6% |
| 22 | 71.5% |
| 23 | 62.9% |
| 24 | 48.8% |
| 25 | 30.5% |
| 26 | 19.0% |
| 27 | 13.9% |
| 28 | 11.7% |
| 29 | 11.8% |
つまり、モデルは問題を読めています。確実にできないのは、桁を組み合わせることです。繰り上がり、繰り下がり、九九。その組み合わせの部分を私たちが補います。
グラフトの仕組み
4つのパーツ、どれも勾配降下法では学習していない
- 読み取り2つの数の各桁ごとに、モデル自身の隠れ状態から取る線形の読み取り。
- ルール答えの各桁ごとの小さなルックアップテーブル。一の位は2つの一の位から決まり、十の位は2つの十の位と繰り上がりから決まります。その上の桁も同じです。
- 書き込みモデルの最終層で、正しい数字トークンへの後押しを加えます。返答を書くのはモデル自身のままです。グラフトは次に来る数字を少し傾けるだけです。
- スイッチフィットさせた2つのスイッチが、グラフトをいつオンにするかを決めます。この種の問題の答えを書いている間だけ作動し、ほかの数学、文章題、コード、ふつうの文章ではオフのままになるようにフィットしています。
読み取りとスイッチは閉形式の最小二乗法でフィットし、ルール表はプログラムで書き出しています(最初の掛け算グラフトは手で書きました)。ベースモデルのファイルには一切触れません。各グラフトはその横に追加します。
どう発展したか
1つのグラフトからパイプラインへ
- ニューロングラフト最初の試みでは、2桁の足し算の繰り上がりを補うために、最終層に新しいニューロンを24個追加しました。封印した問題でも効果は保たれ、+19.7ポイントでした。これはモデル自身の計算をそっと押す形で効いていたので、次の段階は計算そのものを直接行うことでした。
- 手で配線した回路掛け算では、ルール表を手で書き、モデル自身の桁の読み取りを入力にしました。最初のバージョンは封印したホールドアウト問題で83.5%で、元は21.3%でした。スイッチを改良した2つ目のバージョンは83.1%で、ほかの数学で最も大きく下がったのは−0.75ポイントでした。
- プログラムが見つけたルールルールを探すプログラムに、解答付きの問題340問を桁と答えの形で渡しました。プログラムは答えの各桁について、それを決める最小の入力の組を探します。足し算の繰り上がり、引き算の繰り下がり、掛け算の繰り上がりの連鎖を、自力で見つけました。さらに、十の位は一の位のルールを十の位の数字に使い回し、繰り上がりのステップを足したものだということも見つけました。1つのルールが複数の桁に使われているわけで、これはこの研究の出発点になった考えそのものです。このプログラムの掛け算回路はホールドアウトで82.7%となり、手で配線したものとの差は0.5ポイント以内でした。
- 同じパイプラインで新しいスキルへ引き算と2桁の足し算は、掛け算の設定をそのまま使い、調整なしで同じスクリプトに通しました。3桁の足し算には3つの修正が必要で、それぞれホールドアウトのセットを開ける前にテストしました。3つの層をつなげた読み取り、2つ目のスイッチ、そして桁の位ごとに設定した後押しの強さです。
うまくいった理由
プログラムがルールを見つけられた理由
ルールはモデルから出てきたものではありません。モデルの外にある別のプログラムが、解答付きの例340個から見つけました。モデルの役割は数を提供することで、グラフトはそれをモデルの隠れ状態から読み取ります。これを可能にしたのは次の4つです。
- 問題を桁に分ける整数のままだと、7 × 48 = 336 は720通りある問題のうちの1つの事実にすぎません。桁に分けるとパターンが見えてきます。答えの最後の桁は7と8だけで決まります。これがいちばん重要な選択でした。各桁を1つのトークンとして持つSmolLM2にも合っています。
- いちばん単純な説明を求めるプログラムは答えの各桁について、それを必ず決める入力の桁の最小の組を探し、すべての例で成り立つときだけそのルールを採用します。2つの桁で決まるルールなら取りうる項目は約100個で、340個の例でほぼすべて埋まります。そのため、同じ組み合わせを使う新しい問題でも通用します。丸暗記するには入力の桁すべてを使うことになり、組み合わせの数は340個の例ではとても足りません。
- 見つけたルールを使い回す1つ上の桁では、一の位のルールをもう一度試し、残った部分を説明する追加の信号が1つあるかを確かめます。その信号が繰り上がりでした。プログラムはこの言葉を教わっていません。データが変数を1つ必要としていたから、それを見つけたのです。百の位で同じ手順を繰り返すと、繰り上がりの連鎖になります。
- 見たことのない問題で確かめるルールは、まだ見ていない問題でテストしてから、グラフト内のルックアップテーブルにコンパイルしました。
勾配学習には、いちばん単純な説明へ向かう仕組みが組み込まれておらず、例が少ないと丸暗記しました。掛け算では、同サイズの勾配グラフトは自分の学習問題で72.7%、開発用問題140問では25.1%でした。回路は、構築に使った問題で94.7%、同じ開発用問題で88.7%でした。
桁に分けるという枠組みは私たちが決め、プログラムはその中でルールを見つけます。算数を超えたスキルに向けた次の一歩は、問題の正しい分け方まで自分で見つけるプログラムです。
結果
5つのスキル、調整に一度も使っていない問題で
各スキルのホールドアウト問題は、構築を始める前に取り分けておき、それを使って何かを調整することはしていません。スコアはすべて、シード2つ、1問につき4回の実行によるもので、モデル単体でもグラフトありでも同じサンプリング設定です。掛け算のセットは、最初の手配線バージョンのときに1回、最後の2つのときにもう1回だけ開けました。
完全に正しく答えた問題の割合。掛け算は140問、それ以外は500問。
- SmolLM2単体
- グラフトあり
- 同じグラフト、配線をシャッフル
| スキル | 問題数 | SmolLM2単体 | グラフトあり | 向上幅、ポイント(95%下限) | 配線シャッフル | 追加した重み |
|---|---|---|---|---|---|---|
| 掛け算、ルールは手で配線7 × 48 | 140 | 21.3% | 83.1% | +61.8 (+56.1) | 2.4% | 25,2700.019% |
| 掛け算、ルールはプログラムが発見7 × 48 | 140 | 21.3% | 82.7% | +61.3 (+55.5) | 6.3% | 32,5190.024% |
| 引き算(2桁)83 − 27 | 500 | 11.3% | 68.3% | +57.1 (+54.0) | 7.8% | 32,4460.024% |
| 足し算(2桁)38 + 47 | 500 | 49.7% | 86.5% | +36.8 (+33.8) | 16.7% | 32,4760.024% |
| 足し算(3桁)347 + 285 | 500 | 26.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つの比較。
回路は57.9ポイントと59.8ポイント上回りました。
開発用問題140問、シード2つ、各4回。LoRAはグリッドサーチで最も良かった設定を使用。
49.3ポイント上回り、95%下限は+42.8。使った重みは4分の1未満です。
開発用問題500問、シード2つ、各4回。回路の設定は掛け算からコピーし、調整なし。
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に使わせることに取り組みます。