Dwarkesh Podcast

Eric Jang – 从零构建AlphaGo

Eric Jang – Building AlphaGo from scratch

二〇二六年五月十六日 收听原版播客

Eric Zhang(前Google DeepMind高级研究科学家,现任1X Technologies AI副总裁)在休假期间重建并改进了AlphaGo,从头讲解其构建过程。围棋是双人确定性游戏,棋盘19x19,分支因子约361,树深约300步,穷举搜索不可行。AlphaGo的核心突破是使用深度神经网络使搜索可行:策略网络(预测好棋概率)和价值网络(预测胜率)加速蒙特卡洛树搜索(MCTS)。MCTS每步模拟包含选择(PUCT标准)、扩展、评估(神经网络前向传播)和回溯四步,生成比原始策略更尖峰的分布π。训练通过自我对弈实现:用MCTS结果作为监督信号蒸馏回策略网络,迭代提升棋力。Eric用约3000美元计算资源(Prime Intellect捐赠)训练出强围棋AI,对比AlphaGo Zero的3e23 flops,展示了计算效率的大幅提升。

A

今天我和 Eric Zhang 一起,他最近是 1X Technologies 的 AI 副总裁。在此之前,他是现在 Google DeepMind Robotics 的高级研究科学家。过去几个月你一直在休假。你做的其中一件事就是重建、改进和破解 AlphaGo。所以今天我们想让你从头讲解构建 AlphaGo 的过程,以及这对 AI 研究和开发的未来意味着什么。但在那之前,AlphaGo 为什么有趣?为什么你选择在休假期间做这个项目,而不是去海滩放松?

B

当然。我喜欢动手做东西,AlphaGo 和围棋 AI 是真正让我进入这个领域的事物之一。当我在 2014、2015、2016 年看到 AlphaGo 的早期突破时,看到 AI 系统能变得多么智能,以及它们能通过深度学习处理的计算复杂度,这非常深刻。这是一个长期以来被认为对搜索来说难以处理的问题,却通过深度学习解决了。这对我来说相当神秘,我一直想更好地理解这个现象。我的训练背景通常是机器人领域的深度神经网络,其中神经网络做出的决策更直观一些,但 AlphaGo 这类问题中,决策实际上是极深搜索的结果。我一直很困惑,一个 10 层的网络如何能摊销游戏树中如此深层的模拟。

A

是的,有意思。

B

如果你绘制出多年来构建各种强围棋机器人所需的计算量,你会看到在 2020 年,有一个来自 Jane Street 的 David Wu 开发的开源项目叫 Katago,它基本上将训练一个非常强的围棋机器人所需的计算量减少了 40 倍。我不确定它是否比 AlphaGo Zero、AlphaZero 或 MuZero 更强,但它非常非常强。今天大多数围棋练习者在与 AI 对弈时,就是用它来训练的。而且多亏了 LLM 编码,原本需要 DeepMind 整个研究团队和数百万美元研究与计算资源的工作,现在只需几千美元的租用计算资源就能完成。

A

顺便说一句,如果你在音频平台上收听,这是一个黑板讲座,所以我强烈建议你切换到视频平台(如 YouTube),以便查看数学公式、图表和围棋棋盘。好了,我想我们应该先讨论一下围棋的规则。

B

很好。

A

那么,这个游戏是怎么玩的?

B

围棋是一个非常简单的游戏,可以快速轻松地在计算机上实现。游戏的目标基本上是放下黑白棋子,并尽可能多地占领棋盘上的领地。我可能会先放一颗黑子。黑棋总是先手。请开始。你俘获对手棋子的方式是,对于每个交叉点,如果你能用你的棋子包围它所有 4 个相邻点,那么这个棋子就被切断了“气”,然后它就成了死子。所以现在我就控制了这 4 颗棋子以及这个空交叉点。中国规则、日本规则和所谓的 Tromp-Taylor 规则之间有一些细微差别。Tromp-Taylor 规则被设计成完全无歧义,相当于围棋界的“标准规则”。所有围棋 AI 都基于此进行训练和裁决。在典型的围棋中,比如人类对弈时,你实际上不允许把白子放在这里,这会是自杀。但在 Tromp-Taylor 规则中,这是允许的。你放下它,然后它立即被判定为死子。所以结果是一样的。我们重新开始,下几颗棋子,然后我再进一步解释。我就从这里开始。

A

好的,我基本上是在随机下棋,但我想绕过你的棋子,看看能不能——

B

没问题。

A

——俘获它们。

B

是的。嗯,这一步让你的白子暴露了一个空邻居,这很像象棋中的“将军”,如果你不立即在这里放一颗棋子回应,我就可以立刻俘获它。啊,我明白了。好的。

A

因为是对角线——

B

决定了它是否有根基?是十字交叉,不是对角线。所以这颗棋子被三面包围了。是的。如果你不立即在那里放一颗棋子,你就有失去那颗棋子的风险。现在你可以看到我开始给你施加压力,因为我把一颗棋子放在这里,你就被迫在这里放一颗。

A

否则你就会把这个两子块据为己有。

B

是的。然后如果你思考一下,如果你在这里回应会发生什么,你大概可以搜索未来的步骤,推断出我接下来会做什么——你自己想想看。

A

你对我的能力很有信心,但我猜你会把黑子放在这里。

B

没错。然后我就会俘获这三颗棋子。

A

所以我应该认为这一块已经没了。这个小块没了。

B

是的。在围棋中,让对手俘获一些棋子其实是可以接受的,比如如果这能让你在棋盘其他地方布局俘获更多棋子的话。这就是围棋的美妙之处:你可以输掉局部战斗,但赢得全局战争,对吧?随着棋盘尺寸增大,这种微观与宏观动态的复杂性会变得更加有趣。

A

但你可能还是会在这里放一颗。

B

嗯。那么现在我会俘获这一整块。好的。这块就是我的了。好的,还有一个我想演示的情况,我最近代码里正好有个 bug,就是下面这种情况。我们考虑这样一个阵型,对吧?然后,棋盘上还有其他棋子在对弈中。我们来谈谈游戏如何结束,对吧?在这片领地中,谁控制这些区域?是白棋还是黑棋?

A

白棋。

B

实际上是黑棋,因为我实际上包围了整个区域。是的。假设我在这里还有其他黑子,你很难打破这些棋子的控制。

A

所以当最终计分时,这些棋子也会算作——是的,好问题。

B

所以,不同的规则集有不同的计分方式。我们需要聊聊人类和计算机围棋是如何判定分数的,因为人类在评估时其实存在一些模糊性。大多数人类看到这个棋盘局面会认为黑棋已经完全包围了白棋,白棋没有活棋的机会。我们可以继续下几步,但最终我会吃掉所有白棋。是的。然而,如果你有办法打破这个阵型,把白棋连接到外面的棋子,局面就可能翻转,对吧?这就是计算机难以判断这类情况的地方。那么人类是怎么做的呢?值得思考一下人类如何解决这个问题,因为这实际上会映射到我们后来对深度神经网络的思考。人类基本上会说:"我觉得棋局结束了",然后对方也必须说:"我也觉得棋局结束了",接着我们会说:"我认为这些是我的棋子",对方需要同意。如果不同意,就继续下。是的。所以本质上,当两个人类——他们的所谓价值函数——达成共识时,中国规则就会据此判定。是的,有意思。而在特朗普-泰勒计分法中,这是完全明确的,计算机可以用算法判定。假设你在终局阶段,计分方式是先数你控制了多少棋子,这很明确。然后数那些没有被对方棋子触碰的空交叉点。这些交叉点不会算给任何一方,因为它们都与白棋和黑棋相连,对吧?如果是这种情况,白棋会得到3分。这有点奇怪,因为人类知道白棋实际上在失去这些点。是的。但特朗普-泰勒计分法会认为白棋拥有所有这些点以及这些点。明白了,好的。所以计算机围棋和人类围棋在计分上存在很大差异。

A

棋局如何结束?

B

棋局在一方认输或双方连续弃权时结束。酷,是的,这就是规则。很好。

A

好的,现在帮我用AI破解这个问题。太好了。我们来理解一下AlphaGo实际上是如何工作的,以及听众中的人如何能实现它。很好,是的。

B

我们先从直觉上理解用于走棋的底层搜索过程,然后加入深度学习的思路,使其更高效、更可行。围棋是双人游戏。我们画一个人和一个人工智能。假设这个人执黑先行。他们下在这里。然后AI会根据看到的局面走棋。这里有个问题:如何将这些输入编码给AI?也许可以用1和0,但你需要表示黑棋、白棋和空位,所以至少需要3个不同的值,对吧?也许可以用0、1和2。AI可能会看到类似0、0、0、0、1这样的输入。好的,这就是AI在它回合时的输入。是的。AI可以选择3个可能的随机走法,我随便画的。哪个走法最好?我们直到棋局结束才知道。围棋没有任何局部奖励来判断哪步棋好。这就是围棋很难的原因:你实际上要到棋局结束才知道谁赢了。这棵树有多深?在19x19的棋盘上,每一步大约有361种可能。当然,随着棋盘填满,可能性会减少。棋局步数大约在250到300步之间。专家可能会提前结束棋局,但在特朗普-泰勒计分法下,你必须下到最后。所以可能有300步左右。是的,树的深度大约300。如果你不断扩展可能的走法,AI走一步,人类走一步,以此类推,你会发现从这一个状态出发,可能的棋局结果会爆炸式增长。这大约是361的300次方,远远超过宇宙中的原子数。当然,实际上存在冗余和对称性,所以不是真正的300次方,但如果你做一个没有子节点合并的朴素树,就会得到这么大的树。你说的子节点合并是什么意思?我用这个棋盘解释。如果我们从这里开始,你下这里,我下这里,你再下这里,这等价于我先下这里,你下这里,我下这里,你再下这里,对吧?是的。两者通过不同路径到达同一位置。所以这个子节点可以被视为共享祖先。

A

我猜不是361,它从361开始,但每次减少1。

B

分支因子每次减少1。是的,是的。但无论如何,这是一棵非常非常大的树。这也是计算机科学家多年来认为围棋在本世纪不可解的原因,因为穷举所有可能所需的计算量太大了。如果可以,围棋其实是一个确定性游戏。在任何给定状态下,你可以计算出赢得比赛的最佳策略。你可以搜索所有你能赢的未来,然后确保自己始终留在那组未来中。所以AlphaGo的核心概念突破是使用神经网络使这个搜索问题变得可行。在讨论神经网络如何参与之前,我们先聊聊假设我们有一台足够强大的计算机,如何搜索这棵树找到最佳走法。一开始你不会构建整棵树,因为存储它太昂贵了。相反,你可能会交互式地找出哪些叶子节点值得探索和扩展,看看未来还有什么。在bandit文献中有一些早期算法,比如UCB1,它不完全适用于围棋这样的序列游戏,但极大地启发了AlphaGo中使用的动作选择算法。UCB1看起来是每一步都选择最佳动作,即最大化Q(A)的argmax,我稍后会解释Q(A)是什么,再加上某种探索奖励。在每个节点上,我们会跟踪几个量。我们把每个都看作一个节点。这是根节点,你从这里做决策。这些是根节点的子节点。每个节点基本上是一个数据结构,存储这个子节点的访问次数。

A

是父节点访问这个节点的次数吗?是的。我们称之为一个动作。

B

所以一个容易让人困惑的地方是,如果你来自机器人学或其他强化学习领域,你会问:动作在哪里?对吧?我这里只讨论节点。节点代表状态。由于这是一个完全确定性的游戏,没有任何随机性,你实际上可以根据子节点推断出动作。我明白了。所以如果我走到这里,那就隐含了一个动作。而这是我们解决后得到的状态,对吧?所以如果你让大语言模型(LLM)用“氛围编码”实现一个蒙特卡洛树搜索(MCTS),它很可能会设计出正确的数据结构。但这有点像厨师的选择。你实际上可以按自己的喜好重写树结构。这是当我要求时,Claude 4.6 为我写的,这是一个非常合理的选择。那么 Q 代表这个动作的平均动作价值。我会用下标 A 来表示这对应于采取某个特定动作。从根节点出发,要到达这里,对吧?所以如果我们有根节点,基本上采取动作 a 就能到达这个节点。然后我们还会存储采取这个动作的概率。

A

同样,是从父节点出发。

B

是的,从父节点出发。比如,我们采样到这个节点的概率是多少?这之后会变得相关。目前我们讨论的是确定性树,所以概率问题我稍后再引入。最后,我们有一个子节点字典,就像经典链表风格引用树中的更多节点。这是实现树的基本数据结构。在 AlphaGo 中,他们使用了一种略有不同的动作选择标准,叫做 PUCT,全称是“预测上置信区间树”(Predicted Upper Confidence with Trees)。这基本上就是当你选择要走的子节点时,你会对 Q(s, a) 加上常数取 argmax。所以这些公式实际上非常相似。两者都是评分标准,对吧?你希望对这个量取 argmax,并以此决定采取哪个动作。那么我们来分解一下这里如何选择动作的直觉。这是平均动作价值。所以给定子节点平均有多好?如果你实际上知道整棵树,那么这就是你需要的全部,对吧?来选择最佳动作。你不需要做更多。但如果你在交互式地构建这棵树,同时也在计算 Q 值,那么你必须偶尔尝试其他动作,作为一种探索与利用的权衡。所以在 UCB 和 PUCT 中,都有这一项,它基本上奖励你采取之前没试过的动作。正如我们之前提到的,每个节点存储了采取该特定动作的访问次数。所以一切初始化为 0。对于某个动作,比如动作 A,初始是 0。所以随着 N 增加,假设我们已经从根节点做了 10 次动作选择,但还没选过 A,那么这一项对 A 来说会变得相当大。是的。相反,如果我们 10 次都选了 A,那么这一项就变得很小,衰减得非常快。这里的情况其实也一样。

