未来を形作るテクノロジーの深掘り記事。

重み空間プログラミング:LLMの第三のレバー

LLMがニューラルネットの重みを直接読み、編集する「重み空間プログラミング」。直接編集がファインチューニングに勝る場面と、その脆さを解説。

発光するノードの格子の中で、一本の糸に光線が当たり、慎重に繋ぎ直されている様子。
ニューラルネットワークを手作業で編集する。何十億本もの糸のうち一本を、勾配の圧力ではなく意図をもって変える。

勾配降下法は一度も神聖なものではなかった。それは足場だった。人間には読めない数十億の数値を形作るための唯一の汎用的な道具であり、だからこそ私たちはディープラーニングの教義全体をその周りに組み立ててきた。MIT CSAILのチームがその足場を蹴飛ばした。彼らはフロンティアモデルに学習済みニューラルネットワークの生の重みを渡し、学習ループも勾配も順伝播も使わせずに、自然言語でそれを説明させ、デバッグさせ、書き換えさせた。そして実際にうまくいった。重み空間プログラミング、つまり重みを坂道の下へ少しずつ動かすのではなく、パラメータそのものについて推論するやり方は、思考実験からデモへと移った。そしてこれは静かに、ファインチューニングを「モデルを適応させる方法」の座から降ろし、三つの選択肢の一つへと格下げしつつあると私は考えている。

この主要な結果は、受けている注目に値する。勾配更新を一切使わずにQwen3.5-0.8Bの数学力を上げるよう求められたモデル(GPT-6 Astra)は、病的な推論ループを、二つのMLP層に書き込まれた一つの方向まで追跡した。そしてその方向を重みの0.016%から差し引いた結果、MATH-500の正答率は7.9%から48.1%に上がった。サンプリング設定も条件もすべて同じだ。この修正は指示追従にも転用でき、IFEvalのスコアは3倍になった。これはハイパーパラメータの微調整ではなく、手術である。ただし勾配降下法を葬る前に、実際に何が示されたのか、どこまで一般化するのか、そしてどこですでに失敗しているのかを正確に押さえておく価値はある。

重み空間プログラミングの実体

長い間、モデルの振る舞いを変える方法は実質的に二つしかなかった。プロンプティングは入力を変えるもので、重みは凍結したままだ。ファインチューニングは重みを変えるが、盲目的に行う。損失関数の地形にサンプルのバッチを見せ、勾配に任せてエラーを減らす方向へパラメータを押し出す。その途中でどの内部機構が配線し直されるかは、ほとんど制御できない。重み空間プログラミングは第三のレバーを提案する。損失関数は丸ごと捨てる。代わりに推論システムが重みを読み、それが何を計算しているかについて仮説を立て、自然言語の仕様に合うよう重みを編集する。

読み取りの結果がいちばん不気味な部分だ。研究者たちは、Breakout、Pong、Pac-Man、Freewayのグリッドワールド版を遊ぶ小さな方策を四つ、PPOで学習させた。アーキテクチャも入力チャンネルも行動空間も同一なので、区別できるのは重みだけだ。Astraは候補リストを知らされないまま、四つのゲームすべてを正しく言い当てた。円、正方形、三角形を生成するように学習させた拡散モデルでも同じことをやってのけた。さらに難しい版では、埋め込み層と出力層を取り除き、すべての次元にラベルがない状態で中間層だけを渡された文字レベルのトランスフォーマー三つのうち、どれがPython、英語、ローマ字化された日本語で学習されたかを特定した。その過程でAstraは、重み行列同士を掛け合わせることで、すべてのインダクションヘッド(それ以前のテキストを繰り返すコピー回路)を見つけ出した。これは解釈可能性の文献にある既知の手法で、誰もそれを教えていない。メカニスティック解釈可能性の地道な研究を追ってきた人なら、汎用モデルがそれを自然にやってのける様子には、少しめまいを覚えるはずだ。

