AlphaZero 五子棋实战(三):网络到底在学什么 —— 9 个机制模型

发布时间:2026/9/14 23:14:17
AlphaZero 五子棋实战(三):网络到底在学什么 —— 9 个机制模型 AlphaZero 五子棋实战(三):网络到底在学什么 —— 9 个机制模型前两篇讲配置是多少“参数怎么来的”,都属于工程层。这一篇往下钻一层:讲机制——为什么网络会学歪、为什么有的病调参治不好、为什么看起来在退化的指标其实是正常的。这一篇会比前两篇硬。里面 9 个机制模型,每一个都是从数据里倒推出来的因果链,并且都做过可证伪的验证实验(而不是我猜是这样)。有 3 个结论直接把我们的技术路线推翻过。全文约 7500 字。涉及的每个数字都来自项目实测记录。适合人群想知道自对弈训练里那些诡异现象为什么会发生的人想理解 policy/value 双头失衡、颜色对称、探索噪声这些机制细节的人遇到过调参怎么都不行的人(你可能会在这里找到原因)你将收获① 9 个机制模型:每个都有因果链 量化数据 验证实验② 3 个反直觉结论:ReLU 会造成结构级颜色歧视、温度是一道采样门槛、BN 收缩不是病③ 一套结构缺陷 vs 数据稀缺的判别方法(冻结主干只训头部)④ 理解为什么有些病只能改结构,不能靠训练量目录1. 先看三个头的分工:方向盘、仪表盘和司机2. 颜色对称是结构问题,不是训练问题3. value 极端化的完整死锁链4. 噪声的真身:它是学习速度平衡器5. 温度是一道采样门槛6. 中心布局飞轮:增强是放大器不是发生器7. 两个看起来是病其实不是的案例8. 九个机制模型速查表1. 先看三个头的分工:方向盘、仪表盘和司机要理解后面所有的病,先把 MCTS 里三个角色的分工摆清楚:角色在 MCTS 里干什么类比policy(策略头)提供 PUCT 里的P——决定搜索树往哪个方向展开方向盘value(价值头)评估叶子节点 Q 值回传——决定哪些分支被选中仪表盘MCTS按 PUCT 公式做选择,产出访问分布 π 作为训练目标司机1.1 方向盘 vs 仪表盘:一个反直觉的实证按直觉,value 决定局面好坏,应该更重要。但 v2 时代的一次 PK 打了脸:权重valuepolicyPK 结果it69烂好✅8:2 赢it118好烂❌ 输policy 好的那个赢了,而且赢得干净。机制上是这样:policy 是搜索的入口。如果先验把搜索树一开始就展开到错误的分支上,value 再准也纠正不过来——因为它根本没机会评估正确的分支。policy 是方向盘,value 只是仪表盘。方向盘偏了,仪表盘再准也到不了。1.2 policy 为什么会被饿死(梯度机制)v1 时代最诡异的现象:policy 的熵 96 代死死停在 5.416( ln225,即完全均匀分布),完全没学。我们把梯度拆开看,原因是这样的:① policy 是 225 维分类任务,softmax 输出接近均匀 → 交叉熵对 logits 的梯度 p - target → p 均匀时,所有维度的梯度几乎相等 → 没有方向性 ② 输出层的 policy_fc 连接权重很小 → 梯度回传到卷积层时被衰减一个量级 → 卷积层实际上收不到有效梯度实测的梯度占比:模块拿到的梯度占比policy_fc(输出层)92-97%policy_conv(卷积识别层)只剩 2-8%结果就是:做空间棋理识别的卷积层根本没在学——它学不到活三在哪里“哪里该堵”,policy 自然永远接近均匀。对比 value 头:value 是标量 MSE,梯度直接回传所有层(梯度/参数比 4.53%,是全场最高的)。所以value 学得比 policy 快得多——这不是巧合,是结构决定的。1.3 v2 的更大容量为什么没救回 policyv2 用了论文版的 policy 头:1×1 conv → 4 通道 → Linear(900→225)。容量比 v1 大得多,但 policy 依然接近均匀。原因:900 维的中间层把梯度吃了。中间层吸收大部分梯度,更浅的卷积层拿到的更少 → 更大的容量没有转化成更锐利的策略。这也是 v6 用极简头能反超的根因之一:v6 的 policy 是1×1 conv → 直接输出 225(没有中间 fc),梯度路径更短。实测冲四应下点的概率:版本policy 结构冲四应下点概率v1极简 log bug0.47%(饿死)v2双层 fc6.93%v6极简头(直连)7.31%1.4 双头钟摆:理想态从未出现v6 时代我们持续追踪policy 认为的第一手和实际搜索选的第一手,发现了这个现象:it64: policy 领先(认为天元好)→ it86: value 追上反超(搜索开始选天元) → it88: policy 又领先,value 回落 …两个头像钟摆一样交替领先,从来没有同步过。而实战的落子由 value(Q 值)主导—— 所以出现过这种荒诞局面:policy 明明已经知道天元是最好的第一手(top1),但 value 不认可,实战还是走边角。双头同频是理想态,我们在整个项目里从未见过。这解释了一个长期的困惑:为什么policy 学会了和棋力变强之间总有一道延迟。1.5 value 为什么天然抢跑:监督信号的三重不对称维度valuepolicy任务难度学局面→胜率的粗粒度映射。空盘样本 100% 是黑视角且黑胜多 →记住黑先手一般赢这一个统计规律就够判对了,零棋理也能学对方向学局面→225 个位置的分布,必须识别活三/冲四/防守点 →必须等这些模式在数据里反复出现信号强度标签是终局胜负 ±1,全局共享、二元、强烈,第一代就有标签是 MCTS 访问分布 π,早期 value 均匀 → π 接近均匀 → 交叉熵几乎没梯度,必须等 π 有结构才有信号正反馈抢跑 → MCTS 更激进 → 黑胜率升 → 数据更偏 → 标签更极端 →学得更快(单向自增强)被 value 制造的数据教,方向被污染v23 的反向实证:冻结期间(只训 value 头)value_loss 10 代只降 0.12;解冻后2 代猛降 0.27。说明标准 AlphaZero 里 value 确实天然抢跑。实测速度差:value 的学习速度大约是 policy 的 5-10 倍。为什么标准 AlphaZero 没这个问题?因为论文版的回放池是几十万局,value 从海量多样数据里学,统计很平滑。而我们的池只有 5 代(500 局)——value 学到的统计又少又极端,速度失衡被放大。2. 颜色对称是结构问题,不是训练问题这一节是整个项目里最干净的一次因果实验,也是最反直觉的一个机制。2.1 现象:视角跷跷板早期(v1-v7)用的是 1 通道输入:棋盘上有没有子。结果 value 网络表现出一种规律性极强的病:it1-10: 两个视角全盲 it13-20: 黑白视角交替 it25/40/60: 出现过健康窗口(但扩展局面一测就现形) it84-93: 白视角好、黑视角坏 it116: 两个视角都判优 真色盲没有任何一代真正做到双视角都健康。我们把它类比成单摆:value 的能力在攻(感知当前玩家优势)和守(感知当前玩家劣势)两端之间摆动——摆到一头,另一头就失明。更要命的是:这个病治不好。我们用 v6 整整 116 代来验证1ch 能不能自己好——不能,一直在震荡。2.2 真正的根因:ReLU 造成的结构性符号歧视这里是最关键的一步推导。1 通道输入的编码方式是 canonical 形式:当前玩家的子 1,对手的子 -1。然后我们看网络的第一个卷积层后面接的是什么:ReLU。ReLU(x) max(0, x)于是:输入经过 conv ReLU结果当前玩家的子(1)正激活完整通过对手的子(-1)负激活被截断为 0,信息丢弃这就等于:网络架构层面天生偏爱当前玩家视角,对手的信息在第一层就被砍掉了一半。所以双视角健康实际上是在要求网络无视自己的架构偏置,去学一个奇函数——这在结构上是不可能的。这就是结构问题最直接的证据链:不是网络不够大,不是训练不够久,是 ReLU 在看你的输入之前,就已经把对称性破坏了。v8 的修法:输入扩到 4 通道,其中 ch0 当前玩家(0/1)、ch1 对手(0/1)。这样一来:两个通道都是正激活 → ReLU 对称处理 → 颜色翻转等价于交换 ch0 和 ch1→ 结构上支持对称。闭环实验(这是全项目最干净的一次):v6 用116 代证明:1ch 治不好色盲v8 只用37 代证明:4ch 结构性解决(定向互补指标 0.0021,it36 双视角互补 -0.111)结论:结构 训练量。一个结构问题,你用 116 代的训练量也填不平;换个结构,37 代就到位。2.3 一个容易混淆的概念:“对称” ≠ “正确”这两个概念必须分开:含义颜色对称f(-b) -f(b),翻转颜色后评估值取反双视角健康两个视角的方向都正确(该赢的判赢,该输的判输)对称 ≠ 正确:v2 it202 在 12 个规整棋形上镜像误差只有 0.001-0.03(看起来是对称冠军),但方向是错的——这叫对称地盲。正确 ≠ 对称:v6 在 it25/40/60 方向是对的,但镜像关系一团乱。2.4 顺带一个测试方法的教训上面那个v2 it202 看起来对称冠军是个陷阱:测试集结果12 个规整棋形(构造的对称局面)镜像误差 0.001-0.03,表现优秀200 个随机局面镜像误差 0.725,全场最差原因很简单:构造出来的对称棋形是在背题(它们的对称性是人为给的),而随机局面才能测出网络的全局性质。教训:value 的对称性诊断,必须包含随机局面。3. value 极端化的完整死锁链这是 v18 到 v23 困扰我们最久的一个病:value 疯狂输出 ±1(给空盘判必胜/必败)。3.1 病根:条件分布极端化(ch2 捷径)先看标签的统计结构:行类型占比标签分布原因黑行动的行50%大部分1黑进攻,白不堵,黑胜白行动的行50%大部分-1白面对黑攻势不防守,黑胜标签整体是 50/50 平衡的—— 所以数据不平衡这个直觉是错的。真正的病是:在给定当前行动方的条件下,分布是极端偏斜的。而网络在空盘时(board 全 0),唯一能用的特征就是 ch2(当前执色)——于是它学到了这条统计捷径:ch2 1(我是黑)→ 输出 1;ch2 0(我是白)→ 输出 -1实测 ch2 敏感性(同一个棋盘,只翻转 ch2,看 value 差值 Δ):权重空盘黑 1 手后中盘 5 子v21b it30Δ 1.261.020.17v23 it47(修复后)0.690.24-0.07空盘 Δ 1.26 捷径实锤:棋盘全空,网络完全靠我是黑还是白判断胜负。而且效应随局面变复杂而衰减——信息越少,越依赖 ch2。ch2 依赖的时间轨迹(和空盘 value 是同一条曲线):it0-5: Δ 在 ±0.4 随机摆动(健康) it6: 0.30 ← 转正,捷径开始建立 it7-9: 0.46 / 0.47 / 0.38 it10-12: 0.54 / 0.61 / 0.78 it13-14: 0.99 / 1.05 ← 失控 it20-30: 1.11 → 1.26 ← 极端化稳态ch2 依赖度就是极端化的物理载体。3.2 死锁链:一个自我强化的七步循环① 空盘 ch21 → value 输出 0.84(黑必胜) ② MCTS 展开时,黑棋所有进攻动作的 Q 值被 0.84 抬升 ③ 白棋防守动作的 Q 值被压制(父节点 value 高,白子节点天然吃亏) ④ 白棋防守动作的访问数 ≈ 0 ⑤ policy 网络永远收不到防守有效的梯度 ⑥ 白棋 policy 继续乱飘/放弃防守 ⑦ 下一批数据:白行动的行仍然是面对攻势不堵 → vs -1 → value 确认ch20 → 必败 → 回到 ①这是一个闭环。每一圈都让下一圈更极端。3.3 一个特别有意思的机制发现我们对比了 v20b 和 v21b(后者修了噪声注入 bug),发现:v20b(每模拟重采样噪声):反而苟活得不错v21b(论文式根注入一次):死锁闭合,白棋窒息为什么?因为 v20b 那个错误的噪声非常猛,外部噪声强行绕过了 MCTS 的 Q 值死锁——让白棋的防守动作偶尔还能拿到搜索预算。而 v21b 把噪声修干净之后,死锁链完整闭合,白棋就再也没机会了。 这个发现很反直觉:一个 bug 竟然在续命。它也说明修 bug 不一定立刻变好——因为系统里可能存在互相掩盖的病。3.4 后果:读棋盘能力的丧失(量化)通道消融实验(20 个随机局面,看 value 对每个通道的平均敏感度):权重ch0(己方)ch1(对方)ch2(视角)v21b it60.2570.1680.106v21b it100.1260.0400.015v21b it300.0840.0050.015威胁感知区分度(用成五和无威胁局面的 value 差来衡量):权重无威胁黑活三黑冲四黑成五区分度v21b it6-0.119-0.066-0.0060.0730.19v21b it100.3600.3650.5030.099-0.26← 错乱v21b it300.5940.3710.6010.472-0.12←连五连都不认识v23 it47(修复)0.1620.1770.4210.8930.73← 单调递增,真会读棋盘这才是极端化的真实伤害:不是输出太极端,而是网络已经不再读棋盘了——它变成了一个看执色猜胜负的统计机器。v21b it30 那个连黑成五都不认识的数据,完美解释了它后期为什么一碰就碎。3.5 修复后的残留病灶v23 修好之后,黑视角的威胁感知恢复了(v23 it47 区分度 0.73,是健康期的 4 倍)。但白视角还残留一个病灶:白棋自己的威胁全被判负——权重白活三白活四白冲四白五连v21b it6(健康期)-0.246-0.375-0.400-0.324v23 it49-0.220-0.0690.4080.405value 不认可白棋有威胁 优势→ MCTS 不推白棋进攻 → 白棋只能防守等黑失误 →白棋胜率有了天花板(v23 长期卡在 30-40%)。这个病灶是后续白棋为什么总是差一口气的机制根源之一。4. 噪声的真身:它是学习速度平衡器MCTS 根节点要加 Dirichlet 噪声来探索。我们原本以为它只是鼓励探索,后来发现它还有第二重身份。4.1 一个反直觉的推断v20b:每模拟重采样噪声 噪声极大 value 梯度被稀释 value 学得慢 不抢跑(苟活) v21b:论文式根注入一次 噪声锐减 value 学得快 抢跑(死锁闭合)也就是说:噪声大小 ↔ value 学习速度 ↔ 抢不抢跑,是同一个旋钮。降噪提升学习效率 必然放大多头速度差。这就是 v23 暴露的核心问题:noise 修好了,效率上去了,但 value 抢跑更凶了。解决办法不是把噪声加回去(那是倒退),而是用结构性手段把 value 的速度压到和 policy 匹配:捷径删除、冻结调度、损失降权、加大池子。4.2 Dirichlet 噪声的数学性质 → “8% 先验锁定门槛”这一条是我们整个项目最漂亮的一次量化推导。现象:某个白必堵的关键点,policy 先验排top1(2.06%),但 800 次模拟里根节点只被探索了1 次。排名第一却锁不住。机制:PUCT 根层选择 argmax(q c·P_noisy),其中P_noisy (1-PEF)·P PEF·noise, noise ~ Dirichlet(α0.03, 225维)关键在于α 1 时,Dirichlet 分布极端集中——质量会疯狂堆到极少数维度上。10000 次采样实测:指标数值单维最大值的均值25.3%p9037.3%p9954.8%极端情况83.7%每次采样,总有一个点被随机抬到 1/4 的质量。乘上 PEF 0.25 →平均给某个随机点 6.3% 的先验。于是 2.06% 的先验在噪声面前被完全淹没(模拟显示:只被选中 0.2%,和实测的 1 次吻合)。接着我们扫描先验需要多高才能压过噪声:先验800 次根层选择中的命中率3%1.4%5%4.2%8%44.2%(开始锁定)10%66.6%15%92.6%20%97%结论:“认识棋型”(排名 top1)≠ “敢确信”(先验 ≥ 8%)。8% 是压过噪声抬升力的最低先验——这不是经验巧合,是 Dirichlet 噪声的数学性质决定的。policy 锐化(top1 → 8%)是棋力起飞的关键节点。4.3 顺带挖出个业界惯例公式既然 α 这么关键,我们去查了它的取值惯例,发现:α 10 / n(n 格子数)棋类格子数惯例 α围棋3610.028 ≈0.03将棋810.12五子棋2250.044我们照抄的那本书(五子棋例子)直接用了围棋的 0.03,没做维度换算。这跟一代一树是同一类问题:照搬围棋参数。4.4 但 α 不是解药(关键证伪)我们把 α 全参数实测了一遍(以第二选点 400 次里被选中 ≥10%为锁定线):α锁定门槛top1(2.6%)命中率判定0.03(当时的现状)5.6%1.0%全淹没0.05(惯例 0.044)4.3%1.3%仍淹没0.102.9%5.4%top1 开始锁0.30(理论极限)2.3%77.2%top1 锁死,但 top2 饿死α 的本质是先验信任度的双刃剑:α 越大越信任先验——先验对了效率极高(top1 77%),先验错了就灾难性锁死(实测:α0.3 把错误的 top-N 点锁死 31%,真正的堵点反而饿死)。最关键的证伪:我们测了活三不堵这个病,在 α0.03 / 0.05 / 0.3 下全都救不回来。原因很清楚:根因不是噪声,是 policy 先验排名本身就错(防守盲区) value 不惩罚(不堵活三 q0.746)。超参救不了一个排名错 不罚分的组合。5. 温度是一道采样门槛这是 v24 时代发现的一个机制,直接把我们对温度的理解提升了一个层次。5.1 一句话说清温度控制从搜索分布里采样落子。temp 1 时,某个点被选中的概率就等于它的 π 值本身。问题来了:黑棋的进攻点天然 π 很高(90-99%),而白棋的防守点天然 π 很低(20-30%)。于是取样变成了一道门槛:黑棋轻松过关,白棋永远跨不过去。5.2 门槛量化单点被稳定选中到底需要多高的 π?单点概率期望命中10 局里至少命中 8 局的概率评价20%(白堵点)5 局中 1 局0.008%几乎必飞30%10 局中 3 局0.4%不稳50%2 局中 1 局5.5%勉强过半80%5 局中 4 局67%较稳90%(黑进攻点)10 局中 9 局74%稳定99%(黑冲四致胜点)几乎必中~100%锁死白棋的防守尝试,大部分在采样阶段就被拦在门外了。5.3 正反馈分化机制黑先手优势 → 黑 policy 关键进攻点 π99%(锁死级),白防守点 π30%(必飞级) → temp1 采样门槛:黑过关,白过不了 → 黑赢 → 黑进攻成功样本多 → 黑 policy/value 强化 → 白输 → 白防守失败样本多 → 白防守信号学不到 → 黑更强 → 白更弱 → 分化增强v24 数据实证:指标数据黑做题75% →86%(正反馈,越学越强)白做题43% → 52%(在学,但被压制)白胜率it35-46 均值 18% → it47-54 跌到8.5%(it54 3% 新低)黑白 policy 端点先验黑 0.50-0.88(进攻) vs 白 0.046-0.21(防守),差 4-5 倍长期低位徘徊、没有向上趋势 锁死,不是学得慢。还有个细节特别能说明问题:同一个局面里几何对称的两个端点,先验也不对称(黑斜活三 H11 先验 30% vs L7 只有 8%)——几何对称、学习不对称。5.4 双重门槛死锁(核心机制)正常 AlphaZero 里,MCTS 搜索是救生通道:先验低没关系,搜索发现堵点后访问会集中,π 自动就超过门槛了。但在我们这里,value 的悲观把这条救生通道也堵了:白棋防守点 π30% → 【门槛 1:采样】temp1 拦下 → 防守尝试大多没发生 → 【门槛 2:value】MCTS 搜索时 value 判堵了也输(q-0.9) → 访问不集中 → π 还是 30% → 采样还是飞 → 白棋防守成功的样本进不了训练数据 → 没有防守有价值的信号 → policy/value 无从学起 → π 永远 30% → 死锁这是一个贫困陷阱:要提升就得先被选中,要被选中就得先提升。实测对照(it51 同一局面):环节π 值静态先验26.6%MCTS 800 次搜索后访问占比19.1%←不升反降!健康情况应该是26% → 强化到60-90%5.5 破门:两道门分别用什么杠杆门堵死原因杠杆效果采样门temp1 门槛温度指数衰减(而不是前 16 手恒 1、突然跳到贪心)✅ 已改,it55 生效:中位手数 10→14、快攻≤20 从 95%→76%价值门value 悲观 → MCTS 不强化value 修复实证:把 value 压成 v’0.4v 后,堵点访问率 21.2% → 38.9%(q 从 -0.94 提到 -0.36)value 是杠杆点这个判断被这个实验直接证实了:value 不那么极端之后,堵点访问率翻倍。顺带沉淀一条配置审查纪律:检查训练配置不能只看探索量(噪声位置/α),温度调度曲线本身就是关键旋钮。极端温度(前段恒 1 突变贪心)在黑白不对称的五子棋里,等于给弱势方设了一道永远跨不过去的门槛。配置审查应包含:温度曲线形态 × 对局长度分布 × 黑白角色不对称。6. 中心布局飞轮:增强是放大器不是发生器早期(v1-v8)有个诡异现象:网络死活学不会开局占中心,第一手长期偏向边角(边角率 70%,天元起步率只有 0.2-2.4%)。6.1 死锁:中心样本永远产生不了A15 盲区(开局区域网络信号均匀 UCB 展平) → 开局没有探索动力 → 中心开局样本 ≈ 0 → 八方向增强的天元 8 倍放大效应无从发挥 → 中心速攻永远学不会 → 布局永远不收敛关键机制:八方向增强是放大器,不是发生器。因为棋盘有 8 种对称变换,而天元(7,7)在 8 个变换下全部等价——位置等效样本倍数天元8 倍边中点/角4 倍一般位置1-2 倍天元是最高杠杆的注入点。但前提是:你得先产生中心的棋局,否则放大 8 倍的还是 0。死锁加深的过程很典型:A15 盲区 → 首手全边角 → 样本全边角 → value 学成边角 Q 高 → 搜索锁边角 → 对局还是边角 → 样本还是边角 ⟲实测证据:v6 it64 空盘 MCTS 里,天元 Q0.15,边角 Q0.30 ——policy 已经知道中心最好(top1天元),但 value 在盲区。而实战搜索由 value 主导 → 首手锁边角。6.2 飞轮一旦转起来三闸门指标:快攻 20% / 中心率 30% / 天元率 3%理论顺序:value 变强 → 快攻变多 → 对局变短 → 首手影响权重 ↑ → 搜索重新评估中心价值 → 中心率开始动 → 飞轮启动 → 中心样本 ↑ → 八方向增强放大 8 倍 → policy 学会中心 → 更加中心三件套闭环(缺一个,中心布局都到不了):组件作用自举引擎中心胜率高 → value 正反馈 → policy 倾向中心 → 更中心增强涡轮中心样本 8 倍放大,加速飞轮reset 解锁点火一代一树 bug 让首手锁边角 → 中心棋局产生不了 → 涡轮空转;每局 reset 之后,中心棋局才能产生,涡轮才有信号6.3 三个历史卡点(都是实测)卡点表现① 知道结果不知道策略断裂v2 天元开局的胜率是 59.1%,但 policy 选天元只有1.1%——胜率信号在数据里躺了 100 代,policy 提取不到。信号 → 行为,不会自动发生② 短局陷阱v10 it104 近中心开局胜率 53% 边角 60% → value 给了边角也行的正反馈 → 中心尝试 2 代就弹回(快攻化抹掉了长线优势)③ 边角伪胜率对手弱的时候边角开局也赢(50%),value 没有惩罚信号 → 角落惯性极难改(直到 v8 it149 才自愈)7. 两个看起来是病其实不是的案例这一节可能比前面更有用——因为误判会浪费大量时间。7.1 案例一:BatchNorm 收缩不是病现象:v8 深层残差块的 BN 统计量持续收缩——running_var 从 0.62 掉到 0.16,gamma 从 0.995 掉到 0.576。看着像深层网络在退化。机制推导(WD × BN 耦合正反馈):全参数一刀切 wd1e-4 → BN 的 gamma/beta 也被惩罚 → wd 压低 gamma → 通道输出幅度降 → running_var 降 → 有效 wd 被 1/(σ²ε) 放大 → gamma 更小 → running_var 更小 ⟲训练规模高危点:每代训练 32×512 16,384 个样本,而池子有 25,000 条 → 深层特征的 batch 方差估计噪声大,EMA 被噪声推着走,wd 把它锁在低方差区。决定性实验(篡改 running_var):把 res5-7 的 running_var 人为缩小 100 倍 → 败局库准确率崩盘(58.7% → 12.8%)、mean_v 飙到 0.74(瞬间极度乐观)。但阈值是有的:running_var 0.05只是信号, 0.05才致命。然后是三配置离线重训对比(用真实经验数据,it7-46):配置败局库mean_v结论基线(wd 全参 momentum 0.1)43.3%0.168—关掉 BN 的 wd33.2% ❌0.302治标不治本:rv 修好了(0.82),但棋力更差、value 更乐观momentum 0.349.8%-0.009最优:EMA 滞后减轻 → 推断归一化更准 → value 校准改善核心结论:①BN 收缩 ≠ 棋力差。真正影响棋力的是value 的校准(乐观偏置)。基线 rv 缩到 0.26,棋力反而更好。② 关掉 BN 的 wd 是不记了(rv 不缩了但 value 更糟);momentum 0.3 是记得更准(rv 照常缩,但推断正确)。③ 所以 v10/v12 的选择是BN 参数分组 wd0——注意这和上面关掉 wd 棋力更差并不矛盾:那是离线单点实验,而分组 wd0 在长训练里让 gamma 稳定,是另一个层面的问题。监测指标:gamma 趋势 / 深层 running_var(0.15 观察、0.05 干预、0.01 紧急)/ 败局库准确率 / mean_v。7.2 案例二:value 分不清活四/冲四/死四 —— 这是数据问题,不是结构缺陷现象:死四局面(黑四连两端都被白堵死,没有任何成五可能)——权重黑视角白视角v12 it480.988(自认必胜)-0.946(自认必败)网络对被堵死的四连和活四几乎同样反应。完整形态是三棋型零区分度:活四/冲四/死四在白视角下,v8 it200 三个全是 -1.000(区分度 0.000)、v10 it50 是 0.002、v12 it46 是 0.013、连王者权重 it153 也只有 0.081。逐层追踪定位:环节情况主干 res1-8特征提取正常——活四 vs 死四的 L2 距离逐层放大到 166-228,两端的信息一直在value_conv压成 1 通道,差距缩 30 倍value_fc 投影丢失在这里——要么投影归零(fc 前差 -0.16 → tanh 后 0.002),要么 tanh 饱和压缩(fc 前差 0.50 → tanh 后 0.057) 决定性实验(离线,不影响训练):加载 it48,冻结主干(conv_input res1-8),只解冻 value 头(1380 个参数 总量的0.1%),用 81 个构造样本训 300 步——指标结果死四 value-0.773 →-0.203区分度-0.161 →-0.671(4 倍)loss0.0076value 头 0.1% 的参数、300 步就学会了。结论:结构完全支持区分,这是纯粹的训练数据问题。机制解释:自对弈里死四/冲四的静止局面几乎不出现(落子前 MCTS 早就发现会被堵)→ value_fc 从来没被要求区分这个 → 即使主干给足了信息,读出层也直接忽略它。“老师没教过这个题”。顺带一个背题陷阱:后来 it51 在纯净竖四连的死三死四上全对了(一度以为数据量终于到了),但加入多方向 黑白背景子测试立刻现形——横向/主斜全崩,只对副斜碰巧全对。记住特定位置 ≠ 学会数两端。探针铁律:测棋型识别必须多方向 带背景子。纯净单形状会被背题骗过。8. 九个机制模型速查表#机制模型一句话核心验证方式1三头分工失衡policy 是方向盘(搜索入口),value 是仪表盘;policy 偏了 value 救不回来it69(烂 value好 policy)PK 8:2 赢 it1182policy 饿死输出层吃掉 92-97% 梯度,卷积识别层只剩 2-8% → 学不到空间棋理梯度占比实测 冲四应下点概率对比3双头钟摆policy 与 value 交替领先,从未同步;双头同频是理想态v6 逐代追踪天元概率与首手选择4value 天然抢跑任务简单 标签现成 正反馈单向 → value 学习速度是 policy 的 5-10 倍v23 冻结期 0.12 vs 解冻后 2 代 0.275ReLU 结构性颜色歧视1ch 编码下对手的负激活被 ReLU 截断 → 架构级偏爱当前玩家 → 双视角健康在结构上不可能v6 用 116 代证明治不好;v8 用 37 代结构性解决6value 极端化死锁链ch2 捷径 → 白防守 Q 被压制 → 访问≈0 → 收不到梯度 → 数据更偏 ⟲ch2 敏感性 Δ1.26 通道消融 威胁感知区分度7噪声 学习速度平衡器噪声大小 ↔ value 学习速度 ↔ 抢跑,是同一个旋钮;降噪提效必放大速度差v20b(大噪声苟活)vs v21b(锐化后死锁闭合)88% 先验锁定门槛Dirichlet 每次给某点 6.3% 抬升 → 先验 8% 必被淹没;“认识≠确信”10000 次采样 800 次根层选择扫描9温度 采样门槛(双重死锁)temp1 下 π 就是落地率;黑 90-99% 过关、白 20-30% 必飞 → 贫困陷阱门槛量化表 it51 实测(MCTS 后 26.6%→19.1%)还有两个不是病的判别结论:现象是不是病判别方法BN 统计量收缩不是病(收缩是机制);病在 value 校准篡改 running_var 实验 三配置离线重训value 分不清活四/死四不是结构缺陷,是数据稀缺冻结主干只训头部(0.1% 参数 300 步学会 → 结构没问题)写在最后这一篇写起来比前两篇累得多,因为机制推导比记录现象难——你得先猜一个因果链,再设计一个能证伪它的实验,然后接受我猜错了的结果。最有价值的几条,其实都是推翻了我原本的判断:我以为输出极端是病,实际是已经不读棋盘了才是真病(通道消融 威胁感知测出来的)我以为BN 在退化,实际 BN 收缩是网络自己学到的机制,病在 value 校准我以为value 分不清死活四是结构不够,实际冻结主干只训 0.1% 的参数,300 步就学会了——纯粹是老师没教过我以为噪声只是鼓励探索,实际它是学习速度的平衡器,降噪提效的代价是放大双头失衡我以为温度只影响棋谱随机性,实际它是一道采样门槛——在黑白不对称的规则下,等于给弱势方设了个跨不过去的坎如果这几篇里只能留一条给同样在做自对弈的人,我会留这条:遇到调参怎么都不行的时候,先别调了。去找那个结构性的因果链——大概率病不在超参,而在某个你还没意识到的机制里。觉得有收获点个赞⭐九个机制模型那张表建议收藏评论区聊聊:你有没有遇到过调了半天其实是机制问题的经历? **代码 全部对局记录在 Gitee:alpha zero gomoku下一篇:《AlphaZero 五子棋实战(四):55 个踩坑全记录,共勉》从埋了 21 个版本的实现 bug,到半夜挂训练的工程坑,到自己把自己骗了的诊断陷阱——全部按症状 → 根因 → 修复整理。同时,前三篇里用到的实验方法论(实战 PK 六条规矩、单变量对照实验、内部饱和 vs 外部标尺)会作为附录一并整理。敬请期待!