A

为了确保我理解正确,也许我可以用自己的话复述一下。我们只关注 UCB。这里说的,你可以从概念上把它看作两件事:Q 和这个探索项。我们先明确 Q 是什么。Q 基本上是说,嘿,一旦我们做了这些 rollout,你实际上运行了所有这些模拟,沿着树往下走,然后你发现,如果我到达这棵树的终局值,我是否赢了这局游戏?然后你将从该节点出发的所有叶子节点的胜负结果取平均。这个平均值就放在 Q 里。正确。所以你的意思是 Q 基本上代表我是否会赢这局游戏?从该节点出发,我赢的概率是多少?这就是你的利用部分。它就像在说,我运行了这些模拟,我认为这是一个好棋或不是。而另一项是在说,相对于我可以探索的其他动作,我是否已经充分探索了这个分支?或者我已经探索过了。如果我还没探索这个分支,也许我认为它得分低,但我只是还没探索这个节点下足够多的叶子。所以即使 Q(利用部分)告诉我这个分支价值不高,我也应该试试它。因为 ln 增长比 n 慢,所以随着时间的推移,argmax 会从由这个探索项(第二项)主导,转变为由 Q 项主导,这就像在说,好吧,我已经做了足够多的模拟,我很确定这是该走的分支。

B

是的,没错。UCB 的动机是提出一种算法,当你不知道各个臂(arm)的回报,也就是最初可以选择的不同动作时,这种策略基本上会通过一个探索项,将你的遗憾(regret)限制在可能犯错的范围内。我不太清楚具体的证明,也不知道这个算法是否被证明具有对数或平方根级别的遗憾上界,但我觉得这个算法就是被推导成这样的形式。你可以看到这些项的增长方式略有不同,这实际上是为了说明围棋在每一步中可选择的动作比标准的多臂赌博机问题多得多。是的。这里需要澄清一点:你刚才提到了一些关于概率的模拟。我们应该记住,围棋本质上是一个确定性游戏。那么,概率的概念从何而来呢?如果你有一台非常强大的计算机,就没有概率可言——你只需计算平均动作价值的真实均值。那么概率是从哪里来的呢?事实证明,在 AlphaGo 之前的计算机围棋中,我们一直使用某种蒙特卡洛方法,即通过随机选择的树来计算期望的 Q 值。这个随机选择的树就是概率的来源。因此,Q 的解释是:在某种随机搜索过程产生的随机分布下,动作的期望价值。这说得通。那么随机搜索过程又是如何引入的呢?这就是动作概率 P 发挥作用的地方。是的。如果我们假设一个非常简单的算法,其中每个合法动作被选中的概率是均匀的,那么在这个设置中,这个概率就是合法动作数的倒数。你会在这个非常分散的树上取平均值,对吧?这是一个有效的积分,但速度非常慢,因为你会考虑大量价值很低的树。这本质上就像一个重要性采样问题——只有少数动作和路径能产生高价值,而其他几乎所有路径价值都很低。所以这是一个棘手的问题。好的,这就是你决定如何向下搜索的动作选择标准。现在,当你沿着树搜索向下移动时,最终会遇到一个节点,在那里很明显你已经赢了或输了,对吧?在游戏的最末端,当 Trump-Taylor 计分制下没有合法动作可下时,你可以判断自己是赢了还是输了。所以你要么赢,要么输。这基本上就是整局游戏的最终回报,对吧?那么问题来了:我们可以为树的终端叶节点分配一个价值 U,但如何为之前的节点(父节点)分配价值呢?事实证明,你只需取平均动作价值,也就是平均值。假设这些是叶节点。抱歉,这些都是叶节点。这个节点(这个动作)的平均动作价值,就是叶节点上输赢结果的平均值。相应地,你可以沿着链条向上走,说这个节点的平均动作价值(我们称之为 QB,这是动作 B)就是这些节点加权平均值的平均值。是的。加权平均值可能取决于你是否使用了不同的采样分布,但基本直觉是,你想在确定输赢的情况下解析游戏,然后反向推导。这被称为回溯步骤(backup step),为这些节点或动作分配对应于最终终端叶节点平均值的价值。是的。好的,如果你在没有神经网络的情况下这样做,仍然难以处理。你会很难找到哪些动作需要采样。很多动作贡献的价值非常低,尤其是当你试图从劣势局面中脱身时,只有少数动作能带来高价值。所以实际中的搜索仍然非常昂贵。但思路是,由于围棋遵循树结构,你可以根据下游节点的价值(假设它们都正确且搜索深度足够)来非常准确地估计这个节点的价值。

A

你之前关于那些对人类来说胜负已分、但对计算机来说并不明显的状态的解释,实际上让我更直观地理解了为什么价值函数既可训练,又为何是有效学习这个游戏所必需的。也许我们首先应该定义一下什么是价值,但——听起来不错。

B

是的。我们讨论过这个 U 值是你最终判断输赢的结果,这是终端叶节点的条件。但人类并不会一直下到树的叶节点边缘,对吧?他们会在几十步之前就停下来,在高水平对局中甚至可能在一百步之前。那么他们是怎么知道的呢?你可以把人类想象成隐式地拥有一个称为价值函数的神经网络,它接收棋盘状态,然后评估输赢。人类扫一眼棋盘就知道自己可能要输了,对吧?他们本质上是在运行一个神经网络,这个网络看着棋盘,隐式地摊销了大量可能的游戏推演,取平均值,然后判断这个局面是否可赢,以及是否应该认输或继续下。这非常了不起。如果你思考一下这种做法的美妙之处,就像人类大脑中的神经网络能在瞬间完成所有这些模拟,仅凭结晶化的知识和经验,在几秒钟内就知道结果,而无需逻辑地推演每一局棋。这给了我们一个提示:在像围棋这样的游戏中,有办法从根本上加速搜索过程。这也是 AlphaGo 成功的基本直觉之一:你可以训练一个价值函数来观察棋盘,快速解析游戏,而无需将所有树搜索到很深的深度。

A

是的,有道理。我想对听众说,我在准备之前几期节目时,发现理解 AlphaGo 的工作原理非常令人困惑。但一旦你以这种方式理解了问题,然后再构建接下来的几个部分,它实际上会变得更容易理解,而且会很有意义。现在感到困惑也没关系,但到这次讲座结束时,你可能会发现它比你预期的要简单。所以我只是给听众提个醒。

B

对,从高层次来看,重要的直觉是——我们先退一步看看整体方向——传统上,像围棋这样的游戏,你可以构建一棵树,但我们没有足够强大的计算机来做这件事。是的。而且,估算你每一步可能采取的行动的价值也很困难,因为直到游戏结束你才知道结果。你可以通过把游戏玩到底来取平均值,但这同样困难,因为你不知道应该选择哪些行动来采样这些平均值。所以从概念上讲,这有两个问题:树的广度,以及树的深度。而AlphaGo提供了一种方法,基本上把这两个问题都缩小到非常可控的程度。这本质上就是它背后的核心思想。好,所以我们接受这个想法:人类可以扫一眼棋盘,立刻预测自己是否会赢,这或许能让我们大幅缩短搜索的深度。同时,我们也知道,人类可以看一个棋盘,凭直觉一眼就决定哪些走法可能是好的,对吧?所以,我们可以用深度神经网络来做这两件事,以加速搜索过程。我们先回到讨论神经网络之前,先说说这个对弈过程是如何运作的。我们只讨论了走一步棋,对吧?所以AI看着这个编码后的围棋棋盘,它有一棵树,它深入搜索这棵树,找出哪个行动可能是最好的,然后执行那个行动。然后现在轮到人类。也许人类现在看到一个这样的棋盘,然后,他们走一步棋。可能他们把棋子放在这里。然后我们再回到AI,它现在看着一个新的编码棋盘。我用2表示AI执白,1表示人类执黑,0表示空位。然后现在轮到AI,它从头开始重新做MCTS树搜索,对吧?它丢弃上一轮搜索过的旧树,现在有一个新的根节点,它开始重新搜索。如此反复。所以MCTS基本上可以看作是一个搜索算法,借助神经网络来决定最佳走法,并且在每一步棋都执行一次。

A

在你擦掉的时候,另一个对我来说很重要的理解点是:这个MCTS数据结构,包含节点、子节点等等,是在每一步棋时重新创建的,一旦走完一步就重新初始化。所以人类走一步,然后AI看着这个,试图运行一系列模拟,来弄清楚下一步该走什么。这些模拟,本质上就是在MCTS树中探索一个额外的节点。最后,当你运行了1000次模拟后,这就会形成一个——我想你会解释——下一步走法的概率分布。这就是你存储的内容。你根据这些概率选择最佳走法,然后丢弃所有数据,接着下一个玩家走一步,你在每一步开始时重新启动这个过程。

B

正确。有一点小补充:你并不是丢弃所有数据。你会保留一样东西,后面会用到。

A

是的。就像我为Reiner做的那样,我想为这期节目制作一些闪卡,方便大家记住这些概念。理想情况下,大语言模型可以生成一些候选内容,我再进行精炼。但为了获得真正高质量的建议,我需要设计一整套流程。让AI能够在正确的时间点截取黑板截图,然后在需要视觉辅助时生成SVG图表,再通过一个评判器来评估它们的文字和绘图,最后根据反馈修改卡片。仅仅通过堆叠大语言模型调用是很难做到这一点的。这种逐步的流程,如果你有一个持久的智能体,它在前面的所有阶段都参与了任务,效果会好得多。所以我用Cursor SDK为每张卡片启动一个智能体。Cursor帮我省去了设计自定义上下文框架或设计截图、制作动画的工具调用的大量工作。这些智能体都在云端运行,所以我不用担心笔记本电脑一直开着。当有候选内容需要审核时,我会收到一封邮件。你可以在flashcards.dworkash.com查看我的卡片。你也可以在cursor.com/dworkash开始使用智能体SDK。

B

好,现在我们基本了解了如何通过搜索来走棋的直觉。接下来我们要讨论神经网络如何通过提供类似人类直觉的模拟来加速这个过程。这里有两个网络。一个是价值网络,它接收一个状态,然后预测我会赢还是会输?这是一个二分类问题。另一个是策略网络,它生成一个关于好行动的概率分布。我会画一个一维的扁平化走法分布,但实际上它更像一个方形的网格,对吧?所以它可能认为某些行动是这样的概率分布。这两个都是分类问题,对吧?所以你可以像训练任何深度学习分类器一样训练它们,比如用交叉熵损失之类的。具体的架构其实并不太重要。我试过几种不同的架构。Transformer可以,ResNet也可以。根据我的经验,在数据量较小的情况下,ResNet的表现仍然优于Transformer,在较低的计算预算下性价比更高。但这可能不是绝对的。

A

哦,真的吗?为什么?

B

因为它们提供了局部卷积的归纳偏置。一般来说,当你需要更多全局上下文时,Transformer开始超越残差卷积网络。我明白了。好。Katago论文中一个有趣的发现是,他们发现将全局特征汇集起来,并在整个网络中聚合全局特征,对于让网络从全局角度理解如何将棋盘一侧的价值连接到另一侧非常有帮助。聚合全局特征是什么意思?是的。如果你有一个非常大的19x19围棋棋盘,这里有一些战斗,那里也有一些战斗,当你通过卷积神经网络处理时,卷积网络的感受野擅长计算局部特征并保持其不变性,但它们不容易将这两个特征连接起来,对吧?它们需要以某种方式汇集起来并相互关注。所以,关于为什么Transformer在计算机视觉任务中表现出色,比如视觉Transformer等,其论点在于,因为它们具有全局注意力机制,可以更轻松地做出这类预测。但你需要更多的数据,以便通过数据学习那些不变的局部特征。我费了很大劲想让Transformer解决这个问题,因为我很好奇Transformer是否会在围棋领域带来某种突破,并省去很多技巧。但尽管我努力尝试,目前我还没有找到让Transformer优于ResNet的方法。

A

抱歉,再问一个相关的问题。如果你需要考虑的信息不仅仅是空间上的——CNN给你一种偏置,即相邻的东西特别相关——那么Transformer凭借其全局信息汇集能力会更好,这说得通。

B

然后它们会被逐步聚合起来。

A

对,没错。但假设,好吧,对于那些局部情况不太相关的游戏,你基本上必须考虑全局。你说Transformer会更好。那如果是涉及空间维度的游戏呢?特别是时间维度,现在我们只考虑上一步,因为这是一个确定性的完全信息游戏。但如果像扑克或外交这类游戏,玩家很久以前的一次虚张声势对理解当前局势、决定下一步行动很重要,你就需要考虑所有之前的状态。那会不会改变对最相关的归纳偏置和架构的考量?

B

