AlphaZero 五子棋实战(五):评估工具 ------ 学会在错误的地方掉头
这个系列的前四篇讲了配置、参数、机制、踩坑。最后这篇讲一件最容易被忽略、但决定了前面所有努力是否有效 的事:你怎么知道自己走错了?
强化学习里最贵的错误不是"训不好",而是"你以为训得很好 "。这篇文章给出一套完整的评估体系------从最不可信的 loss,到每代自动跑的探针体检,再到最终裁判实战 PK:15 个常规维度分 5 层 + 4 个深水区专项工具。
全文约 7500 字。所有指标都有真实数据和判断标准,可以照着搭。
适合人群
- 正在跑训练,但不确定"现在到底该继续还是该停"的人
- 只看 loss 曲线做决策的人(看完可能会想改一下)
- 想知道"怎么在训练到一半就发现方向错了"的人
你将收获
① 一套 15 维度 / 5 层的评估体系(从快到慢、从不可信到金标准),外加 4 个深水区专项工具(几何等变性 / 算杀纵深 / 动态探针 / 通道归因)
② 三个"指标骗人"的真实案例(loss 骗人 / 探针全绿骗人 / 单点骗人)
③ 探针设计的两个 OOD 坑(不避开,体检结果全是假的)
④ 一份可以直接照抄的评估清单和判读标准
目录
- [1. 核心教训:loss 是自证预言](#1. 核心教训:loss 是自证预言)
- [2. 第一层:探针(每代自动体检)](#2. 第一层:探针(每代自动体检))
- [3. 第二层:激活率(比 loss 靠谱得多的健康指标)](#3. 第二层:激活率(比 loss 靠谱得多的健康指标))
- [4. 第三层:PK 实战(终极裁判)](#4. 第三层:PK 实战(终极裁判))
- [5. 四方互证:任何结论至少两方支持](#5. 四方互证:任何结论至少两方支持)
- [6. 评估维度全景:15 个维度,5 个层级](#6. 评估维度全景:15 个维度,5 个层级)
- [7. 三条铁律](#7. 三条铁律)
- [8. 评估速查表(建议收藏)](#8. 评估速查表(建议收藏))
1. 核心教训:loss 是自证预言
这是整个项目最深刻的教训,如果不读这一节,前面所有训练经验都会用错方向。
1.1 铁证:loss 创新低,棋力垫底
v1 训练到第 91、92 代的时候,value_loss 降到 0.41------历史新低,看起来完美。
然后我们做了实战 PK,排名是:
85 代 > 51 代 > 91 代
91 代的 loss 比 85 代更低,棋力却是三个里最差的。
1.2 为什么会这样
因为 loss 是在"自对弈自己生成的数据分布"上测的。
随着训练推进,模型的棋风会固化 → 自对弈双方越来越像 → 输赢越来越接近随机 → loss 自然下降。
但这个下降是自我印证的:
数据里已经学不到新东西了,loss 只是在一遍遍确认旧认知。
打个比方:一个学生反复做自己做过的题,分数当然越来越高------但这不证明他学会了新知识,只证明他把旧题背熟了。
1.3 还有一个更隐蔽的版本:loss 平坦也骗人
反过来也成立。有这么一段训练,loss 几十代完全平坦(既没涨也没跌),看起来是"训练停滞"。
但那段时间,同一批权重拿去跟外部的固定标尺打,战绩一直在涨。
所以:loss 既不能证明变强,也不能证明没变强。它只是一个参考量。
📌 纪律:报告训练状态时,loss 趋势必须搭配探针或 PK 验证。单独报 loss,等于报了个假消息。
2. 第一层:探针(每代自动体检)
既然 loss 不可信,那就自己造标尺:构造几个"胜负明确"的局面,看网络的预测方向对不对。
2.1 七个探针局面
| 探针 | 期望 value | 含义 |
|---|---|---|
| 黑活四 | +1.0 | 黑四连两端开放,必胜 |
| 白活四 | -1.0 | 白四连,黑必败 |
| 黑活三 | +0.6 | 黑三连两端开放,优势 |
| 白活三 | -0.6 | 白三连,黑劣势 |
| 黑冲四 | +0.8 | 黑四连一端被堵,强威胁 |
| 白冲四 | -0.8 | 白四连一端被堵 |
| 空盘 | ~0 | 开局均衡 |
判读规则 :符号方向正确 + 幅度合理;空盘要求 |value| < 0.3。
听起来简单?我们在这里踩了两次 OOD 的坑,第一次错了一个多月。
2.2 坑一:五连探针(训练数据里根本没有)
最早的探针里有"黑五连""白五连"。
结果这几个探针的 value 随训练越来越差(-0.35 → -0.78)。我们一度以为"网络退化了"。
真相:训练数据里**"已经成五连"的局面数量是 0**。
原因很简单:五子连珠的那一刻棋局就结束了 ,而我们的 trajectory 记录的是"落子前"的棋盘。所以网络从来没见过"棋盘上已经有五连"的样子。
这种局面对网络来说叫 OOD(分布外数据)------你拿一个它没学过的东西考它,它答错是正常的,不代表它退化了。
修正:探针只能用训练数据里真实出现过的局面。
2.3 坑二:纯色探针(比五连坑更隐蔽)
改掉了五连,我们换了"黑活四"当探针------棋盘上放 4 颗黑子,形成活四。
但这 4 颗黑子旁边,白棋是零颗。
问题来了:真实的对局里,从来没有"棋盘上只有一种颜色"的局面。黑棋能形成活四,说明白棋早就下过很多手了。
纯色盘也是 OOD。
我们后来抓到了它造成的假象:
| 探针版本 | v2 代40 结果 | 判读 |
|---|---|---|
| 纯色版(4 颗黑子,无白子) | -0.425 | health_log 标"✅" |
| 交替版(主线 + 6 个对手散子) | +0.301 | ❌ 翻车! |
体检通过,实战判断却是反的。
还有个更细的发现:散子数量对结果影响巨大------黑活四的 value 随对手散子数从 -1.0 变到 -0.585。
也就是说,网络学的其实是**"棋盘上对手子多 = 对黑不利"这个粗信号**,而不是真的识别"活四威胁"。
2.4 正确的探针怎么造
主线棋形(活四/活三/冲四)
+ 6 个随机对手散子(远离主线,黑白交替)
+ 取多组均值 ± 方差
+ 通过标准:方向正确 且 |均值| > 0.3
唯一原则:评估工具的输入分布,必须匹配模型真正面对的分布。
2.5 一个有意思的副产品:先学会冲四,后学会活四
网络的学习顺序是先会冲四,后会活四。原因是数据频率:
- 活四是"瞬时状态"------一旦形成,对手立刻堵一头变成冲四,所以活四局面在数据里出现频率很低
- 冲四是"稳定状态"------被堵的四连会一直保持,出现频率高
所以早期"活四探针判断反/震荡"是正常的 ,不要慌。要看冲四和活三先转正,作为早期信号。
v2 的探针转正轨迹:
| 代 | 黑冲四 | 白冲四 | 黑活四 | 备注 |
|---|---|---|---|---|
| 12 | +0.32 ✅ | -0.53 ✅ | -0.32 ❌ | 冲四先转正 |
| 13 | +0.46 ✅ | -0.51 ✅ | -0.34 ❌ | 冲四持续强化 |
| 14 | +0.85 ✅ | +0.25 ✅ | +0.40 ✅ | 三探针同时转正 |
| 15 | +0.79 ✅ | -0.25 ✅ | -0.49 ❌ | 波动,但冲四稳定 |
14 代 就达到了 v1 巅峰期(85 代)都未必有的探针强度------这就是"每代体检"的价值:它让你在 14 代就知道方向对了。
3. 第二层:激活率(比 loss 靠谱得多的健康指标)
除了探针,还有一类"参数层"的健康指标,最有用的是中层 BatchNorm 激活率。
3.1 怎么算、怎么看
取中间几层残差块(res3-5)的 ReLU 输出,统计输出大于 0 的比例(即"有多少神经元在干活")。
3.2 实测:它比 loss 更能预测棋力
| 权重 | 激活率 | value_loss | PK 结果 |
|---|---|---|---|
| 代 51 | 69% | 0.580 | ✅ 6:4 胜 |
| 代 75 | 48% | 0.473(更低) | ❌ 输 |
激活率高的那个赢了,尽管它的 loss 更高。
判读标准:
| 激活率 | 含义 |
|---|---|
| 43-47% | 健康稳态(v2/v8 的长期水平),死通道 0 |
| < 50% | ⚠️ 神经元成批坏死,此时 loss 越低实战越弱 |
为什么神经元会坏死? 根因通常是数据多样性不足(不是模拟量不够)------这个结论从"把 value 头砍到 226 参数照样崩"的实验里也得到过侧面印证:问题在数据侧,不在容量侧。
3.3 还有一条更细的判据
参数标准差单调上升 = 正常学习(网络在形成越来越明确的结构)。
但如果参数 std 单调上升、同时行为却在退化 = "学歪了"------网络在往一个错误的方向上越走越远、越走越自信。
这个判据在 v6 it73-78 有过实测。
4. 第三层:PK 实战(终极裁判)
探针和激活率都是"间接指标"。两个权重到底谁强,只能靠实战对打。
但 PK 这件事本身也有一堆规矩,不然打出来的结果也是废的:
4.1 PK 五条方法论
| # | 规矩 | 为什么 |
|---|---|---|
| 1 | 分先赛制(先手 N 局 + 后手 N 局) | 五子棋先手优势巨大,不分先就是在测运气 |
| 2 | 模拟量 ≥ 训练模拟量 | 见下面的"反转陷阱" |
| 3 | 控制变量(同 MCTS / 同 greedy / 同 noise) | 不然测的是配置差异 |
| 4 | 每局前 reset_mcts() |
防止残树污染 |
| 5 | 局数 ≥ 10 | 3 局的噪声极大 |
4.2 模拟量匹配铁律(实测打脸)
这一条是硬规矩:
| 对局 | sim=800 | sim=200 |
|---|---|---|
| v6 it20 vs v1 it20 | 8:12 负 | 16:4 胜 |
同一对权重,只换评测的搜索量,胜负完全颠倒。
原因:搜索量不足的时候,评估测的是 policy 的锐度,不是真实棋力。policy 先验"看起来聪明"的权重会在低 sim 下占便宜。
铁律:训练用多少 sim,评估就用多少 sim。
4.3 三个必须做的审计
这三个坑我们都踩过,每一个都能让 PK 结果完全失真:
| 审计项 | 会出什么假象 |
|---|---|
| 权重文件同名 | 结果 JSON 的 key 冲突,出现过"10:0 假象" |
| 对局独立性 | 贪心模式会锁死重复对局(同执黑方 5 局完全同谱)→ 10:0 实际只是 1 局 |
| 记录与棋盘脱节 | 某个"预设开局"模式只改了棋盘数组没同步环境 → 非法落子假象 |
对策:权重文件名带版本后缀 + 逐局核对细目 + 看分边明细(执黑/执白分开解读)。
4.4 局数:为什么是 10 局起步
我们实测过 3 局口径的噪声:同一个 85 代,3 局可以 3-0 赢 51 代;而 91 代在同设置下 0-3 输。
3 局什么都说明不了。 后来的标准提高到 20 局/场(10 局口径实测有 1/6 概率结论反转)。
5. 四方互证:任何结论至少两方支持
把上面的东西组合起来,我们最终建立的体系是这样:
① Loss 趋势 ------ 快,但不可信(自证预言)
② 探针(每代跑) ------ 快、可信,自动体检
③ 激活率(每代跑) ------ 快、可信,参数层健康
④ PK 实战 ------ 慢,但终极可信(金标准)
规则:任何"训练变好了/变坏了"的结论,至少要两方支持。
标准诊断路径:
loss 降了但 PK 输了
→ 先跑探针:是不是全反?(方向性问题)
→ 再看激活率:是不是 <50%?(神经元坏死)
→ 都不像 → 去查数据侧(分布/多样性)
这套路径帮我们定位过好几次"看起来很好其实很糟"的版本。
6. 评估维度全景:15 个维度,5 个层级
上面讲的是核心三层。后来我们把评估体系系统化成了 15 个维度、5 个层级------按"速度 vs 可信度"排列:
层 0:训练过程指标(快,不可信,仅参考)
| 指标 | 测什么 | 判读 |
|---|---|---|
| policy_loss / value_loss | 训练损失 | 只做趋势参考,绝不单独下结论 |
| 每局/每代耗时 | 训练速度 | 监控对局变长趋势 |
| 经验条数 | 对局长度 | 55-59 条 = 55-59 步(每步一条,别除以 2) |
层 1:静态探针(快,可信,训练内自动跑)
① value 价值探针 ------见第 2 节。学习顺序:先冲四、后活四。
② policy 探针(四类棋形方向)
| 类别 | 含义 |
|---|---|
| 黑攻 / 白攻 | 自己有棋形该不该攻 |
| 黑守 / 白守 | 对手有棋形该不该堵 |
- 每类 4 个局面(活三横/竖/斜、冲四)
- 通过线:关键点概率 > 8 × 随机基线(8/225 ≈ 3.55%)
- ⚠️ 颜色语义坑 :
黑守= 白棋有威胁、黑棋去堵(主线要放白子)!写反了会把"白守"测成"黑守"
③ 网络健康度(参数层)
| 项目 | 判读 |
|---|---|
| 中层 BN 激活率 | < 50% = 神经元成批坏死 |
| 有效秩(SVD) | 单通道输出头有效秩恒 = 1 属正常;主干深层降秩(128→100)健康 |
| 权重移动速度 / std 趋势 | std 单调升 = 正常;升但行为退化 = 学歪了 |
层 2:专项诊断(中速,下载权重本地跑)
④ 败局库检测(value 的唯一仲裁)
- 素材:从 PK 输局里提取的 172 个局面(黑 92 + 白 80),站在输棋方视角
- 指标:方向正确率 / MSE(对比 -1) / value 均值 / 黑白分项
| 指标 | 判读 |
|---|---|
| MSE < 1.5 | ✅ 好 |
| 1.5 - 2.5 | ⚠️ 中 |
| > 2.5 | 🚨 反向自信 |
| 均值偏正 | 败局乐观(错) |
- 历史基线:v6 it91 51.7% / v2 it202 37.8% / v8 it37 58.7%(历史最佳)
- ⚠️ 败局库和体检可以完全背离 :v8 it33 体检 9/9 全绿 ,但败局库只有 27.3%(垫底) ------败局库才是 value 的真仲裁
⑤ 稀疏盲区威胁探针(6 局面,白视角)
- 设计原则:黑白数量一样或差 1(贴合训练分布)
- 测 value 方向:黑优局面在白视角应为负
- 跨代曲线 = W 型振荡 :v6 it40 5/6 → it45-52 崩 → it64-70 恢复 → it79 0/6 全倒置 → it84-86 恢复
- ⚠️ 崩盘谷的权重不要拿去 PK 判棋力
⑥ 稀疏盲区探针(9 局面,黑视角)------残留问题:对"3 颗孤子"有乐观偏置(判定"黑大优")。
⑦ Grad-CAM 威胁欠权分析
给 value 输出对中间层做梯度加权热力图,比较"威胁区域热力 / 全盘热力":
| 聚焦度 | 判读 |
|---|---|
| > 1.3 | ✅ 看到威胁了 |
| < 0.8 | ❌ 没看到 |
核心结论(v2/v6/v8 一致) :大多数局面下,CNN 提取是正常的 (聚焦度 1.3-1.8×),但 value 头把威胁信号"平均没了" ------
v8 it37 实测:某个"黑冲四 vs 白活二"局面,Grad-CAM 显示它明确看到了敌方威胁 ✅,但 value ≈ 0 ❌ ------"看到了但没用"。
⚠️ 方法学纠正:这个分析必须用败局库里的真实败局,不能用自造的简单局面(简单局面复杂度低,聚焦度天然 7-8×,是假象)。
⑧ 威胁比分析
威胁比 = |冲四局面 value| / |均势局面 value|
| 时期 | 威胁比 |
|---|---|
| 健康期(v8 it6-16) | 2.85 - 4.59(对威胁反应远强于均势) |
| v8 it37 | 0.01(极端倒置:对最强威胁毫无反应,对均势给 -0.7) |
它比"单项正确率"更敏感------正确率还有 3/6 的时候,威胁比可能已经崩到 0.01。
⑨ 做题准确度(固定题库)
准备一批"有明确正确答案"的题(给定局面问"该不该堵这个活三""top1 该落哪"),看网络命中率。这是最接近"考试"的静态指标。
题库有两种口径:
| 口径 | 构成 | 用途 |
|---|---|---|
| 奇偶题集 | 20 道黑侧 + 17 道白侧 | 分侧专测(黑/白分开看) |
| 混合题集 | 42-43 道混合 | 通用能力 |
历史读数 :v18 峰值 84.4% / v24 it73 72.5% / v36 it209 67.4%
⚠️ 口径混用陷阱(实测踩过):
有一次看到"奇偶题集黑侧 94% ,历史新高!",但混合题集整体只有 76.2% ------没超过历史最好的 81%。
📌 单一口径的"新高"不等于全面飞跃。三个口径同时涨,才算真的涨。
⚠️ 第二个陷阱 :做题分数也会被"自对弈平衡"吸收------v36 后期做题平坦,但对 Rapfi 的战绩一直在涨。做题不是终点指标。
层 3:行为统计(中速,对局全量统计)
⑩ 快攻占比趋势
- 定义:≤20 手终局的对局占比(全量统计,不看个别局)
- v6 全量 2.8-3.4%(峰值代 9-12%,it80 达 14%)/ v8 约 0.7%
- ⚠️ 解读陷阱:快攻上升 ≠ 好事 ------可能是双方防守都退化了(防不住就更快出五连)。必须配合威胁探针一起看
⑪ 白棋胜率与黑白平衡(最重要的健康指标)
定义:全量对局里白棋的胜率。目标带 45-55%。
为什么它是核心指标? 五子棋 15×15 无贴目,黑棋先手在强搜索下是必胜的(我们实测:两个强权重 sim800 对打,执黑 100% 机械必胜)。
所以白棋胜率是个警报器------一旦长期单边下滑,说明进入了**"数据单边化螺旋"**:
黑赢多 → 白棋赢的样本少 → 网络学不到白棋怎么赢 → 白更弱 → 黑赢更多 ⟲
崩盘的典型读数 :白胜率掉到个位数
| 崩盘案例 | 白胜率读数 |
|---|---|
| v33 | it10 白 12% → it13 白 0% |
| v34 正常局 | 白 9% / 7% / 10%(三连崩) |
| v25 | 单代跳水 22pp |
v36 的读数(健康态) :it0-194 稳定在 39-51%(中枢约 43%),近 290 代不崩。
🚨 必须分口径看(这里有过一次严重的"假健康"):
| 局类型 | 白胜率 |
|---|---|
| v34 让手局 | 96% ← 看起来非常健康 |
| v34 正常局 | 9% ← 真相是崩的 |
当时"总白胜率看起来还行",完全是被让手局拉高的。分口径统计是白胜率指标的强制要求。
观察线 :连续 3 代白率 < 35% 才触发干预(单代低点可能是脉冲,不要见风就是雨)。
⑫ 对局质量(中位手数 / 超短局占比)
为什么看这个?棋局太短说明双方在互相速杀,中盘根本没展开------训练数据的质量会整体下降。
实测(v35 温度热改前后):
| 指标 | 改前 | 改后 |
|---|---|---|
| 超短局(≤11 手)占比 | 42% | 7% |
| 中位手数 | 14 手 | 23 手 |
v36 长跑:中位手数 15-24 手。
📌 它是"先行指标" :对局变长 → 有质量的局面变多 → 棋力才可能涨。而白胜率是"滞后指标"------调完一个改动,先看手数有没有动,再等白胜率。
⚠️ 口径 :用中位手数比"平均手数"稳(几盘超长局就能把平均值拖偏)。
⑬ 开局布局分析(天元率 / 中心率 / 边角率)
- 天元率(首手下在 (7,7))/ 中心率(距天元曼哈顿距离 ≤ 3)/ 边角率(首手 top5 落在边角)
- v6 全程:天元率 0.2-2.4% (≈没有)、中心率 5-17%、首手 top5 全在边角
- 发现一个"出生病" :it0(随机权重)的边角率就是 70% ,而理论值应该 50%------多出来的 20% 是 UCB 搜索的锅(边角子树小、Q 方差小 → UCB 的探索奖励更快兑现)
- 观察线:中心率 > 20-30% 才说明 policy 真的学会中心开局(v6 全程未达)
层 4:终极裁判(慢,最可信)
⑭ PK 对弈------见第 4 节。
⑮ 人机实战防守测试(最终验收)
- 终极验收标准 = 能不能堵活四
- 由来:v6 it86 探针 5/6 通过,但实战里活四不堵 ------ 探针全绿 ≠ 会下棋
- 复现"这一步为什么不堵"的标准方法:重建局面 + 噪声双跑 + 候选点 value 对比
深水区专项工具(⑯-⑲:常规体检解释不了的时候用)
前面 15 个维度是"日常体检"。下面这四个是深水区工具------平时不跑,但当常规指标解释不了问题时,它们能挖出更根本的东西。
⑯ D4 方向等变诊断:value 对几何变换一致吗
棋盘有 8 种对称变换(4 种旋转 × 2 种翻转 = D4 群 )。理论上,把棋盘旋转 90° 再喂给网络,value 应该完全相同 。
实测偏差(随机 10 局面 × 5 种变换):
| 项目 | 偏差 |
|---|---|
| 空盘 | 0.0000(平凡假象------旋转后输入完全相同,必然一样) |
| 随机局面 value | 均值 1.3-1.4,最大约 2.0 |
| policy | 0.013(近似等变) |
同一局面旋转 90°,value 能从 +0.7 翻到 -0.9 ------ 完全反转。
而且这是全家族共性:
| 版本 | 等变偏差 | 收敛? |
|---|---|---|
| v1 | 早期 0.05-0.10 → it60 起 1.0+ | ❌ |
| v2 / v6 / v10 | 全程 0.84-1.55 | ❌ |
| v8 / v12 / v18 | 全程 0.97-1.63 | ❌ |
没有一个版本收敛过。
⚠️ 这里有个必须避开的假健康陷阱:
| 时期 | value 输出幅度 | 等变偏差 | 真相 |
|---|---|---|---|
| v1 it10-40 | 0.04-0.07(接近常数) | 0.05-0.10 | "假等变"------网络根本没学会评估 |
| v1 it60 | 0.555 | 1.04 | 学会评估了,方向捷径也来了 |
机制 :sim=50 时期自对弈质量差 → value 目标噪声大 → value 学不动(输出≈0)→ "不变"是平凡结果。等 sim 提上去、value 真学会评估局面,方向捷径同时出现。
📌 判据:value 幅度 < 0.15 的"等变"是假健康;幅度 > 0.3 才有讨论意义。而且没有任何版本做到"既有信息量又保持等变"------"学会评估"的副产品就是方向捷径。
为什么 value 学不到等变?
- value 的监督强度比 policy 弱约 20 倍(MSE ~0.24 vs 交叉熵 ~5.0),等变约束形同虚设
- 标量任务天然走捷径------记住"上半部子多 = 黑优"这种方向统计就能压低 loss,不需要学旋转不变的表示
- 数据的方向分布本身就是偏的(开局偏好 → 搜索探索不均),提供了捷径信号源
顺带挖出一个非常有用的区分:方差 vs 偏差
| 问题 | 性质 | 推理期技巧能修吗 |
|---|---|---|
| D4 不等变 | 方差(同局面不同方向输出不一致) | ✅ 能(8 方向平均) |
| 攻守失衡 | 偏差(value 系统性对威胁惩罚不足) | ❌ 不能 |
我们实测过 8 方向平均推理 :单方向判错(+0.638)的局面,8 方向平均后 -0.238,判对了 ✅。
但放进 MCTS 一测:堵点访问率 1.88% → 1.13%,反而略降 ❌。
原因很清楚:那个局面的 root value 本来就判对了 (-0.83),MCTS 依然不堵------问题在偏差,平均修不了偏差。
结论:推理期 8 方向平均不值得做 (对防守无益,成本还 ×8,过度平滑还让搜索更散)。攻守失衡只能在训练侧修。
⑰ D60 / D80:败局识别深度(算杀纵深)
这个指标很直观:给网络一个已经输定的局面,看它要提前多少步才能"意识到自己要输"。
做法:从真实败局取局面,用当前权重跑 MCTS,看在末盘前第 N 步时搜索能否识别必败(N 越大 = 算杀越深)。
| 指标 | 我们的读数 |
|---|---|
| D60 | 12-13 步 |
| D80 | 7 步 |
最扎心的数据是:it165 到 it282,跨 117 代,D80 一直卡在 7 步零位移 (把 sim 翻 4 倍也一样)。
有意思的是,这个"停滞"后来被证明只反映算杀纵深,不代表整体棋力停止 (同期对 Rapfi 战绩一直在涨)。所以它的定位是:衡量"深度计算"这个特定维度,和 PK 的综合棋力互补。
⑱ 动态探针:Q 值探针 vs 败局库 MCTS
静态探针(单次前向)有个盲区:实战打的是"搜索后"的评估 (UCB 里 Q 项主导),静态测不到搜索协同。所以补两个动态探针:
| Q 值探针 | 败局库 MCTS | |
|---|---|---|
| 测什么 | 候选点的后继评估(选点质量 / Q 初值) | 整个局面的搜索后评估(局面判断) |
| 怎么测 | 每个候选点先落子 → 对手视角评估 → 转回当前玩家 | 跑满 sim 的 MCTS → 根节点访问加权 Q |
| 样本 | 5 个对杀局面 × 候选点(22 项) | 217 个历史败局局面 |
| 强项 | 更敏感精细,能定位"哪个局面反了" | 更贴近实战(真实败局 + 完整搜索协同) |
| 弱项 | 样本小,噪声大(实测 91% → 77% 波动) | 趋势可靠但粒度粗 |
分工:败局库 MCTS 看趋势(宏观局面判断),Q 值探针看细节(定位哪一步反了);两者同向时可信度最高,背离时以败局库 MCTS 为准。
⑲ 通道三件套:网络到底在读输入的哪一部分
当模型行为诡异时(比如"白棋死活不防守"),你需要知道它到底在看输入的哪一块。三个工具配套使用:
| 工具 | 测什么 | 判据 |
|---|---|---|
| ch2 扰动 | 只翻转"颜色通道",看 value 变不变 | Δ≈0 = 忽略该通道;Δ 大 = 依赖(实测训练早期 0.086 → 成熟期 0.45) |
| 双视角反对称 | 同一局面从黑白视角评估,是否互为相反数 | |均值| < 0.15 且 |max| < 0.5 |
| 头部分测 | 分别看 policy 头和 value 头对某通道的敏感度 | 敏感度可差 100 倍 |
第三个工具挖出了一个重要机制(v18 实测,把 ch2 翻掉后分别测两个头的 loss):
| 头 | loss 变化 | 解读 |
|---|---|---|
| value 头 | 0.152 → 0.339(涨 2.2 倍) | 确实在读 ch2 |
| policy 头 | 变化 < 0.4% | 几乎无视 ch2 |
📌 共享主干的总体 loss 只能说明"整体在读某个通道",但两个头对同一个通道的敏感度可以差两个数量级------必须分头测。
顺带两个有意思的结论:
① policy 忽略 ch2 可能是"合理"的 ------ 五子棋规则黑白对称,预测落子确实不需要知道颜色;真正需要视角信息的是 value(判断谁优)。所以"policy 不看 ch2"不一定是缺陷,"value 白视角判反"才是真病。
② policy 有个固有倾向:自我中心 ------ 己方邻域的落子概率是"其他"位置的 1.5-8 倍,top5 落点绝大多数贴在己方或交界,极少主动贴对方 。也就是说:policy 的原始倾向是"哪里能扩张我的形状",防守并不是自发倾向。
这就解释了 v18"白棋弱"的完整机制链:
policy 头:ch2 权重萎缩(不读颜色)→ 不知道"我执白" + 自我中心
→ 执白时依然优先发展自己,不堵黑
value 头:读 ch2 但拟合不足 → 对手斜四威胁判自己优(白视角判反)
MCTS:policy 不指路防守 + value 不报警 → 防守链条整个断裂 → PK 白败
7. 三条铁律
评估体系搭完之后,我们总结了三条贯穿始终的铁律:
铁律一:loss 是自证预言
loss 是在"自己生成的数据分布"上测的。它下降可能只是"越来越熟悉自己的棋风"。任何 loss 结论都必须搭配第二方证据。
铁律二:单点会骗人,集中趋势不会
这条我们是差点被骗才总结出来的:
有一次看到"某个权重的 policy 冒尖率 22.9% ",以为是突破。结果下一代直接归零------那是初始化噪声造成的假信号。
单看一个 max 值会被骗。要看"多局面冒尖的频率"这个趋势。
铁律三:探针全绿 ≠ 会下棋
这一条来自一个很扎心的事实:能力是分层的:
认识形状 → 静态评估 → 动态兑现 → 整局战略
(看到活四) (知道该堵) (真的去堵) (知道为什么堵)
常规探针只测前 1-2 层。
铁证:v6 it86,探针 5/6 通过 ,但实战里活四摆在面前不堵------它认识形状、也知道该堵,但"动态兑现"这一层是断的。
所以最终验收永远是人机实战。
8. 评估速查表(建议收藏)
8.1 十五个常规维度一览
| 层 | 维度 | 速度 | 可信度 | 关键判读 |
|---|---|---|---|---|
| 0 | loss 趋势 | 快 | ⭐ | 绝不单独下结论 |
| 0 | 对局/训练耗时 | 快 | ⭐ | 对局变长 = 健康信号 |
| 0 | 经验条数 | 快 | ⭐⭐ | 55 条 = 55 步 |
| 1 | value 探针 | 快 | ⭐⭐⭐⭐ | 方向对 + |均值|>0.3;空盘 |v|<0.3 |
| 1 | policy 探针 | 快 | ⭐⭐⭐⭐ | 关键点概率 > 8×随机基线(3.55%) |
| 1 | BN 激活率 | 快 | ⭐⭐⭐⭐ | < 50% = 神经元坏死 |
| 1 | 有效秩 / std 趋势 | 快 | ⭐⭐⭐ | std 升 + 行为退化 = 学歪了 |
| 2 | 败局库 | 中 | ⭐⭐⭐⭐⭐ | MSE <1.5 好 / >2.5 反向自信 |
| 2 | 稀疏盲区探针 | 中 | ⭐⭐⭐⭐ | 黑白数差 ≤1;W 型振荡 |
| 2 | Grad-CAM | 中 | ⭐⭐⭐⭐ | 聚焦 >1.3 看到威胁;必须用真实败局 |
| 2 | 威胁比 | 中 | ⭐⭐⭐⭐⭐ | 健康 2.85-4.59;<0.1 = 崩 |
| 2 | 做题准确度 | 中 | ⭐⭐⭐⭐ | 多口径同涨才算涨;v36 it209 67.4% |
| 3 | 快攻占比 | 中 | ⭐⭐⭐ | 上升可能是防守退化,别单看 |
| 3 | 白棋胜率 | 中 | ⭐⭐⭐⭐⭐ | 目标带 45-55%;必须分口径;连续 3 代 <35% 才干预 |
| 3 | 对局质量 | 中 | ⭐⭐⭐⭐ | 超短局 42%→7%、中位手数 14→23;是先行指标 |
| 3 | 开局布局 | 中 | ⭐⭐⭐⭐ | 中心率 >20-30% = 学会开局 |
| 4 | PK 实战 | 慢 | ⭐⭐⭐⭐⭐ | sim 匹配 + 分先 + ≥20 局 |
| 4 | 人机实战 | 慢 | ⭐⭐⭐⭐⭐ | 终极验收:堵活四 |
8.1b 四个深水区工具
| # | 工具 | 什么时候用 | 关键读数 |
|---|---|---|---|
| ⑯ | D4 方向等变 | 怀疑"评估不稳定/看方向" | 偏差 1.3-1.4 = 不等变;幅度 <0.15 的"等变"是假健康 |
| ⑰ | D60 / D80 算杀纵深 | 想知道"深度计算"这一维 | D60 12-13 步 / D80 7 步;停滞 ≠ 整体停滞 |
| ⑱ | 动态探针 | 静态探针和实战结果不符 | Q 值探针看细节、败局库 MCTS 看趋势 |
| ⑲ | 通道三件套 | 怀疑"网络没读某个输入" | 分头测!policy 和 value 对同一通道可差两个数量级 |
8.2 探针设计三条纪律
| # | 纪律 | 违反后果 |
|---|---|---|
| 1 | 只用训练分布内出现的局面 | 五连探针 → 假"网络退化" |
| 2 | 必须黑白交替 + 对手散子 | 纯色探针 → 体检 ✅ 但实战反了 |
| 3 | 多组取均值,不看单点 | 初始化噪声 → 假突破 |
8.3 诊断决策树(照着走就行)
loss 降了但 PK 输了?
→ ① value 探针:是不是全反了?(= value 头崩)
→ ② 激活率:是否 <50%?(= 神经元坏死)
→ ③ 败局库:MSE >2.5?(= 反向自信)
→ ④ policy 探针:全局 ❌?(= 方向盘歪了)
→ ⑤ 威胁比:<0.5?(= 对稀疏威胁失活)
→ ⑥ Grad-CAM:聚焦 ❌ = 提取失败 / 聚焦 ✅ 但 value 错 = 综合失败
→ ⑦ 快攻占比 / 中心率:飞轮动没动?
→ ⑧ PK 终极验证(sim 匹配 + 分先 + ≥20 局)
每一步都在回答一个具体的"是不是",而不是笼统地看"效果好不好" ------ 这是这套体系最有用的地方:它把"训练好像不太行"这种模糊感受,变成一条可以走到底的排查路径。
8.4 监控节奏(什么时候跑什么)
体检不能全跑(太贵),也不能不跑(会瞎)。我们的节奏是这样:
| 频率 | 跑什么 |
|---|---|
| 每代自动(训练内置) | value 探针 / policy 探针 / BN 激活率 / 死通道数 / loss |
| 每代(日志统计) | 快攻占比 / 中位手数 / 天元率 / 中心率 / 首手 top5 |
| 每 5-10 代(本地) | 败局库 / 稀疏威胁探针 / 威胁比 / 参数趋势(权重 std、有效秩) |
| 每 5-10 代(服务器) | 败局库 MSE(与训练 loss 同单位,可直接对比) |
| 异常代 / 关键节点 | Grad-CAM / 通道偏爱 / 人机防守测试 |
| 决策点(不定) | PK(分先 + sim 匹配 + 审计细目) |
关键设计:越轻的越勤跑,越重的越少跑------每代跑的那几项几乎零成本,所以能在第 14 代就告诉你"方向对了";而 PK 很贵,只在需要下判断的时候跑。
写在最后
这一篇我想说的其实就一句话:评估工具的价值不是"证明你做对了",而是"让你在错误的地方早点掉头"。
这个项目里最贵的几次教训,都不是"跑不出结果",而是"跑了很久,还以为效果不错":
- v1 的 loss 一路降到新低,但我们真正变强的是 85 代,不是 91 代
- 探针一开始全绿,实战里却连活四都不堵
- 有那么一批权重,静态指标全面向好,实战 PK 却打成 10:10 平
而每一次"掉头"的时机,都取决于你的评估工具有多早发现问题:14 代就发现方向对(探针),还是 80 代才发现方向错(实战)? 差别是几十个小时的算力和一整个版本的周期。
如果这篇能让你在自己的项目里早一点搭起这套体检,那它就没白写。
👍 五篇看完的朋友,给个赞吧
⭐ 15 维度速查表 + 排查顺序,建议收藏
💬 评论区聊聊:你被哪个指标骗过?
🔗 **代码 & 全部对局记录在 Gitee:alpha zero gomoku
系列完。 感谢一路看到这里。