---
title: "スパース回路とは？OpenAIの重みスパースTransformerの仕組みと公開モデルでの検証"
url: "https://www.issoh.co.jp/tech/details/9878/"
published: 2025-11-18
updated: 2026-11-09
categories: ["LLM・RAG"]
publisher: "株式会社一創"
---

# スパース回路とは？OpenAIの重みスパースTransformerの仕組みと公開モデルでの検証

スパース回路は、OpenAIが2025年11月13日に発表した解釈可能性の研究です。重みのほとんどをゼロにして言語モデルを学習させ、特定のタスクを担う最小の部品（回路）を取り出して、人が配線図として読めるようにします。原論文は「[Weight-sparse transformers have interpretable circuits](https://arxiv.org/abs/2511.13653)」（Leo Gaoほか5名）で、[ICML 2026の会議録](https://proceedings.mlr.press/v306/gao26w.html)に掲載されました。

この記事では、学習方法と回路の取り出し方、論文が読み解いた回路の中身を一次情報から整理します。さらに、OpenAIの公開モデルで論文が名指しした部品の配線を重みから確かめ、そのチャネルを切って出力の変化を測りました。2026年11月時点の批判と後続研究までまとめています。

## まとめ：スパース回路の要点

- 重みの大半をゼロに強制して学習したGPT-2系のモデルから、タスクごとの最小回路を取り出す手法です。最も疎なモデルでは非ゼロの重みは約1,000個に1個です。
- 同じ事前学習損失の密なモデルと比べると、同じタスク損失を出す回路が約16分の1の大きさになります。
- 代償は計算効率です。同程度の能力の密なモデルより学習と推論に100〜1,000倍の計算が必要で、最先端モデルをこの方式で作り直すことは現実的でないと論文は評価しています。
- 公開モデルで確かめると、論文の配線は重みに実在しました。第2層Attentionの書き込み1249を平均に固定すると、入れ子64件の二択内平均確率は0.828から0.039へ落ち、対照の20チャネルを1本ずつ平均に固定した場合は0.820〜0.831でした。
- 取り出した回路が元モデルの計算を忠実に表しているかには反論があり、2026年の検証では、GaoらのモデルのMLP層から標本抽出した非ゼロ重みについて、10分割の未使用文章で評価した頑健な解釈率が15.0%でした。
- 自社のAIの判断根拠を説明する用途には、現時点では使えません。

以下、定義から順に根拠を示します。

## スパース回路の定義：重みの疎なモデルから取り出す最小の配線

通常の密なネットワークでは、各ニューロンが次の層のほぼすべてのニューロンとつながり、1つのニューロンが複数の概念を兼務します。個々の重みを見ても意味が読めないのはこのためです。論文はその原因の候補として、密なモデルはより大きな「ほどけた」疎なネットワークを近似しているという重ね合わせ（superposition）仮説を挙げています。

そこでOpenAIは、最初から接続の少ないモデルを学習させました。ニューロンの数は増やしつつ、1つのニューロンが読み書きできる接続を数十本程度に制限すると、タスクごとの計算が小さな部品に分かれやすくなります。

論文での「回路」は、ノードとエッジの集合です。ノードは個々のニューロン、アテンションのチャネル、残差ストリームへの読み出しと書き込みで、重み行列の行と列に対応します。エッジは重み行列の非ゼロ要素1つです。解釈しやすさの主指標は、タスクごとの回路に含まれるエッジ数（幾何平均）です。

### MoE・スパースアテンション・事後の枝刈りとの違い

「スパース」を名乗る技術はほかにもあります。論文は脚注で、Mixture of Expertsは重みのほぼすべてが非ゼロなので、この研究の用語では密なモデルに分類されると明記しています。

| 技術                 | 疎にするもの       | 主な目的     |
| ------------------ | ------------ | -------- |
| スパース回路（重みスパース学習）   | 重み行列の要素      | 解釈しやすさ   |
| Mixture of Experts | トークンごとに使う専門家 | 計算量の削減   |
| スパースアテンション         | アテンションをかける位置 | 長い文脈の高速化 |
| 事後の枝刈り（Wandaなど）    | 学習済みの重み      | 軽量化      |

計算量削減のための疎化は[MoE（Mixture of Experts）の疎活性化とルーターの仕組み](/tech/details/15810/)や[疎なAttentionの仕組みとNSA・DSA](/tech/details/16057/)で扱っています。スパース回路は速さを犠牲にしてでも読みやすさを取る研究で、方向が逆です。

## 重みスパースTransformerの学習方法

### L0制約と段階的なアニーリング

学習はAdamWによる通常の交差エントロピー最小化です。違いは、毎ステップのAdamW更新の直後に、各重み行列で絶対値の大きい要素だけを残して残りをゼロにする点です。どの行列も非ゼロの割合が同じになるようにそろえます。非ゼロ数（L0）は最初から目標値にせず、学習の前半50%で密な状態から目標値へ線形に下げ、最大かつ最も疎なモデルでは80%まで延ばしています。

### モデル構成と学習データ

アーキテクチャはGPT-2に近いデコーダーのみのTransformerで、学習データはPythonコードです。Hugging Faceで公開された`csp_yolo2`は8層、`d_model` 2,048、MLP幅8,192、ヘッド数128、ヘッド幅16、語彙2,048です。語彙が小さいのはPython専用のトークナイザーを使っているためで、汎用の対話モデルではありません。

## 回路の取り出し方と評価の基準

回路の評価には、手作業で作った20個のPythonの次トークン予測タスクを使います。どれも2択で答えが一意に決まる課題で、たとえば文字列を一重引用符と二重引用符のどちらで閉じるかを当てさせます。

タスクごとに、目標のタスク損失（特記がなければ0.15）を満たす最小のノード集合を探します。ノードには学習可能なマスクを付け、タスク損失と残すノード数の和を最小化します。削ったノードは0にせず、事前学習データ全体での平均活性に固定します（平均アブレーション）。

結果は、事前学習損失がそろう2つのモデルで、どの目標損失でも疎なモデルの回路が約16分の1の大きさでした。回路のノードだけを削って残りを生かすとタスク性能が大きく落ちることも確かめ、回路が十分条件であるだけでなく必要条件でもあると示しています。

## 論文が読み解いた3つの回路

研究チームは、単純そうに見えた3タスクの回路を1つあたり研究者1人日ほどかけて手で解析しました。

### csp\_yolo1の引用符を閉じる回路：12ノード・9エッジ

12層の別モデル`csp_yolo1`の回路です。第0層のMLPが、`("`と`('`の埋め込みから「引用符検出」と「引用符の種類判定」の2つのニューロンを作ります。第10層のアテンションヘッドが前者をキー、後者をバリューとして使い、文字列の開始位置から種類の情報を末尾へコピーして、対応する閉じ引用符を予測します。論文の図は、この12ノードと9エッジを省略なしで描いています。

この部品に接続するエッジは合計41本で、そのうち9本がこの回路で使われており、著者らは、この程度なら重みだけから回路をたどれる見込みがある、と書いています。

### リストの入れ子判定回路：残差チャネル1249による深さの表現

フラットなリストを`]`で、入れ子のリストを`]]`で閉じるタスクです。第2層のヘッド125がチャネル12で開き括弧の検出値を文脈全体で平均し、その大きさを入れ子の深さとして残差チャネル1249に書き込みます。第4層のヘッド80はこの値をクエリのチャネル4で読み、アテンションシンクとの比較をしきい値にして、深さが十分なときだけ残差チャネル1079へ「入れ子を閉じる」信号を出します。

平均を取る仕組みだと分かれば、弱点も予想できます。リストの前のコメントに余分な`[`を置けばフラットなリストでも`]]`と誤答させられ、リストを長くすれば平均が薄まって入れ子でも`]`と誤答します。論文はこの「文脈の希釈」が同程度の能力の密なモデルにも通じたと報告しています。

### 変数の型を追う回路：2段のアテンション

`current = set()`か`current = ""`かを覚えておき、後で`.add`と`+=`のどちらが続くかを当てるタスクです。第4層のヘッド73が変数名の埋め込みを`set()`側のトークンへコピーし、第6層のヘッド26がその情報を最終位置へ運びます。回路外とのエッジは計100本あり、著者らもタスク用データなしでは理解が難しいと認めています。

## 公開モデルcsp\_yolo2で配線と挙動を確かめた結果

OpenAIは論文で用いたモデルの一部の重みと推論コードを[GitHubのopenai/circuit\_sparsity](https://github.com/openai/circuit%5Fsparsity)で、括弧と変数のタスクに使った`csp_yolo2`を[Hugging Faceのopenai/circuit-sparsity](https://huggingface.co/openai/circuit-sparsity)で公開しています。ライセンスはどちらもApache License 2.0です。2026年11月8日に、Hugging Face版（model.safetensorsは約1.68GB）をIntel Core i9-9880HのCPU、Python 3.11.15、torch 2.2.2、transformers 4.46.3で動かしました。

### Hugging Face版の読み込みエラーと3つの互換性対策

モデルカードの手順どおりに`AutoModelForCausalLM`で読むと、この環境では次の順にエラーが出ます。リビジョンは2025年12月12日の`ebf2603`から更新されておらず、下の1点目は11月時点でも直っていません。

1. 同梱の`config.py`が`circuit_sparsity.gpt`をimportしており、GitHub版のパッケージを入れても同じ名前のモジュールは`circuit_sparsity.inference.gpt`に移っていて解決しません。
2. 同梱`config.py`が渡す`unembed_rank`など10個の引数を、同梱`gpt.py`の`GPTConfig`が受け付けません。
3. `nn.RMSNorm`を使うため、torch 2.4未満では読み込めません。Intel Mac向けの公式配布wheelは、torch 2.2.2が最終版です。

次のスクリプトは、この3点を回避して重みの疎度と括弧の予測確率を測ります。再現時はPython 3.11環境にtorch 2.2.2、transformers 4.46.3、numpy 1.26.4、huggingface-hub、safetensorsをインストールしてください。

```
import sys, types, dataclasses
import torch
from torch import nn

from huggingface_hub import snapshot_download
MODEL_DIR = snapshot_download("openai/circuit-sparsity", revision="ebf2603cfe24e5c09e31169d9e34a9fd3d15230c", local_dir="/tmp/cs_hf_full")

# (1) torch 2.2 には nn.RMSNorm が無い(2.4で追加)ので同じ式で補う
if not hasattr(nn, "RMSNorm"):
    class RMSNorm(nn.Module):
        def __init__(self, d, eps=None, elementwise_affine=True, **kw):
            super().__init__()
            self.eps = eps
            self.weight = nn.Parameter(torch.ones(d))
        def forward(self, x):
            eps = self.eps if self.eps is not None else torch.finfo(x.dtype).eps
            return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + eps) * self.weight
    nn.RMSNorm = RMSNorm

# (2) 同梱 config.py が参照する circuit_sparsity.gpt を同梱 gpt.py に向ける
pkg = types.ModuleType("circuit_sparsity")
pkg.__path__ = [MODEL_DIR]
sys.modules["circuit_sparsity"] = pkg
import circuit_sparsity.gpt as g

# (3) 同梱 gpt.py の GPTConfig が受け付けない引数(unembed_rank など)を落とす
_Orig = g.GPTConfig
_fields = {f.name for f in dataclasses.fields(_Orig)}
g.GPTConfig = lambda **kw: _Orig(**{k: v for k, v in kw.items() if k in _fields})

from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained(MODEL_DIR, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(MODEL_DIR, trust_remote_code=True).eval()

w = model.circuit_model.transformer.h[0].attn.c_attn.weight
print("layer0 c_attn nonzero:", (w != 0).float().mean().item())

DOUBLE = tok("]]\n", add_special_tokens=False)["input_ids"][0]
SINGLE = tok("]\n", add_special_tokens=False)["input_ids"][0]

def p_double(text):
    ids = tok(text, return_tensors="pt", add_special_tokens=False)["input_ids"]
    with torch.no_grad():
        logits = model(ids).logits[0, -1]
    return torch.softmax(logits[[DOUBLE, SINGLE]], -1)[0].item()

print("flat  ", round(p_double("values =[5, 3, 11, 3, 12"), 3))
print("nested", round(p_double("values =[[5, 3, 11, 3, 12"), 3))
for n in (5, 10, 20, 40, 60):
    xs = ", ".join(str((i * 7) % 13 + 1) for i in range(n))
    print("nested n=%d" % n, round(p_double("values =[[" + xs), 3))
```

第0層のアテンション重みの非ゼロ割合は0.0009765625、ちょうど1,024分の1でした。8層×4種の重み行列32個すべてが同じ割合で、論文の「行列ごとに非ゼロの割合をそろえる」設計どおりです。モデル全体の非ゼロ469万のうち419万は設定で有効になっている密なbigram表で、Transformer本体の非ゼロは約50万でした。

### 入れ子が長いほど薄まる残差1249と「文脈の希釈」

入れ子のリストに要素を足すと、`]]`の確率は下がります。あわせて、第2層のアテンションが最終位置で残差チャネル1249へ書き込む値も読み出しました。

| 入れ子の要素数 | 入力トークン数 | `]]`の確率 | 残差1249の値 |
| ------- | ------- | ------- | -------- |
| 5       | 17      | 0.885   | 0.265    |
| 10      | 32      | 0.702   | 0.252    |
| 20      | 62      | 0.344   | 0.193    |
| 40      | 122     | 0.127   | 0.130    |
| 60      | 182     | 0.021   | 0.101    |

要素20個で誤答の`]`が優勢になります。要素60個の入れ子の0.101は、要素5個のフラットなリストの0.129より小さい値です。しきい値が文脈の長さで変わらないなら、長い入れ子はフラットと同じ側に落ちます。

コメントで余分な`[`を足す攻撃は、`[`が1個（`# Don't get distracted: [`）だとフラットなリストでの確率が0.001から0.041に上がるだけで、2個で0.616になり誤答しました。必要な「おとり」の数は入力の長さで変わるので、論文の図の入力をそのまま使っても再現しない場合があります。

この節の確率は、改行を含む`]]\n`と`]\n`の2候補のlogitだけをsoftmaxで再正規化した値で、全語彙に対する生成確率ではありません。

### 論文の配線を重み行列で読む：ヘッド125から残差1249、ヘッド80へ

論文は回路を図で示しますが、公開された重みには同じ接続がそのまま残っているはずです。該当する行の非ゼロ要素を抜き出しました。

| 接続                          | 重み      | その行の非ゼロ本数           |
| --------------------------- | ------- | ------------------- |
| 第2層ヘッド125のチャネル12 → 残差1249   | 0.427   | 3本（他は-0.101と-0.002） |
| 残差1249 → 第4層ヘッド80のクエリのチャネル4 | \-0.140 | 1本のみ                |
| 第4層ヘッド80のチャネル14 → 残差1079    | 0.218   | 2本（他は0.038）         |

2,080次元の入力のうち、ヘッド80のクエリのチャネル4は残差1249だけを読んでおり、論文の図と一致します。ただし符号は論文の記述と一致しませんでした。論文は残差1079に正の値を出すと書いていますが、手元の読み出しでは入れ子で-0.575、フラットで-0.006でした。出力層は`]]\n`のトークンをこのチャネルから-0.228で読むので、負の値が`]]`を押し上げます。向きの記述は違っても、働きは論文の説明と同じです。

### 残差1249と1079を切る実験：入れ子64件がすべて誤答

短いPythonの入力128件（入れ子64件・フラット64件）を自作し、1チャネルだけを固定して`]]`の平均確率を測りました。平均値はCPython標準ライブラリ80ファイルの先頭から集めた20,027トークンで近似しています。対照は第2層で発火している別のチャネルから無作為に選んだ20本で、1本ずつ同じ操作をしました。

| 条件                            | 入れ子         | フラット  | 正答         |
| ----------------------------- | ----------- | ----- | ---------- |
| 何もしない                         | 0.828       | 0.000 | 128/128    |
| 第2層Attentionの残差書き込み1249を平均に固定 | 0.039       | 0.001 | 64/128     |
| 第4層Attentionの残差書き込み1079を平均に固定 | 0.002       | 0.000 | 64/128     |
| 第2層ヘッド125のチャネル12だけをゼロに        | 0.056       | 0.001 | 64/128     |
| 第2層ヘッド119のチャネル4だけをゼロに         | 0.814       | 0.000 | 128/128    |
| 第4層ヘッド80のチャネル14だけをゼロに         | 0.002       | 0.000 | 64/128     |
| 第2層の無作為な20本（各1本）              | 0.820〜0.831 | 0.000 | 全条件128/128 |

入れ子の64件がすべて誤答になり、フラットの64件は正答のままでした。2,048本ある残差のうち1本で、入れ子の判定だけがなくなります。

逆方向も試しました。フラットな入力で最終位置の1249だけを入れ子の値へ近づけると、0.210では`]]`の確率が0.011、0.247で0.178、0.283で0.753と急に立ち上がります。しきい値で切り替わるという論文の説明どおりの形です。一方、入れ子の入力で最終位置だけをフラットの値に下げても0.892から0.498までで、判定は最終位置1か所では決まっていません。残差1249を切る操作は、読み込み後に次のコードで再現でき、この入力では0.892が0.080になります。

```
gm = sys.modules[type(model.circuit_model).__module__]
hu = sys.modules[gm.hook_save.__module__]

def cut_1249(t):
    t = t.clone()
    t[..., 1249] = 0.0
    return t

ids = tok("values =[[5, 3, 11, 3, 12", add_special_tokens=False, return_tensors="pt")["input_ids"]
with torch.no_grad(), hu.hook_recorder(regex="$^", interventions={"2.attn.resid_delta": cut_1249}):
    logits = model(ids).logits[0, -1]
print("cut 1249", round(torch.softmax(logits[[DOUBLE, SINGLE]], -1)[0].item(), 3))
```

残差1249へはヘッド119からの書き込みもありますが、ヘッド125のチャネル12だけを切ると0.056まで落ち、ヘッド119のチャネル4を切っても0.814のままでした。確かめたのは1タスクの短い入力で、回路が元のモデルの計算を丸ごと表すかというDroriの問いには、この実験は答えていません。

## 性能と解釈しやすさの引き換え条件

総パラメータ数を固定してL0を下げると、能力（事前学習損失）は悪化し、回路は小さくなります。逆にL0を固定したまま幅を広げると、能力と解釈しやすさが同時に良くなりました。論文はこれを、モデル規模の拡大で両者の境界線が外側へ動く、と表現しています。

ただし、解釈しやすさを保ったまま非ゼロパラメータを数千万より大きくすることはまだできていません。[MIT Technology Reviewの取材](https://www.technologyreview.com/2025/11/13/1127914/openais-new-llm-exposes-the-secrets-of-how-ai-really-works/)でGaoは、能力は最大でもGPT-1程度（直接比較はしていない）と述べています。同じ記事で、数年のうちに完全に解釈できるGPT-3級のモデルが作れるかもしれないとも語りましたが、ボストンカレッジの数学者Elisenda Grigsbyは、より難しいタスクを担う大きなモデルへ広がるとは確信していません。論文の結論も、最先端モデルを丸ごとこの方式で解釈したり学習したりするのは現実的でない、というものです。

## 既存の密なモデルへの橋渡し（ブリッジ）と公開状況

疎なモデルをゼロから学習する方式のままでは、すでに動いている密なモデルは説明できません。そこで論文は、密なモデルの各サブレイヤーの前に、密な活性と疎な活性を相互に変換する「ブリッジ」を置いて同時に学習させる方法を予備的に試しています。4層の密なモデルでは、疎なモデル側の「引用符の種類判定」チャネルを書き換えると、二重引用符で始めた文字列なのに一重引用符を出す確率が大きく上がりました。

ブリッジのモデルは、2026年11月8日時点でもダウンロードできません。READMEには`csp_bridge1`と`csp_bridge2`が載っていますが、配布元の`final_model.pt`はどちらも404を返し、[GitHubのissue #7](https://github.com/openai/circuit%5Fsparsity/issues/7)（2026年1月16日起票）も未解決です。リポジトリの最終コミットは2025年12月11日で、手元で再現できるのは疎なモデル単体の回路までです。

## 批判と2026年の後続研究：抽出回路の忠実性と重みの解釈率

### 抽出回路の忠実性に対するDroriの反論

2026年2月9日、Anthropic Fellows Programに参加していたJacob DroriがLessWrongで「[Weight-Sparse Circuits May Be Interpretable Yet Unfaithful](https://www.lesswrong.com/posts/sHpZZnRDLg7ccX9aF/weight-sparse-circuits-may-be-interpretable-yet-unfaithful)」を公開しました。回路規模の主結果を概ね再現したうえで、意味のないタスクでも約30ノードの回路でタスク損失0.05未満を達成できること、元のモデルでは偏っていたアテンションが回路では一様になること、枝刈りに使った分布から少し外れた入力では元のモデルと大きく違う挙動をすることを挙げています。Droriは検証の途中から原論文の平均アブレーションでなくゼロアブレーションへ切り替えており、Drori自身も平均アブレーションのほうが忠実な回路を与えた可能性を認めています。

### 重み単位の解釈：NeurIPS 2026の17〜35%と10分割の頑健率15.0%

Marin-LlobetとHeimersheimは[arXiv:2607.02964](https://arxiv.org/abs/2607.02964)（2026年7月）で、MLP層から標本抽出した非ゼロ重みの用途をLLMに説明させ、別の文章で検証しました。同じ研究は[NeurIPS 2026のポスター](https://neurips.cc/virtual/2026/poster/150805)に別題で掲載されています。そこの要旨にある「疎なモデルは17〜35%、密なモデルは5〜9%」は、下の表の「別の文章での単回通過率」の列と一致します。

| モデル         | 同じ文章  | 別の文章での単回通過率 | 10分割での頑健率 |
| ----------- | ----- | ----------- | --------- |
| Gaoらの疎なモデル  | 37.3% | 35.3%       | 15.0%     |
| Droriの疎なモデル | 21.4% | 17.2%       | 9.6%      |
| Droriの密なモデル | 13.2% | 9.0%        | 1.5%      |
| Pythia-70m  | 12.0% | 5.0%        | 0.4%      |

引用するときは列に注意が要ります。1回の検証だと密なモデルにも5〜9%の「解釈できる重み」があるように見えますが、10分割の文章で平均スコアと基準線を超えることまで求めると1.5%と0.4%に落ちます。差が開くのは検証を厳しくしたときで、疎なモデルも絶対値では10〜15%にとどまります。

### 枝刈り・分解・概念の地図に広がる後続研究

- Zhang（[arXiv:2603.15919](https://arxiv.org/abs/2603.15919)）：画像分類のDeiT-III B/16を学習後にWandaで枝刈りすると、回路のエッジは約2.5分の1になるものの、ニューロンの選択性やSAE特徴の解釈しやすさに系統的な改善はありませんでした。
- Yanほか（[arXiv:2608.03913](https://arxiv.org/abs/2608.03913)、2026年8月）：学習済みの密なモデルの重み行列を2つの疎な因子に分解するSparse Weight Decompositionを提案し、GPT-2やQwen3.5-27Bで回路抽出を試しています。代替モデルを別に学習せずに済むため、ブリッジが狙う「既存モデルの説明」への別ルートです。
- Wilam（[arXiv:2605.24603](https://arxiv.org/abs/2605.24603)、2026年5月）：8層の疎なPythonモデルで、106個の構文要素と組み込みオブジェクトの回路を63,800個のプロンプトから抽出しました。単著のプレプリントです。

Zhangの結果は、事後の枝刈りと最初から疎に学習させる方式とを区別する根拠になります。一方、OpenAI自身の続報は確認できていません。

## スパース回路が役立つ場面と使えない場面

自社のAIの判断根拠を説明したい、という目的には、現時点のスパース回路は使えません。対象はPythonコードで学習した小さな研究用モデルで、既存の密なモデルへ広げるブリッジは予備段階、そのモデルも公開されていません。本番の分類モデルや予測モデルなら、[モデル解釈性とSHAP・LIMEの選び方](/tech/details/16357/)や[深層学習とLLMの判断根拠を可視化する実装手順](/tech/details/17927/)で扱う事後の説明手法を候補にします。その場合も、説明の忠実性と業務上必要な根拠は別途検証が要ります。社内LLMの評価設計や根拠提示の要件から整理するなら、[生成AI導入支援](https://www.issoh.co.jp/service/ai/genai/)でも相談を受けています。

役立つのは、Transformerの内部で何が起きているかを実物で学びたい場面です。公開モデルは約1.68GBでGPUの無い環境でも推論でき、アテンションが「平均を取る」だけで数を数えている仕組みを手元で確かめられます。活性を方向として扱う手法との比較には[ペルソナベクトルによる人格特性の監視と制御](/tech/details/8541/)が、Transformer自体の基礎には[自己注意の仕組みとBERT・GPTの違い](/tech/details/13446/)が参考になります。

## よくある質問

### スパースとは？スパース化の意味は？

スパース（sparse）は「まばら」という意味で、スパース化はモデルや行列の要素の大部分をゼロにすることを指します。スパース回路の研究では、学習中に各重み行列の絶対値が大きい要素だけを残す操作を毎ステップ行い、最終的に非ゼロを約1,000個に1個まで減らしています。軽量化のための量子化や枝刈りとは、狙いが解釈しやすさにある点で違います。

### スパースモデルとMixture of Expertsは同じものですか？

違います。MoEはトークンごとに一部の専門家だけを動かしますが、重み自体はほぼすべて非ゼロです。論文はMoEを重みの観点では密なモデルに分類しています。同じ「疎」でも、MoEは計算量を減らすための活性の疎、スパース回路は読みやすさのための重みの疎です。限界節では、将来の方向として重みスパースとMoEの組み合わせに触れています。

### スパース回路でAIのブラックボックス問題は解決しますか？

解決はしていません。説明できたのはPython専用の小さなモデルの単純なタスクで、論文は非ゼロパラメータを数千万より大きくすると解釈しやすさを保てないことを課題に挙げています。取り出した回路が元のモデルの計算を忠実に表すかにも反論があります。業務システムの説明責任には、現時点では事後の説明手法と検証の組み合わせを選びます。

### SHAPとスパース回路はどう違いますか？

SHAPは学習済みのどんなモデルにも後から当てられる手法で、入力の各特徴が予測にどれだけ寄与したかを数値で示します。スパース回路は、解釈しやすいようにモデルの学習方法そのものを変え、内部の計算手順をニューロン単位で書き下します。既存モデルの説明にはSHAP、内部機構の研究にはスパース回路、と用途が分かれます。

### スパースモデリングとはどう違いますか？

スパースモデリングは、Lassoのように少数の変数だけで観測データを説明する推定の枠組みを指すことが多く、画像の圧縮センシングなどにも使われます。スパース回路は深層学習モデルの重みを疎にして内部の計算を読む研究です。「少数の要素で説明する」という発想は共通しますが、推定対象がデータの説明変数か、モデル内部の接続かという点で別物です。

## 関連記事

- [モデル解釈性とは？説明可能性との違いとSHAP・LIMEの選び方を実装目線で解説](/tech/details/16357/)
- [Black Box AIとは？深層学習とLLMの判断根拠を可視化する実装手順](/tech/details/17927/)
- [ペルソナベクトルとは？LLMの人格特性を活性の方向で監視・制御するAnthropicの手法と実装](/tech/details/8541/)
- [MoE（Mixture of Experts）とは？疎活性化とルーターの仕組み・VRAM要件と採用判断を実装者向けに解説](/tech/details/15810/)
- [Transformerとは？自己注意の仕組みとBERT・GPTの違いを実装目線で解説](/tech/details/13446/)

---

出典: [スパース回路とは？OpenAIの重みスパースTransformerの仕組みと公開モデルでの検証](<https://www.issoh.co.jp/tech/details/9878/>)（株式会社一創）