好问题。围棋是一个完美信息游戏。在完美信息游戏中,存在一个纳什均衡策略,它不会比任何其他策略更差。所以,如果你知道对手有特定偏好,比如他们喜欢激进打法,你实际上可以针对这个策略做出比纳什均衡策略更好的应对。但要应对任何给定策略,确实存在一个单一的纳什均衡,它仅凭当前状态就能决定。这是大多数围棋智能体——AlphaGo选择的设计,事后看来效果很好,因为纳什均衡似乎超越了人类水平。没有人类策略能击败它。现在,有些变体需要你考虑时间历史。这是一个非常令人兴奋的研究领域,我鼓励大家fork我的仓库并尝试这些方法。比如,如果你玩2v2围棋,你需要建模队友的行为,而你可能不知道他们的打法。所以你需要汇总一些信息来做出相应反应。是的,这些情况不再是完美信息游戏。在这些不完美信息或部分可观测的游戏中,你需要一些上下文来构建模型。我认为在自我对弈或外交风格方面,这会变得非常有趣。好,回到神经网络,架构本身不是特别重要。你可以用Transformer实现,也可以用ResNet实现。我发现对于低预算实验,ResNet效果稍好。你也可以用Karpathy风格的自动超参数调优来优化架构。所以你不必太担心这个。你只需要设定问题,使其有一个目标优化。好,我们选一个对我工作有效的、有点随意的架构,但再次强调,这部分不是特别重要。你有编码后的棋盘状态,我们选择用3个通道,类似RGB:一个通道编码黑子,一个通道编码白子,另一个通道编码空位,或者如果你想在多种棋盘大小上训练,可以编码掩码区域。我现在不讨论多种棋盘大小,那有点太复杂了。所以我们假设有一个2或3通道的RGB图像,然后进入ResNet,再分成两个分支头。一个头预测价值函数,这是一个单一的logit,比如R1。另一个头是策略,比如R361。这就是架构,我们基本上要训练它根据棋盘状态预测游戏结果,同时训练它预测好棋。最初的AlphaGo论文,即AlphaGo Lee,用专家人类对弈的监督学习数据集初始化了这个网络。后来,他们通过让模型自学如何下好棋去掉了这个限制。但我发现,从实现角度来说,对你的听众非常有用的是,总是从简单的东西开始初始化实验,让问题先跑通,然后再尝试从头学习。就像深度学习中的初始化一样,初始化就是一切。你总是希望将研究项目初始化到尽可能接近成功,特别是当你做新的事情时。总是选一个能工作的东西,然后让它做得更好,而不是从完全不工作的东西开始,再试图让它工作。基于这个理念,从一个好的初始化开始是个好主意。所以我们用专家人类对弈数据训练模型预测好棋。我们取所有赢棋的棋局,即专家赢的棋局中的所有落子,然后预测这些动作。然后,无论棋盘状态如何,无论输赢,你都要预测结果。你可能会想,在早期棋盘上,比如只下了一颗子,你怎么可能知道谁会赢?如果你有几十万局棋,平均来看,你会看到从这种开局分支的棋局中,大约一半会赢,一半会输。所以这没问题。当你训练模型预测这些时,logit会收敛到0.5。所以对于这些情况,一旦你训练好模型,起始棋盘状态会显示0.5,然后随着游戏进行,到结束时,胜率要么上升要么下降。这是你的步数。随着你进入几百步,在专家数据分布下,谁更可能赢或输就变得清晰了。

A

我没理解为什么这种思考价值的方式对专家数据特别重要。

B

这并不局限于专家数据,而是适用于你训练模型的任何数据。是的。所以如果你从零开始学习,你也会预期到这一点。没错。如果你只是这样做,想象一下你在用 vibe coding 的方式编写 AlphaGo,并从网上的 Katago 收集一些专家数据集,或者你有一个人类玩家的数据集,然后训练这个模型。实际上,这个模型已经是一个相当不错的围棋选手了。它很可能击败大多数人类玩家,对吧?所以如果你只取这个策略推荐,并对其取 argmax——如果这是概率分布,你取 argmax 并直接把这个动作作为你的围棋走法,它会是一个非常非常快的围棋选手,不需要考虑推理步骤。它只是凭直觉行事,而且会是一个很强的围棋选手。如果你想想只有 10 层神经网络,可能不到 300 万个参数,就能做到这么令人印象深刻的事情,这已经相当神奇了。是的。所以你可以从这一步开始,在实现时验证这一点很重要,确保你的围棋规则实现正确,并且你能相对快速地运行这些模拟。这就像一个检查点,在你尝试叠加更复杂的东西(比如搜索)之前,确保你能完成这个基本步骤。是的。但我们可以做得比直接使用原始神经网络来下棋好得多。这就是我们如何将其应用于蒙特卡洛树搜索。所以让我们用神经网络来改进蒙特卡洛树搜索。我们从根节点开始,现在有一个 4 步的迭代过程来执行 MCTS。这在我第一次读论文并试图理解时让我困惑,但本质上我们要做的是选择一定数量的模拟,比如 num_simulations。这个数字会变化。它可以在 200 到 2048 之间。我相信在 AlphaGo 与李世石的对局中,他们每步棋用了数万次模拟,因为他们想尽可能提升模型的强度。是的。但在训练中,你实际上不需要那么多。而 Katago,我认为也用了这个量级的模拟次数。

A

你知道他们是否用了——如果你看过纪录片,他们在比赛期间放了一台笔记本电脑。但他们并没有用那台笔记本电脑本身。

B

它是在某个 TPU pod 上运行的,我想。是的。但现在——说实话,有点不公平。嗯——

A

李世石可没用 1e22 次浮点运算来下一步棋,你知道吧?

B

说得对。有趣的是,现代围棋AI在测试时并不需要那么多算力。当我们讨论MCTS策略改进的工作原理时,会发现随着时间推移,原始网络实际上会把那个大型TPU集群的所有负担都吸收进网络本身。你只需要一次神经网络前向传播就能完成所有工作。但TPU集群始终会在基础上提供额外的性能提升。这就是他们为比赛准备的东西。所以我们来讨论这个num_simulations参数。每次模拟,我们基本上要同时做几件事:看看当前树中哪些走法最好;在需要时向树中添加新的叶节点;以及更新树的动作价值。这就是每次模拟包含的四个步骤:选择、扩展、评估和回溯。在蒙特卡洛树搜索开始时,我们的树非常简单,只有根节点,也就是AI当前要下棋的棋盘状态。我们首先要为这个根节点选择最佳动作。创建根节点时,我们知道可以通过神经网络评估它,得到Vθ值和动作概率分布。我称之为根节点。对于所有可能的动作,我们可以创建一系列子节点。比如这里我画了一个3x3棋盘,缺了一个位置,所以有8个可能的子节点。每个子节点都有对应的动作概率,比如P8、P1、P2等等。在蒙特卡洛树搜索开始时,我们有根节点,并可以用一些子节点初始化它,因为策略网络在根节点上的评估告诉我们,在一个已有一步棋的3x3棋盘上,AI有8个可能的子节点。每个子节点,策略网络也给出了选择它的概率。第一步是树的选择。目前这棵树很浅,只有深度3,实际上就是1。所以我们的第一步是通过最大化或argmax一个标准来选择,这个标准是Q(s,a)加上C_puct乘以P(a)乘以根号N除以(1+Na)。对于每个动作,初始时Na和N都是0。所以我们基本上就按这个标准选择。一开始,最可能的选择会偏向概率最高的动作,因为其他项都是均匀的。假设P1是概率最高的节点,你选择了它。到达这个节点后,你发现它不是叶节点——游戏还没结束,无法得到最终结果。下一步是扩展。你将这个节点(棋盘状态)输入策略网络。注意这是AI的走法。当我们扩展这棵树时,现在要考虑人类或任何对手可能怎么走。树扩展过程完全是——当我们评估这个节点时,要从这个玩家的角度来评估。这个节点有多个可能的动作,我们扩展这里的叶节点。对于每个可能到达的节点,我们要检查它们的好坏程度。比如从这里,人类可能下这里、这里或这里。我们要存储每个节点的Vθ值,比如节点1'的Vθ。我们基本上用神经网络直观地判断这个棋盘对这个玩家来说有多好。幸运的是,因为这是零和游戏,很容易推导出这个玩家在这个步骤的价值就是1减去从另一个角度得到的价值。所以根据玩家不同,很容易翻转搜索过程。这就是扩展步骤:你取一个非叶节点,扩展它并评估其价值。这基本上是一个快速猜测:如果我下到终局,我会赢吗?你可以把Vθ看作搜索到终局的捷径。这就是评估步骤,评估每个棋盘的质量。在最初的AlphaGo Lee中,他们做了一件有趣的事:把这个价值与真实围棋对局的价值取平均。他们实际上从这里开始模拟一局完整的棋,一直下到终局。我画一条曲线表示路径。他们一直下到Tromp-Taylor规则下的完整棋盘终局,结果是0或1。然后他们把这两个价值取平均,公式是α乘以某个节点的Vθ加上(1-α)乘以真实随机模拟的结果。你可能会想,他们怎么模拟这局棋?如果再做一次搜索,成本太高,就像树中套树。所以他们不这样做,而是直接用策略网络自我对弈,让两个玩家都用策略网络一直下到终局。这有助于让这里的估计更贴近现实,因为你可以得到一个关于输赢的单一样本估计。在终局阶段,棋盘几乎已定,这个做法会很有用,因为策略网络的走法很可能给出一个合理的游戏结果。这样就不会出现估计脱离现实的问题。事实证明这完全没必要。在AlphaGo Lee之后的所有后续论文中,他们都去掉了这个步骤。在我的实现中,我也做了同样的事,这大大加快了速度,因为你不需要在每次模拟中都进行完整的对局。

A

好的,为了巩固我自己的理解,也为了向听众重新解释一下。顺便提一下,如果还不清楚的话,选择步骤中的那个p就是来自网络的概率。没错,是策略网络。好的,所以从根本上说,一次模拟就是搜索过程中多展开一个节点。

B

差不多。当整棵树已经存在时,模拟是很容易理解的,对吧?你只需要根据Puck选择标准沿着树往下走,然后继续前进。在AlphaGo中,数据结构是这样的:我们一开始只有一棵深度为1的树,也就是只有它的子节点。然后你要在沿着树选择动作的同时,迭代地构建这棵树。这就是核心所在,因为围棋是一个组合复杂度极高的游戏,你无法事先构建好整棵树再进行搜索。你必须在构建树的同时进行搜索。好,让我最后讲一下最后一步,也就是回溯。一旦你给这些节点打了分,你基本上就是取平均值,这个节点上执行该动作的Q值就是你在这里评估值的平均值。你会在所有已执行的模拟中取一个运行平均值,然后对子节点的值取平均。这就是所谓的回溯步骤。一旦你评估了这个值,你就可以递归地往回走。所以如果你知道了这个节点的动作值,你就可以对其父节点取平均值,以此类推。所以这是一个四步过程:首先选择你目前知道的最佳动作,然后你可能会遇到一个之前没访问过的节点,所以你需要扩展一下树,接着你通过网络运行平均值来猜测你是否会赢,最后你一路回溯到根节点,更新你对最佳走法的估值。当你迭代执行这个过程时,这个选择标准会让你访问——因为你总是根据这个标准来选择,所以你总是会在任何给定分支上选择你认为的最佳动作。因此,你最终选择这些动作的访问次数,会反映出通过这个搜索过程诱导出的正确策略分布。而我们之前存储在节点中的访问次数,实际上就成了最终应该选择哪个动作的投票依据。是的。所以,作为理解程度的测试,值得思考一下我们能否让这个过程更简单。比如,我们能不能干脆去掉这个部分,仍然让系统正常工作?回想一下,当你在这个节点进行扩展和评估时,你是在检查每个子节点的获胜概率。如果这个节点是1,而其他节点是0,你确实能知道哪个动作可能更好。那么为什么还需要这个呢?为什么不直接把这个归一化成一个分布,然后把它当作你的策略分布呢?这没问题,这样做可能也行得通。但在实践中,通过一次前向传播得到一个相当不错的猜测,正是用来剪枝搜索广度的方法。这里存在一种对偶性。假设策略推荐了一个与价值评估相矛盾的动作,那就会很奇怪。如果策略说这个动作概率很高,但价值评估说它价值很低,那么你的策略头和价值头之间就存在根本性的不一致。所以它们是相互关联的,如果你能找到另一种方法仅从价值评估中恢复出策略,你也许可以去掉这个部分。

A

但为了确保我理解正确,你不这么做的原因是为了避免做360次独立的前向传播,比如“嘿,这是所有东西的价值,我们取argmax”,对吧?相反,你只需要做一次前向传播就能得到所有动作的概率。

B

通常你可以把这些批量处理得相当高效。所以在实践中,这可能不会带来巨大的计算负担。但没错,你需要将最多361个棋盘状态传入一个迷你批次更新中,以评估所有这里的价值,然后进行归一化。实际上,我们仍然保留这个部分还有一个更重要的原因,那就是蒙特卡洛树搜索如何自我反馈,并递归地改进自身的预测和搜索能力。这就是为什么把这个部分作为一个显式的实体来建模,而不是作为价值评估的隐式归一化,是一个好主意。有道理。好。我们讨论了模拟过程,基本上,随着模拟次数的增加,你最终得到的树看起来就像我画的这个低维版本。当然,在真实游戏中,它要高维得多。但你最终会得到一个树结构,其中有很多叶子节点因为价值被认为太低而被终止,不再被访问。但在某一条路径上,会有一组访问次数非常高的动作,随着N的增加,它们会趋向于那一组决策。这就是蒙特卡洛树搜索中树的直观图景。你应该把它和穷举树对比一下,比如井字棋,你可以说,有9个动作,然后是8个、7个、6个,所以它的大小是9的阶乘。而围棋中的蒙特卡洛树搜索非常稀疏,它只考虑你扩展了子节点的那些路径。好,现在我们有了应用价值函数和策略函数的搜索算法,接下来可以讨论蒙特卡洛树搜索算法如何作为这些函数的改进算子来运作。

A

20年前,Jane Street的数据中心只占办公室的一个角落。联合领导技术团队的Ron Minsky告诉我这一切是如何开始的。我们有一个计算集群叫Hive,我记得第一个版本的Hive就是六台戴尔服务器叠在一起放在过道尽头。交易系统也放在那里,因为我们想确保能随时关掉那该死的东西。这有好有坏,比如有一次,清洁工在吸尘时拔掉了一个交易系统的电源。所以,最终把它们都放在数据中心里确实更好。Jane Street的数据中心从那六台戴尔服务器发展了很多,我和Ron以及负责物理工程团队的Dan Pontecorvo一起参观了德克萨斯州的一个数据中心。这些机柜,这些GB300机柜,峰值功耗大约140千瓦。相比之下,传统的风冷机柜大约是10到40千瓦。

