
作者: Alex Weldon
Alex Weldon 是自由撰稿人,来自加拿大蒙特利尔的游戏设计师和半职业玩家。
在我写这篇文章的时候,最近这场人类与机器的扑克对战进行了四分之三,人类的成绩落后机器,但不太远。Dong Kim是四位人类选手中唯一盈利的选手,从AI Libratus那里赢了$33,297,而且基本上是在一手巨大的抓诈唬手牌中获得。队友Jason Les和Jimmy Chou稍有亏损,Daniel McAulay输的最多,Libratus赢的$54,809大部分都从他这里来。
由于对这些玩家面临的挑战感到好奇,上周我跟我的表亲Eric Jackson开发的机器人Slumbot打了几千手牌。Slumbot当然没有Libratus强,跟*耐基卡**梅隆大学同一个团队之前开发的Baby Tartanian 8对战时也小有亏损。但是,所有这些机器人采取的都是类似的算法,根据一种叫做反事实的遗憾最小化的技术进行改进而以。与你能找到的大部分扑克AI相比,Slumbot还是非常强的。
下面是我得出的关于跟机器人对战和跟人类对战有何区别的几点观察。以下并无特别的顺序。
领先容易,保持很难
我跟Slumbot的对战一开始非常顺利,在前2,000手牌左右基本上是每打100牌手盈利就翻倍一次。我希望能保持这种状态,得到更大的样本,结果从那时开始盈利就下跌到有所亏损。我经历了两三个cooler,一次翻牌前全下抛硬币,还在几个更大的底池做了愚蠢的跟注。如果你去看Slumbot从前的数据,会发现这个模式很典型;在前1,000手牌左右只要运气稍微好一点,你是很容易赢钱的,但是很少有人能在5,000手牌左右时依然领先。
换句话说,如果你自己并不是高手数的玩家,你可能需要比想象中更大的样本才能判断出两位玩家中谁打得最好。考虑到机器人的打法比较稳定且时刻都有空进行比拼,跟机器人打牌得到的结果会更加可信。
从无漏洞中找漏洞
Slumbot和它的同类有一个相同的特点,它们不会实时调整打法,而是在比赛开始前尽可能开发出漏洞最少的混合策略,然后在比赛中执行,完全不注意对手在前面的底池是怎么打的。它们每次在相同的底池打法未必相同,而是从相对概率相同的选项中进行选择。
讽刺的是,人类玩家知道机器人不会实时调整,意味着他们自己没必要采取混合的策略。比如说,如果你发现自己在某种类型的时机诈唬有利可图,你可以每次碰到这种情况都诈唬,无需担心机器人会增加跟注频率。换句话说,也许你很难找到方法击败机器人,但当你找到时,完全不用担心它会设置陷阱。
一个大漏洞
机器人的算法中有一个严重的漏洞,那就是机器人完全没办法完全自由地判断下注量。因此,算法必须给下注量设置一定的区间,比如把29%底池的下注四舍五入为30%的底池,而且这跟31%底池的下注没有区别。
我在跟Slumbot对战的第一手牌就遇到了这个漏洞的影响;我拿到A高牌,我认为机器人手里有许多更差的A或K,于是在了一个非常小的价值下注,但我惊讶地发现他用8高牌跟注我了。我的表亲解释说,我的下注太小了,所以机器人把它四舍五入为0%,于是就当成我在过牌了。
现在Slumbot设计出来的主要目的是跟其他机器人对战,所以这个漏洞还没有得到掩盖或纠正。Libratus应该不会有这种可以利用的漏洞。但是就算是最强的机器人也可能在面对稍微有点不同的下注量时呈现一些不连贯的反应,这就是敏锐的人类可以利用的弱点,从而进行攻击。
也许你真的是一条幸运的鱼
有句扑克俗语说,你压制对手越彻底,他越容易把你的胜利归结为运气好。我们都有过这种被人说运气好的经历,但其实他没有理解我们为什么会这样打一手牌,或是我们为什么会成功。
Slumbot让人感到羞耻的一个地方是,它不仅提供你的真实盈利,还会提供一个“基准”盈利。这个数据呈现的是你的真实盈利和机器人自己来打跟你完全相同的底池和牌面时可以赢的钱之间的差距。
可能你在一些样本的手牌中以30 BB/100的数据击败了Slumbot,但是你会发现你的基准盈利其实是 -40 BB/100。也就是说,如果你真打得很好的话,你本应该在同样的运气下盈利70 BB/100,一旦波动变正常,你就会输掉相同的数目。
你不禁开始思考,过去那些喊你运气好的傻瓜的对手其实很可能说对了。如果不是牌运好的话,你可能早就输光了。
最好的老师是你的对手
关于这些算法,你要明白一件很重要的事,机器人采用的混合策略其实是根据他们跟自己对打的数百万手牌总结出来的。这意味着机器人最后采取的策略是它自己没有找到漏洞的策略。反过来这意味着,当你不确定该怎么打时,你可以试着问问自己,机器人会怎么做;仿效它的策略可能不会给你优势,但如果你做得对,至少不会输钱。
这与跟人类对战是非常不同的,人类的策略在对付自己时其实不是平衡的。人类完全可能在一个已知的河牌诈唬太多,也有可能在反过来的情况中跟注不够。因此,你觉得对手会怎么做你就怎么做的话,很可能要么让你入天堂,要么使你进地狱。
自负对人类打牌有巨大影响
跟Slumbot对战时,你会注意到的第一件事是,它诈唬的次数比你想象中更少。打多一点后,你会发现这也不尽然。它其实诈唬还不少,但是跟大部分人类相比,机器人在前面的街诈唬会多很多,在后面的街会少很多,而且在面对一次下注时经常开火。
我们来看一个极端的例子,Slumbot有时会这么做,但你不太可能看到人类玩家这样打。它会在翻牌前做4bet诈唬,当对手跟注时,它会在很多牌面直接弃牌,完全不尝试在翻牌后偷池。在仅仅几千手牌的样本中,它就这样做了好几次,在3bet或4bet的底池的翻牌后过牌到底,然后我用A高牌或小口袋对拿下底池,在更多的手牌中,他在翻牌过牌后,会在转牌直接对中等下注弃牌。
如果它的打法是正确的(或接近正确),那么有一点就完全合理了,那就是人类会在诈唬时因固执而犯错。诈唬被跟注是很尴尬的,尤其如果我们最后必须亮牌的话,所以人的本能是在前面的街被跟注时继续开火,目的是要么把对手赶走,要么击中一手还能拿得出手的牌。
同样,当我们没有摊牌价值,却不敢在底池冒险开枪时,会觉得自己好没用。其实直接用8高牌过牌-弃牌能给我们省下很多筹码,免得被对手范围内很多抓诈唬牌打败。Slumbot就完全没有这个问题。总的来说,我发现Slumbot愿意放弃很多小底池,在大底池则打得很好,而且很善于选择时机。这当然是我们大部分人可以改进的部分。
情绪失控比你想象中更严重
跟上面相关的一点是,你以为跟一位不会说话且没情绪的对手交战,而且不玩真的钱,你肯定不会像在正常打牌情况下那么容易情绪失控。对有些人来说可能是这样,但对我来说不是。有部分原因是,当Slumbot运气好赢过我时,我会陷入沮丧的困境,然后在它并不经常诈唬的时机跟注,因为我对自己说它不可能每次都有好牌。面对人类对手时,这种逻辑就已经很可怕了,面对机器人则更严重。
对手的情绪状态有可能是种错觉
同时,尽管我知道这并不可能,但有好几次我发誓机器人情绪失控了。比如,有好几次我用弱的听牌float,击中牌,赢了一个大底池,然后下一手牌 Slumbot就做了五倍的开池。面对人类对手时,这种大的开池量自然会令我们猜测对手对上个底池输掉耿耿于怀,所以做这么大的下注量,以免你再次“反超”。
当然, Slumbot做五倍的开池是因为它的程序设置的策略中有五倍开池的概率,然后随机数目的生成器恰好选中这一次做五倍的开池。你认为这是它对之前手牌的反应纯粹是你的错觉。和“运气好”的现象一样,这使得我不禁开始思考我在猜测对手的感觉时有多少次是对的,有多少次错误地联系到之前的手牌,其实但是他只是在混合策略,或拿到一些不一般的手牌。
人类的下注量太保守了
游戏新手经常听到一个建议,下注量要保持一致,从而避免泄露太多关于手牌的信息。更高级的玩家会开始不仅依靠底牌来调整下注量,而且还要看牌面结构,或是根据河牌要全下来合理安排每条街的下注量。
事实上,在一个已知的情况下,你会根据不同的底牌,采取多种下注量,只要每个范围分别都是平衡的。也就是说,你可以在拿到大牌时下注很大,在拿到边缘牌时下注更小,只要你在每种情况下的诈唬频率都能让对手很难选择是跟注还是弃牌,以及你自己并不会对加注弃牌太多。
由于人有欲望,所以人类很难做到;我们下注很多是因为希望对手弃牌,或出于贪婪。我们下注很少是因为想让对手跟注,或是在诈唬时不想冒险太多。但是如果把范围分割,设置不同的下注量,我们是希望对手在面对更小的下注量时做更多跟注,但错的次数更多,在面对更大的下注时则打得更保守,但会错过更多的诈唬。
这对人类来说是很难的,因为这要求我们非常明白我们范围内的各部分与对手范围内各部分对比情况如何。对Slumbot这种AI来说,这个工作就容易多了,只要有更强力的算法就好了。
Slumbot对范围的“思考”可能跟我们想象中完全不同,只会采取自己的经验证明过有利可图的打法。即便如此,观察它们的打法以及为什么这种不同的下注量会如此好用能让人类自己的游戏中增加一些高级的因素。