完整的一局
支持 2、3、4 人的完整锄大地,多局累计到 100 分为止。麻烦的规则一个不少:A-2-3-4-5 是最小的顺子、花色决定同点大小、首局由方块 3 开牌、2 人局过牌要摸一张、3 人局明置一张废牌。
开始一局浏览器内实测中位数,95 百分位为 14 毫秒
4 人网络 3270 万局,3 人网络 3550 万局
胜率、期望分数,以及背后的理由
对手是概率机器人,均势下应为 33.3%
你会得到什么
内部构造
对手由你来选。一个靠推算,一个靠感觉。它们选的牌经常不一样,看它们争起来本身就挺好玩。
它先推出还有哪些牌没露面,再问这些牌能对你做什么。对单张来说答案是精确的 —— 在剩余牌堆上的闭式概率,而不是估计 —— 有时还能证明某一手根本压不过,或者证明你可以一路走完整手牌而不丢庄。其余情况就靠把局面模拟上千次来决定。
顾问面板背后就是这个引擎,所以它给的是概率,而不是意见。
训练方式和 DouZero 学斗地主一样:自己跟自己打上千万局,记住每个局面最后值多少分,再学着预测它。上桌时它什么都不算 —— 一次看完所有合法出牌,挑出感觉最好的那个,大约 3 毫秒。
它公布的胜率来自和一个刻意调弱的概率机器人对战,所以那是训练进度,不是说它稳赢。
为什么 2 人局不一样
2 人桌上神经网络选项是关掉的,你面对的是概率机器人。网络是按 3–4 人训练的,而单挑锄大地是另一个游戏:剩下的 26 张成为摸牌堆、过牌要付出一张牌、输家也不会扣分。现有的 2 人网络打不过概率机器人,所以干脆不发布 —— 这个选项会灰掉并写明原因,而不是在你背后悄悄换掉。
它是怎么学会的
锄大地没有一本「好棋谱」可以抄,所以这个网络从来没被人教过一步。它被丢去自己跟自己打,只被告知谁赢了、赢多少,剩下的自己想明白 —— 和 DouZero 学斗地主用的是同一套办法,叫做深度蒙特卡洛。一共两次训练,3 人桌和 4 人桌各一次,单机各跑 6 小时。
01
每一轮它会发 512 副新牌打完。对手是它自己早先的版本 —— 一个 6 个旧版本的池子 —— 所以它没法靠钻某一个固定对手的空子取胜。每 10 步里有一步是随机下的,正是这一点让它不会一头钻进死胡同、再也不肯试别的。
02
牌局进行中它不作任何评判。等一副结束,这副里的每一步都会被标上这局对出牌的那个人到底值多少分 —— 剩下的牌,按规则该翻倍翻三倍的照算。不用一个估计去猜另一个估计:标签就是真实结果。
03
这些带标签的出牌进入一个只保留最近 500,000 条的缓冲区,网络要学的就是只看局面和这一手牌,预测最后那个分数。整个把戏就在这里 —— 上桌之后它不做任何模拟,一次给所有合法出牌打分,出分最高的那一手。
每训练 10,000 轮就停下来,坐 1 号位对一个调弱的概率机器人打 800 副。在虚线以上,就说明它赢得比这桌该有的份额多。
训练轮数
| 轮数 | 3 人训练 | 4 人训练 |
|---|---|---|
| 10,000 | 51.9% | 38.2% |
| 20,000 | 56.6% | 42.8% |
| 30,000 | 56% | 43% |
| 40,000 | 56.9% | 39.6% |
| 50,000 | 57.1% | 43.9% |
| 60,000 | 59% | 43.5% |
| 70,000 | 57% | 44.6% |
| 80,000 | 61.3% | 47.1% |
| 90,000 | 58.1% | 43.6% |
| 100,000 | 58.2% | 44.8% |
| 110,000 | 58.1% | 44.4% |
每 700 轮的训练误差中位数,色带是这一段里的最低和最高值。所有点都来自 3 人训练自己的逐轮日志。
训练轮数
为什么往上走不代表坏了。 它不是在拟合一份固定的标准答案。它变强的同时对手也跟着变强、牌局也打得更凶,所以它要预测的那个东西一直在变难。误差从 0.047 升到 0.155 而胜率同时也在涨,正是这类训练健康时该有的样子;真正该担心的是误差在降、胜率却不动。
两次训练用的是同一个网络和同一套设置,只有桌上的人数不同。
| 指标 | 3 人 | 4 人 |
|---|---|---|
| 打过的副数 | 35.5 M | 32.7 M |
| 实际耗时 | 6 小时 | 6 小时 |
| 每秒副数 | 1,756 | 1,611 |
| 最佳单副胜率 | 61.3% | 47.1% |
| 均势应为 | 33.3% | 25% |
| 结束时的误差 | 0.1548 | 0.2135 |
有一点如实说明,不藏着:只有 3 人训练的逐轮日志保存了下来,所以误差图只有那一次训练。4 人的数字来自它控制台日志里打印的十一次评测。两次训练的日志都在仓库里,想看可以自己翻。
这些数字为什么可信
顾问只有算对了才有用。这一切最初是个 Python 项目,而那些代码没办法搬进浏览器 —— 于是它被重写成 TypeScript 和 WebAssembly,再拿去对着原版核对:Python 那边把自己实际的行为导出成记录,浏览器引擎必须一模一样地复现。
录下的 2、3、4 人对局 —— 其中一局打满 102 副直到 100 分 —— 在浏览器里走出完全相同的过程。
300 局完整对局,每一个回合都检查:牌数守恒、出牌合法、计分正确,从未出现过非法状态。
单张被压过的概率用精确整数运算,和原版对到小数点后十二位。
154 项测试覆盖规则引擎,包括大家常争的边角 —— A-2-3-4-5 顺子、同花的比法,以及只能同张数相压。
每一个权重都逐位往返一致,浏览器选的牌就是 PyTorch 选的牌。
模拟内核就是原来的 C 源码编译成的 WebAssembly,所以你标签页里跑的是被基准测试过的那份代码,不是重新解读的版本。
全部开源 —— 阅读引擎、训练流程和测试套件
常见问题
选好人数和对手,大约十秒就能开始,顾问面板可以一直开着。