B

所以高了很多。

A

我们深入探讨了运营这样一个数据中心的细节,很多是我以前从未考虑过的。里面充满了液体,一种蒸馏水或去离子水与丙二醇的混合物,丙二醇占25%。

B

这是为了抑制细菌或藻类的生长。

A

我不太喜欢需要担心服务器里长细菌的世界。我看到了比以往任何时候都多的数据中心内部运作。Jane Street愿意掀开地板,取出机架,带我到后面,所有冷却器所在的地方。你可以在janestreet.com/thoracash查看所有这些内容,我们在那里发布了完整的参观视频。

B

好,那我们现在来谈谈强化学习部分,也就是这个东西如何通过自我对弈变得更强。假设我们玩一个游戏,AI——你走一步,AI会计算搜索,然后得到一个访问次数分布。假设这是你的策略,初始策略在这个节点上的推荐。经过MCTS后,它对其中一个动作变得更确信了,对吧?所以分布可能变得更尖峰,像这样,基于搜索的结果。当然,你可以调整搜索过程,让它变得更分散,但那可能不是个好主意。MCTS应该对某些动作比其他动作更确信,但一开始它可能对其他动作赋予很大权重。随着模拟次数增加,它会收敛到一个非常尖峰的分布。所以这是新的,我们叫它π。我们把它包装成一个MCTS算子,输入是状态S。应用MCTS过程后,你的策略推荐分布变成这样,比之前更尖峰一些。然后你取argmax,或者可能从这个分布中采样,不一定是argmax。然后你走一步,扔掉这棵树,在下一步重新开始,对吧?所以再次计算一个新的分布。一开始你的猜测可能像这样,然后通过MCTS精炼。

A

棋盘上应该多一个X,对吧?

B

抱歉,你说得对,是的。变成像这样的东西,对吧?所以在每一步,你都有来自策略网络的初始猜测,然后结合策略网络和价值网络的搜索过程,得出一个更确信的动作,你执行它。如此反复。游戏结束,一人赢一人输。AlphaGo自我训练的美妙之处在于,它实际上可以利用这个最终的搜索过程,即搜索过程的结果,告诉策略网络:嘿,与其让MCTS做这么多苦工才到达这里,你为什么不从一开始就预测这个呢?对吧?为什么不直接用这个猜测,而不是一开始的猜测?如果你的策略网络一开始就有这个猜测,那么MCTS需要做的工作就少得多。所以如果我们画一个测试时扩展图,假设这是模拟次数。在0次模拟时,你的隐含胜率大概是这里。没有任何模拟,如果你直接取这个原始动作,这就是你的胜率。随着模拟次数增加,胜率可能像这样。假设搜索1000步,你得到一个策略,达到这里,这很好。但如果你把这个MCTS策略网络蒸馏回你的快速策略网络,那么你可以从这里开始。如果通过蒸馏,这里变成了0,那么你再花1000步模拟,实际上可以到达这里。这几乎就像,如果你能把前1000步的搜索过程摊销到策略网络中,而不是搜索过程中,那么你可以从一个更好的起点开始,并在投入相同模拟次数的情况下获得更好的结果。

A

测试时扩展的Sigmoid型特性,随着模拟次数增加,胜率提升幅度变小。即使对于蒸馏后的网络也是如此吗?也就是说,我们从蒸馏后的网络开始,是否还能再次获得这些早期增益,还是说这本质上是MCTS固有的特性?

B

说实话,我其实不知道MCTS模拟的测试时扩展行为,而且我认为它可能对这个网络的实际强度非常敏感。我只是画了一个单调递增的函数,最终趋近于1。好了,别太在意曲线的形状,只要知道它是单调的就行。MCTS的想法非常巧妙:我们通过搜索得到了更好的结果。然后在下一轮更新网络时,我们训练它去近似1000步搜索的结果。这样,我们不是从这里开始,而是让神经网络从这里开始,然后在此基础上再应用1000步搜索,棋力就会变得更强。你可以一直这样迭代下去。所以AlphaGo的训练算法基本上是:拿那些在每一步都应用了搜索的游戏(无论输赢),这一点很重要,然后训练模型去模仿搜索过程。这其实和机器人学中的DAGGER算法有类比。我先画一个状态示意图,比如S0、S1、S2、S3。假设我们在一个MDP中采取了一系列动作,得到一条轨迹。这些动作可能不是最优的,对吧?也许我们最后输了。有一类算法基本上就是拿轨迹,然后重新标记动作,使其变成更好的轨迹。比如这里更好的动作可能是a0',这里更好的动作是a1',以此类推。MCTS所做的就是:你玩了一局游戏,最终输了,但在每一步,我都会给你一个严格更好的动作,你应该用它替代。它不能保证你一定会赢,但能保证如果你把这些元组作为训练数据,重新训练你的策略网络去预测这些更好的动作,你会变得更好。这和机器人学及模仿学习中的DAGGER算法非常相关,你需要在某个点收集干预。即使你处于一个不好的状态,比如一辆自动驾驶汽车偏离了道路,仍然有一个有效的动作可以纠正你,让你回到正轨。

A

对,好的,那问一个较真的问题:有没有保证MCTS一定比策略网络更好?比如,你可以想象在训练早期,因为MCTS受价值网络影响,而价值网络在早期还没在完整对局上训练好,MCTS可能比随机初始化的策略网络还差。所以MCTS比策略网络更好只是一个启发式规则,还是有某种保证?

B

没错。在实践中,这是一种启发式方法,也确实有效。不过,让我举一个例子,说明 MCTS 有时会给出比策略网络更差的分布。这种情况经常发生在自对弈算法训练到不错的状态后,却因为训练数据不够多样等原因而崩溃。假设有一个棋盘状态,策略网络的推荐非常好,比如 π(A, S) 的值很高。但也许因为我们玩了很多局游戏,其中机器人直接认输,而不是一直下到终局,它们就忘记了如何评估这类后期局面。就像我们之前展示的角落下法例子,重放缓冲区中的训练数据可能 100% 都缺少如何评估那些状态下价值函数的样本。于是你可能遇到终局价值非常差的情况。如果叶节点的终局价值不好,这种误差会向上传播,导致你的落子选择标准和回溯结果出现偏差。最终你访问的分布会与策略网络最初推荐的分布大相径庭。此外,如果模拟次数太少,还可能因为探索不足而产生方差问题。MCTS 只有在模拟次数趋近无穷大时才保证收敛。因此,搜索过程中的方差以及评估中的不准确,确实会损害策略网络推荐的质量。这就是为什么它不能保证一定改进。我怀疑这也是为什么 AlphaGo Lee 在训练算法中使用了完整对局到终局的方法,以便让系统基于真实对局来落地。在实践中,你也可以在 10% 的对局中禁止机器人认输,强制它们下到终局。这样你的重放缓冲区就能获得一些训练数据,真正解决那些人类玩家通常不会下到最后的后期局面。是的,是的。所以,如果你假设价值函数是正确的,MCTS 之所以能给出更好的策略,是因为——这是一个非常关键的假设链条——假设价值函数准确,那么搜索过程应该能给出比初始猜测更好的推荐。

A

对。好的,那么如果你有一个冷启动的策略,比如 AlphaZero 那种情况,最初几个 epoch 实际上策略基本没用,你真正做的只是下完整局棋。一旦我们下完了完整对局,对于前面的每一步,我们就能标记谁赢了、谁没赢。AlphaZero 的损失函数包含两个部分:策略相对于 MCTS 的好坏,以及价值预测相对于从这一步开始最终谁赢了的好坏。你可以认为这适用于每一个动作或每一步。在 AlphaZero 训练的初期,我们实际上是在让价值函数学会预测:如果你处于这个状态且你是当前玩家,谁会赢。仅此而已。等到价值函数训练好了,策略才会随之改进。

B

正确。好的,我发现有一个技巧相当有用——这不是经过同行评审的说法,所以仅供参考——我在自己的实现中发现以下做法很有帮助。你首先得确保价值函数是好的,然后再投入大量周期去做 MCTS。在垃圾价值预测上做搜索没什么意义。所以你要从一个好的起点开始。AlphaGo Lee 做得很好的一点是,它直接拿人类对局来训练,然后就能工作,对吧?完全可行。你也可以拿一个开源围棋机器人,让它自我对弈生成数据,这也行。所以如果你有一些包含合理高水平对局的离线数据集,你就能很容易地学会后期局面的价值函数。这正是启动搜索过程所需要的。

A

抱歉,你能再读一遍这句话吗?

B

当然。评估围棋后期局面其实很容易。当几乎所有棋子都落在棋盘上时,这几乎是一个可判定的问题,对吧?因为树的深度不确定性越来越低。所以,理性玩家下到终局的大多数对局,都是训练树终局部分价值函数的好数据。明白了,好的。然后随着你下更多对局,搜索会将好的价值回溯到树的中间节点。随着数据量增加,你的价值头会逐渐形成对什么是好局面、什么是坏局面的直觉。这些在棋局中期的判断比开局或终局要微妙得多。最难评分的是中期,而不是开局或终局,因为开局显然就是 0.5,而终局谁赢也很明显。所以价值函数最难学的是中期谁占优。这实际上与 TD 学习非常相似。是的,这跟 TD 学习有一个美妙的联系,我们稍后可以讨论,并与蒙特卡洛树搜索进行对比。所以,你首先需要好的价值函数,专家数据可以给你一个快速捷径。我建议从业者先这样做,初始化到一个好的起点。然后如果你想做 AlphaZero 或 Katago 那种从零开始的学习,你可以尝试在小棋盘上让随机智能体下随机对局。如果你下个 5 万局,实际上也能学到相当好的价值函数。因为在 9x9 棋盘上,随机对局已经能让你看到足够多的常见模式。然后如果你训练一个能同时处理 9x9 和 19x19 数据的模型——Katago 提出了这样一种架构——那么从 9x9 上训练的价值头到 19x19 会有相当好的迁移学习效果。

A

对,因为与其他棋类不同,围棋在棋盘尺寸增大时并不会引入新的棋子类型。

B

如果我们把问题推到极限,考虑一个非常小的 4x4 棋盘,如果你下 5 万局,你会得到大量类似 5x5 或 9x9 的终局状态。想象一下,纯粹随机对局也能产生相当合理的棋盘局面,这并不夸张。然后你可以很容易地给这些局面打分。这就是你获得自举能力的基础,从而能用搜索来改进策略。但非常关键的一点是,MCTS 需要准确的价值估计。你必须让价值函数落地。最终,如果没有一个落地的价值函数,MCTS 就会崩溃。

A

我很好奇,把价值和策略训练在同一个网络上能节省多少算力,因为它们共享相同的表示,学习效率能提高多少。这很有意思,因为我们刚刚讨论过它们本质上在做类似的预测,或者说应该彼此一致。所以我想知道,把它们放在同一个网络中是否真的能减少一半的计算量。

B

没错。最初的 AlphaGo 论文中,AlphaGo Lee 使用了两个独立的网络。而在后续的所有论文中,它们被合并成了两个头。这大概是为了节省算力。但要用非常严谨的科学方式来回答这个问题,其实——这是个简单的问题,但在实践中,如果你真的想追根究底,要彻底解决它需要相当多的工作。不过直观上,是的,它们共享了大量表征。而且正如我们提到的,策略网络和价值网络在进行评估时,应该在一定程度上达成一致,对吧?所以它们之间确实应该存在这种一致性。

A

告诉我这样想是不是不对。我觉得,当我了解大语言模型的工作原理,以及 RLVR(强化学习与价值网络)作为算法有多么简单时,我对它能做到的事情感到震惊——它仅仅通过一个“是/否”信号就能学会构建非常复杂的代码库等等。而在这里,我觉得如果你更深入地理解 AlphaGo,仅仅是通过预测 MCTS(蒙特卡洛树搜索),它反而显得不那么令人印象深刻了,因为你意识到:哦,你通过告诉它预期值,注入了大量偏差;你告诉它如何随着过程调整探索的步调;你为它构建了非常明确的树搜索。所以我不知道你是否也有这种直觉——实际上,你越了解它,2017 年的这项成就就越显得不那么惊人。我个人不同意这种看法。

B

我认为它们因不同的原因而意义深远。我对大语言模型和强化学习的了解不足以在你的播客中评论这一点。但我觉得 AlphaGo——为什么它是一个深远的成就?也许值得退一步来看:它确实不同于现代强化学习,我们可以讨论一下其中的一些算法选择。但我认为最深刻的一点是,一个 10 层的神经网络前向传播——基本上就是 10 步推理。当然,推理并不只是一条思路;它可以是分布式表征,同时进行大量思考。但按照设计,一个 10 层的神经网络只能进行 10 步顺序思考,对吧?10 步的神经网络,并行化、分布式表征的思考,能够以非常高的保真度摊销并近似一个几乎不可解的搜索问题。所以这是一个突破,我认为大多数人至今都没有完全理解这个成就有多么深远。这也是 AlphaFold 的基础,例如,你有一个非常困难的物理模拟过程,需要展开无数微观模拟,但一个相对较小的神经网络的 10 步计算,却能以某种方式捕捉到感觉像是 NP 类问题的东西,并将其压缩成一个单一问题。这让我怀疑我们对 P/NP 这类基本计算困难问题的理解是否不完整,对吧?显然,这不是 P/NP 的证明,但其中有一些令人不安的东西:一个感觉非常困难的问题,竟然能被一个非常简单的宏观解决方案攻克。

A

这是一个非常有趣的见解:很多被证明是 NP 难的问题——我不确定围棋是否被证明是 NP 难,但蛋白质折叠等——神经网络之所以能解决它们,是因为它们在最坏情况下是 NP 难的,但我们处理的并不是最坏情况。我们通常不关心最坏情况。你知道,这些问题通常有很多结构。

