LOG ENTRY / post
ブラウザ言語モデルでCoTを検証する — 評価汚染の指摘により結論を三度修正した記録
ブラウザ言語モデルでCoTを検証する — 評価汚染の指摘により結論を三度修正した記録
概要
自作のブラウザ完結型言語モデル学習環境 TinyLM Lab Zero に、Chain-of-Thought(CoT)の効果を測定する実験機能を追加した。実装は Claude、独立レビューは GPT-5.6 が担当した。従来は GPT-5.6 が実装し Claude が検証する分担だったため、今回は役割を入れ替えた形になる。
結果を先に述べる。当初報告された「思考あり 98% 対 直答 3%」という数値は、評価問題の 42% が学習データに含まれる汚染された測定であり、撤回した。train/test を完全分離した再実験では、2桁加算・約10万パラメタの条件において、スクラッチパッド形式の学習は汎化の開始を早めるが、最終到達点では直答学習と同水準かそれ以下だった(未見200問で 85.5% 対 90.5%)。さらに、バッチ順序の違いだけで同一条件の未見正答率が 39% と 96% に分かれるという強い確率感度を確認した。
追加した機能
対象は依存ゼロの単一HTMLファイルである。数値計算エンジン(CORE / GPUCORE)は今回の全工程で一切変更していない。
- 思考コーパス合成。
[利用者]47+85は[助手][思考]7+5=12→2繰1 4+8+1=13→3繰1 →1 答132[答]132ですという筆算スクラッチパッド形式と、[利用者]47+85は[助手]132ですという直答形式を、同一seedから同一問題列で生成する。 - 思考スパンの状態機械。生成中に
[思考]で思考モード、[答]で回答モードへ遷移する。思考部分はチャット画面で折りたたみ表示になり、KVキャッシュには全文が計上される。思考が既定の文字数予算を超えた場合は[答]をKVへ強制注入して回答へ誘導する(budget forcing)。 - Best-of-N。KVキャッシュのスナップショットと復元により、同一文脈からN本の候補を生成し、応答先頭の数字列(なければ応答全文)の一致数による多数決と平均logprobで勝者を選択する。
- 正答率測定。CPU KVとgreedyデコードで採点する。測定問題は学習から除外されたtest集合から取る(後述)。
- UI再構成。学習・文章生成・チャット・思考実験・保存の5ページ制とし、ハンバーガーメニュー、URLハッシュルーティング、固定ステータスバーを実装した。
独立レビューによる修正
GPT-5.6 のレビューは2件の実質的な問題を指摘した。いずれも検証の結果、事実だった。
1. 例外処理のバグ(P0)。 チャット生成関数の catch 節に、リファクタ前のコードが参照していたローカル変数 boundary への参照が残っていた。例外発生時にこの参照が ReferenceError を起こし、元の例外を上書きする。Claude 自身の146項目のテストは catch 経路を一度も通過しておらず、このバグを検出できなかった。例外注入により再現を確認した上で修正し、例外3経路(原因保持・途中経過の保全・UI状態の復旧)のテストを追加した。
2. 評価汚染。 学習コーパス(seed 101、5000問)と評価問題(seed 20260823、100問)の間に完全一致の重複が42問あるという指摘。独立に検算した結果、正確に42問だった。学習コーパスのユニーク問題数は 8100 通り中 3727 であり、一様サンプリング同士なら当然生じる重複である。設計時にこれを見落とした。
対応として、全問題ペアを列挙し seed 付きシャッフルの先頭200問を test 集合として学習から除外する分離機構を実装した。生成時に重複数を検算して表示する。UI には問題列・モデル初期化・評価の3つの seed 入力を追加し、同一 seed であれば思考あり/直答が同一の問題列・同一の初期重みになることをテストで保証した。
実験条件
- 課題: 2桁+2桁の加算(全8100ペア、test 200ペアを除外)
- モデル: d=64 / 2層 / 4ヘッド / ctx=64 / dense、約10.2万パラメタ
- 学習: 5000問、バッチ8、lr 3e-3、4400 step
- 評価: greedy、チェックポイントは未見50問、最終は未見200問全数
- 思考あり/直答は同一問題列・同一初期化・同一ハイパーパラメタ
結果
未見test問題に対する正答率の推移。
| step | 思考あり | 直答 |
|---|---|---|
| 1100 | 44% | 8% |
| 2200 | 96% | 18% |
| 3300 | 98% | 66% |
| 4400(200問) | 85.5% | 90.5% |
要点は三つある。
第一に、思考ありは学習の立ち上がりが明確に速い。step 1100 時点で 44% 対 8%、step 2200 で 96% 対 18% であり、序盤の優位は大きい。
第二に、直答も遅れて汎化に到達する。step 3300 から急伸し、最終的には思考ありを上回った。この規模・この課題では、スクラッチパッドは汎化を可能にする唯一の手段ではなく、汎化の開始を早める要因と解釈するのが正確である。
第三に、測定は強い確率感度を持つ。別の実行(チェックポイント時のRNG再シード位置が異なり、バッチ順序のみが変わる)では、同じ step 2200 の未見正答率が 39% だった。同一条件で 39% と 96% が分かれる以上、単発測定の数値には±10ポイント以上の不確かさを見込む必要がある。レビューが要求していた複数seedでの平均と分散の記録は、この結果によって必須事項であることが裏付けられた。本記事の数値も各条件1本の測定であり、この限界の内にある。
補足として、失敗モードの観察を記す。容量の小さい構成(d=48/2ヘッド)では思考あり・直答とも10%前後で並び、思考ありの誤答は「一桁の計算と繰り上がりは正しいが、問題文からの桁の読み取りを誤る」形に集中した。ヘッド数を4に増やすとこの誤りは解消した。d=64 の長期学習では、繰り上がり付き一桁加算の誤り(8+9+1=17 など)と、思考内で正答を導きながら最終回答への転記を誤る例(答180 と書いた直後に 188です と回答)が残った。
制約
- 全条件が単発測定である。複数seedによる平均と分散の測定は未実施。
- ヘッド数の統制実験(d=64でH=2とH=4の比較)、スクラッチパッドの内容を意図的に壊した対照群との三群比較は未実施。これらを行うまで、序盤の優位がスクラッチパッドの内容に起因するのか、回答前の追加トークンによる計算量増加に起因するのかは分離できない。
- 課題は2桁加算のみ。3桁は文脈長の制約から未実験。
再現手順
公開したHTMLの seed 既定値は本実験と同一(問題列101・初期化42・評価20260823)である。思考実験ページでコーパスを生成し、d=64/2層/4ヘッド/ctx=64 で初期化して2000〜4500 step 学習し、正答率を測定すれば同条件になる。直答・4400 step 学習済みのモデルファイル(未見200問で90.5%)も併せて公開する。保存と読み込みページからロードすれば、学習を待たずに挙動を確認できる。
まとめ
汚染のある測定は 98% 対 3% という明確な差を示し、分離後の単発測定は 39% 対 29% を示し、長期学習の再実験は 85.5% 対 90.5% を示した。三つの数値はいずれも同じ実装から得られたものであり、評価設計と測定回数が結論を決定していた。実装と検証を分離した相互監査は今回も機能し、特に実装者自身のテストが例外経路とデータ汚染を検出できなかった点で、独立レビューの必要性が具体的に示された。