Skip to main content
Eric Jang

Eric Jang

May 17, 2026

Unknown podcast

#539. 手搓AlphaGo:前DeepMind科学家拆解AI围棋核心原理,以及对LLM强化学习的深远启示

May 17 · 2h 9m

29:21
好,那么对于那些局部情况不重要的游戏,你说 transformers 会更适合。那时间维度上的游戏呢?现在我们只考虑上一步,因为这是个确定性的完全信息游戏。但如果是像扑克或者外交这样的游戏,你之前的一次虚张声势可能对现在理解局势决定下一步很关键。你需要考虑所有之前的状态,这会不会改变哪种归纳偏置最相关,哪种架构最-
29:47
相关。对,好问题。围棋是 perfect information 游戏,在完美信息游戏里存在一个 Nash equilibrium 策略,你用这个策略不会比任何其他策略做得更差。所以如果你知道对手有某种偏好,比如他们喜欢下得特别凶狠,你原则上可以针对那种具体策略做到比 Nash equilibrium 策略更好。但是要应对任何给定策略,其实存在一个单一的 Nash equilibrium,它只取决于当前状态。所以这是个设计选择。大多数围棋 agent,包括 AlphaGo,都选择了只依赖当前状态。事后证明效果很好,因为 Nash equilibrium 看起来是 superhuman,没有任何人类策略能打败它。不过也存在一些变种游戏,确实需要考虑历史状态。这是一个非常激动人心的研究领域。我鼓励大家去我的代码库 fork 一份,试试这些东西。比如说如果你玩二对二的围棋,那你实际上需要建模你队友的行为,你可能不知道他们是怎么下的,所以你需要收集一些信息,了解他们的下法,才能做出相应的应对。你看,这些情况就不再是完美信息游戏了。在这些不完美信息或者部分可观测的游戏中,你确实需要一些上下文来构建模型。我觉得从自我对弈或者像外交这类游戏的角度来看,这会是一个非常非常有前景的方向。好,回到神经网络上来。架构其实不是特别重要,用 transformer 也行,用 ResNet 也行。我发现对于低预算的实验,ResNet 的效果会好一点。你也可以用 Karpathy 风格的自动超参数调优,把你的架构调得相当不错,所以你不用太担心这个,你只需要把问题搭好,明确你要优化的目标。我们接下来就选一个我之前用过的能跑的架构。不过这真的不是重点。你把编码后的棋盘状态,我们不妨像 RGB 那样用三个通道,一个通道给黑子,一个给白子,还有一个通道可能是编码空位,或者如果你要训练多种棋盘大小,就加一个遮罩区域。目前先不讨论多种棋盘大小,太复杂了。我们就说有这么一个两三个通道的类 RGB 图像,然后送进 ResNet 里。然后我们有两个分支头,一个头预测价值函数,这是一个单独的 logit,也就是一个标量输出,另一个是策略头输出是三百六十一个值,这就是整体的架构。我们基本上就是要训练它,给定棋盘状态,预测游戏的结果,同时也预测哪些着法是好棋。对最初的 AlphaGo 论文也叫 AlphaGo Lee,是用人类专家的棋谱数据及做监督学习来初始化这个网络的。后来他们去掉了这个限制,让模型自学怎么下好棋。但是从实际实现的角度,我觉得对听众来说特别好的做法是把你的实验初始化得简单一些,先把问题跑通,然后再去尝试一上来就啃下整块硬骨头,从零开始学。一般来说,你总是想做好初始化,就像深度学习里初始化就是一切,对吧?做研究项目也一样,你总是想把它初始化到尽可能接近成功的状态,尤其是当你在做以前没做过的新事情,总是先选一个能跑通的东西,再让它做得更好,而不是从一个完全跑不通的东西开始,然后试图把它弄通。基于这个理念,从一个有好初始化的起点开始就非常棒。所以我们会拿人类专家的棋局训练模型来预测好的着法,也就是把所有人类专家赢的棋局里那些赢棋的着法拿来,然后预测那些着法,然后不管棋盘状态如何,也不管这盘棋是赢是输,我们都要预测最终结果。你可能会想,有些开局阶段,比如棋盘上才下了一颗子,你咋可能知道谁输谁赢呢?但如果你有几十万盘棋,那么平均来说,你会发现像这样的开局从它衍生出的棋局里大概一半会赢,一半会输。所以当你训练模型去预测这些结果的时候,模型的输出自然就会收敛到零点五左右。因此,一旦模型训练好,开局的棋盘状态预测出来就是零点五。然后随着棋局推进,这个胜率要么往上走,要么往下走,这大致对应着你的部署。等你走了几百步之后,在专家数据的分布下,谁更可能赢,谁更可能输,就变得非常清晰了。
36:52
说实话,这有点不公平。李世石下一步棋可没用上十的二十二次方次浮点运算。
36:59
也是你说的有道理。不过有意思的是,现代的围棋机器人在测试时已经不需要那么多算力了。我们后面讲到 MCTS 策略改进的时候,就会发现,随着时间的推移,原始网络实际上吸收了那个大 TPU Pod 的全部负担,把这些能力内化到了网络里,你只用一次神经网络前向传播就能完成所有那些工作。当然,TPU Pod 永远会在上面再加一点额外的马力,所以那是他们比赛时想要的。好,我们选一个模拟次数,然后对于每一次模拟,我们大致要同时做几件事。我们要在当前树里判断哪些走法最好。如果到了需要添加叶子的时候,就给树增加新的叶子,同时更新树上各个动作的价值。每一次模拟基本都包含这样一个四步过程,这四步就是选择、扩展、评估和回传。在蒙特卡洛树搜索刚开始的时候,我们的树非常基础,只有根节点,也就是我们 AI 当前要下的那个棋盘。我们要为这个根节点选择最好的动作。当我们创建根节点时,我们可以用神经网络来评估它,得到一些量,比如 V theta 以及动作的概率分布。对于根节点的所有可能动作,我们可以创建一堆子节点。比如我现在画的是一个三乘三的棋盘,上面已经有一枚棋子,所以根节点一共关联着八个可能的子节点,每个子节点都有一个对应的动作概率,对吧?比如 P八、P一、P二等等。所以在蒙特卡洛树搜索开始时,我们有根节点,并且可以用这些子节点来初始化它,因为策略网络评估完根节点之后,对于这个已经有一枚棋子的三乘三棋盘,给出了八个 AI 可以下的子节点。对每个子节点策略网络也给出了选择它的概率。那么第一步就是进行树的选择。现在这还是一棵非常浅的树,深度只有一层,我们第一次选择就是根据 PUCK 准则来最大化,或者说取 argmax。这个准则大致是 Q s a 加上 c puck 乘以 pa 除以 n,再除以 1 加 Na。一开始每个动作的 Na 都是零,n 也是零,我们就照这个准则来挑。一开始选择的动作很可能会偏向概率最高的那个,因为概率对大家来说都差不多。假设 P1 是概率最高的节点,你就选中了它,到这个节点后,你发现它不是叶节点,对吧?游戏还没结束,不是终局,所以没法得出最终结果。下一步就是扩展。你会用 policy network 来处理这个节点,这个棋盘状态。注意,这是 AI 在走棋,对吧?所以当我们扩展这棵树时,我们思考的是人类或其他对手可能会怎么走。扩展过程里,我们会从这个玩家的视角来评估节点。这个节点有一些可能的走法,我们就把这些叶节点扩展出来。对于每个可以到达的节点,我们去检查它们有多好。比如人类可以走这里、这里或这里,然后我们会存储每个节点的 V theta 值,像节点一的 V theta,节点 one prime 的 V theta。我们基本上是用 neural network 来做一个直觉猜测。从这个玩家的角度看,当前棋盘有多好。幸运的是,因为这是零和游戏,很容易推导出这一步里这个玩家的价值,就等于一减去对手视角的价值。所以根据你处在哪个玩家,很容易翻转搜索过程,这就是扩展步骤。你拿了一个非叶节点扩展它,并评估了价值。这本质上是快速猜测,如果我走到底,我会赢还是输。你几乎可以把 V theta 看作是对任何给定模拟搜索到树末尾的捷径。然后这其实就到了评估这一步。我们在评估每个棋盘的质量。在最初的 AlphaGo 里,他们做了一件挺有意思的事,他们把这个价值和一个真实围棋 play out 的价值做了平均,他们会真的从这里开始走一盘完整的棋,一直走到棋盘终局分出胜负,就像我画一条弯弯曲曲的线来表示一条路径,他们一直走到整盘棋,得出结果,这就是一个零或一的结果。然后他们把这个价值和刚刚那个价值做平均,他们用的公式大概是 alpha 乘以某个节点的 V theta 值,加上一减 alpha 乘以一个真实随机采样的 play out 值。你可能会问,那他们怎么走这个 play out 呢?在这个 play out 上再做一次搜索成本太高了,几乎就像树中套树,所以他们没这么做,而是直接用 policy network 自我对弈,让双方都用这个网络一直走到结束。这有助于让估计值更贴近现实,因为你能得到一个单样本的胜负估计。你可以想想,在棋盘几乎快分出胜负的终局阶段,play out 其实很有用,因为按照策略走出的对局大概率能给出相当合理的胜负猜测,这样你就不会遇到估计值和现实脱节的问题。但后来发现这完全没必要。在 AlphaGo 之后的所有论文里,他们就去掉了这一步。在我的实现里,我也照做了,速度因此快了很多,因为不用在每次模拟时都 roll out 这些对局。好。
98:01
Mm.
98:02
Okay.
98:02
So what happens if you don't have the ability to easily search a tree, right? Like in Go, it's a perfectly observable game.
98:10
You can easily construct a pretty deep tree that c- completely captures the game state.
98:14
In a game like StarCraft, where you don't have really complete control over the binary, it's, it's a little bit hard to do this, and I'm not even sure if it's a, it's a deterministic game, right? So, so that makes this, uh, kind of difficult from a data structures perspective.
98:27
So, um, what is done instead is that the, the basic idea of supervising your actions with a better teacher is still there, right? So, so if, if in a given neural fictitious...
98:41
So we're gonna talk a little bit about how neural fictitious self-play works.

24 MINS LATER

122:17
Yeah

We value your privacy

We use cookies to understand how you use our platform and to improve your experience. Click “Accept All” to consent, or “Decline non-essential” to opt out of non-essential cookies. Read our Privacy Policy.