B

是的,我认为我们应该问自己的问题是,我们一直在以最坏情况复杂度来构思 NP 难问题的解决方案。我不会说这解决了围棋,对吧?它没有给出最优解的精确结果。但在实践中,它非常有用。同样的情况在 AlphaTensor 和 AlphaFold 中也得到了体现:是的,有一个非常困难的问题,在最坏情况下似乎不可解,但我们却能取得几乎任意程度的进展。所以,在极限情况下,这可能会是什么样子呢?如果你想要模拟非常复杂的东西,比如天气,或者预测未来——我们是否生活在模拟中?构建一个非常复杂的模拟所需的计算资源,可能比我们想象的要小得多,这基于我们将大量计算摊销到单个网络前向传播中的能力。有趣。所以对我来说,AlphaGo 是第一篇真正展示这种深刻模拟被压缩到少量计算中的论文。

A

我觉得自己完全没有资格在计算复杂性或数学方面评论这一点,但我想知道混沌在这里是否扮演了重要角色。天气的问题是什么?为什么预测一天后的天气需要 10 倍资源,而且每多预测一天,资源需求就持续增加?因为这是一个混沌系统。随着时间的推移,微小的扰动可以完全改变最终的估计。我想这很有趣。我猜对于围棋和蛋白质折叠也是如此。

B

这里有一个与天气相关的类比,可能适用于围棋。问题是:这是当前的棋盘状态。根据我们对两位棋手的了解,未来的棋盘状态是什么?精确的未来棋盘状态是什么?对吧?这对初始条件极其敏感。就像在这里放一颗棋子,就能完全打乱整个预测,对吧?所以这很难。这直观上就是一个混沌问题。然而,不知何故,我们却能预测谁会赢。这捕捉了大量的可能性。所以,存在一个我们真正关心的更宏观的量,即平均值或期望,或者某种关于许多可能未来的全局宏观结构。这是一个有趣的思考方式。在天气中,情况可能相同,对吧?我们并不确切关心特定经纬度上方 6000 英尺处的风速。我们关心的是飓风在哪里之类的事情。在混沌理论中,有一个经典的洛伦兹吸引子,看起来像这样,对吧?如果你从洛伦兹吸引子上的任何一点开始,你不知道最终会落在哪里,但你知道这个东西看起来像这样。对吧?所以有一种美:有时我们不一定关心微观尺度的事情,我们实际上关心的是宏观结构。这很有趣。

A

而这些事情是可以预测的。相比之下,像哈希函数这样的东西,虽然也极度依赖初始条件,但没有宏观结构——或者至少希望算法正常工作的话没有。

B

人们希望如此。是的,人们希望如此。

A

所以没有等价的价值函数,或者广义上“天气会怎样”这种有趣的东西。它实际上只关心:这一步是什么?100 步后的棋盘会精确地变成什么样子?

B

是的,直观上这似乎是正确的。同样,这也超出了我的专业领域,但我发现有趣的是,密码学和哈希的工具一直无法证明你不能提出快速近似方法。你不能提出快速近似方法,对吧?如果它们能做到这一点,那么你就能证明 P 不等于 NP。

A

是的。事实上,我们知道许多密码协议中都存在结构,比如 RSA 密码学。这种结构正是量子计算机用来破解它们的关键,对吧?我明白了。Reiner 有一篇非常有趣的博客文章,我们在那一期节目里讨论过。他在文中提到,如果从高层视角看密码协议和神经网络,它们极其相似。两者都有将信息逐层混合的序列结构。这是因为算法中存在一种趋同演化:在密码学中,你希望最终状态对初始条件极其敏感,这样任何改动都会让输出看起来杂乱无章;而在神经网络中,你同样希望所有信息相互依赖,因为你需要处理全部信息并考虑它们之间的关联。

B

没错,神经网络的最大能力就处于混沌的边缘。我记得 Joshua Strohdick 的团队在这方面有一些研究论文。是的,混沌本身有一些非常根本的东西,它不仅仅是无望的噪声。在混沌系统中,至少在那个边界上,存在某种有用的特性。不过,这只是我个人的哲学思考。我对数学的了解还不够深入,无法进一步评论。总之,我们稍后会讨论 LLM 强化学习,因为两者之间有一些联系。但让我们先回到 MCTS。它到底在做什么?关键在于,它并不是直接说“我们要提高获胜的概率”。它不会说“我们要提升所有获胜动作的权重,降低所有失败动作的权重”。重要的是,它做的是:对于每一个我们采取的动作,我们都通过 MCTS 进行了相当彻底的搜索,看看是否能做得更好。然后我们只是让每个动作变得更好——通过让策略网络预测那个结果来实现。这是一个非常非常巧妙的想法,因为每个动作都有一个监督目标。是的,与那种简单的朴素强化学习相比,你的学习信号方差非常低。那么,让我们考虑一个非常朴素的算法,它看起来更像今天的现代 LLM 强化学习:比如,我们取自我对弈游戏中的胜者,并鼓励它更多地采用那种策略。好的,值得思考一下:除了 MCTS,我们还有哪些替代方案来训练自我对弈的智能体?现在我们经常使用类似 LLM 的强化学习。这相关吗?我们能不能用那种方法替代?让我们稍微深入思考一下。假设我们有一个非常朴素的算法:我们建立一个由不同检查点智能体组成的联盟,让它们相互对弈。对于某一方获胜的游戏,我们强化那些获胜动作,然后重新训练策略网络去模仿那些动作,而不是使用 MCTS 的目标。那么会发生什么呢?假设你有一连串导致获胜的动作,并且两个智能体实力相当。实际上,我们假设策略 A 和策略 B 势均力敌,它们的真实胜率是 50%。假设你玩了 100 局游戏,每局游戏有 300 步。你采用某种进化策略或某种方式来扰动这些智能体,让它们做出不同的行为。或者你根本不扰动,只是让它们对弈,偶尔会发现其中一个可能比另一个有更好的策略。假设策略 A 赢了 51 局,策略 B 赢了 49 局。这仅仅是随机运气,或者你以某种方式扰动了策略 A 让它做到了这一点。为了建立一个非常简单的模型,我们假设其中 50 局游戏双方表现完全一样。抱歉,是 50 局游戏双方表现完全一样。而在那一局策略 A 获胜的游戏中,它的表现略有不同。它做出了一个关键决策,正常情况下它会做出不同的选择,但由于某种探索或随机噪声,它恰好做出了比之前更聪明的决策。那么,你的策略网络只有一个真正的监督信号,而其余 99 局游戏乘以 300 步的模仿动作,只会让你得到和之前完全相同的策略。因此,你的方差规模实际上非常糟糕,因为你只有这一个标签,而整个监督动作数据集却非常庞大——实际上,抱歉,让我稍微澄清一下。

A

好的,所以我们讨论的是,好的动作(即数据分布中的动作)只占所有游戏中所有动作的一小部分,而你想在这些动作上进行训练。这当然让我想起了 LLM 是如何通过策略梯度方法训练的。Karpathy 在参加播客时称之为“通过吸管吸取监督信号”。所以,是的,有趣的是,你所说的这种在围棋中难以处理、会阻止你达到更高水平的方法,恰恰是 LLM 默认的训练方式,对吗?

B

没错。所以这并不是说它不起作用。如果你想象将游戏数量增加到数百万个样本,只要你能找到某种方法屏蔽掉那些来自普通智能体的监督信号,你实际上可以获得一些有意义的监督样本。这时,事情就开始与强化学习中的优势函数、基线等概念紧密相关了。让我们看看这种非常朴素的方法的梯度方差,我暂且称之为梯度强化学习,它基本上就是奖励的总和。

A

好的,我明白你的意思了。

B

所以奖励的总和就是回报,对吧?在我们这个简单的设定中,我们只有一个指示变量来表示回报,要么赢要么输。所以当你输的时候,你就不训练——梯度是0,你不会用那些样本进行训练。而当你赢的时候,你就尝试预测那些动作,对吧?所以你可以把这个设定看作是这个通用公式的一个特例。问题在于,这种方式的方差非常大,因为当你把这些项乘起来,试图计算方差时,梯度的方差等于期望的平方减去……简单来说,我们可以假设这个平均值是0左右,如果你把它中心化到无信号的状态。这里的方差基本上意味着你是在对这个乘积项取平方。结果你会得到一个随t呈二次增长的项。所以在这种设定下,方差会在这个项的基础上产生耦合效应。现在让我们把这个映射到LLM的场景中,这样就能回答为什么LLM只做单步RL而不是多步RL。在LLM中,你有一个解码器,可能会预测出像"hello world"这样的词。所以在当前的LLM RL中,他们把整个序列当作一个单一动作,即a_t,而大T就是1,对吧?确实,由于Transformer通过条件概率乘积的方式构建,这个序列的概率等于整个序列的对数概率之和,也就是各个token的概率之和,比如log hell加log lo加log world。这是成立的。如果这个项等于1,那么它们就是一样的。然而,在采样过程中,如果你给每个特定token都分配一个奖励项,那么这些项和这些项之间就会产生交叉相乘的交互效应。所以问题就变成了:你如何把每个回合的功劳归因到所有这些不同的项上?

A

我想我困惑的是,在语言模型里,这样做会是什么样子?因为LLM只在回合结束时得到奖励。

B

你可以想象一种奖励机制,我称之为过程监督,你在每一步都会为每个动作获得一个奖励。

A

好的,所以你的意思是,不采用你写的那种方式——不过,按你写的,它最终也是求和,所以它们不需要相乘。但你的意思是,不那样做,而是把这些过程奖励在最后加起来,然后当作一个单一的奖励信号?没错。

B

对应一个单一的对数概率动作。

A

但这不就是一开始的写法吗?比如奖励的总和?是的。

B

所以数学中有点隐藏的一点是,我们假设当你把问题分解成多步问题时,你通过这个项的计算引入了动作之间的相关性。如果你把这些项分开,那么这会放大这个项的方差。所以在你没有分开的情况下,如果T等于1,你只有一个对数概率的估计和一个奖励的估计。现在,这个项仍然会出现在——在LLM中,它看起来更像——朴素的REINFORCE估计器看起来有点像单一动作的回报乘以……它看起来有点像这样。这是非常基础的形式,但它仍然是方差的一个贡献因素。所以你要确保,就像在这个例子中我们训练了很多中性标签一样,你要确保减去那些没有帮助的标签,只奖励那些真正让你变得更好的标签。直观上,这里的类比是:我们能否在训练目标中找到一项,使得它实际上被阻止这样做,或者这些项对梯度没有影响,而这个项对梯度有影响?

A

我想如果你在那里应用这个,你唯一能做的就是消除49局游戏。至少按你写的方式,会是51次——

B

实际上,最优的情况是提取出来,丢弃所有这些动作,只在你变得更好的那一个动作上获得梯度。是的,但你怎么做到呢?对吧。所以这在实践中是一个非常棘手的问题。这就是强化学习中优势估计发挥作用的地方。所以你要从你的乘数中减去一项,而不是用1和0的指示函数,你想要一个东西,它对所有这些项表现得像0,而对所有这些项表现得像1。

A

是的。所以如果你能说,嘿,我赢了这局游戏,这略高于基线表现,那你就可以做到。

B

嗯,你赢了很多局游戏。没错。但你不知道哪些局是因为你真正更好而赢的,哪些是偶然赢的。

A

你怎么设计一个基线,让它真正代表更好?

B

是的,这就是在RL中人们使用TD学习之类的方法来更好地近似质量函数,也就是我们之前提到的Q函数。你可以尝试从你的回报中减去它。我明白了。所以理想情况下,在RL中你真正想做的是,把那些让你比平均水平更好的动作推高,把那些让你比平均水平更差的动作压低。他们称之为优势。有多种方法可以计算它。我强烈推荐John Schulman的通用优势估计论文,它很好地阐述了如何思考各种计算方法。但归根结底,你想通过让这个项变小来降低方差,这样它就不会放大这个项的方差。对,有道理。

A

但这要求你对一个状态下的平均表现有一个非常好的估计。这又回到了我们之前讨论的价值函数问题。

B

