Qwen-ScopeはQwen内部特徴を推論制御やデータ合成に使うSAEスイート
目次
Qwenチームが2026年4月30日、Qwenモデル向けのSparse Autoencoder(SAE)スイート Qwen-Scope を公開した。
公式ブログはCSRで本文を直接取りにくかったが、Hugging Faceの公式モデルカードと技術レポート Qwen-Scope: Turning Sparse Features into Development Tools for Large Language Models は読める。
SAEは、モデル内部の活性化を「少数の特徴の組み合わせ」に分解するオートエンコーダだ。
普通のオートエンコーダは入力を再構成できればよいが、SAEは中間表現を疎にする。つまり、1回の入力で反応する特徴数を絞る。
これにより「このトークンでは毒性っぽい特徴が立った」「この層では数学推論っぽい特徴が立った」のように、巨大な隠れ状態を人間が扱いやすい特徴へ落とし込める。
Anthropicの感情ベクトル研究では、Claude内部の感情表現を増幅・抑制して脅迫やreward hackingの発生率が変わる話を書いた。
Qwen-Scopeも同じくモデル内部を見る話だが、方向は少し違う。
単発の内部ベクトル観察ではなく、Qwen3/Qwen3.5の複数モデル・全層にSAEを載せて、開発ツールとして使える形にしたリリースだ。
14グループを全層ぶん出してきた
技術レポートによると、Qwen-Scopeは7種類のQwenバックボーンに対して、合計14グループのSAEを公開している。
denseモデルとMoEモデルの両方が対象で、基本的には各モデルの全層に対してSAEが用意される。
| 系統 | 対象モデル | SAE幅 | Top-K |
|---|---|---|---|
| dense | Qwen3-1.7B-Base | 32K | 50 / 100 |
| dense | Qwen3-8B-Base | 64K | 50 / 100 |
| dense | Qwen3.5-2B-Base | 32K | 50 / 100 |
| dense | Qwen3.5-9B-Base | 64K | 50 / 100 |
| dense | Qwen3.5-27B-Instruct | 80K | 50 / 100 |
| MoE | Qwen3-30B-A3B-Base | 32K / 128K | 50 / 100 |
| MoE | Qwen3.5-35B-A3B-Base | 32K / 128K | 50 / 100 |
モデルカードの例を見ると、Qwen3.5-27B向けSAE は隠れ次元5120に対してSAE幅81920、16倍拡張、Top-K 100。
各層の残差ストリームにフックして、W_enc, W_dec, b_enc, b_dec を持つPyTorch辞書として配布されている。
Top-K 100というのは、各入力位置で81920個の特徴のうち100個だけを非ゼロにする設定だ。
「全部を薄く見る」のではなく「強く反応した100個だけ見る」ので、特徴の解釈や介入に使いやすい。
分析だけでなく介入まで含めている
Qwen-Scopeの売りは、SAEを可視化や後追い分析で終わらせない点にある。
レポートでは、推論制御から学習改善まで用途を挙げている。
| 用途 | やること |
|---|---|
| 推論時ステアリング | 特徴方向を直接操作して、言語・概念・好みを制御する |
| 評価分析 | ベンチマーク間の特徴活性を比べ、重複やカバレッジを見る |
| データ分類・合成 | 毒性特徴などを使い、少量の種データから分類や安全データ合成を行う |
| 学習改善 | コードスイッチングや繰り返し生成の原因特徴を見つけ、SFT/RLの信号に使う |
プロンプトで「もっと英語で」「もっと安全に」と頼むのではなく、内部特徴を直接操作する。
これは強いが、同時に危ない。
特徴が本当に因果的に効いているのか、別の特徴を巻き込んでいないか、モデルや層をまたいで同じ意味を保つのかを検証しないと、単なる「それっぽいノブ」になる。
公式モデルカードにも注意書きがあり、非科学的な目的でモデル能力に干渉したり、有害情報生成に使うことを禁じている。
SAEは透明性ツールであると同時に、モデル挙動を変える介入ツールでもある。
Qwen3.6-27Bの独立SAEとは対象が違う
同じタイミングで、OpenInterpretability側の Qwen3.6-27B Paper-Grade Sparse Autoencoders も目立っている。
こちらはQwen公式ではなく、Qwen3.6-27BのL11/L31/L55に対してTopK SAEを訓練したものだ。
| 項目 | Qwen-Scope | OpenInterpretabilityのQwen3.6-27B SAE |
|---|---|---|
| 提供元 | Qwen公式 | OpenInterpretability |
| 対象 | Qwen3/Qwen3.5の7バックボーン | Qwen3.6-27B |
| 層 | 対象モデルの全層 | L11 / L31 / L55 |
| 目的 | 広いモデル群の開発ツール化 | 27B denseの高品質SAE検証 |
| 形式 | PyTorch .pt dict | safetensors、sae_lens互換 |
OpenInterpretability版は、各層200Mトークンで訓練し、L11でvar_exp 0.8433、L31で0.7135、L55で0.8157を報告している。
再現には96GB VRAM級GPUで約35時間、クラウド費用はおおむね30〜60ドルという見積もりも出している。
Qwen-Scopeは「公式が広く全層を出した」価値が大きい。
OpenInterpretability版は「Qwen3.6-27B denseでどこまで高品質に作れるか」の実験として価値がある。
この2つは競合というより、対象モデルと粒度が違う。
Qwen3.6の文脈ではまだ穴がある
このブログでは直近で Qwen3.6-35B-A3B と Qwen3.6-27B dense を触っている。
どちらもエージェントコーディングやローカル実行の観点では面白いモデルだったが、Qwen-Scope公式リリースの対象は現時点でQwen3/Qwen3.5だ。
Qwen3.6系を内部特徴レベルで見たい場合、公式Qwen-Scopeだけでは足りず、OpenInterpretability版のような外部SAEに頼ることになる。
ここは少し惜しい。
Qwen3.6はGated DeltaNetやThinking Preservationを含む新しい世代なので、コードスイッチング、長文脈、思考トークン、エージェント挙動の特徴をSAEで見たい。
特にQwen3.6-35B-A3BはMoEなので、公式レポートが言う「MoEではより細かい特徴を捉えるために幅広SAEを出す」という設計がそのまま効きそうだ。
使えるが、特徴名を信じすぎない
SAEの弱点は、特徴が見つかっても名前付けは別問題なところだ。
「毒性特徴」「数学特徴」「英語特徴」とラベルを付けても、その特徴が本当に単一概念だけを表しているとは限らない。
プロンプト、データ分布、層、モデルサイズが変わると意味がずれることもある。
それでもQwen-Scopeのリリースは大きい。
Qwen系で「内部を調べたい」となったとき、毎回自分で活性化を集めてSAEを訓練する必要がなくなる。
推論制御、評価データの重複チェック、安全データ合成、SFT/RLの診断まで同じ特徴空間で試せる。
ローカルで1層載せるのに何GB食うか
Qwen-ScopeのSAE重みは1層1ファイルの .pt で、中身は W_enc, W_dec, b_enc, b_dec の4テンソルだけだ。
専用フレームワークは不要で、torch.load() で読んで matmul → topk → scatter の5行で推論が完結する。
問題はサイズ。
Qwen3-8B向けSAEは W_enc が 65536×4096、W_dec が 4096×65536 で、float32で1層あたり約2.1GB。
ベースモデルをbf16で載せた16GBに足して、1層だけ見るなら合計18GB前後。24GB VRAMのGPU 1枚で収まる。
全36層のSAEを落とすと77GBになるが、同時に全層をメモリに載せる必要はない。分析したい層だけロードすれば足りる。
Qwen3.5-27Bは1層3.4GB、ベースモデルbf16で54GB。合わせて57GBでA100 80GBが要る。
最小構成はQwen3-1.7B + 32K SAEで、SAE 1層が約500MB、ベースモデルbf16で3.4GB前後。8GB VRAMでも余裕で入る。
特徴の解像度は8Bより粗いが、SAEの挙動を試すには十分だ。
公式のコード例ではベースモデルを torch.float32 で読み込んでいるが、これだとQwen3-8Bだけで32GB食う。
bf16に変えればベースモデル側のメモリは半減する。SAE重み自体はfloat32の .pt なのでそのまま読むが、推論はmatmul 1回なのでfp32でも処理は軽い。
Gradioデモの app.py が付属していて、--model と --sae-path を指定して起動するとブラウザ上で層とトークンを選んで活性特徴を眺められる。
技術レポートにはSAE推論のレイテンシやスループットへの影響は書かれていない。
フォワードパスへの上乗せは matmul + topk だけなので推論自体は軽いが、残差ストリームをフックで抜くためtransformersの通常推論パスに手を入れる必要がある。
vLLMやOllamaのような最適化ランタイムにはそのまま組み込めない。
LLM分類器とは根本的にやり方が違う
TRACERのようにLLMの出力ラベルから代理モデルを訓練する方法では、LLMをブラックボックスの分類器として使い、入力→ラベルのペアを教師データにしてBERTなどの軽量モデルを育てる。
分類精度が出てしまえばLLM本体は不要になる。
SAEは逆だ。
モデル内部の特徴活性を直接見て「この特徴が立ったら毒性」と判定する。
分類ヘッドの訓練もファインチューニングもない。
技術レポートの実験では、Qwen3-8BのSAE特徴1個で英語毒性検出のF1が0.90を超え、上位2個のORルールで0.96に達した。
種データも200例で十分で、2000例からの低下はほぼなかった。
英語で見つけた毒性特徴をそのまま他言語に適用した結果も出ている。
ロシア語0.95、フランス語0.93、日本語0.76、中国語0.70。
言語固有のチューニングなしでこの数字が出るのは、LLMの内部で「毒性」が言語横断的な特徴として表現されていることの傍証だ。
代わりに失うのは独立性だ。
TRACERやBERT分類器はLLMから独立して動くので推論コストを劇的に下げられるが、SAEは特徴を取るのにベースモデルのフォワードパスが必要になる。
安い分類器がほしいだけなら従来のアプローチのほうが向いている。
SAEが効くのは、分類だけでなく「なぜそう判定したか」が特徴・層・トークン位置まで追跡でき、同じ特徴空間で推論ステアリングやデータ合成まで一貫して扱える場面だ。
MoEの疎性とSAEの疎性は別物
MoEもSAEも「疎」が出てくるが、何が疎になるかがまるで違う。
MoEは推論時にエキスパートの一部だけを選んで計算する。
Qwen3-30B-A3Bなら30Bのパラメータのうち3B分だけが各トークンで動き、残りのFFNブロックは丸ごとスキップされる。
疎になるのはモデルの計算経路そのもので、目的はパラメータ効率だ。
訓練時にルーターごと学習されるアーキテクチャの一部であって、後から分析するものではない。
SAEは訓練済みモデルの活性化ベクトルを後付けで分解する。
5120次元の隠れ状態を81920次元に展開してTopK 100で絞る、というのは「この入力で反応した概念的特徴はどれか」を取り出す操作だ。
モデルの計算パス自体には手を入れない。
MoEのルーター(どのエキスパートに送るか)とSAEのTopK(どの特徴が活性したか)は動作として似て見える。
ただしMoEのルーターはモデルの一部で出力に直結するのに対し、SAEの特徴を操作するにはデコードして残差ストリームに書き戻す介入ステップが別に要る。
Qwen-ScopeがMoEモデル向けに128K幅のSAEを用意しているのも、MoEとSAEが異なるレイヤーの話だからだ。
MoEのエキスパート選択で既にルーティングされた後の活性化を、さらにSAEで特徴分解する二段構え。
公式レポートでは、MoEモデルのほうがdenseモデルより細かい特徴パターンを持つ傾向があるため、SAE幅を広げないと取りこぼすと報告している。
SAEは刈り込みの逆か
「活性しているフィルターを外す」は、ネットワーク刈り込み(pruning)や活性化パッチング(activation patching)でやるやつだ。
刈り込みは影響の小さいニューロンやフィルターを消して計算量を削る。
活性化パッチングは、ある入力で活性している部分をゼロにしたり別の入力の値と差し替えたりして、どこが効いているかを調べる。
ROME/MEMITの知識編集やcausal tracingがこの系統。
SAEがやっていることは活性化パッチングと目的は近いが、操作する空間が違う。
活性化パッチングはモデルの生のニューロン空間で介入する。
ただしニューロン1個は複数の概念を混ぜて表現している(polysemanticity)ことが多く、1個潰しても何の概念を消したのかはっきりしない。
SAEはまず活性化を解釈しやすい特徴空間に分解してから、その特徴単位で抑制や増幅をかける。
「毒性」特徴を0にする、「英語」特徴を強める、のように概念を名指しで操作できる(理想的には)。
生のニューロンを潰す刈り込みの逆というより、同じ「除去して挙動を見る」をpolysemanticity を解きほぐした特徴空間で行う形だ。
技術レポートの推論ステアリング実験がまさにこれで、特定の特徴方向を増幅してQwen3-8Bの出力言語を切り替えたり、コンテンツの好みを変えたりしている。
刈り込みが「不要な部分を消す」方向なのに対し、SAE介入は「特定の概念を足し引きする」操作に近い。
毒性が見えるなら消せるのでは
SAEで毒性特徴がF1 0.96で検出できるなら、逆にその特徴をゼロにすればモデルの安全フィルターを外せるのでは、という疑問が出てくる。
ラベリングが概念的に正確かはさておき、「この特徴を潰すと有害出力が増える」特徴は実験的に特定できてしまう。
これはabliteration(ablation + liberation)の発想に近い。
2024年にFailSpyがLlama 3 8Bで示した手法で、有害プロンプトと無害プロンプトの残差ストリームの差分から「拒否方向」を推定し、その方向成分をモデル重みから直交射影で除去する。
モデルは拒否せずに何でも答えるようになる。
従来のabliterationは残差ストリームの平均差分から拒否方向を1本だけ推定するので、操作が粗い。
拒否以外の能力が巻き添えで劣化したり、特定の有害カテゴリだけ外したいのに全部外れたりする。
SAEの特徴空間で同じことをやると精度が上がる余地がある。
81920次元の特徴空間で「毒性」に対応する数個の特徴だけを潰すなら、拒否方向ベクトル全体を消すより副作用は小さくなる。
公開レポートにはこの方向の検証は含まれていないが、道具立てとしては揃っている。
公式が推しているのは毒性検出と安全データ合成だが、検出に使える特徴がそのまま除去に使える特徴でもあるのは自明だ。
SAEの特徴分解精度が上がるほど、abliteration的な介入も選択的にできるようになる。