この文書の数値はすべて本機で実行したコードの出力です。 推定値はありません。 v0.1 は 3 シードの平均 ± 標準偏差です。Day 1(単一シード)の記録は §8 に残してあります。
実測日: 2026-09-21(v0.1)/ 2026-09-20(Day 1、§8)
評価セット: data/bench_ja.jsonl 300 件(学習に一度も使っていない)
生データ: runs/bench_v01_seeds.json、runs/bench_seed{0,1,2}/results.json、
runs/diagnostics/state_use_v01_seed{0,1,2}.json、runs/position_bias_v01_seed{0,1,2}.json
訂正(2026-09-21)。
bench_jaの bool 質問(「送信者は解約・契約終了を示唆しているか」)は 学習データに一度も現れていません。ただし Day 1 のリーク検査は不完全で、解約が train+val の質問文 718 行、解除が 868 行に含まれていました。 いずれもchoice質問の選択肢説明(criteriaの値)と選択肢ラベルとしての出現です。 当時の検査がcriteriaのキーしか読んでおらず値を検査していなかったこと、および解除が語彙リストに入っていなかったことが原因です。 カタログと検査はscripts/check_catalog_leak.pyで修正済みで、v0.1 のデータは CLEAN です。 Day 1 の s0 / s1 の数値は訂正しません——bool 質問は未出現であり、 語彙が入っていてもなおboolが転移しなかったという事実は変わらないためです。
再現:
for s in 0 1 2; do
uv run python scripts/train.py --train data/train_v2b.jsonl --val data/val_v2.jsonl \
--run-id v01_seed$s --seed $s --epochs 2 --batch-size 24 --head-lr 2e-4 \
--encoding joint --save
uv run python scripts/calibrate.py --checkpoint runs/v01_seed$s/model.pt --val data/val_v2.jsonl
uv run python scripts/run_baseline_ja.py --out runs/bench_seed$s --skip-laya \
--sokudan-checkpoint runs/v01_seed$s/model.pt \
--sokudan-temperatures runs/v01_seed$s/temperatures.json
done
uv run python scripts/report_bench_seeds.py --runs runs/bench_seed0 runs/bench_seed1 runs/bench_seed2| 条件 | 要求 | 実測(3 シード平均、較正前) | |
|---|---|---|---|
bool acc |
> 0.703(多数決) | 0.788 ± 0.010 | PASS |
bool AUROC |
> 0.65 | 0.789 ± 0.043 | PASS |
score RPS |
< 0.197(多数決) | 0.090 ± 0.023 | PASS |
Day 1 からの変化。設計を separate encoding から joint encoding に変えたことが主因です
(docs/architecture.md §1.1、A/B の数値は §7):
| Day 1 (s1, 1 シード) | v0.1(3 シード) | |
|---|---|---|
| choice acc | 0.450 | 0.847 ± 0.009 |
| score RPS↓ | 0.168 | 0.090 ± 0.023 |
| bool acc | 0.623 | 0.788 ± 0.010 |
| bool AUROC | 0.513 | 0.789 ± 0.043 |
| 対象 | choice acc | choice ECE↓ | score RPS↓ | score acc | score MAE↓ | bool acc | bool ECE↓ | bool AUROC | bool mean P(true) |
|---|---|---|---|---|---|---|---|---|---|
| sokudan-ja-310m | 0.847 ± 0.009 | 0.147 ± 0.003 | 0.090 ± 0.023 | 0.763 ± 0.088 | 0.258 ± 0.086 | 0.788 ± 0.010 | 0.202 ± 0.013 | 0.789 ± 0.043 | 0.125 ± 0.012 |
| + 温度較正 | 0.847 ± 0.009 | 0.092 ± 0.036 | 0.149 ± 0.032 | 0.763 ± 0.088 | 0.258 ± 0.086 | 0.788 ± 0.010 | 0.129 ± 0.009 | 0.789 ± 0.043 | 0.170 ± 0.007 |
laya-multilingual (ja) |
0.747 | 0.148 | 0.232 | 0.443 | 0.620 | 0.543 | 0.352 | 0.523 | — |
| 多数決クラス | 0.380 | 0.000 | 0.197 | 0.460 | 0.540 | 0.703 | 0.000 | — | — |
| ランダム | 0.253 | 0.003 | 0.201 | 0.403 | 0.777 | 0.513 | 0.013 | — | — |
Laya・多数決・ランダムは Day 1 の実測をそのまま引いています(docs/baseline_ja.md、同一の 300 件・
同一のスコアリング経路)。v0.1 の測定では再実行していません。
| 指標 | seed 0 | seed 1 | seed 2 |
|---|---|---|---|
| choice acc | 0.843 | 0.840 | 0.857 |
| score RPS↓ | 0.117 | 0.080 | 0.074 |
| score acc | 0.663 | 0.800 | 0.827 |
| bool acc | 0.793 | 0.777 | 0.793 |
| bool AUROC | 0.837 | 0.773 | 0.756 |
| bool mean P(true) | 0.135 | 0.112 | 0.129 |
score acc のシード分散が大きい(0.663〜0.827、SD 0.088)。平均 0.763 は
どのシードの実測値でもありません。配布している重みは seed 0 なので、
その実測は acc 0.663 / RPS 0.117 です。
| 指標 | 較正前 | 較正後 | |
|---|---|---|---|
| choice ECE↓ | 0.147 | 0.092 | 改善 |
| bool ECE↓ | 0.202 | 0.129 | 改善 |
| score RPS↓ | 0.090 | 0.149 | 悪化 |
温度は合成の検証セットでフィットしており、bench_ja の score 分布と一致していません。
v0.1 の既定は未較正です。temperatures.json は同梱しますが、
利用者のデータで再フィットすることを推奨します。
同じ 300 件、同じ質問、選択肢の表記と順序だけを変えた 5 条件。 remap なしの提示順そのままの集計です。
| 条件 | 提示した選択肢 | sokudan 第1選択肢(3シード) | Laya 第1選択肢 | sokudan acc |
|---|---|---|---|---|
| A 原文 | 急がない / 早めに / 業務が止まっている | 92.0 ± 12.5 | 0 | 0.761 ± 0.085 |
| B 逆順 | 業務が止まっている / 早めに / 急がない | 81.3 ± 19.7 | 0 | 0.788 ± 0.070 |
| C 言い換え | 低 / 中 / 高 | 97.7 ± 19.1 | 1 | 0.697 ± 0.009 |
| D 言い換えの逆順 | 高 / 中 / 低 | 91.7 ± 12.4 | 1 | 0.733 ± 0.048 |
| E 4段階 | 全く急がない / 急がない / 早めに / 業務が止まっている | 45.3 ± 25.5 | 0 | 0.427 ± 0.072 |
Laya は 5 条件すべてで第 1 選択肢が 300 件中 0〜1 件しか選ばれず、
docs/baseline_ja.md §6.2 はこれを「第1選択肢スロットが構造的に選ばれない位置バイアス」と
結論しました。sokudan は 3 シード・5 条件すべてで第 1 選択肢を 15〜35% の頻度で選んでいます。
Laya の数値がハーネス由来でないことは別途確認済みです。公式
layaパッケージの README どおりの最小コードで再現し、保存済みの確率と完全一致しました (runs/diagnostics/laya_harness_check.json、floored の最大 |Δ| = 0.0)。
残る弱点は E(K=4)です。 acc 0.427 は A〜D の 0.697〜0.788 から明確に落ちます。 スキーマ間の振れ幅 0.427〜0.788 は Laya の 0.270〜0.473 より狭いものの、 K=4 以上の順序尺度の性能を K=3 から外挿してはいけません。
bench_ja の state を差し替えた 3 条件(3 シード平均 ± SD):
| 条件 | choice acc | score RPS↓ | score acc | bool acc | bool AUROC | mean P(true) |
|---|---|---|---|---|---|---|
| 本来の state | 0.847 ± 0.009 | 0.090 ± 0.023 | 0.763 ± 0.088 | 0.788 ± 0.010 | 0.789 ± 0.043 | 0.125 ± 0.012 |
| state を空文字に | 0.380 ± 0.000 | 0.411 ± 0.054 | 0.257 ± 0.000 | 0.703 ± 0.000 | 0.500 ± 0.004 | 0.006 ± 0.007 |
| state を別文書に | 0.337 ± 0.012 | 0.365 ± 0.021 | 0.327 ± 0.012 | 0.641 ± 0.019 | 0.511 ± 0.028 | 0.125 ± 0.012 |
Day 1 との直接対比:
| Day 1 (s1) | v0.1 | |
|---|---|---|
| bool acc(本来の state) | 0.623 | 0.788 |
| bool acc(空文字) | 0.703 ← 上がる | 0.703 ← 下がる |
| bool AUROC(本来) | 0.513 | 0.789 |
Day 1 は state を空にすると bool の精度が上がって多数決 0.703 に一致しました
(=文面を読まず「常に false」)。v0.1 は本来 0.788 から下がって 0.703 に落ち、
AUROC は 0.789 → 0.500 のチャンスになります。
空文字時の mean P(true) は 0.006 で、state がないときだけ「常に false」に退化します。
choice も 0.847 → 0.380(多数決と同値)、score の RPS も 0.090 → 0.411 と崩壊します。
3 プリミティブすべてが state に依存していることが測定できました。
mean P(true) 0.125 に対し gold の陽性率は 0.297 です。 AUROC 0.789 なので順位付けは機能していますが、閾値の位置はずれています。 較正後も 0.170 で、温度スケーリングでは補正されません(温度は argmax を変えないため)。 利用者の事前確率に合わせて閾値を決める必要があります。
val で logit のバイアス項を 1 つフィットし、held-out val(未知スキーマ × 未知文書)に
当てた結果:
| acc | ECE↓ | AUROC | mean P(true) | gold | |
|---|---|---|---|---|---|
| before | 0.7859 | 0.1902 | 0.8879 | 0.4366 | 0.5133 |
| after(bias −2.979) | 0.7792 | 0.1814 | 0.8879 | 0.3714 | 0.5133 |
AUROC の変化は 0.000000。 バイアスは順位を動かさないので、これは期待どおりです (温度も動かしませんが、温度は argmax も動かしません。バイアスは動かします)。
しかし held-out val では役に立ちませんでした。 acc は 0.786 → 0.779 とわずかに悪化し、
ECE だけが改善します。理由は分布です: held-out val は属性ごとに 40〜60% へ再バランスして
あるので gold 陽性率が 0.513、mean P(true) は 0.4366 で、過少予測がほとんど起きていません。
bench_ja(gold 0.297、P(true) 0.125)とは条件が違います。
したがって P(true) の過少予測はモデルの大域的な性質ではなく、bench_ja の陽性率に対する
ずれです。直すなら、検証セットではなく実際に配備する分布の事前確率に対して閾値を
決める必要があります。これは診断であり、既定の較正には入れていません。
生データ: runs/diagnostics/bias_and_k.json。
held-out(val、未知文書)の score を K 別に分解し、学習ビュー数と並べたもの:
| K | 学習ビュー | n | acc | RPS↓ |
|---|---|---|---|---|
| 2 | 1,648 | 256 | 0.688 | 0.241 |
| 3 | 2,796 | 444 | 0.414 | 0.308 |
| 4 | 3,248 | 564 | 0.633 | 0.143 |
| 5 | 2,368 | 488 | 0.537 | 0.125 |
| 6 | 1,652 | 244 | 0.525 | 0.098 |
| 7 | 1,580 | 324 | 0.256 | 0.218 |
K=4 は学習ビューが最多(3,248、全体の 24.4%)で、val の acc も K=3 より高い。 データ不足でも K=4 固有の弱点でもありません。
acc と RPS は単調でも一致してもいません。 acc は K=3 で谷、K=4 で回復、K=7 で最低。 RPS は K=6 が最良(0.098)で K=3 が最悪(0.308)。K=6 は acc が低いのに RPS が最良で、 Day 1 §6 の「片方だけ見ると結論が逆になる」がここでも成り立ちます。
bench_ja の E 条件(4 段階、acc 0.427)は、K が 4 であることでは説明できません。
残る説明はその条件固有の選択肢の並び(「全く急がない / 急がない / 早めに / 業務が止まっている」)
で、先頭 2 つが語として紛らわしいことです。これは未検証の仮説です。
local_attention: 128 の影響を見るために、600〜2200 文字の長文を生成し、
トークン数でビン分けして測ったもの(文字ではなくトークンで切るのは、窓がトークンで
数えられているためです)。学習済み属性と held-out 属性を分けています。
| 属性 | トークン数 | n | AUROC | acc |
|---|---|---|---|---|
| 学習済み | 0–200 | 25,648 | 0.9994 | 0.993 |
| 学習済み | 200–400 | 4,394 | 0.9993 | 0.990 |
| 学習済み | 400–600 | 290 | 0.9970 | 0.983 |
| 学習済み | 600– | 54 | 0.9650 | 0.944 |
| held-out | 0–200 | 1,722 | 0.9043 | 0.799 |
| held-out | 200–400 | 593 | 0.8815 | 0.791 |
| held-out | 400–600 | 171 | 0.8662 | 0.754 |
| held-out | 600– | 33 | 0.7302 | 0.636 |
held-out は単調に下がります(0.904 → 0.882 → 0.866 → 0.730)。落ち方は 400 トークンを 超えると大きくなり、600 トークン超で顕著です。学習済み属性は 600 トークンまでほぼ平坦 (0.997)で、そこから 0.965 に落ちます。
ただし 600 トークン超は n=33 で、AUROC の標準誤差は約 0.09 です。0.730 と 0.904 の差は 2 標準誤差程度にとどまるので、「600 超で急落する」と断定できる精度はありません。 400 トークンまでの低下(n=171 以上)のほうが確かです。
local_attention: 128 はもっともらしい機構ですが、この測定は相関であって因果の証明では
ありません(窓幅を変えた対照実験はしていません)。
生データ: runs/diagnostics/long_states2.json、コーパスは data/docs_long_val.jsonl。
上の段落の「窓幅を変えた対照実験」を 1 シードで行いました(docs/local_attention_1024.md、
docs/night_report_5.md)。v0.1 seed 0 と同一の設定で local_attention だけを 1024 にして学習し、
held-out / val で比較したものです(v0.1 は 3 シード、1024 は seed 0 のみ)。
| 指標 | n | v0.1 s0 / s1 / s2 | 1024 s0 |
|---|---|---|---|
| held-out bool AUROC(M1) | 9,850 | 0.8817 / 0.8857 / 0.8955 | 0.8604 |
| 400–799 帯 AUROC(M2) | 210 | 0.8492 / 0.8288 / 0.8571 | 0.7520 |
ends_with_question acc(M3) |
3,348 | 0.6338 / 0.6792 / 0.6711 | 0.5352 |
| choice acc(val) | 1,976 | 0.7055 / 0.7110 / 0.7009 | 0.6898 |
| score RPS(val) | 2,320 | 0.1875 / 0.1777 / 0.1696 | 0.1664 |
| score acc(val) | 2,320 | 0.5129 / 0.5272 / 0.5328 | 0.5392 |
| bool acc(val) | 7,862 | 0.9303 / 0.9326 / 0.9294 | 0.9335 |
窓を広げて微調整するだけでは改善せず、悪化しました(事前登録した前進ゲートは FAIL)。
ただし sliding 層は事前学習で相対距離 ±64 までしか見ておらず、窓 1024 は訓練外の距離への
RoPE 外挿を伴います。したがってこれは 「距離が原因」という仮説の反証ではなく、介入手段の失敗
として扱います。仮説の検証は入力順を入れ替える実験(docs/input_order.md)に引き継ぎます。
| 項目 | 値(3 シード) |
|---|---|
| 1問 p50 | 11.9 ms ± 0.0 |
| 1問 p95 | 29.5 ms ± 0.1 |
| 1問 mean | 13.1 ms ± 0.0 |
| questions/sec | 229.4 ± 0.6 |
この数値から複数問のレイテンシを外挿しないでください。 v0.1 は joint encoding で、
質問ごとに state を再エンコードします。N 問のリクエストは backbone を N 回通ります
(docs/architecture.md §1.2)。10問・50問は測定していません。
| 項目 | 値 |
|---|---|
| エンコーディング | joint([CLS] 指示 [SEP] 選択肢+マーカー [SEP] state [SEP]) |
| エポック | 2 |
| バッチサイズ | 24 |
| learning rate(backbone / head) | 2e-5 / 2e-4 |
| 学習ビュー | 67,394 |
| 検証ビュー | 12,158 |
| 学習時間 | 661 秒 / シード(RTX 5090) |
| シード | 0 / 1 / 2 |
| 段 | 数 |
|---|---|
| 生成した文書 | 4,833 文書(21 ドメイン) |
| ラベル付き (文書, 質問) ペア | 31,243 ペア |
| スキーマ拡張後のビュー | 79,552 ビュー(train 67,394 + val 12,158) |
「ビュー」を「例」と読み替えないでください。 同じ文書・同じラベルを スキーマ表記だけ変えて複数回見せたものを含みます。独立な事例数は「ペア」の段です。
生成は qwen3:30b-a3b-instruct-2507-q4_K_M 単一モデル。生成条件をそのままゴールドとし、
同じモデルに temperature 0・ゴールド非開示で検算させ、不一致ペアを破棄しました
(破棄率: 表層 6.1% / 明示的態度 9.4% / 非明示の意図 17.5%)。
検算者は生成者と同一なので、これは「生成器が自分の指示に従ったか」の測定であり、
「ラベルが真か」の測定ではありません。
学習に一度も出していない 5 属性(質問文・言い換え・否定形・選択肢文字列すべて未出)を、
学習に使っていない文書で評価したもの。bench_ja と同じ「未知スキーマ × 未知文書」の条件です。
| 段 | AUROC(seed 0 の学習構成) |
|---|---|
| 全体 | 0.872 |
| I 段(非明示の意図) | 0.786 |
| E 段(明示的態度) | 0.995 |
| S 段(表層・位置依存) | 0.688 |
bench_ja の bool(「解約を示唆しているか」)は I 段と同型です。
S 段が最も低いのは設計時の想定と逆でした。 該当属性は「文末が問いかけで終わっているか」で、
これは意味ではなく位置の問題です。local_attention: 128 の制約が効くのは
意図推論ではなくこちらでした。
同一データ・同一配合・同一エポック・同一 head LR で両方を学習した結果:
| separate + cross-attn head | joint | |
|---|---|---|
| val choice acc | 0.349 | 0.691 |
| val score RPS↓ | 0.204 | 0.185 |
| val bool AUROC | 0.529 | 0.984 |
| held-out AUROC | 0.506 | 0.872 |
| held-out I 段 | 0.486 | 0.786 |
| 定常 epoch 時間 | 464 秒 | 330 秒 |
当初 separate を選んだ論証(local_attention: 128 では連結すると質問が state を見られない)が
外していた点は、実データの平均系列長が 160 トークン(state 134 + 質問 26)で
local の窓 128 とほぼ同じだったことです。想定した「位置 3000 の質問ブロック」は起きませんでした。
詳細は docs/architecture.md §1.1。
以下は履歴です。v0.1 の数値ではありません。
§9 は「多数決クラスを下回ったら即座に報告して止まる」と定めています。該当します。
| プリミティブ | sokudan | 多数決 | laya-ml | 判定 |
|---|---|---|---|---|
score RPS↓ |
0.195 | 0.197 | 0.232 | ⭕ 両方を上回る(多数決とは僅差) |
score acc |
0.403 | 0.460 | 0.443 | ❌ 多数決を下回る |
bool acc |
0.683 | 0.703 | 0.543 | ❌ 多数決を下回る(laya には勝つ) |
bool AUROC |
0.405 | — | 0.523 | ❌ 0.5 未満=順位が反転している |
choice acc |
0.427 | 0.380 | 0.747 | ⭕ 多数決は超える/laya には遠く及ばない |
choice ECE↓ |
0.056 | 0.000 | 0.148 | ⭕ 学習モデル中で最良 |
| レイテンシ mean | 14.3 ms | — | 25.0 ms | ⭕ 実測で最速 |
狙った score と bool の両方で、多数決ベースラインを完全には超えられませんでした。
得られたものもあります。設計の中核だった「死んだスロット」の位置バイアスは解消しました(§2)。
ただし別種の位置バイアスが残っており、それが score の伸び悩みを説明します。
| 対象 | choice acc | choice ECE | score RPS↓ | score acc | score MAE↓ | bool acc | bool ECE | パース失敗率 |
|---|---|---|---|---|---|---|---|---|
| sokudan-ja-310m | 0.427 | 0.056 | 0.195 | 0.403 | 0.727 | 0.683 | 0.257 | 0.0% |
| sokudan-ja-310m + 温度較正 | 0.427 | 0.098 | 0.194 | 0.403 | 0.727 | 0.683 | 0.197 | 0.0% |
laya-multilingual (ja) |
0.747 | 0.148 | 0.232 | 0.443 | 0.620 | 0.543 | 0.352 | 0.0% |
laya-multilingual + 温度較正 |
0.747 | 0.087 | 0.196 | 0.443 | 0.620 | 0.543 | 0.012 | 0.0% |
laya (英語版に日本語) |
0.467 | 0.108 | 0.200 | 0.460 | 0.603 | 0.303 | 0.634 | 0.0% |
| 多数決クラス | 0.380 | 0.000 | 0.197 | 0.460 | 0.540 | 0.703 | 0.000 | — |
| ランダム | 0.253 | 0.003 | 0.201 | 0.403 | 0.777 | 0.513 | 0.013 | — |
| ローカル LLM-as-classifier ※ | 0.890 | 0.105 | 0.165 | 0.707 | 0.330 | 0.867 | 0.133 | 0.2% |
※ 公平な比較対象ではありません。 bench_ja を生成したモデルと同一の重みで、
自分が書いた文を自分の生成条件に照らして分類し直しています。上限の目安です。
scoreの RPS 0.195 は laya 0.232 を明確に上回り、多数決 0.197 も僅かに上回る。 ただし argmax 精度 0.403 は多数決 0.460 を下回ります。 つまり分布の形は改善したが、当てにいく能力は多数決以下です。 RPS だけを見て「勝った」と書くのは誤りなので、両方を並べています。choiceの ECE 0.056 は学習モデル中で最良(laya 0.148、較正後 0.087)。 ヘッドのロジット直読 + 中立初期化の効果と読めますが、 アブレーションをしていないので原因は特定できていません。- 温度較正は
boolの ECE を 0.257 → 0.197 に下げましたが、choiceは 0.056 → 0.098 と悪化しました。検証セット(合成)で当てた温度がbench_ja(未知スキーマ)に転移しなかった、と読めます。
docs/baseline_ja.md §6.2 と同一の 5 条件・同一の 300 件。
| 条件 | 提示した選択肢 | laya-ml | sokudan |
|---|---|---|---|
| A 原文 | 急がない / 早めに / 業務が止まっている | 0 | 62 (20.7%) |
| B 逆順 | 業務が止まっている / 早めに / 急がない | 0 | 95 (31.7%) |
| C 言い換え | 低 / 中 / 高 | 1 | 8 (2.7%) |
| D 言い換えの逆順 | 高 / 中 / 低 | 1 | 11 (3.7%) |
| E 4段階 | 全く急がない / … / 業務が止まっている | 0 | 28 (9.3%) |
⭕ 死んだスロットは解消しました。 5 条件すべてで第1選択肢が実際に選ばれています (laya は 0〜1 件)。単調 CDF による定式化(§6.3)が意図どおり働いた部分です。
| 条件 | acc | RPS↓ | spearman(期待値, gold) |
|---|---|---|---|
| A 原文 | 0.387 | 0.195 | +0.310 |
| B 逆順 | 0.207 | 0.210 | −0.316 |
| C 言い換え(低/中/高) | 0.310 | 0.197 | +0.289 |
| D 言い換えの逆順 | 0.237 | 0.214 | −0.303 |
| E 4段階 | 0.293 | 0.215 | +0.325 |
選択肢を逆順にすると、スピアマン相関が同程度の大きさで符号反転します。 (+0.310 → −0.316、+0.289 → −0.303)
これは remap 後の、ラベル意味に揃えた相関です。符号が反転するということは、 モデルが「後ろの選択肢ほど高いレベル」という提示順の規則を読んでおり、 選択肢の意味を読んでいないことを意味します。
順序尺度は通常「低→高」で書かれるので、この事前分布自体は妥当です。
しかし schema_aug の反転率を 35% に設定したのは不足でした。
65% が低→高のままだったため、位置の規則が意味の読解より強く残っています。
スキーマ間の accuracy 振れ幅は 0.207〜0.387(幅 0.180)。 laya の 0.270〜0.473(幅 0.203)とほぼ同等で、脆弱性は解消していません。
これが score が多数決を超えられなかった直接の原因と考えられます
(ただし反転率を変えたアブレーションは未実施なので、確定ではありません)。
docs/baseline_ja.md §6.3 で laya に当てたのと同じ診断:
| 指標 | sokudan | laya-ml | 多数決 |
|---|---|---|---|
| gold 正例率 | 0.297 | 0.297 | — |
| 平均 P(true) | 0.096 | 0.434 | — |
| 精度 @ 閾値 0.5 | 0.683 | 0.543 | 0.703 |
| 精度 @ 正例率一致閾値 | 0.547 | 0.613 | — |
| AUROC | 0.405 | 0.523 | — |
AUROC 0.405 は 0.5 を下回っており、順位付けが反転しています。 平均 P(true) 0.096 に対し gold 正例率 0.297 なので、 モデルはほぼ全件に「いいえ」と答えている状態です。 精度 0.683 はそこから来ており、多数決 0.703 にわずかに届いていません。
閾値を正例率に合わせると 0.547 まで下がるのも、順位情報がないことの裏付けです。
laya より精度は高い(0.683 vs 0.543)が、AUROC では laya (0.523) より悪い。 精度だけで「laya に勝った」と書くのは誤りなので、両方を出しています。
検証セット(合成、学習と同系統のスキーマ)では bool 精度 0.807 でした。 未知スキーマへの転移で崩れています。 これがゼロショット汎化の失敗です。
| 対象 | p50 (ms/件) | p95 (ms/件) | mean (ms/件) | questions/sec |
|---|---|---|---|---|
| sokudan-ja-310m | 14.1 | 17.3 | 14.3 | 210.2 |
laya-multilingual (ja) |
19.8 | 37.7 | 25.0 | 119.8 |
laya (英語版) |
26.5 | 38.7 | 27.8 | 107.9 |
| ローカル LLM-as-classifier | 939.0 | 1110.0 | 1029.0 | 2.9 |
1件 = 3問。同一マシン・同一条件での実測です。
この数字で「state を1回だけエンコードするから速い」とは主張できません。
現在の測定は質問ごとに state を再エンコードする経路です(sokudan_baseline.py に明記)。
§6.2 の単一エンコード経路の効果は別途測る必要があります。
速いのは事実ですが、その理由は未検証です。
| 段 | 数 |
|---|---|
| 生成した文書 | 2,965 文書 |
| ラベル付き (文書, 質問) ペア | 5,930 ペア |
| スキーマ拡張後のビュー | 23,720 ビュー(train 22,304 / val 1,416) |
「ビュー」を「例」と読み替えないでください。同じ文書・同じラベルを スキーマ表記だけ変えて複数回見せたものを含みます。
| 項目 | 値 |
|---|---|
| エポック | 1 |
| ステップ | 930 |
| 学習時間 | 155 秒 |
| batch_size | 24 |
| シード | 1つのみ |
| attention | sdpa |
検証セット(合成 held-out 文書、スキーマは学習と同系統):
| 学習前 | 学習後 | |
|---|---|---|
| choice acc | 0.190 | 0.624 |
| score RPS↓ | 0.238 | 0.209 |
| bool acc | 0.497 | 0.807 |
検証セットでの 0.807 が bench_ja で 0.683 に落ちている点が、
このモデルの現状を最もよく表しています。学習したスキーマ系統では動き、
未知スキーマでは崩れます。
ordinal.cut.bias = -5.0(初期分布を厳密に一様にするため)が、
softplus'(-5) = 0.0067 により勾配を約150倍減衰させ、
930ステップで -5.000 → -4.999 しか動きませんでした。
spacing が凍結すると閾値が1パラメータ族に潰れ、中間レベルにピークを作れません。
-1.0 に変更して score RPS の学習量が 0.0016 → 0.029 に改善しました。
詳細は docs/architecture.md §4。
§14.4 により当日は実施していません。やっていないものを「効いた」と書きません。
| 項目 | 状態 |
|---|---|
| スキーマランダム化あり/なし | 未実施 |
| 反転率 35% の妥当性(§2.2 の原因究明に必須) | 未実施 |
| head 2層 vs 4層 | 未実施 |
| head 内 RoPE | 未実施 |
| RLCD (Stage 3) | 未実施 |
| 質問エンコードキャッシュのレイテンシ効果 | 未実施 |
- ❌ 「
score/boolで laya を上回った」— RPS と精度で結論が逆になるので、単独では書けない - ❌ 「多数決を超えた」—
scoreacc とboolacc で下回っている - ❌ 「state を1回だけエンコードするので速い」— 現在の測定経路が違う
- ❌ 「位置バイアスを解決した」— 死んだスロットは解消、方向バイアスは残存
- ❌ 「スキーマランダム化が効いた」— アブレーション未実施
- ⭕ 「
scoreの RPS 0.195 は laya 0.232 と多数決 0.197 を上回った(単一シード、300件、1スキーマ)」 - ⭕ 「死んだスロットの位置バイアスは 5 条件すべてで解消した」
- ⭕ 「
choiceの ECE 0.056 は比較した学習モデル中で最良だった」 - ⭕ 「同一条件のレイテンシで最速だった(理由は未検証)」
S 段(表層)は属性ごとに判定する。位置依存属性は判定から除外する。
| 内容 | |
|---|---|
| 判定 | held-out にある S 段属性のそれぞれが AUROC > 0.85 |
| 免除 | 位置依存属性(sokudan/data/intent_attributes.py の POSITIONAL_ATTRIBUTES): ends_with_question(最後の一文)、includes_greeting(冒頭の一文) |
| 位置依存の定義 | 答えが文書の決まった場所(末尾・冒頭)にある属性。どこに出てきても検出できる属性(箇条書き・日付・数値)は、形が構造的でも位置依存ではない |
| 免除の理由 | local_attention: 128 のため、決まった場所が選択肢のマーカーから見えない範囲に落ちることがある。その AUROC は「読めるか」ではなく「どこを見ているか」を測っている |
| 判定対象がない場合 | 通過とみなすが、「判定する属性がない」と明記する(scripts/eval_heldout.py が表示する) |
| 実装 | scripts/eval_heldout.py の s_tier_gate()。テスト tests/test_s_gate.py |
以前の規則との違い: 以前は S 段をまとめた AUROC で判定し、落ちた属性が ends_with_question だけなら免除していた。
まとめた値は、1 つの属性が 0.85 を下回っても他が高ければ通ってしまう。
この規則を既存のチェックポイントに当てた結果(参考。v0.1 の公開判断は変えない):
| 物差し | S 段の中身 | 結果 |
|---|---|---|
凍結(heldout_val_v2) |
ends_with_question だけ(位置依存) |
判定する属性がない(全チェックポイント、形式上は通過) |
12 属性(heldout_val_v4) |
ends_with_question(免除)+ uses_bullet_points |
9 本中 8 本が不通過。uses_bullet_points が 0.76〜0.83(v0.1 の 3 シード: 0.7915 / 0.8002 / 0.7787)。通るのは v0.3 seed 2(0.8580)だけ |
つまり凍結物差しでの v0.1 の S 段通過は、判定する属性がなかったことによる。
位置依存でない表層属性(uses_bullet_points)では、どのモデルも 0.85 に届いていない。
この節の数値は、事前登録した 1 回だけの bench の実行結果です(docs/release_candidate.md §2)。再実行はしていません。
- 対象:
runs/release_candidate/model.pt- 旧コードの v0.1 seed 0〜7 の 8 本を単純平均した soup です。
- SHA-256 は
c301449145c97f9e317fb6eec716df17275fceef32e8a4baac2c9071d93504fe。選定の過程はdocs/release_candidate.md§3 にあります。
- 実行:
scripts/release_bench.py run(2026-09-27 00:09:47–00:12:07) - 判定:
scripts/release_bench.py judge(00:12:12) - 生データ:
runs/release_candidate/{bench_ja,bench_en,bench_v01_seed0}/results.json、runs/release_candidate/position_bias_ja.json、runs/release_candidate/judgement.json
スコアリングコードの確認:
- v0.1 の記録(commit 68d217b)の後にコードの変更があったので、v0.1 seed 0 を現行コードで再スコアしました。
- 較正前の 5 指標は、記録と完全に一致しました(差 0.0)。そのため、下の v0.1 の値は §1 に記録した 3 シードの値のままです。
| 対象 | choice acc | choice ECE↓ | score RPS↓ | score acc | score MAE↓ | bool acc | bool ECE↓ | bool AUROC | bool mean P(true) |
|---|---|---|---|---|---|---|---|---|---|
| S8_old(soup) | 0.880 | 0.099 | 0.075 | 0.817 | 0.210 | 0.780 | 0.181 | 0.844 | 0.133 |
| v0.1(3 シード) | 0.847 ± 0.009 | 0.147 ± 0.003 | 0.090 ± 0.023 | 0.763 ± 0.088 | 0.258 ± 0.086 | 0.788 ± 0.010 | 0.202 ± 0.013 | 0.789 ± 0.043 | 0.125 ± 0.012 |
| S8_old + 温度較正 | 0.880 | 0.075 | 0.132 | 0.817 | 0.210 | 0.780 | 0.119 | 0.844 | 0.173 |
| v0.1 + 温度較正(3 シード) | 0.847 ± 0.009 | 0.092 ± 0.036 | 0.149 ± 0.032 | 0.763 ± 0.088 | 0.258 ± 0.086 | 0.788 ± 0.010 | 0.129 ± 0.009 | 0.789 ± 0.043 | 0.170 ± 0.007 |
| 多数決クラス(今回も実行) | 0.380 | 0.000 | 0.197 | 0.460 | 0.540 | 0.703 | 0.000 | 0.500 | 0.297 |
| ランダム(今回も実行) | 0.253 | 0.003 | 0.201 | 0.403 | 0.777 | 0.513 | 0.013 | 0.489 | 0.500 |
- 温度は
val_v2でフィットしました(scripts/calibrate.py、v0.1 と同じ手順)。 - v0.1 と同じく、較正は
scoreの RPS を悪化させます(0.075 → 0.132)。
リリース規則(docs/release_candidate.md §2.3。較正前、v0.1 の 3 シード平均との差):
| 区分 | 指標 | S8_old | v0.1 | 差 | 条件 | |
|---|---|---|---|---|---|---|
| 主要 | bool AUROC | 0.843868 | 0.788540 | +0.055328 | ≥ +0.01 | 通過 |
| 主要 | score RPS↓ | 0.074509 | 0.090323 | −0.015813 | ≤ −0.005 | 通過 |
| ガードレール | choice acc | 0.880000 | 0.846667 | +0.033333 | ≥ −0.01 | 通過 |
| ガードレール | bool acc | 0.780000 | 0.787778 | −0.007778 | ≥ −0.01 | 通過 |
| ガードレール | score acc | 0.816667 | 0.763333 | +0.053333 | ≥ −0.01 | 通過 |
判定: v0.2 候補として確定。HF への公開はチャット側の確認後。
- bool acc だけは v0.1 より 0.0078 低くなりました。ガードレールの −0.01 の内側です。
- 参考として、v0.1 の配布重みは seed 0 で、その値は choice 0.843、RPS 0.117、score acc 0.663、bool acc 0.793、AUROC 0.837 でした(§1)。
| 対象 | choice acc | choice ECE↓ | score RPS↓ | score acc | score MAE↓ | bool acc | bool ECE↓ | bool AUROC | bool mean P(true) |
|---|---|---|---|---|---|---|---|---|---|
| S8_old(soup) | 0.872 | 0.093 | 0.114 | 0.652 | 0.362 | 0.690 | 0.241 | 0.621 | 0.134 |
| v0.1(sokudan) | 記録なし | 記録なし | 記録なし | 記録なし | 記録なし | 記録なし | 記録なし | 記録なし | 記録なし |
laya (english model) |
0.883 | 0.182 | 0.149 | 0.590 | — | 0.672 | 0.216 | 0.494 | — |
laya-multilingual (en) |
0.817 | 0.080 | 0.340 | 0.266 | — | 0.645 | 0.305 | 0.355 | — |
| 多数決クラス | 0.331 | 0.669 | 0.257 | 0.486 | — | 0.683 | 0.317 | 0.500 | — |
| ランダム | 0.272 | 0.021 | 0.197 | 0.307 | — | 0.548 | 0.195 | 0.546 | — |
- Laya・多数決・ランダムは
docs/baseline_en.md§4 の値です(2026-09-22 の実測。今回は再実行していません)。 - sokudan の行は
scripts/run_bench_en_sokudan.pyで得ました。SokudanBaselineにbench_enの質問を与え、run_baseline_en.pyと同じscore_baselineで採点しています。 - v0.1 の sokudan は
bench_enで測っていません。事前登録どおり、今回も測っていません。 - bool acc 0.690 は多数決(0.683)とほぼ同じです。 AUROC は 0.621 でした。
| 条件 | 提示した選択肢 | S8_old の提示順 argmax 件数 | S8_old 第1選択肢 | S8_old acc | S8_old RPS↓ | v0.1 第1選択肢(3 シード) | v0.1 acc | v0.1 RPS↓ |
|---|---|---|---|---|---|---|---|---|
| A 原文 | 急がない / 早めに / 業務が止まっている | [85, 110, 105] | 85 | 0.807 | 0.0741 | 92.0 ± 12.5 | 0.761 ± 0.085 | 0.0907 |
| B 逆順 | 業務が止まっている / 早めに / 急がない | [78, 129, 93] | 78 | 0.817 | 0.0718 | 81.3 ± 19.7 | 0.788 ± 0.070 | 0.0858 |
| C 言い換え | 低 / 中 / 高 | [99, 70, 131] | 99 | 0.687 | 0.1173 | 97.7 ± 19.1 | 0.697 ± 0.009 | 0.1198 |
| D 言い換えの逆順 | 高 / 中 / 低 | [99, 94, 107] | 99 | 0.740 | 0.1044 | 91.7 ± 12.4 | 0.733 ± 0.048 | 0.0983 |
| E 4段階 | 全く急がない / 急がない / 早めに / 業務が止まっている | [5, 94, 103, 98] | 5 | 0.347 | 0.1612 | 45.3 ± 25.5 | 0.427 ± 0.072 | 0.1672 |
- A〜D では、第 1 選択肢が 78〜99 件選ばれました。v0.1 の 3 シードと同じ範囲で、acc は A と B で v0.1 より高くなりました。
- E(K=4)では、第 1 選択肢が 300 件中 5 件(1.7%)しか選ばれませんでした(v0.1 は 45.3 ± 25.5)。acc も 0.347 で、v0.1 の 0.427 ± 0.072 を下回ります。
- モジュールの判定文は「dead-slot なし」ですが、E での第 1 選択肢の率は §2 の Laya(0〜1 件)に近づいています。
- v0.1 の単体 3 シードで E の第 1 選択肢が選ばれた件数は 58 / 16 / 62 で、最も選ばれにくいスロットだったのは seed 1 だけです(提示順の argmax 件数は [58, 63, 47, 132] / [16, 88, 121, 75] / [62, 44, 111, 83])。
- 平均した重みで第 1 スロットがほぼ選ばれなくなった原因は、調べていません。
- acc の振れ幅(5 条件の最大 − 最小)は 0.470 で、v0.1 の 3 シード(0.220 / 0.487 / 0.383)の範囲内です。
- K=4 以上の順序尺度の性能を K=3 から外挿してはいけないという §2 の注意は、soup ではより強く当てはまります。
- 両端の位置(2026-09-28 night_23 に追記): 「先頭と最後の位置が不利」は、どこでも出るわけではありませんでした(§11.3)。
bench_jaの部署ルーティング(choice、K = 4)を 24 通りの全順序で聞くと、スロットごとの選択率は 0.243 / 0.251 / 0.256 / 0.249 で、ほぼ一様でした。- held-out の choice(K = 3、30 状態 × 6 順序)は 0.289 / 0.328 / 0.383 で、最後がいちばん選ばれています。
- はっきり両端で低く出るのは、包括的な選択肢(「その他」)の確率です。
docs/probe_catch_all.md(勘定科目、K = 6 と 11): その他が正解の state での P(その他) は、両端で 0.21〜0.22、中ほどで 0.37〜0.42(K = 6)。bench_ja: 「その他」が正解の 38 件での recall は、その他の位置別に 0.303 / 0.325 / 0.346 / 0.307(差は小さい)。
X の公開スレッドでの報告を受けて、部署ルーティング(choice、4 クラス)をクラス別に見直しました。v0.2.1 の重みは v0.2 と同じで、choice は較正していません。
bench_ja(300 件): acc 0.880、Top-2 0.963。
| 正解 \ 予測 | 請求 | 技術 | 営業 | その他 | recall | precision | Top-2 |
|---|---|---|---|---|---|---|---|
| 請求(114) | 113 | 1 | 0 | 0 | 0.991 | 0.958 | 1.000 |
| 技術(97) | 0 | 95 | 0 | 2 | 0.979 | 0.833 | 0.979 |
| 営業(51) | 4 | 2 | 45 | 0 | 0.882 | 0.818 | 1.000 |
| その他(38) | 1 | 16 | 10 | 11 | 0.289 | 0.846 | 0.763 |
bench_en(290 件): acc 0.872、Top-2 0.983。
| 正解 \ 予測 | Billing | Technical | Sales | Other | recall | precision | Top-2 |
|---|---|---|---|---|---|---|---|
| Billing(90) | 89 | 0 | 1 | 0 | 0.989 | 0.967 | 1.000 |
| Technical(96) | 0 | 95 | 0 | 1 | 0.990 | 0.792 | 1.000 |
| Sales(56) | 0 | 1 | 52 | 3 | 0.929 | 0.912 | 0.982 |
| Other(48) | 3 | 24 | 4 | 17 | 0.354 | 0.810 | 0.917 |
- 「その他」の recall は 0.289(ja)/ 0.354(en)です。 取りこぼしは、主に技術(16 / 24 件)と営業(10 件、ja)に入ります。
- 誤りの大半は「その他」の取りこぼしです。ja の誤り 36 件のうち 27 件、en の誤り 37 件のうち 31 件がそうでした。
- 「その他」と予測したときは、ほぼ当たっています(precision 0.846 / 0.810)。選ばれにくいだけです。
- 正解が「その他」の 38 件での、P(その他) の平均は 0.272 です(en 0.277)。
- Top-2 では、「その他」も 0.763 / 0.917 まで上がります。
bench_jaでは、300 件中 224 件が P(top1) ≥ 0.99 でした。そのうち 14 件(6.25%)が誤答です。bench_enでは 28 件で、そのうち 1 件(3.6%)が誤答です。- choice の温度較正の再判定(choice は raw のまま)は、
docs/calibration.md§11〜§12 にあります。
bench_ja の部署ルーティング、全 24 順序:
- 300 件 × 24 = 7,200 決定です。CPU で
sokudan.load("GeneLab/sokudan-ja-310m").predictを使いました(647 s)。 - 提示順どおり(説明つき)の argmax は、保存済みの出力と 300 件すべてで一致しました。
| slot 0(先頭) | slot 1 | slot 2 | slot 3(最後) | |
|---|---|---|---|---|
| そのスロットの選択肢が選ばれた率(順序に依らなければ 0.25) | 0.243 | 0.251 | 0.256 | 0.249 |
| 正解がそのスロットにあるときの acc | 0.857 | 0.868 | 0.878 | 0.865 |
| 「その他」が正解の 38 件: その他の位置別の P(その他) の平均 | 0.291 | 0.305 | 0.331 | 0.289 |
| 「その他」が正解の 38 件: その他の位置別の recall | 0.303 | 0.325 | 0.346 | 0.307 |
- 順序で平均した acc は 0.867(順序ごとに 0.853〜0.880)です。
- 答えが 24 通りのあいだで一度でも変わった件は、8.7% でした。
held-out の choice(presentation checks の保存結果):
-
30 状態 × 3 選択肢の 6 順序 = 180 決定です。
-
スロット別の選択数は 52 / 59 / 69、率は 0.289 / 0.328 / 0.383 です(順序に依らなければ 1/3)。
-
先頭は低く、最後は高くなっています。
-
両端が不利なのは、全体の傾向ではありません。 目立つのは、包括的な選択肢の確率です(§10.3 の追記、
docs/probe_catch_all.md§4.3)。
| acc | Top-2 | ECE(15 等分位) | ECE(10 等幅) | P(top1) の中央値 | 「その他」の recall | |
|---|---|---|---|---|---|---|
| 説明つき(既存の質問) | 0.880 | 0.963 | 0.088 | 0.093 | 0.997 | 0.289 |
| ラベルだけ(説明を空に) | 0.537 | 0.747 | 0.140 | 0.132 | 0.546 | 0.316 |
- ラベルだけの混同行列(行 = 正解: 請求 / 技術 / 営業 / その他):
- 請求: [83, 16, 9, 6]
- 技術: [1, 51, 22, 23]
- 営業: [24, 7, 15, 5]
- その他: [1, 11, 14, 12]
- 「請求 / 技術 / 営業 / その他」のような短い部署名だけでは、acc が 0.343 下がりました。
docs/probe_catch_all.mdの勘定科目(D、ラベルだけ)では、ほとんど下がりませんでした(0.852 → 0.843)。ラベル自体が内容を表すかどうかで、説明文の効き方が変わります(読み取りです。条件をそろえた比較はしていません)。