そして重みを書いた。PPOで学習させた車の制御器が局所解に嵌まっていた。方策はバックして速度をつける代わりに、スロープへまっすぐ突っ込んでいた。Astraは重みと記録された一エピソードだけからその失敗を診断し、パラメータの3.5%を変えた編集によって、1,024回の評価エピソードすべてで車を成功させた。環境からのフィードバックがゼロの状態で、ゲームをプレイするネットワークをゼロから書くよう求めると、1億ステップ学習させたPPOのネットワークを上回る方策を生み出した。もう一度読んでほしい。対話もなく、報酬信号もなく、ゲームの自然言語による記述を、言語モデルの推論が機能する重みにコンパイルしたのだ。

実際のモデルへの直接的な重み編集

実務者にとって重要なのはQwenの修復結果だ。0.8億パラメータは本物のモデルであり、チームが実際にファインチューニングして出荷するようなサイズだからだ。失敗はよく知られている。小さな推論モデルはループに陥り、答えを出さないまま同じ文を繰り返して、トークン上限に達してしまう。Qwenのモデルカード自体がこの問題に警告している。研究者たちの試行では、最初の96回答のうち85回が、この形で32,768トークンのコンテキストを使い切っていた。Astraの診断はこうだ。層15と19のMLPが、モデルを同じ生成軌道へ引き戻し続ける方向を残差ストリームに書き込んでいた。その修正は、二つのMLPそれぞれの64個の出力列からその方向を差し引くことだった。合計131,072個の重み、モデル全体の0.016%である。

計算はほとんど馬鹿馬鹿しいほど単純で、それがポイントだ。活性化空間のどの方向が「永遠にループする」に対応するかが分かってしまえば、それを取り除くのは射影に過ぎない。影響を受ける各重みベクトルについて、悪い方向に沿った成分を引けばよい。数行のコードで誰でも書ける。

import numpy as np
def subtract_direction(W, v, columns):
"""Remove the component of each chosen column that lies along v."""
v = v / np.linalg.norm(v)
W[:, columns] -= np.outer(v, v @ W[:, columns])
return W
# The Qwen repair, schematically: for the MLP output projections of
# layers 15 and 19, subtract the "loop" direction from 64 columns each.
# 2 layers x 64 columns x 1024 rows = 131,072 edited weights.
W_down[15] = subtract_direction(W_down[15], loop_dir[15], cols[15])
W_down[19] = subtract_direction(W_down[19], loop_dir[19], cols[19])

本当に難しかったのは引き算ではない。数千次元にもわたる残差ストリームの中で、どの層の、どの方向かを知ることだ。これまで私たちが勾配降下法を必要としたのはまさにその部分だった。勾配とは、重み空間上の探索手続きであり、何も理解していなくても使えるものだからだ。Astraは探索を診断に置き換えた。試行錯誤で配線をいじって故障が消えるまで待つ電気工と、回路図を読んで正しい線を切る電気工の違いのようなものだ。モデルが重み行列の合成によってインダクションヘッドを見つけたのも同じ理屈による。それは見せられたことのない公開された解釈手法を適用したのであり、暗記したレシピではなく、推論の本当の転移を示唆している。

濃密な織物のように編まれた発光する糸の中から、一本の光る糸がきれいに引き抜かれている様子。
ネットワークの重みから一つの方向を差し引く。正しい糸を選べば、織物は崩れない。

直接的な重み編集がファインチューニングに勝るとき

ここで私の立場を述べ、それを擁護しよう。小〜中規模のモデルにおける、狭く局所化できる失敗に対しては、直接的な重み編集がすでにより良い道具であり、その差は小さくない。ループのバグに対するファインチューニングという選択肢を考えてみよう。ループしない推論トレースのデータセットを組み立て、SFTやRLを回し、損失の圧力がその振る舞いを取り除き、モデルの他の知識を劣化させないことを祈る。GPU時間を燃やしながら、本当の意図である「同じことを繰り返すな」ではなく、代理指標(たとえば数学データを増やすこと)に向けて山登りをすることになる。重み空間プログラミングなら意図をそのまま書ける。その編集が触れたのはモデルの0.01%にすぎない。ファインチューニングはモデル全体に触れ、その副作用は後になって、学習の実行とは結びつけられない奇妙な回帰として表面化する。

