后悔最小化:机器学博弈的方式
这本书叫《后悔》,到这一章才把这个词的第二层意思拿出来。前面二十章里,「不后悔」是一个用来判断的标准——检查某一格是不是均衡。这一章它变成一个可以累加的数,一个可以被最小化的目标。而当一台什么都不懂的机器反复把这个数往下压时,它会自己走到均衡上。这不是比喻,是一条有证明的定理,也是今天所有顶级扑克 AI 的地基。
你要写一个程序去玩石头剪刀布,对手是谁不知道。你不许在程序里写死任何博弈论知识——不许算方程,不许查表,不许写「出 1/3」。
你只能让它做一件事:每一轮结束后,看一眼刚才要是出别的会怎么样。
问:这样一个程序,长期会收敛到什么?
把「后悔」定义成一个数
一局结束了。你出的是石头,输了。现在问一个很自然的问题:
刚才我要是出布,会多拿多少分?
这个差额就是后悔值。它是一个数,可以是正的(那一手更好,我后悔),可以是负的(那一手更差,还好没出)。
把每一手的后悔值一轮一轮累加起来,得到一张「累计后悔表」。然后是整个算法的全部内容:
# 后悔匹配(regret matching),Hart 与 Mas-Colell 2000 年提出
每一轮:
1. 看累计后悔表,把负数都当成 0;
2. 按剩下的正数的比例,随机选一手出去;
(如果全是 0,就均匀随机)
3. 出完之后,算出每一手的后悔值,累加进表里。
# 就这三步。没有方程,没有对手模型,没有搜索。
直觉是:越是「我本来该多出它」的那一手,我以后就越多出它。而一旦某一手出多了,它的后悔值就会掉下来,出的频率也跟着降。这是一个自我修正的循环。
它凭什么会走到均衡上
这里有一条漂亮的定理,值得说清楚,因为它把这一章和前面二十章缝在了一起。
Hart 和 Mas-Colell 证明了:后悔匹配是一个无悔算法——随着轮数增加,平均后悔值趋于 0。
而「平均后悔趋于 0」意味着什么?意味着回头看,我没有任何一手是「早知道就该一直出它」的。把这句话和第 2 章那个均衡的定义放在一起:
均衡 = 在别人不变的前提下,我换任何一手都不会更好。
无悔 = 回头看,我换成一直出任何一手都不会更好。
几乎是同一句话。区别在于:均衡是关于一个时刻的,无悔是关于整段历史的平均的。
于是就有了这条结论:如果双方都用无悔算法,他们的平均出手频率会收敛到均衡(对零和博弈是纳什均衡;对一般博弈是第 22 章要讲的「粗相关均衡」)。
请注意收敛的是平均频率,不是当前策略。当前策略可能一直在跳,但把整段历史平均一下,它落在均衡上。
推到有信息不对称的博弈:CFR
石头剪刀布太简单了。真正的挑战是你知道一些对方不知道的事的博弈——比如扑克:你看得见自己的牌,看不见对方的。
这类博弈的麻烦在于,你不能简单地说「我在这个局面下该怎么做」,因为你不知道自己处在哪个局面——你只知道自己看到了什么。相同的观察对应着好几个可能的真实状态。
2007 年,Zinkevich 等人给出了 CFR(counterfactual regret minimization,反事实后悔最小化)。它的核心想法是把后悔值拆到每一个信息集上(也就是「我看到的东西」而不是「真实的状态」),并且按「这个局面有多可能出现」来加权。
然后神奇的事情发生了:在每个信息集上分别做后悔最小化,整体就会收敛到整个博弈的均衡。一个局部的、贪心的、完全不懂全局的过程,收敛到了全局解。
用一个有标准答案的题来验它
怎么知道 CFR 真的算对了?找一个有人手算过标准答案的博弈。
库恩扑克正好合适。它是 Harold Kuhn 在 1950 年设计的最小扑克:三张牌(J、Q、K),一人发一张,各下 1 底注,一轮下注。它小到可以完全手算,而 Kuhn 当年就算出了它的全部均衡,包括先手的期望收益是 −1/18。
把 CFR 放上去跑:
迭代次数 先手的期望收益 离真值 −1/18 的距离
100 −0.05598721 4.32e−04
1000 −0.05555722 1.66e−06
10000 −0.05554640 9.16e−06
真值(Kuhn 1950 手算) −1/18 = −0.05555556
一千轮之后,差 1.66 × 10⁻⁶。
这台机器不知道什么是纳什均衡,不知道 Kuhn 是谁,也没人告诉过它答案。它只是反复问自己「刚才要是出别的会不会更好」,问了一千遍。
更值得看的是它学出来的策略。Kuhn 当年证明:先手拿到最小的牌 J 时,会以某个概率 α 虚张声势下注;而拿到最大的牌 K 时,下注的概率必须正好是 3α。这个 3 倍关系是均衡的一部分。
上面 demo 切到「库恩扑克」那一栏,它会把学出来的 α 和 3α 打出来,跟机器实际拿 K 时的下注频率放在一起比。这不是我们教给它的,是它自己撞出来的。
虚张声势(bluff)在日常语言里是「骗人」,带着道德色彩。在均衡里它是一个必需品:如果你只在拿好牌时下注,对方一看你下注就弃牌,你的好牌一分钱都赚不到。
所以均衡策略里必须有一定比例的虚张声势,而且比例是精确的(这里是 α 和 3α 的关系)。这跟性格无关——一个从不虚张声势的玩家,在数学上是可被利用的。
同样地,「诈唬得太多」也是可被利用的。均衡不是「不骗人」,也不是「多骗人」,是一个精确的频率。这是第 2 章那条「只有随机才安全」在扑克上的完整形态。
扑克 AI。2017 年,卡内基梅隆大学的 Libratus 在一对一无限注德州扑克上击败了四位顶尖职业选手;2019 年 Pluribus 在六人桌上做到了同样的事(这两项工作分别发表在《Science》上)。它们的核心都是 CFR 的变体加上抽象和实时求解。请注意这条技术路线和下棋 AI 的差别:AlphaGo 那一支是搜索加评估,CFR 这一支是「反复后悔」。后者专门对付信息不对称。
在线学习与广告出价。「无悔算法」这个概念远不止用在博弈上。它是在线学习理论的中心概念:在一个你完全不了解的环境里反复做决策,怎么保证长期不比「事后最优的那个固定选择」差太多。第 16 章那些自动出价工具,本质上就在跑这类算法。
一个可以自己用的思维工具。后悔最小化提供了一种非常朴素的决策复盘方式:不问「我做得对不对」,而问「如果我一直采用另一种做法,累计下来会好多少」。这两个问题差别很大——前者会陷入对单次结果的纠结(而单次结果里有大量运气),后者关注的是策略层面的系统性差距。
《打分》讲强化学习:一个智能体从环境的奖励里学。这一章讲的东西形式上很像,但有一个关键差别——这里的「环境」里坐着另一个也在学的人。
这个差别是致命的。标准强化学习假设环境是固定的(同样的动作,同样的分布的回报);而在博弈里,你一变强,对手就变了,你的「环境」跟着动。这也是为什么多智能体强化学习到今天仍然难:目标在跑。
CFR 之所以有效,正是因为它不假设对手固定——它追求的是「对任何对手都不会太亏」,而不是「对当前这个对手最优」。这个区别就是选项 D 和 B 的区别。
「机器要玩好一个博弈,得先理解这个博弈——建模、算均衡、然后照着执行。」
CFR 里没有任何一步在「求解均衡」。它从头到尾只在做局部的、增量的调整,而均衡是作为副产品浮现出来的。
这和第 12 章那个结论是同一件事的两个版本:均衡不需要有人去算它。第 12 章里是「被淘汰出来的」,这一章里是「被后悔压出来的」。达到同一个地方的路,不止解方程这一条。
顺带说,这也解释了为什么这类方法能处理大到没法写下来的博弈。德州扑克的状态数远超任何求解器的能力,但你不需要写下整张表——你只需要在你实际走到的那些局面上,反复问那一个问题。
正确答案是 B:会收敛到均衡。石头剪刀布上收敛到 (1/3, 1/3, 1/3),库恩扑克上收敛到 −1/18,一千轮后误差 1.66 × 10⁻⁶。
A 「没有知识就找不到均衡」——这是这一章要推翻的核心直觉。均衡不是一个需要「知道」才能到达的地方,它是一个动力学的不动点。你不需要理解它,你只需要不停地往「少后悔」的方向挪。 C 「会被对手带着走,一直震荡」——这个答案抓到了一个真现象:当前策略确实一直在跳,可能永远不稳定(这正是第 12 章石头剪刀布那些永远闭合的圈)。它错在把「当前策略」当成了答案。收敛的是平均频率,把整段历史平均起来,它落在 1/3 上。 D 「只能对付特定对手,换个对手就废」——这是「剥削式打法」和「均衡式打法」的区别,而这个区别值得记住:专门针对当前对手的策略赚得更多,但自己也会露出破绽(第 2 章那个「布多一点」就是这样)。CFR 学的是均衡策略,它对任何对手都不会输太多——代价是它也不会把弱对手榨干。真实的扑克 AI 通常两者都要,先站在均衡上,再有限度地剥削。你在设计一个多方参与的自动化系统(比如内部的资源竞价),参与方会用算法来出价。你希望系统的行为可预测。改什么?
规则复杂、每次的收益依赖别人的出价 ⇒ 各方都上无悔算法 ⇒ 系统会收敛,但收敛到的是均衡,而均衡未必是你想要的那一格(想想第 4 章那个 80 分钟)。 先把机制改成第 14 章那种策略防伪的 ⇒ 各方的最优策略是照实报价,与别人无关 ⇒ 无悔算法一学就学到「说实话」,系统当场稳定,而且你还拿到了真实数据。这是这本书前后两半合起来才有的结论:当参与者会学习时,机制设计变得更重要,而不是更不重要。因为学习算法会精确地找到你机制里的每一个缝。
这一章的一句话
「后悔」不是情绪,是一个可以累加、可以最小化的数;把它压到 0,你就站在了均衡上——哪怕你从头到尾不知道均衡是什么。
下一章处理无悔算法收敛到的那个东西。在零和博弈里它就是纳什均衡,可在一般的博弈里,它是一个更大的集合——而这个「更大」是个好消息。下一章会给第 3 章那个斗鸡装一个红绿灯:混合均衡下每人拿 14/3 ≈ 4.667,撞车概率 1/9;装上信号灯之后每人拿 21/4 = 5.25,撞车概率 0。而且这个 5.25 比所有纳什均衡的任何混合都高——连公开抛硬币都只能到 4.5。