对。所以请记住,在这种情况下,无模型强化学习(model-free RL)设置试图解决一个信用分配问题,即你不知道哪些动作实际上是好的、哪些是坏的。蒙特卡洛树搜索(Monte Carlo tree search)做的事情则根本不同——它并不试图进行信用分配,而是试图改进你采取的每个动作的标签。实际上,我们可以考虑一个完全不同的算法,叫做神经虚构自我对弈(neural fictitious self-play),它在AlphaStar和OpenAI的Dota等系统中取得了很好的效果。那么,我来谈谈如何将无模型强化学习和自我对弈中的一些想法统一起来。好,如果你没有能力轻松地搜索一棵树,会发生什么?比如在围棋中,这是一个完全可观测的游戏,你可以很容易地构建一棵相当深的树,完整地捕捉游戏状态。而在像《星际争霸》这样的游戏中,你无法完全控制二进制数据,这就有点难办了。我甚至不确定它是否是一个确定性游戏,对吧?所以从数据结构的角度来看,这变得有些困难。那么,取而代之的做法是,用更好的教师来监督你的动作这个基本思想仍然存在。所以,在神经虚构自我对弈中,我们来谈谈它是如何工作的。同样的想法,我们要为每个采取的动作生成更好的标签,就像在MCTS中一样。但如何推导出这些更好的标签呢?在MCTS中,我们执行搜索——假设我们有一个好的价值函数,搜索会给出比初始猜测更好的结果。在一个不容易模拟搜索过程的游戏中,他们转而训练一个所谓的“最佳响应策略”(best response policy)。所以,你固定你的对手。假设你正在训练策略A对抗一个强大的对手策略B。在《星际争霸》中,比如这些是虫族,你玩的是神族之类的。你固定对手,并将其视为一个经典的无模型强化学习算法,你的目标就是击败这个对手。这里你可以使用标准的TD学习技巧,或者PPO,或者任何无模型强化学习算法,来试图优化以战胜这个玩家。你训练时,奖励函数是这样的:如果击败了策略B,回报为1,否则为0。所以这不再是一个自我对弈问题,而是一个固定对手的问题,你只是试图最大化对抗它的得分。一旦你训练出一个好的策略——用你喜欢的无模型强化学习算法,比如PPO、SAC、VMPO或它们的混合——你就得到了一个能给出好标签的策略,指示在对抗那个玩家时应该怎么做。当你训练多个最佳响应策略时,你基本上可以将强化学习算法蒸馏成针对特定对手的标签。比如,你可能有一个对抗策略B的最佳响应策略,然后你有一个对手联盟,包括策略B、策略C、策略D。你会针对每个固定对手训练最佳响应策略,并用这个策略提供的标签来监督当前策略。这有点像——这几乎就是MCTS教师的替代品,对吧?不用MCTS教师,而是用无模型强化学习算法来找到能击败对手的最佳搜索动作。最后,你将策略蒸馏成一个所谓的“混合策略”(mixed strategy),它试图在所有可能对抗的对手之间取平均。这样得到的策略不会比联盟中随机选出的对手更差。这绕过了必须从MCTS推导教学信号的问题,但本质上仍然是用更好的动作重新标记状态,以改进策略。

A

为了确保我理解正确,这就像如果你赢了对抗另一个策略的游戏,你会强化那条轨迹上的所有动作。是的。

B

所以这里你可以使用多种算法,比如PPO、BMPO,甚至Q-learning。具体算法通常是无模型的,因为你没有搜索能力。但我想提一下MCTS和Q-learning之间一个有趣的关联。在MCTS中,你有一棵树,通过树叶子节点(或近似叶子节点)的价值函数解析,你可以沿着多个序列回溯,得到某种均值价值估计。你的Q值就是从多次模拟的平均中推导出来的。在无模型算法中,通常有一个估计Q值的部分。Q值通常通过TD学习来学习,尽管在PPO中,优势估计的方式不一定通过Bellman备份。但在Q-learning中,有一个很酷的技巧:Q值被备份为R加上折扣因子乘以下一步的最大值。直观上,如果你有一个MDP,并且这是终止状态,这表示在这个状态下你能采取的最佳动作等于采取这个动作获得的奖励加上在下一个状态能做到的最佳结果。所以MDP具有递归和动态规划的性质。你可以训练神经网络来强制这种一致性。也就是说,一旦我知道这个动作的Q值,我就可以用它来计算关于另一个Q值的信息。

A

所以之前我问,为什么我们要训练策略?为什么不只训练价值函数?

B

这就是答案。这是一种算法,用于在你无法进行前向搜索时恢复中间步骤的价值估计。你必须先收集一条n步的轨迹,才能使用这个技巧。但直觉是类似的:知道这里的Q值可以告诉你那里的Q值。实际上,你可以从Q值中恢复策略。所以你不需要显式地建模策略分布,而是可以通过对Q值取argmax来恢复策略分布。所以Q-learning,或者说这种近似动态规划,会将你对未来Q值的了解向后传播。你可以看到这里有一种类似的结构:在MCTS中,你是在规划智能体尚未访问过的轨迹;而在这里,你是在规划智能体已经访问过的轨迹。那么,为什么Q-learning很重要?因为历史上我们无法对高维问题(如机器人技术)进行搜索。所以很长一段时间里,我们假设:如果无法用世界模型建模动态,那就收集轨迹,然后只根据唯一重要的数字——奖励——来规划。好了,这非常有趣。

A

然后为了将这一点与我们关于大语言模型(LLM)的讨论统一起来,在LLM中,你做的事情——没有Q值,但你在做这种反向学习,即“嘿,让我们找出那些在某个编程环境中通过单元测试的轨迹,然后强化这些轨迹”。这与MCTS(蒙特卡洛树搜索)的前向方法存在巨大差异。之所以能用MCTS,并且它更可取,是因为你可以每步都做MCTS,让每一步变得更好,而不必像Karpathy说的那样,希望从整个轨迹中学习。对,就像通过一根吸管获取监督信号。基本上只是升级一条轨迹中所有可能相关或不相关的token,这些token可能对得到正确答案有贡献。之所以能在围棋中做到这种样本效率更高、更有利的事情,是因为MCTS在围棋中有效——你基本上知道,如果我在这里做局部搜索,并且这个搜索在末端被一个值函数截断,即使我没有展开整个轨迹,这个值函数也能工作,我就可以直接说这是我的新策略。这样我就能以更迭代、更局部的方式改进,而不必展开所有这些轨迹。

B

有一些研究,我记得是谷歌在2023到2024年做的,他们确实尝试将树结构应用于推理。对。我认为目前对于这种方法是否可行还没有定论。所以我想说,未来我们很可能会重新审视前向搜索这个想法。但有两件事让MCTS在围棋中变得非常简单:一是值估计相当具体,你可以真实地确定它;然后你可以用它来截断深度,就像你说的。二是广度也是确定的。关键的一点是,那种迭代访问并扩展树的动作选择算法,非常适合围棋的问题规模和深度。但对于像LLM推理这样的问题,PUCT(预测置信上限树)可能并不是一个足够好的启发式方法。它可能对局部token过于贪婪,只会给出一些明显正确但并不能真正解决最终问题的想法。所以我认为,对于LLM推理的最终形态会是什么样,目前还没有定论。我不会排除这些方法卷土重来的可能性,但这确实很难。

A

LLM难道不是天生就学会了做MCTS吗?它们会尝试一种方法,然后发现“哦,这不行,退回去,试试另一种”,然后朝着更有成果的方向前进?对,确实如此。

B

我认为LLM确实能做到一些看起来像真正人类推理的事情,而不必使用显式的树结构。话虽如此,我认为进行前向搜索和模拟以更好地理解什么是有价值的这个想法,可能会卷土重来,尽管不会完全以AlphaGo那样的形式出现。

A

但为了确保我理解核心问题:广度来自合法动作的数量更大,深度来自无法轻易训练出一个值函数。

B

为什么?这里有一个LLM会出问题的例子。Sepuk规则涉及n的平方根除以1加na。在LLM中,你几乎永远不会对同一个子节点采样超过一次,对吧?所以,如果你有多个思考步骤,因为语言是如此宽泛和开放,离散动作集对于LLM来说并不是一个合适的选择。尽管它们是离散的token,但数量实在太大了,这种探索启发式方法可能并不是指导树搜索的正确方式。

A

对。但我想核心在于,在围棋中,你知道MCTS几乎肯定比当前策略更好,即使你还没有探索任何轨迹的终点。正确。而在LLM或机器人技术的正常推理中,没有办法以独立于实际解决问题的方式,来局部评估和改进你的下一步动作。

B

“没有办法”这个说法有点绝对。我认为很多人都在思考如何将MCTS或其继任者(如μZero)应用于连续控制空间。我相信很酷的研究工作仍在进行中,试图攻克这个问题。但没错,目前看来,大多数问题要么处于更高维的动作空间,要么像语言这样组合爆炸性更强,它们似乎不像围棋那样适合离散动作选择启发式方法和游戏评估之类的东西。但这并不是说,沿着多条平行路径思考未来,不会给你提供一些关于搜索方向的信息。如果你想想数学,我认为数学通常更偏向于一种逻辑搜索过程,你可以回溯,看看哪些路径看起来不错。那里有更严格的结构,而在商业谈判之类的情境中,可能就不太像一棵树,而是有些不同。

A

好的,现在我们坐下来了,这样我可以问你更多关于AlphaGo和AI研究的问题。2021年,Andy Jones发表了一篇论文,题为《棋盘游戏的缩放损失缩放》(Scaling Scaling Loss for Board Games),他基本上通过展示测试时计算和训练计算可以相互权衡,从而预见到了推理计算或推理缩放。也就是说,你可以花更多计算资源在MCTS搜索上,如果这样做,就能获得相当于花更多时间训练模型的性能。所以如果你看到这种模式,你可能会想,好吧,未来在LLM上也可能做类似的事情。事实上,后来确实发生了。那么,现在在玩具设定中探索缩放的其他维度,有哪些有趣的探索方向?这对于理解几年后AI发展可能是什么样子会很重要。

B

是的,我认为测试时扩展(test-time scaling)和推理能力,以及它们与模型规模之间的相互作用,确实非常深刻。这涉及到有多少工作实际上需要作为显式搜索来完成,又有多少可以打包进神经网络的前向传播中。而神经网络的前向传播又是如何学会执行那些本应是序列化和递归步骤的任务的?这很有意思。所以,Andy Jones 关于棋盘游戏的规模定律(Scaling Laws)论文非常酷。那篇论文中还有一个很棒的结果:他不仅展示了你可以预测类似大语言模型(LLM)的规模定律——即随着参数增加,你可以减少搜索所需的计算量,反之亦然——他还证明了你可以预测解决更大规模棋盘游戏所需的计算量。例如,围棋可以从 3x3 扩展到无限大的棋盘,你或许可以重新审视这个问题,尝试复现这一现象。我启动这个项目的动机之一,就是想知道“苦涩的教训”(Bitter Lesson)或我们对规模定律的理解,是否能让我们在计算最优的围棋机器人上做得更好。我们能否在不使用所有 Katago 技巧的情况下,仅仅专注于“苦涩的教训”和规模定律,就构建出一个强大的围棋机器人?到目前为止,我还没有成功,但我认为事实通常是:当你希望规模定律发挥作用时,你需要处于一个配方已经有效、数据集质量良好的环境中,而不是在试图弄清楚如何扩展的同时,还要摸索什么样的数据集才是合适的。所以,研究中的科学理解部分往往遵循这样一个步骤:先让某样东西工作起来,然后利用这个系统收集数据,再通过这些数据帮助你建立关于事物如何运作的心智模型,比如规模定律。对吧?因此,通常来说,如果你想利用规模定律构建一个强大的围棋机器人,你实际上必须先做出一个强大的围棋机器人,然后再用规模定律来稍微外推一下未来的方向。请再多说一些。

A

让我先确认一下,你是说规模定律没有起作用,还是说在你的围棋机器人中看不到任何规模定律的模式?

B

是的。我最初犯的一个错误是,在 MCTS(蒙特卡洛树搜索)标签生成过程中存在一些 bug。我会用专家策略收集大量数据,然后将其视为监督学习问题,试图从专家数据集中识别规模定律。你确实可以画出看起来类似的东西,但如果你处于策略效果不佳的环境中,你可能只是在研究基于糟糕数据的规模定律,对吧?所以,一个重要的实现细节是:如果你想研究规模定律问题,你必须有一个数据质量好、架构合理、没有 bug 的问题,然后在那里解决它。直到系统的其余部分正常工作之前,我无法将规模定律应用于指导我应该关注什么。这听起来显而易见。对于研究人员来说,当然希望在研究扩展之前先有一个无 bug 的工作系统。但作为给实践者的建议,我在这项目开始时真正绊倒的地方是:在你的人工制品足够有趣、值得研究之前,你不一定想急于跳进研究它的科学中。

A

说到计算量,如果你回顾过去 10 年训练全球最佳 AI 模型所用的计算量图表,在对数空间里,这是一条非常平滑的、逐年指数增长的曲线,但有一个巨大的异常点,那就是 AlphaGo Zero。它训练所用的计算量远超当时任何其他 AI 模型,大约是 3e23 flops。这大致相当于前沿大语言模型(Frontier LLM)的水平。虽然数量级上还有差距,但依然如此。那么问题来了,特别是考虑到你能用更少的资源做出成果,你是自己训练的吗?

B

我从 Prime Intellect 获得了大约 1 万美元的捐赠。我大概花了前 4000 美元做探索性研究,然后用大约 3000 美元做了最终运行。剩下的钱用于部署模型。很酷。

A

是的,你觉得如果现在用 1 万美元就能做到,是不是说明他们当初训练得不好?

B

第一个做成某件事所需的计算量,总是远大于后来者追赶所需的计算量。大语言模型领域也是同样的故事,对吧?一旦别人做成了,你就可以使用蒸馏(distillation)之类的技巧,以及各种辅助手段来引导自己走向成功。就我自己在线部署的机器人而言,我实际上使用了针对 Katago 模型的最佳响应训练(best response training)来获得较强的性能。在录制这段内容时,我正在验证我能否完成第一步,也就是从零开始(tabula rasa)的对弈。但重要的是,在研究中,你通常希望从一个好的初始状态开始,对吧?所以我做的第一件简单的事就是训练针对 Katago 的最佳响应智能体。而 AlphaZero 团队没有任何可以与之对练的策略,因为他们试图一切从零开始。第一个做这件事意味着,你的优先目标是让系统工作起来,而不是追求最计算高效的实现。这在机器人领域也是如此。如果你看看为机器人训练的大型模型的前沿,散点图分布得很散,不像前沿大语言模型那样有一条非常清晰的线。这是因为训练这些模型的人通常还没有达到每个 flop 都至关重要、需要榨干每个 flop 性能作为预训练主导决策因素的规模。相反,他们的重点更像是:我们希望出现某种能力,所以我们优化训练设置,让这种能力更容易涌现。一旦你拥有了这种能力,那么如果你扩大计算规模,你就不得不让它变得计算高效,因为这涉及数亿美元。但在过去,当实验的计算资源相对充裕,或者研究人员不需要真正为计算成本负责时,人们最终就会优化其他东西,而不是追求计算最优的帕累托前沿(Pareto frontier)。