ファインチューニングは意図の代理指標に向けて山登りをする。重み空間プログラミングなら、意図をそのまま書ける。

二つ目のケースは、勾配法が構造的に抜け出せない局所解からの脱出だ。PPOが車をスロープに押し付けたままにしたのは、強化学習が現在の方策をわずかに揺さぶって探索するからであり、「まっすぐ進む」という方策の小さな摂動からは「まず二秒バックする」は見つからない。推論は揺さぶらない。現在の答えの摂動ではなく、問題のモデルの上で動くため、質的に異なる解へ飛び移ることができる。十億ステップのPPOが、一回の推論パスが見つけたものを見つけられなかった。それは効率の差ではなく、カテゴリーの違いなのだ。

三つ目として、反復のループが崩壊する。ファインチューニングには、データ整理、学習の実行、評価の掃引、回帰チェックといった物流の尾がついてくる。そのせいで「小さな振る舞いの変更」が数日がかりのプロジェクトになる。大規模モデルを自前のハードウェアで動かしたことがある人なら、その労力の多くがモデリングではなく配管作業であることを知っているはずだ。重みの編集はコードのホットフィックスに近い。診断し、パッチを当て、評価を回し、間違っていれば元に戻す。診断が正しければ、学習パイプライン全体を飛ばせる。明確な勝ち筋は次の四つの状況に集中している。

  • 失敗は診断できているが、その修正を表現する学習データがない
  • 振る舞い一つだけを変え、他を流出させない外科的な範囲が必要
  • ランダムな探索では抜け出せない局所解に嵌まっている
  • GPUでも日程でも、学習パイプラインを用意する余裕がない

重み空間プログラミングが脆い理由

さて、冷水を浴びせる番だ。材料は十分にある。私が見た中で最も有用なデータ点は論文からのものではなく、小さな自然言語からbashへのモデルに同じ手口を試したが、差し引きでは何も得られなかった実務者の報告だ。1,920個の重みを編集したところ、grepの間違いは直ったが、ほかのコマンドが壊れた。それは予想どおりの結果であり、そこに本質的な問題がある。学習済みネットワークの振る舞いは絡み合っているのだ。Qwenの編集がうまくいったのは、ループという振る舞いがたまたまコンパクトで取り除ける方向に存在していたからだ。多くの振る舞いはそうではない。重ね合わせの中に塗り広げられ、同じ列が無関係な複数の特徴を同時に担っている。だから「方向」を一つ引くことは、和音から一音だけ取り除こうとするようなものだ。他の音も削ってしまう。どの失敗が幾何学的にコンパクトで、どれが塗り広げられているかを事前に予測する理論は誰も持っていない。それができるまで、重みの編集はすべて賭けである。

読み取りのデモも割り引いて見る必要がある。ゲームネットワークについてのAstraの推論は表面的な統計に頼っていた。第一層の重みがどこに集中しているか、どの出力ロジットが分離しているかといったことだ。言語の識別も、実質的には三択問題だった。その中の一つ、ローマ字化された日本語には、q、l、v、xがないという際立って特異な文字分布がある。印象的なパターンマッチングだろうか。もちろんだ。重み空間の深い本質的理解の証拠だろうか。それはあまり明確ではない。拡散モデルの結果は両面性がある。Astraは、モデルが実際には塗りつぶされた図形を生成するのに、すべての図形を輪郭線として描いた。これは、Astraが網の振る舞いをシミュレートしたのではなく幾何学を読んでいたことを示す誤りだが、同時に、その「理解」がテストを通過しながらも構造的に間違いうることも示している。

