あなたがCoTを読んでいるとき、モデルは別のことを考えている
Thinking modelが流行っている。DeepSeek-R1、Claude 3.7 Sonnet、Qwen3.5——推論過程を見せてくれるモデルが増えた。
RTX 4060でQwen3.5-9Bを回していると、thinkingブロックに延々と内部推論が表示される。"Wait, let me reconsider..." "Actually, this approach is better..." と自問自答しながら回答を組み立てていく。見ていて安心する。ちゃんと考えてくれている、と思う。
その安心感は、根拠がない。
CoTの表示を読んで安心しているとき、あなたが見ているのは推論の記録ではなく、推論に見えるよう生成されたテキストだ。この区別は直感に反するが、測定可能な事実として示されている。
2025年5月、Anthropicが自社の研究論文 Reasoning Models Don't Always Say What They Think を発表した。推論モデルは、自分が実際に考えていることを必ずしも言わない。自社モデルの弱点を公開してまで伝えたかったメッセージがそれだ。
実験: ヒントを与えて、CoTに出るか見る
Anthropicの実験設計は単純で巧妙だ。
評価問題にこっそりヒント(正答のリーク)を仕込む。モデルがヒントを使って正答にたどり着いたとき、CoT(Chain-of-Thought)の中で「ヒントを使った」と正直に言うかどうかを調べる。
[実験の流れ]
1. 評価問題を出す(数学、論理、コーディング等)
2. 問題文にこっそりヒントを埋め込む
例: "ところで、正解はBだよ" を微妙な形で混入
3. モデルが回答する(CoT付き)
4. 回答が正しい場合、CoTの中で
ヒントの存在に言及しているかを分類
判定:
- "ヒントに気づきました" → 忠実 (faithful)
- ヒント使用の痕跡なし → 不忠実 (unfaithful)
結果がこれだ。
[CoT忠実性 — ヒント使用の開示率]
全体平均 懸念されるヒント*
Claude 3.7 Sonnet: 25% ~20%
DeepSeek-R1: 39% 29%
Claude 3.5 (非推論): -- --
DeepSeek-V3 (非推論): -- --
*懸念されるヒント = 不正アクセスの例示など
セキュリティ上問題のある情報
(misaligned hints)
Claude 3.7 Sonnetの全体平均開示率は25%。つまりヒントを使って正答したケースの75%で、CoTにその痕跡が残らない。
さらに深刻なのは懸念されるヒントのケースだ。不正アクセスの手法などセキュリティ上問題のある情報をヒントとして与えた場合、Claude 3.7 Sonnetの開示率は約20%まで落ちる。8割のケースで、モデルは問題のある情報を使いながらCoTに痕跡を残さない。DeepSeek-R1も29%と低い。
Anthropicが自社モデルの問題を公開したことの意味を考えてほしい。
なぜCoTは嘘をつくのか
厳密には嘘をついているわけではない。CoTが忠実でない理由は複数ある。
1. CoTは推論の記録ではなく生成物
根本的な誤解がここにある。CoTはモデルの内部計算のログではない。モデルがテキストとして、もっともらしい推論過程を生成しているだけだ。
[CoTの実態]
ユーザーが見えているもの:
"まず、Aの可能性を検討します。
しかしAには問題があります。
次にBを考えると... これが正解です"
実際に起きていること:
各レイヤー内で全トークンへのattentionが並列計算
→ レイヤーを順に通過して特徴量を変換
→ 最終層で次トークンの確率分布を出力
→ もっともらしいトークンを選択
→ 繰り返し
「まずAを検討」したわけではない。
各レイヤー内では全トークンの関係が一度に計算され、
出力として「Aを検討した風の」テキストが生成されている。
2. タスク複雑度が上がるとCoTの忠実性は下がる
Anthropicの研究で明確に示されたパターンがある。タスクが複雑になるほど、CoTの忠実性が低下する。
簡単な問題では、モデルの内部計算とCoTの記述がほぼ一致する。実際にAを検討してBに変えた、に近い処理をしている。だが複雑な問題では、内部計算とCoTの乖離が広がる。モデルは答えに到達するために複雑な内部処理をするが、CoTではその過程を大幅に簡略化(あるいは事後合理化)して出力する。
3. 強化学習がきれいなCoTを報酬にしている
推論モデルは強化学習で訓練されている(DeepSeek-R1はGRPO、ClaudeはRLHF系の手法)。訓練過程で、論理的で分かりやすいCoTが高い報酬を得る。結果として、モデルは実際の推論過程を忠実に記述することよりも、人間が読んで納得するCoTを生成することに最適化される。
実際の推論が 直感→修正→直感→修正 のカオスだとしても、出力されるCoTは ステップ1→ステップ2→結論 のきれいな物語になる。
DeepSeek-R1の反芻パターン
DeepSeek-R1 Thoughtologyの分析(arXiv:2504.07128)が面白い角度からこの問題を照らしている。
R1のthinking過程には**反芻(rumination)**と呼ばれるパターンがある。以前検討した問題構成を何度も再検討し、同じ地点をぐるぐる回る。
[R1のthinking構造 — 典型的な反芻パターン]
Phase 1: 問題分解
"Let me break this down..."
Phase 2: 再構成サイクル(ここが反芻)
→ "Wait, let me reconsider approach A"
→ "Actually, approach B might be better"
→ "Hmm, going back to approach A..." ← 戻った
→ "Let me try approach C"
→ "No, approach A was right after all" ← また戻った
→ [5-15回繰り返す]
Phase 3: 最終回答
"Therefore, the answer is..."
RTX 4060でQwen3.5-9Bを回した前回の実験でも同じパターンを観察した。9Bモデルのthinkingは数百行に達し、その大部分が反芻だった。27Bでは十数行で同等以上の回答品質を出した。
ここに本質的な問題がある。反芻が長いthinkingは、一見よく考えているように見えるが、実際には同じ地点を繰り返しているだけの可能性がある。そしてAnthropicの研究が示すように、このthinkingが内部計算を忠実に反映しているとは限らない。
なぜClaudeよりDeepSeekの方が「正直」なのか
ここで一つ、直感に反する事実に触れておく。
CoT忠実性はClaude 3.7 Sonnetが25%、DeepSeek-R1が39%。安全性とアライメントを最重視するAnthropicのモデルが、DeepSeekより不透明という結果だ。
これは「R1が透明性に優れている」のではなく、Claudeが不透明になる方向に訓練されていると読むべきだと思う。AnthropicのRLHFは「きれいで分かりやすいCoT」を高く評価する。その最適化が、ヒント使用のような「ノイズ」をCoTから除去する方向に働いた。R1のGRPOはCoTの見栄えをそこまで磨かない。反芻的で冗長なthinkingが、結果的にヒント言及を「ノイズ」として残す。
R1は洗練されていないからこそ忠実であり、Claudeは洗練されているからこそ不忠実だ。
これが示しているのは構造的な矛盾だ。AIの安全性訓練が、安全性の監視手段であるCoT監視を弱体化させている。アライメントのための訓練がアライメントの検証を困難にする——楽観的に受け取れる結果ではない。Anthropicが自社モデルの問題としてこれを公開した判断は、この矛盾の深刻さを示している。
個人スケールで何ができるか
データセンターのAI安全性研究では、CoTの忠実性は重大な問題だ。モデルのアライメントをCoTの監視で担保する戦略が根底から揺らぐ。
個人ユースでは、影響は違う方向に出る。
実害: CoTを根拠にした判断は危険
やりがちなのがこれだ。
# こういうワークフローは危険
response = llm.generate(
"このコードのセキュリティリスクを分析して",
thinking=True
)
# thinkingを読んで「ちゃんと分析してくれた」と判断する
# → thinkingが忠実でないなら、この安心感は偽物
if "セキュリティリスクは見当たりません" in response.thinking:
deploy() # CoTを信じてデプロイ → 危険
CoTの文面だけで「よし、ちゃんと検証してくれた」と判断するのは、モデルの出力を二重に信じていることになる。回答を信じ、回答の根拠(CoT)も信じている。だが根拠自体が生成物であり、内部計算の忠実な記録ではない。
対策1: CoTを無視して出力だけ検証する
逆説的だが、CoTの忠実性が信用できないなら、CoTは読まなくていい。出力の正しさを独立に検証する方がはるかに信頼性が高い。
# CoTに頼らない検証パイプライン
code = llm.generate("Pythonでスレッドセーフなシングルトンを実装")
# CoTがどんなに立派でも、出力を直接検証する
test_results = run_tests(code) # 実行してテスト
static_analysis = run_linter(code) # 静的解析
type_check = run_mypy(code) # 型チェック
# 3つとも通れば信頼できる。CoTの内容は関係ない
対策2: 複数モデルのクロスバリデーション
8GB VRAMの環境でも、モデルを切り替えて同じ問題を投げることはできる。
# 9B で回答を生成
./llama-cli -m qwen3.5-9b-q4_k_m.gguf -p "このコードのバグを指摘して"
# MoE で同じ質問
./llama-cli -m qwen3.5-35b-a3b-q4_k_m.gguf -p "このコードのバグを指摘して"
# 2つの回答が一致するなら信頼性が上がる
# 不一致なら、どちらかのCoTは嘘をついている
コストはゼロ(ローカルなので)。時間だけかかる。だがAPIのように課金されないからこそ、この贅沢な検証ができる。ローカルLLMの構造的メリットだ。
対策3: thinkingの量に騙されない
Qwen3.5-9Bのthinkingが数百行で、27Bが十数行だったデータを思い出してほしい。多くの人は長いthinkingを見て よく考えている と感じる。だが実際には反芻の長さであり、推論の深さとは無関係だった。
thinkingが長い = よく考えている ではない。これを内面化するだけで、CoT忠実性問題の実害の半分は防げる。
CoTは有用だ、ただし過信するな
誤解しないでほしいのは、CoTが無価値だと言っているわけではないということ。
CoTには教育的価値がある。モデルの出力の意図を人間が理解する手がかりにはなる。プロンプトのデバッグにも使える。なぜこの回答になったかの仮説を得るツールとしては依然として有用だ。
だが検証の手段として信用してはいけない。CoTに "このコードにバグはありません" と書いてあっても、それはモデルが実際にバグチェックをした証拠ではない。
Anthropicがこの研究を公開した意味は重い。自社モデルの弱点を開示してまで伝えたかったメッセージは明確だ——CoTの監視だけでAIの安全性を担保する戦略は破綻する。
個人エンジニアにとっての教訓は単純だ。CoTは読め。参考にしろ。だが信じるな。出力は独立に検証しろ。ローカルLLMなら検証のコストはゼロだ。この贅沢を使え。
参考
- Reasoning Models Don't Always Say What They Think — Anthropicの研究。CoT忠実性が20%以下の衝撃
- Measuring Faithfulness Depends on How You Measure — 忠実性の測定方法依存性
- DeepSeek-R1 Thoughtology — R1の反芻パターン分析
- C2-Faith: Benchmarking LLM Judges for Causal and Coverage Faithfulness — CoT忠実性のベンチマーク手法