A

我明白了,比如速度之类的。

B

是的,比如得到结果的时间,或者只是让系统跑起来。我认为最初的 AlphaGo,他们可能拥有大量计算资源,不需要太担心让它成为计算最优的方案。

A

那么,计算效率的提升中,有多少是 2017 年之后才出现的方法,又有多少是他们在 2017 年就能做到的?嗯,好问题。

B

所以进入这个项目时,我心里隐约知道事情总是会随着时间的推移变得更容易。我想看看 Go 在 2020 年 Katago 之后似乎没有出现任何重要的开源强 bot 的情况下处于什么位置。然后阅读 Katago 的论文,里面有很多巧妙的想法。我有点好奇,好吧,让我们看看“苦涩的教训”是否已经发生,即很多这类技巧是否因为 NVIDIA 制造了更快的 GPU 而消失了,对吧?所以我们大致处于什么阶段?再次强调,这不是经过同行评审的说法。这只是我基于自己的实验对所见情况的初步直觉猜测。但似乎架构选择并不那么重要。Transformer 对比 ResNet,我们处于 GPU 的速度下,模型规模并不大到让这真正产生影响。实际上你可以大大简化这个设置。与其采用带有 replay buffer、pusher 和 collector 的分布式异步 RL 设置,你可以做一个简单的同步操作:收集数据,训练一个监督学习模型,然后再收集数据。因此有机会简化基础设施。NVIDIA GPU 确实变得更快了。虽然 Katago 是在 V100 上训练的,但你可以用一半数量的桌面级 Blackwell GPU 进行训练,效果依然不错。而且如果你有强大的初始化,Katago 开发的一些辅助监督目标其实并不必要。如果你针对 Katago 本身进行最佳应对训练,那么你自己的模型实际上不需要 Katago 所需的任何技巧。所以核心问题是如何尽可能快地获得一些强大的对手。这比具体的架构创新重要得多。但仍然存在一些不错的计算乘数。我发现训练 9x9 棋盘对于解决终局价值函数非常有效。然后如果你能在一种可以在 9x9 和 19x19 之间迁移的架构上进行协同训练,那么你可以大大减少从头学习的热启动时间。我认为 AlphaGo Zero 的图表显示,前 30 小时左右基本上是在追赶监督学习基线。而通过在小棋盘上预训练,然后热启动到 19x19 棋盘对弈,你可以大幅缩短这段时间。还有一些其他东西,比如在对局之间改变模拟次数。实际上这并不那么敏感。你可以固定它或增加它,影响不大。但无论如何,从科学角度重新审视一篇旧论文,看看什么真正重要,这还是挺不错的。

A

这是一个有点跑题的问题,但为什么 AlphaGo 中使用 buffer 是可以的?每次我和 AI 研究人员交谈时,他们都会告诉我 off-policy 有多糟糕。但 AlphaGo Zero 的一个简单实现方式会是,在给定的反向步骤或一批反向步骤中,大多数落子并不是由最新训练的模型做出的。

B

所以为什么这是可以的呢?好问题。是的,这涉及到 off-policy 与 on-policy 强化学习的基本问题。如你所知,在 MCTS 中,你采取行动,然后重新标记它们,以便在相同状态下采取不同的行动,对吧?所以这里的 off-policy 部分在于,如果你重新标记那些你的新策略永远不会访问的状态,那会怎样?比如,这有什么意义?你基本上是在浪费容量。在极端情况下,想象你训练 buffer 中的状态分布都是你永远不会访问的状态,那么你基本上是在监督它们对永远不会达到的状态采取好的行动,因此你的策略可能会变得非常糟糕,对吧?这就是 off-policy 可能对 AlphaGo 造成伤害的地方。然而,如果你从 DAGGER 的角度来理解,这基本上是一种根据某些数据将自身纠正回最优轨迹的方法,那么在这种算法中,你希望大部分状态是你将要访问的,但有一小部分或合理比例的状态位于最优轨迹周围的高维管道中。这些状态中的任何一个都会被赋予一个监督目标,以将你引导回最优轨迹。也许我可以在这里快速画一下。好的。所以在 DAGGER 风格的设置中,你的最优训练数据分布是这样的:这里是你最优的状态和行动。所以这就像,你知道,你想处于这个状态,你想处于这个状态,你想处于这个状态,然后你在这里获胜。这些是你最优的策略行动。所以这些是你肯定想要训练的内容。但为了使其对干扰具有鲁棒性,你需要确保如果你碰巧漂移到其他状态,你可以将自己引导回——

A

但这为什么不是 off-policy 训练的完全通用论据呢?

B

这正是为什么有时你会想要做离策略训练(off-policy training)的原因——你不希望出现累积误差,即一旦犯错,就没有数据告诉你如何回到最优分布。最优控制理论其实并没有太多讨论如何避免意外偏离,因为它假设一旦你学会了策略,你就会到达那里。但在机器人等应用中,比如一阵风把你吹偏了一点,然后你需要纠正,对吧?或者你一个轮胎的摩擦力比另一个轮子稍低,然后你的车开始漂移,你得修正它。这些在更真实的环境中经常发生。实际上,关于国际象棋和围棋有个有趣的说法:围棋和国际象棋的问题在于,对手总在搞事情,对吧?所以事情可能会偏离轨道,你总想能够纠正回你的获胜状态。因此,你的回放缓冲区(replay buffer)应该包含你的策略会访问的状态,加上一些你可能漂移到的状态分布,以及如何返回最优状态的方法。

现在,如果你把这个想法推到极端,说我们没有任何这类数据,我们只用MCTS(蒙特卡洛树搜索)来标记那些离最优行为很远的状态,比如这一堆状态。那么,每个状态都会得到一个MCTS标签,你的策略会学习如何在这里采取最佳行动,但你永远不会到达这里。所以你是在训练模型处理你永远不会达到的状态。这根本不存在,所以这就是问题,对吧?这就是离策略可能真正有害的地方。实际上,作为这个项目的一部分,我确实尝试了一个实验:我拿了一堆轨迹,为了尽可能让GPU饱和,我从数据集中随机选取状态,然后只对这些状态重新运行MCTS。也就是说,我不玩整局游戏并在每一步都做MCTS,而是忽略动作的因果性,直接随机挑选棋盘状态,用我当前的网络标记它们。我可能会重新访问之前标记过的旧状态,并用当前网络重新标记它们。实际上,这确实有效。你可以说,让我们选取一些合理状态,在训练过程中不断重新标记它们。这开始收敛到一种非常类似机器人的设置,这种设置很常见:你有一个轨迹数据集,然后有一个类似回放缓冲区推送器(replay buffer pusher)的东西。这些是离策略的离线轨迹,对吧?你的回放缓冲区推送器将转换元组推送到回放缓冲区。然后有一个任务在持续重新规划:你本应采取的最佳动作是什么,而不是当前这个动作?在机器人领域,使用最小化TD误差(TD error)非常常见。你的贝尔曼更新器(Bellman updater)不断从缓冲区拉取数据,试图满足QSA。然后从这里,你的训练器(trainer)试图拟合S到A,或者拟合Q到Q目标。所以你可以把这看作一种规划器:你重新访问之前去过的旧状态,用当前模型重新思考:如果我访问了这个状态,我能做得更好吗?这实际上就是离策略机器人学习系统通常的训练方式。如今有一种更简单的做法,但在Google QTOp时代,我们就是这样做的。

A

那么训练器是什么?

B

哦,训练器就是试图最小化Q和Q_target。

A

等等,你能再解释一下整个设置吗?比如从高层次上?

B

好的。你有一些来自不同策略的离策略数据。你不断将之前见过的转换推送到回放缓冲区。然后有一个叫贝尔曼更新器的东西,它基本上重新规划:在状态S下,我应该采取什么动作来获得更好的价值?实现方式是通过最小化TD误差。具体来说,给定S',你计算Q,找到与S'搭配能使Q值尽可能高的动作。然后把这个加到奖励上,得到你的实际目标。所以对于当前的S和A,你的Q目标就是这个。然后你把Q目标送回这个转换。这样,这个元组就配上了Q目标。然后在训练器上,你只需使用监督学习,最小化当前网络的QSA与目标之间的差距。明白了吗?

A

好的。所以本质上,你就是在后台思考:这些动作实际上有多大的价值?

B

是的。在一个更优的策略中,你试图最大化这个,那么这个转换的Q目标是什么?

A

这有点像在做白日梦。

B

你可以这么想。你就像在事后回顾,心想:嗯,根据历史缓冲区中看到的内容,我本可以采取更好的动作吗?是的。现在,我尝试将这个思路与围棋联系起来,结果还算成功,但太复杂了无法开源。做法是用一个MCTS重新标记器替换这个,而不是做这种目标网络计算。也就是说,你运行MCTS来处理你的转换。在这种情况下,你有状态、动作,以及你是否赢了游戏。实际上,你可以丢掉这两个,只关心状态。你只需用当前网络规划MCTS来得到最佳策略π,而不是当初采取这个动作的网络。你离线重新搜索这些转换。如果这些转换是你的策略能够达到的,那么这会产生很好的稳定效果。另一个好处是,你可以更好地让GPU饱和,因为你不需要等待围棋游戏提供棋盘状态。你可以并行地在所有深度上搜索所有棋盘状态。然后训练器只需尽可能预测MCTS标签。所以这确实有效,在机器人领域也很相关,因为你有很多离线数据,但无法模拟MCTS。不过在实践中,这会遇到一个问题:如果当前模型在查看它永远不会达到的状态,那就在浪费容量。所以你需要小心一点。因此,在策略(on-policy)方法,以及许多强化学习,已经收敛到更偏向在策略的设置,它们不直接训练离策略数据。最多,它们用离策略数据来减少方差,但不直接影响目标。

A

抱歉,为什么它们会收敛到那种方式?

B

因为更稳定。是的。所以你可能用离策略的Q来计算优势(advantage),比如Q减去Q的和。这类似于你的价值,然后这是你当前的Q值。所以那个动作的优势就是平均价值减去当前值。人们可以尝试用离策略方式估计Q,然后只在这里使用优势。如果这些动态中有问题,它不会让损失函数爆炸太多。所以在机器人领域,有一种趋势是:用离策略数据来塑造奖励,但不直接作为你的——

A

这让我想起我们之前讨论过的一个话题,为什么MCTS(蒙特卡洛树搜索)比LLM常用的强化学习或策略梯度方法更有利。这可能完全不对,但我几个月前写了一篇博客,讲的是强化学习——至少是策略梯度强化学习——甚至比你想象的更低效。人们通常认为的低效在于,你必须展开整个轨迹才能获得任何学习信号。随着这些轨迹越来越长,智能体不再只是完成句子中的下一个词,而是需要花两天时间工作才能判断项目是否做对。每浮点运算的信息量在下降,因为你必须展开两天的思考才能验证某件事是否正确。实现这个功能时,每浮点运算的样本量也在下降。你可以把学习过程看作最大化每浮点运算的比特数,对吧?这可以理解为每浮点运算的比特数等于每浮点运算的样本数乘以每样本的比特数。我刚才提到的是,随着强化学习的时间跨度变长,每浮点运算的样本数会下降。但至少这种朴素的强化学习在每样本的比特数方面也很糟糕。我的意思是,与监督学习相比。训练初期,假设LLM的词表大小为10万,即有10万个可能的token,模型完全未训练,提示是"The sky is."。在监督学习中,模型会对所有可能的输出有一个概率分布。标签说正确答案是"blue",模型通过交叉熵损失学习其分布与正确输出"blue"之间的差距。但如果用强化学习,模型会尝试"The sky is halakon",错了;"The sky is told",又错了。这是一个完全未训练的模型,对吧?所以你需要尝试大约10万次才能偶然碰到"blue",然后从中获得学习信号。在监督学习下,你有概率分布,被告知答案是"blue"后,你就能知道偏离了多少。你学到的量取决于你的通过率。离"blue"越远,通过交叉熵损失向"blue"靠近的幅度就越大。你可以把通过率看作你事先说出"blue"的概率。在监督学习中,通过交叉熵损失,一旦获得标签,你学到的就是负对数概率(以比特计)。而在强化学习中,如果你只是随机猜测并看是否有效,那基本上就是一个二元随机变量的熵。这里还有一个难点:你实际采样的分布是你的策略分布。

B

所以如果你的策略根本没有采样到"blue"的机会,你就永远得不到信号。

A

完全正确。这体现在你采样到"blue"的概率极低。如果你确实采样到了,你学到的量和监督学习一样多。但在其他情况下——对于未训练模型来说99.999%的情况——你从"halakon不是正确词"或"told不是正确词"中学到的极少。这就是大多数时候发生的情况,所以你学到的很少。如果你画个图,横轴是通过率,纵轴是从一个样本中学到的比特数。通过率从0%到50%再到100%。训练结束时你在这里。监督学习的负对数通过率曲线是这样的,而二元随机变量的熵曲线是这样的。这取决于你用nats还是bits。如果用bits,峰值是1,对吧?这就像抛硬币,从抛硬币中学到的最多。这是监督学习,这是强化学习。但问题在于,你大部分训练时间都花在这个区域,即低通过率区域。实际上,学习速度取决于每样本获得的比特数,而在这里你得到的信号非常少。如果你把通过率画在对数坐标上,横轴是对数刻度:训练开始时词表大小为10万,通过率是十万分之一,然后是万分之一、千分之一、百分之一,等等。这个图看起来是这样的:监督学习曲线是这样,而强化学习曲线——如果你把我刚才展示的算一下——就是这样。

B