そして規模と出自の問題がある。きれいな結果はどれも1.7万から700万の重みの範囲にとどまり、Qwenの0.8Bが例外的な存在だ。中間層を読む実験でさえ、そこに到達するのに最大100回のPython解析実行を要した。70Bモデル、ましてやフロンティアモデルでこれが機能したという例は示されていない。重みをコンテキストウィンドウに貼り付けるという素朴なやり方は、そこまで届く前に力尽きる。全体に重くのしかかる不快な問いもある。この能力はどこから来たのか。チェスに異様に強いLLMは、大抵学習中にチェスの表記を大量に食べていたことが判明する。Astraが重みデータで意図的に学習させられていたのなら、これらの結果は創発的な理解というより、非常に優れたカリキュラムについて多くを語っている。正直なところ、私たちには分からない。

最後に、MATH-500の上昇には但し書きが必要だ。このベンチマークは何年も前から学習データで飽和している。そして基盤モデルが7.9%しか取れないのは、ほぼ確実に数学の能力ではなく、ループや書式で失敗しているからだ。つまり今回の編集は、スキルを生み出したのではなく、潜在能力のブロックを外したことになる。それでも価値はある。ブロックを外すことは本物の成果だ。しかし「編集によってモデルが数学でより良くなった」とは別の主張であり、ベンチマークは実際の仕事の大半を捉えられないという、おなじみのパターンに当てはまる。

作業台の上で、露出した回路基板のそばに並んで置かれたメスと大槌。
モデルを変える二つの哲学:重み編集のメスと、勾配学習の大槌。

本番環境での重み編集:ホットフィックスとして扱う

試してみたいなら、そして小さなモデルでは試すべきだが、稼働中のデータベースへのホットパッチに適用するのと同じ規律で重みの編集を扱ってほしい。すべてを差分で記録する。どのテンソルがどれだけ変わったかを正確に残すこと。0.016%というのは、編集スクリプトのサイレントなバグが永遠に隠れてしまうほど小さい数字だからだ。対象の振る舞いだけでなく、広く評価すること。Qwenの修正はたまたま指示追従も改善したが、その副作用の符号は運によるものであり、次は逆方向に出るかもしれない。ベースのチェックポイントは神聖なものとして守り、すべての編集を可逆なパッチとしてバージョン管理する。そして野心の範囲を絞ること。実証された適切な領域は、完全に評価できるモデルにおける、小さくよく理解された失敗だ。70Bモデルの曖昧な「雰囲気」の問題を「悪い方向を取り除く」ことで直そうとしているなら、重ね合わせについて痛い目を見ることになる。

  • ベースのチェックポイントを固定し、編集は差分として保存する。上書きはしない
  • 編集の前後に、対象のベンチマークだけでなく広範な評価を回す
  • 曖昧な雰囲気よりも、鋭く再現可能な兆候を持つ失敗を優先する
  • 巻き戻しのコストを見込んでおく。いくらかの編集は何かを壊すと想定する

正直な立場を述べると、現状これは解釈可能性の計器であり、デバッグのためのメスであって、デプロイのパイプラインではない。最初に価値を引き出すチームは、重みの編集を本番に出荷するチームではないだろう。フロンティアモデルを使って、自分たちの小さなモデルが何を学習したかを説明させるチームだ。推論トレースをすでに読んでいるように、チェックポイントを読み、その知識に基づいて、ありふれた、地味で信頼できる道具で行動するのだ。

勾配は死んだのではなく、降格しただけ

ここで、冒頭の主張が崩れる。率直に認めたい。勾配降下法には、重み空間プログラミングにはできないことがある。大規模なデータから学習することだ。Astraがこれらの編集に使ったすべての能力は、そもそも巨大な学習コーパス上で勾配によって組み込まれたものだ。推論はネットワークが知っていることに手術を施すことはできるが、人間のテキストの総体をネットワークに教えることはできない。現実的な未来は、勾配が置き換えられることではなく、役割分担だ。勾配がコンクリートを流し込み、重み空間プログラミングが仕上げの大工仕事をする。四十年にわたり、私たちは学習済みの重みを不透明な成果物、外側からしか操縦できないブラックボックスとして扱ってきた。ここで本当に新しいアイデアは、その箱が読めるようになりつつあるということ、そしてそれを読んでいるのは私たちではないということだ。それを心強いと思うか不安に思うかは、勾配をどれだけ信頼してきたかによるのだろう。