TL;DR
- 前記事で Qwen3-30B-A3B (MoE) に Path Patching をかけ、医療タスクで効く attention head を 2 系統 (Positive 378 / Negative 457) 抽出。本記事はそれを実際に SFT (Pinpoint Tuning) に食わせた結果の報告
- 結果、全評価データセットで大幅劣化 (専門医試験で -12.7〜-16.0pt、McNemar p<10⁻⁶ で統計的にも確定)
- 原因は「attention は head 粒度で絞ったが、MLP は layer 粒度で unfreeze した」設計。MoE は 1 layer あたり Expert (=MLP) が 128 個 あるため、
pinpoint_freeze_mlp=falseにした瞬間に Expert 側が学習を支配し、head 粒度の pinpoint はほぼ効かなくなる -
Dense モデル前提の Pinpoint Tuning (Chen24) の直感が MoE には転用できない、というのが本記事の定量的な発見。MoE で成立させるなら (a)
pinpoint_freeze_mlp=trueで attention だけ触る、(b) Path Patching を Expert 粒度に拡張して Expert 側も同じ粒度で絞る、の 2 択
はじめに
RAMENチームとして医師国家試験のデータで Qwen3 系列に post-training をかけた一本になります。前回の記事 の続きで、Chen24 (Fig 1) の Pinpoint Tuning の 2 段構えのうち、前回が ① diagnose 部分、今回が ② optimize 部分になります。
つまり、
「Path Patching で炙り出した head だけを狙って学習したら、モデルの性能は上がるのか?」
を実際に試してみた記録です。前記事の最後で、Path Patching の出力として Both Positive (378 head) と Both Negative (457 head) の 2 系統の head 集合を得たところで終わっていました。今回はこの 2 系統をそれぞれ Pinpoint Tuning の学習対象として SFT を回し、医師国家試験と専門医試験で評価します。
なお、Chen24 の Pinpoint Tuning は Dense モデル (GPT-2 系) で提唱された手法で、MoE モデルへの適用例は先行研究には見当たりません。本記事は Qwen3-30B-A3B (MoE 128 Expert) への Pinpoint Tuning の第一報として、freeze 粒度の設計空間を最初の一手として探索した記録という位置付けになります。
結果から言うと:
| 評価データセット | Base 30B | Positive Pinpoint SFT | Negative Pinpoint SFT |
|---|---|---|---|
| 医師国家試験 (igakuqa) | 86.2 | 80.3 (-5.9) | 79.2 (-7.0) |
| 専門医試験 (specialist_exam_test_v2) | 60.9 | 44.9 (-16.0) | 48.2 (-12.7) |
| 診療ガイドライン | 15.7 | 10.8 (-5.0) | 11.7 (-4.0) |
全評価データセットで劣化してしまいました。McNemar 検定でも p < 10⁻⁶ で、統計的に確実にモデル自体が悪化しています。この結果を踏まえ、「MoE への Pinpoint Tuning の第一手として何が足りなかったか」 を、結果分析し、整理していきます。
目次
- どの head を学習対象にしたか
- 基本設定
- 学習結果
- 考察: なぜ壊れたか
- Positive vs Negative、どちらが有効かは判定できない
- 動かすには何を組み直すべきか
1. どの head を学習対象にしたか
前記事で 2 軸 (medical_impact, reasoning_impact) の Path Patching を回し、両軸が同符号の head 集合として Both Positive (378 head) と Both Negative (457 head) を得ました。それぞれの意味は以下の通りです:
| 手法 | 選択基準 | 意味 | Head 数 |
|---|---|---|---|
| Positive Pinpoint | medical > 0 かつ reasoning > 0 | 医療用語を消したら正解率が 上がる = 元の head は正答を 妨害 していた → 修正して伸ばしたい | 378 (24.6%) |
| Negative Pinpoint | medical < 0 かつ reasoning < 0 | 医療用語を消したら正解率が 下がる = 医療タスクに 貢献 している → 貢献をさらに伸ばしたい | 457 (29.8%) |
「どちらも学習対象にする」というのは意図的で、「妨害を弱める」と「貢献を強める」の両方向のアプローチを、同じ学習パイプラインで並列に検証したかったという設計です。
1.1 前記事から引き継いだ層分布
前記事で観察された、Positive と Negative の層方向の分布は以下でした:
| Both Positive | Both Negative | |
|---|---|---|
| Head 集中層 (Top5) | L24: 18, L22: 17, L1: 16, L0: 15, L26: 14 | L45: 23, L47: 21, L44: 20, L16: 20, L43: 19 |
| 浅い層 (0-15) の Head 数 | 多い (L0: 15, L1: 16) | 少ない (L0: 3, L1: 1) |
| 深い層 (38-47) の Head 数 | 少ない (1-6 heads/layer) | 多い (12-23 heads/layer) |
- Positive = 浅い〜中間層に集中
- Negative = 深い層に集中
前記事で「Pinpoint Tuning で Negative 側のほうが学習で強く動く可能性が想定されます」と書いた予想が、今回の SFT 結果でどう出るかというのが、この記事の1つの見どころになります。
2. 基本設定
2.1 実装の前提: pinpoint 機能は plugin として実装した
先に触れておく必要があるのですが、ms-swift / Megatron のデフォルト実装は「特定 layer / 特定 head / 特定 Expert だけを学習対象にする」という pinpoint 制御をそもそもサポートしていません。全パラメータ学習か LoRA のようなアダプタ差込かの 2 択で、「素の重みのうち特定スライスだけ trainable」という粒度は提供されていないです。
そのため今回は、ms-swift 側に pinpoint 用の拡張を plugin として自前で開発し追加する形で対応しています。plugin では以下のオプション群を CLI 引数として使えるようにしており、これによって「attention の特定 head」「MoE の特定 Expert」「特定 layer の MLP」などをブロック単位でオン/オフできる状態になっています:
| 制御レベル | オプション例 |
|---|---|
| Layer | --pinpoint_trainable_layers "5,10,15,20" |
| Expert (MoE) | --pinpoint_trainable_experts "5:3,7_10:1,4" |
| Attention Head | --pinpoint_trainable_heads "5:0,1,2_10:3,4" |
| ブロック単位 freeze |
--pinpoint_freeze_mlp / --pinpoint_freeze_attention / --pinpoint_freeze_router / --pinpoint_freeze_shared_expert / --pinpoint_freeze_embed_lm_head
|
以下の設定は この plugin ありきで解釈してください。
2.2 学習設定
以下が今回使った設定です。
| ハイパラ | 値 |
|---|---|
| Base model | Qwen3-30B-A3B-Instruct-2507 (MoE 128 experts, top-8) |
| Trainable heads | 378 (Positive) / 457 (Negative) — attention の qkv_proj スライスのみ |
| Learning rate | 1e-4 (cosine, warmup 5%, min 1e-5) |
| Global batch size | 32 (micro=2 × grad_acc=2 × 8 GPU) |
| Epochs | 1 |
| Max seq length | 4,096 |
| Weight decay | 0.1 |
| Optimizer | AdamW (β1=0.9, β2=0.95, ε=1e-8) |
| Dtype | bfloat16 |
| DeepSpeed | ZeRO-3 |
| MLP freeze |
pinpoint_freeze_mlp=false (対象 layer の MLP は trainable) |
| Attention freeze |
pinpoint_freeze_attention=false (対象 head の qkv のみ trainable) |
| その他 freeze | router / shared_expert / embed / lm_head はすべて frozen |
| KL 制約 | なし |
| データ | 医師国試 2001-2022 + 正解付き回答 (messages 形式) |
MoE への Pinpoint Tuning は前例がないため、上記の plugin が提供する freeze 組み合わせの空間から「最初の一手」を選ぶ必要がありました。今回は以下の推論で、「attention は head 粒度で絞りつつ、MLP は該当 layer で開放する」という中間的な設定を採用しています:
- Chen24 の Dense 版 Pinpoint Tuning は attention と MLP を両方触るのが基本
- 一方で
pinpoint_freeze_mlp=trueにすると完全に attention のみになり、MoE Expert 側に載っている医療知識に触れられなくなる懸念があった - 中間解として「attention は head 粒度で絞り、MLP は該当 layer だけ開ける」を試すのが第一手として考える
3. 学習結果
3.1 3つのデータセットで全滅
再掲します:
| モデル | igakuqa | specialist_exam_test_v2 | guideline |
|---|---|---|---|
| Base 30B | 86.2 | 60.9 | 15.7 |
| Positive Pinpoint SFT | 80.3 (-5.9) | 44.9 (-16.0) | 10.8 (-5.0) |
| Negative Pinpoint SFT | 79.2 (-7.0) | 48.2 (-12.7) | 11.7 (-4.0) |
なお学習に使った igakuqa は 2001-2022 年分で、評価に使った igakuqa は 2023-2025 年分です (学習と評価で年度が完全に分離されているので data leak はありません)。specialist は完全に別データセットです。それでも igakuqa で -5.9〜-7.0pt の劣化があり、specialist では -12.7〜-16.0pt という擁護のしようがない水準になりました。
専門医試験の全 accuracy を診療科別に可視化したのが下図です。左半分の 30B Group (Base / Pos PP SFT / Neg PP SFT) が本記事で扱う対象で、右半分の 80B Group は連載の他記事 (RL 系) の結果を参考に並べたものです。30B 側は Pos/Neg SFT で全診療科がオレンジ〜赤 (低精度) に沈んでいるのに対し、80B 側の RL 系はほぼすべての診療科で Base より緑側 (高精度) に伸びており、対比が視覚的にはっきり出ます。
医師国試の年度別推移も同じ傾向で、下図の左パネル (30B Group) では Base の黒線に対して Pos PP SFT (赤) と Neg PP SFT (青) が全年度で下側に張り付いています。右パネルの 80B Group では RL 系が Base を上回っており、ここでも対照的です。
3.2 McNemar 検定 (vs Base 30B)
「たまたま悪く出た」を否定するために統計検定を通しています:
| データセット | 比較 | 改善 | 劣化 | Net | chi² | p 値 |
|---|---|---|---|---|---|---|
| igakuqa (N=1,122) | Base vs Positive | 57 | 123 | -66 | 23.47 | < 10⁻⁶ |
| igakuqa (N=1,122) | Base vs Negative | 58 | 136 | -78 | 30.56 | < 10⁻⁶ |
| specialist (N=3,757) | Base vs Positive | 305 | 905 | -600 | 296.53 | < 10⁻⁶ |
| specialist (N=3,757) | Base vs Negative | 337 | 813 | -476 | 196.20 | < 10⁻⁶ |
いずれも p < 10⁻⁶ で、確実にモデル自体が悪化していることが確認できます。
3.3 診療科別の壊れ率
specialist の劣化を診療科別に、Base 30B からの変化量 (pp = percentage point) として並べた図が下記です。全診療科・両手法とも青系 (負の変化) 一色で、色の濃さがそのまま壊れの深さになっています。
数値でも押さえておきます。「壊れ率」は Base で正解していた問題のうち SFT 後に不正解になった割合です:
| 診療科 | Base 正答数 | Pos 壊れ率 | Neg 壊れ率 |
|---|---|---|---|
| 耳鼻科 | 154 | 50.0% | 44.8% |
| 神経内科 | 116 | 47.4% | 40.5% |
| 麻酔科 | 204 | 47.1% | 41.7% |
| 肝臓 | 129 | 45.7% | 31.8% |
| 救急 | 182 | 45.6% | 33.5% |
| 消化器 | 146 | 43.2% | 37.7% |
| 眼科 | 138 | 42.8% | 46.4% |
| 心臓外科 | 157 | 42.7% | 40.1% |
| 整形外科 | 115 | 42.6% | 33.0% |
| 外科 | 202 | 40.6% | 35.1% |
| 精神科 | 231 | 37.7% | 35.5% |
| 産婦人科 | 231 | 29.9% | 35.1% |
| 内科 | 282 | 20.9% | 19.9% |
耳鼻科では Positive で半数が破壊されています。眼科・産婦人科では Negative のほうが壊れ率が高くなっています。
また、内科だけが壊れ率 20% 台に留まっているのも目立つ観察です。他の診療科が 30〜50% で壊れる中、内科の耐性が明らかに違います。原因は本記事の範囲では特定できていません。
3.4 改善と劣化のバランス
specialist の内訳をもう少し細かく見ます:
| 手法 | 改善数 (Base不正解→正解) | 改善率 | 劣化数 (Base正解→不正解) | 劣化率 | Net |
|---|---|---|---|---|---|
| Positive | 305 | 20.7% | 905 | 39.6% | -600 |
| Negative | 337 | 22.9% | 813 | 35.5% | -476 |
Base 正解の 35〜40% が壊れる一方で、Base 不正解の 改善は 20〜23% に留まります。改善 : 劣化 ≈ 1 : 2.5〜3 という比率で、壊す量が治す量を圧倒的に上回っています。
igakuqa (学習と同じ試験形式で、年度だけ違うセット) でも改善 37% / 劣化 12〜14% で Net マイナスになっており、同形式の評価ですら勝てていない状態です。
3.5 フォーマット崩壊は 0%
念のためフォーマット遵守率も確認しています:
| モデル | 全 3 データセット Parse Fail Rate |
|---|---|
| Base 30B | 0.0% |
| Positive PP SFT | 0.0% |
| Negative PP SFT | 0.0% |
[ans]...[/ans] のパース失敗率はすべて 0% でした。劣化原因として「フォーマット崩壊」は完全に否定 できます。純粋に推論能力が落ちている、という壊れ方です。
4. 考察: なぜ壊れたか
結果を見た後で 2 章の設定を振り返ると、劣化を招いた要因として 3 つの仮説が立てられます。影響度が大きいと考える順に並べます。
4.1 仮説1: MLP unfreeze が MoE ではスケール的に強すぎた
最大要因はこれだと考えています。今回は「attention は head 粒度で 378 個に絞りつつ、MLP は layer 粒度で開放」というアンバランスな組み合わせでした。Dense モデルなら 1 layer あたり MLP は 1 個なので大した問題ではないのですが、MoE では 1 layer あたり Expert (= MLP) が 128 個あります。今回の設定だと 46 layer × 128 expert ≈ 5,888 個の Expert MLP が学習対象となり、head 側の 378 個とは 2 桁近くスケールが違います。
結果として、パラメータ総数の大半を占める Expert 側が学習の主役になり、head 粒度の pinpoint は事実上ほぼ寄与しない状態になりました。Dense の直感がそのまま MoE に転用できない、というのが本記事のもっとも定量的な発見です。
要するに、MoE で Pinpoint Tuning を成立させるには筋としては 2 つあります:
-
(a) MLP をガッツリ freeze する (
pinpoint_freeze_mlp=true)。attention の head 粒度だけを触る、LoRA 的な設計 -
(b) Expert 側も探索範囲に入れる。前段の Path Patching に Expert 粒度の impact 測定を追加し、
pinpoint_trainable_expertsで attention と揃えた粒度で絞る
4.2 仮説2: 学習率 lr = 1e-4
full-SFT でも 5e-5〜2e-5 が普通の水準で、1e-4 は上限寄りの学習率です。仮説1 と組み合わさって「広範囲を高 lr で更新」になり、既存知識の消し込みを加速したと考えられます。
4.3 仮説3: Path Patching で選ばれた head の層分布が壊れ方に反映されている
Positive/Negative の 2 系統で学習した結果、壊れ方のパターンが Path Patching で示された層分布と整合する現象が観察できました。具体的には以下 3 点です:
- Positive (378 head, 浅い〜中間層集中) の学習: 診療科によらず満遍なく壊れる (13 科中 10 科で Positive の壊れ率が Negative を上回る)。浅い層は下流の全 head の入力を作る汎用的な処理を担うため、そこを 1e-4 で書き換えると全 task の下流が同時に狂う、という絵とあっている
- Negative (457 head, 深い層集中) の学習: specialist の劣化幅が -12.7pt と Positive の -16.0pt より 3.3pt 小さい。ただしこれは「Negative の学習が良く効いた」という話ではなく、深い層 = タスク固有の判断を担う場所を書き換えたことで、specialist の全体スコアに寄与しない領域が優先的に壊れた、と読むほうが素直です。壊す場所が違うだけで、壊す量そのものが減ったわけではない
- 眼科・産婦人科での逆転 (Negative のほうが壊れる): Path Patching が示した「医療タスクへの貢献 head」(Negative side) が、これらの科の解答ロジックに強く依存していた可能性を示唆。触ったら、その領域が優先的に壊れた、という現象
つまり Path Patching は "壊す" 実験、Pinpoint Tuning は "書き換える" 実験 で方向は違いますが、「触れば影響する」という点では共通しており、「効くと判定された head を触ると、その領域が優先的に壊れる」が実測で見えた、と読めます。
つまりもしかしたら、深い層かつ Path Patching で選んだ head をあわせて学習すれば、壊さずに精度が上がるのではないか — と考えています。
5. Positive vs Negative、どちらが有効かは判定できない
元々の判断軸は「Positive で学習するのと Negative で学習するのとで、どちらが良くなるのか / 何か違いはあるのか」でした。結果はどちらも大きく劣化した上に、後述の通り数字上の差も「学習の優劣」とは言えないため、「どちらで学習すべきだったか」を確定させることはできない、というのが結論になりました。
5.1 数字での直接比較
| 評価 | Positive Pinpoint | Negative Pinpoint | 差 |
|---|---|---|---|
| igakuqa | -5.9pt | -7.0pt | Positive の劣化が +1.1pt 小さい |
| specialist | -16.0pt | -12.7pt | Negative の劣化が +3.3pt 小さい |
| guideline | -5.0pt | -4.0pt | Negative の劣化が +1.0pt 小さい |
specialist と guideline では Negative のほうが劣化幅が小さく、igakuqa では Positive のほうが劣化幅が僅かに小さい、という混在した結果になりました。specialist は最も差が大きく (3.3pt)、ここでの相対優位は Negative 側と言えます。
ただし、この「劣化幅が小さい」は「学習で精度が上がった」という意味ではない ことに注意が必要です。両手法とも Base 30B からは大きく落ちており、差はあくまで「壊れの深さ」の差でしかありません。
5.2 差は「壊す領域の違い」で、優劣を意味しない
4.3 で書いた通り、Positive/Negative の壊れ方の差は Path Patching で選ばれた head の層分布の違いに対応します。Positive (浅い層集中) は下流の全 head の入力を狂わせて全診療科に波及、Negative (深い層集中) は特定領域に集中して壊れるため specialist の集計平均には乗りにくい、というだけです。
診療科別で見ても Negative は眼科・産婦人科を強く壊しつつ他の多くの科では軽く済ませており、「どちらが優れている」ではなく「どこで壊れるか」のトレードオフでしかありません。specialist の 3.3pt 差も、この壊し方の偏りが集計平均に有利に働いた結果にすぎません。
5.3 したがって、この学習設定では優劣を出せない
- 見かけの「勝ち」は specialist で Negative (3.3pt)、しかしその中身は「壊した領域の偏り」であって学習の優劣ではない
- 両手法とも大幅劣化している点は変わらず、「どちらの学習が有効だったか」という問いに正の答えは出せない
6. 動かすには何を組み直すべきか
次回以降機会があるのであればPath Patching の出力はそのまま活かしつつ、Pinpoint Tuning 側の設定を組み直す事により分析したいと考えております。 :
-
pinpoint_freeze_mlp=trueに切り替え — attention の head 粒度だけを触る本来の Pinpoint 設定に戻す (4.1 の対策 (a))。まずここから -
pinpoint_trainable_expertsで Expert 粒度指定 — MLP を触るなら Expert 側も head と同じ粒度で絞る (4.1 の対策 (b))。前段の Path Patching に Expert 粒度の impact 測定を追加する必要あり - lr = 5e-5 以下に下げる — 4.2
- 対象 head 数を上位 50〜100 に絞る — 378/457 は多すぎるので impact 上位で切る
- 対象 Layer 数も絞る — 全 48 層ではなく head が集中する上位 10 層のみ (特に深い層に絞る)
謝辞
この成果は、NEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)の 委託業務(JPNP25006)の結果得られたものです。
参考文献
- Wang et al. (2022) "Interpretability in the Wild: a Circuit for Indirect Object Identification in GPT-2 small" arXiv:2211.00593
- Zhang et al. (2025) "Exploring Translation Mechanism of Large Language Models" arXiv:2502.11806
- Chen et al. (2024) "From Yes-Men to Truth-Tellers: Addressing Sycophancy in Large Language Models" arXiv:2409.01658
関連記事
- 前記事 (Path Patching 側 = ① diagnose):
リポジトリ
https://github.com/weblab-llm-m/singularity-post-training-medical
学習済みモデル (HuggingFace)