是的。可以说你所有时间都花在这里。可能永远得不到一次成功,对吧?没错。所以这是一个令人沮丧的图,因为一旦你在这里,根本不清楚如何到达那里。一旦你到了那里,你就有东西了,但实际上在很多强化学习问题中,你所有时间都花在这里。所以问题在于如何初始化,使通过率至少不为零,而是非零。我还想补充一点关于每样本比特数的内容,这对任何机器学习问题都很相关,而且与软目标和蒸馏有关。如果你能访问logits(对数几率),而不仅仅是one-hot(独热)的token答案。如果你能访问软目标,这个分布的熵远高于one-hot。所以软标签实际上每样本包含的信息和比特数要多得多。这就是为什么蒸馏每样本如此有效,因为它每样本提供的信息多得多。

A

啊,是的。我想知道公式会是什么,显然它——

B

就是这个分布的熵。这个的熵是零。这个的熵就是熵公式。这也是为什么AlphaGo很优雅。在AlphaGo中,你训练策略网络不是模仿MCTS的动作,而是模仿MCTS的分布。有趣。但两者实际上都有效。如果你想做一个科学实验,看看这种软标签、暗知识蒸馏有多重要,你可以做一个实验,重新训练策略网络基于MCTS选择的动作,而不是软分布。

A

有趣。之前我凭直觉摸索这个问题。为什么这种迭代搜索的能力——你不需要一开始就能赢棋,只需要能改进当前策略——在强化学习中如此强大,而LLM目前的强化学习方式却做不到?是的,这正是因为要考虑整个轨迹的通过率。我其实不知道如何正式地思考这个问题。也许你能帮我理清。

B

为什么说AlphaGo是一个优雅的强化学习算法?主要原因在于,你永远不需要从0%的成功率起步,去解决如何获得非零成功率的探索问题。正是这一点让你能够沿着一条优美的监督学习信号进行爬山——如果你去看AlphaGo的实际实现,每一步其实都没有TD误差学习或动态规划,至少显式上没有。它只是在做值分类上的监督学习以及策略KL最小化。所以本质上就是一个在改进标签上的监督学习问题。因此训练非常稳定,对吧?你可以训练任意大的网络,可以在数据集上反复重新训练,一切都会稳定进行。基础设施实现起来也非常简单,你不需要复杂的分布式系统来保持策略在线。归根结底,你只是说:我有一些改进后的标签,让我在这些目标上重新训练我的监督模型。所以你始终处于一个优美的状态:你只是在努力改进策略,而不是试图逃离那种所有信号都平坦的局部最小值。

所以画曲线的方式是:如果你画出MCTS策略相对于原始网络的胜率,假设这条虚线是原始网络,MCTS策略看起来大概是这样。每一步的监督信号都非常清晰。你永远不会遇到MCTS不给你任何信号的情况。除非你的MCTS分布恰好收敛到策略网络预测的结果。

A

对对对,这个解释很棒。好的,那我们坐下来聊聊自动化研究吧。我一直想问你的是,你在这个项目中通过这种自动化LLM编码助手循环做了大量研究。有一种观点认为,如果完全自动化AI研究,可能会引发某种奇点。显然我们还没到那一步,但既然我们已经有了这个过程的早期迹象,我很好奇你的观察:AI擅长什么,不擅长什么,你对这个场景有什么看法,它最终实现的可能性,以及你对此的整体想法。

B

当然。我认为自动化科学研究是前沿实验室目前正在开发的最令人兴奋的能力之一。而且我认为,对于所有从事研究的人来说,了解它现在能做什么、不能做什么,以及未来当AI自动化大量研究调查时科学过程会如何运作,都非常重要。简单来说,我在这个项目中主要使用了Opus 4.6和4.7。它擅长的是超参数优化。过去,人们会设计一个超参数搜索空间,比如学习率、权重衰减、网络层数,然后做网格搜索或贝叶斯超参数优化,找到一些调优后的参数。现在自动化编码真正酷的地方在于,它可以搜索更开放的问题空间。比如它会说:我发现这一层的梯度有点小,让我改一下这里;让我重写代码,让DataLoader加入我想到的新数据增强方法;让我们尝试找到最适合优化问题约束的方式。最终你会得到一种更灵活、更高级的能力,几乎像研究生一样,能够不断打磨性能指标。这可以挤出相当多的性能提升。在固定数据集和固定时间预算下,你可以在分类问题(如LLM或围棋)上大幅提升困惑度。而且它现在在执行任何实验方面也非常出色。我写了一个叫Experiment的Claude技能,给它一个我想绘图的描述,比如:这是x轴,这是y轴,帮我回答这个问题。它就会去运行所有实验,编译图表,生成报告,并建议可能的原因。这就是目前效果不错的地方,而且我们可以预期这些能力未来会变得更好。

但了解它目前不太擅长什么也很有用。在我博客版本的教程中,我有一张图,基本上把所有实验按树状结构分组,每个节点代表失败、成功或混合的实验结果。然后从那里分支到子节点,表示后续实验。有时我会沿着一条路径深入,比如离策略MCTS重标号,做几个实验,然后意识到可能不值得,于是跳到完全不同的路径。我称之为"行"。我发现,目前我们可访问的闭源模型(公众现在能用的)在给定路径上选择下一个实验方面似乎不太擅长,而且它们似乎无法退一步进行横向思考:等等,这条路径其实不合理,让我们回到基本原理,想想瓶颈是什么,或者我们到底想达成什么目标。所以我经常需要自己捕捉基础设施错误,通过向Claude提示正确的问题来调查是什么导致了差异,然后它会回答。我认为随着Mythos级或Mythos++级模型上线,这可能完全改变,这些问题会随着规模提升而消失。但与此同时,我认为有大量机会开发强化学习环境来激励这种横向思考。建立这个围棋环境的一个动机是,我认为围棋捕捉了许多非常有趣的研究问题,通常与LLM或机器人学重叠,而且验证速度很快。外循环最终就是:智能体是否按我预期的方式行动?你可以很容易地检查围棋对局的结果。内循环则涉及所有研究工程,比如分布式系统、预测某个想法是否有效、预测训练算法的某个特定修改可能带来的差异。我认为有丰富的子任务和子环境库,你可以训练一个自动化科学家来处理这些任务。以围棋作为外验证循环,一旦你掌握了这些技能,也许可以应用到其他领域,比如生物科学、机器人学,或者自动化AI研究本身。

A

或者自动化AI研究本身。这才是真正的关键,或者说可怕/令人难以置信的事情——让AI制造未来版本的AI。你是在暗示,这里的外循环基本上就是你对阵KataGo的胜率吗?

B

这是其中之一。我认为还有更深层次的问题可以解决。例如,假设你有一个改进缩放律计算乘数的想法。结果不一定是我做出了史上最强的围棋机器人。结果可能只是:我能预测我的围棋机器人的胜率吗?或者我能预测我的想法产生的缩放律曲线吗?但你可以通过使用像围棋这样非常可验证的游戏作为外循环,来确保你没有奖励作弊。

A

我觉得有几个有趣的后续问题。有关于内循环和外循环的问题。在内循环中,有一个问题是,你做的任何修改在局部可验证性上有多强。也就是说,当你尝试某个想法时,你是否能知道它实际上是改进还是退化?你能判断出问题是因为bug导致的,还是因为想法本身错了?伊利亚曾谈到为什么他认为自己是个优秀的研究者——其中一个原因是他对正确想法有直觉,并且有强烈的信念。他能够坚持克服bug,并根据对想法应该有效的宏观信念,区分哪些是bug、哪些是根本性错误。我们不如就从这个问题开始吧?好想法在局部上有多容易验证?

B

我认为,以深度学习成功的故事为例,你可以把它看作一个持续数十年的想法,需要很大的信念才能让它成功。这构成了一个极具挑战性的长周期强化学习问题,每一步都有委员会告诉你这是个坏主意,但最终你突破了它,对吧?那么,如何设计能更早提供反馈的强化学习环境呢?我认为这是一个非常棘手的开放问题,我也没有答案。但归根结底,要打造一个非常强大的围棋AI,你可能确实需要发现深度学习。所以,我认为,在外循环中,拥有一个难以作弊的挑战性游戏,可以作为发现深度学习原理之类的外循环信号。当然,为了让问题变得可处理——这正是研究品味真正重要的地方——你必须找到初始化问题的方法,这样你就不会去解决一个极其棘手的问题,对吧?也许你可以利用LLM作为一种中间层的通用语法,来提供某种局部反馈。LLM是通用语法这一事实意味着它们可以在堆栈的几乎任何层级上运作,对吧?它们既能非常局部地思考,也能退一步进行非常宏观的思考。我认为人类很多横向思考能力就来源于此。比如,如何判断你正在追求的方向或目标不对,应该换个问题来问。

A

另一个问题是,在试图在外循环上取得更好结果的过程中,局部改进的可叠加性如何。我听说有些AI实验室出过问题,人们各自追求好想法,但这些想法最终无法很好地叠加。训练运行因为两个看似好想法之间的奇怪交互而失败。因此,拥有一个自上而下的统一愿景来指导工作非常重要。你在不同AI实验室工作过,也尝试过让并行智能体尝试不同想法。你对AI创新的可并行性有什么看法?

B

是的,好问题。我认为,要很好地执行“苦涩教训”,研究品味在于知道苦涩教训能带来多少收益,以及在当前时刻,多少要求是过分的。当然,从长远来看,计算能力几乎是决定一切的最重要因素。随着你扩大能源、计算和参数规模,智能几乎不可避免地会从中涌现。这非常美妙,非常深刻。除此之外,任何算法细节都不重要。但在当下,我们没有无限的计算资源、参数和任意好的初始化。所以我们必须想出启发式方法来提供这些。但这些启发式方法可能有些冗余。这大概就是为什么你会看到很多计算乘数效应不一定能叠加——它们可能有相关的收益。然后三年后,当NVIDIA GPU变得更强大时,它们可能叠加得更差,对吧?也许在任何给定时间点,任何计算乘数效应的收益都是暂时的,这正是我对Katago论文的怀疑。算法思想被应用了。然后你可以看到,与现代Blackwell GPU和Ada级GPU(比论文使用的V100级GPU好得多)相比,一些加速收敛的算法技巧相对于其他因素就不那么重要了。我认为这在当下是一个品味问题。

A

是的,有趣。那外循环呢?在让AI更智能方面,可验证性如何?在围棋中,你确实有一个外循环,即与最佳开源模型的胜率。即使在那里,正如你所说,还有其他外循环,比如你是否发现了新现象——这实际上很难验证。如果你不知道缩放定律的重要性,回到2015年,你能想象出一个自动化程序来区分哪篇论文是缩放定律论文,哪篇只是另一个随机图表吗?所以即使在围棋案例中,这也是一个难以验证的外循环。而外循环的整个想法是给改进提供一个安全网。更不用说通用AGI了,我们当然有一堆基准测试,但问题在于:我们知道可以衡量的东西,并改进可衡量的东西,但我们关心的是更广泛的经济上有用的工作能力——至少在自动化一切之前,这并不容易衡量。所以,问题来了:AI自我改进的外循环验证有多好,这重要吗?

B

是的,我要给出一个非严格的论证,但我直觉上相信它。DeepMind这个AI研究实验室,最初专注于游戏,对吧?他们用游戏作为外循环,然后研究人员从解决游戏的经验中学习,现在他们在研究LLM。大概从他们研究Atari、围棋和星际争霸的经历中,有一些正向迁移,现在帮助他们做出好的LLM。我假设在编码、通用研究能力或项目管理等方面存在某种正向迁移,所有这些可能帮助他们做得好。所以如果是这样,为什么对自动化AI研究者不成立呢?他们应该能够将快速验证、快速迭代环境的经验正向迁移到更雄心勃勃、经济上有用的任务上,比如自动化药物发现等。

A

我的意思是,我不知道。历史上直到Gemini 3或几年前,人们一直在说,谷歌在LLM上追赶不上,因为他们太执着于旧方法。是的,有收益,但也有方式会主动阻碍你。所以对我来说,并不明显存在——

B

现在下结论还为时过早,对吧?谁知道呢。比如说,目前谷歌做得相当不错,但长期来看,在游戏上训练的初始化最终会不会限制他们成为赢家的能力?这很难说。同样,他们看似起步较晚,会不会其实是在更长时间里预训练如何扩展 TPU?他们把整个技术路线都押在了让 TPU 变得更好上,短期内似乎没什么用,但长期来看可能就成了——所以,即使有今天的数据,人类也很难推断出最优的研究策略应该是什么。是啊,是啊。不错。

A

好,我们应该让大家知道如何了解更多这个项目,无论是自己 fork 它,还是查看你的博客文章——你在那篇文章里很好地解释了许多这些想法。大家接下来该去哪里?

B

好的。我的网站是 evjang.com。上面有一篇博客文章,链接到了这个教程的交互式版本。我的 GitHub 用户名是 ericjang,里面有一个 AutoGo 仓库,大家可以 fork 并复现训练结果。

A

我也强烈推荐大家去看看那篇博客文章《As Rocks May Think》,我们在这次对话中提到了其中一些想法,但它有一个更宏大的论点:当思考成为计算机科学中的一个基本操作时会发生什么。没错。所以我强烈推荐大家也去看看那篇文章。

B

是的。我也鼓励听众思考一下,通过 MCTS 和搜索,思考与围棋之间的关系,以及它如何与 LLM 联系起来。我认为这里面有一些相当深刻的东西,可能还没有被充分探索,因为与 LLM 的繁荣相比,围棋的研究相对较少。这并不是说我认为 LLM 里应该加入树结构,但两者之间确实存在一些非常有趣的二元性。而且,你实际上可以用很少的资源在围棋、MCTS 和推理方面做很多研究。所以这非常令人兴奋。

A

太棒了。Eric,感谢你来做客。

B

能上这个播客是我的荣幸。

译自 Dwarkesh Podcast · 录于 二〇二六年五月十六日