返回 2026-05-16
🤖 AI / ML

埃里克·姜——从零构建 AlphaGoEric Jang – Building AlphaGo from scratch

dwarkesh.com·2026-05-15

AlphaGo 仍是展示智能基本原语的典范:搜索、经验学习和自我对弈。文章通过 Eric Jang 的视角回顾了 AlphaGo 的核心架构,强调其在强化学习与深度神经网络结合上的里程碑意义。它不仅是围棋 AI 的突破,更成为理解通用智能构建模块的关键案例。

Dwarkesh Patel

埃里克·姜(Eric Jang)将带你从零开始构建 AlphaGo,但使用的是现代 AI 工具。

有时,通过回顾过去,我们能更好地理解未来。AlphaGo 至今仍是智能基本要素——搜索、从经验中学习以及自我对弈——最清晰的实际案例。要洞察未来更通用的 AI 如何学习,你必须回到 2017 年。

在解释完 AlphaGo 的工作原理后,它为我们讨论 LLM 中的 RL 机制及其改进方式提供了背景。原始的策略梯度 RL 必须从轨迹中 10 万多个 token 里找出哪些真正导向了正确答案,而 AlphaGo 的 MCTS 每一步都明确建议一个更优的动作,从而绕过信用分配问题,为你提供一个训练目标。人类的认知方式显然更接近后者。

埃里克还在他的项目中启动了一个自动研究循环。有趣的是,我们讨论了 LLM 已经能很好地自动化哪些 AI 研究工作(如实现和运行实验、优化超参数),以及哪些仍力有未逮(比如选择下一个该研究的问题、跳出研究死胡同)。这对近期关于何时会出现智能爆炸及其内部体验的讨论颇具启发意义。

请在 YouTube 上观看此视频,以便看到黑板内容。

查看我写的闪卡,以巩固这些洞见。

  • Cursor 的 agent SDK 让我为本期节目构建了一条生成闪卡的流水线。每张卡片上,代理会读取字幕、处理黑板截图、生成 SVG 图像,并通过批评者模型进行校验。相比一连串 LLM 调用,一个持久的代理在此类任务中表现更佳,而 Cursor 的 SDK 让这一切变得简单。访问 flashcards.dwarkesh.com 查看卡片,并前往 cursor.com/dwarkesh 开始使用 SDK。
  • 珍妮特街(Jane Street)为我深入参观了其数据中心之一。我有幸向 Ron Minsky(共同领导 Jane Street 技术组)和 Dan Pontecorvo(负责 Jane Street 实体工程团队)提问。他们甚至掀开地板、取出机架来讲解一切原理。完整导览请见 janestreet.com/dwarkesh。
  • (00:00:00) – 围棋基础

    (00:08:17) – 蒙特卡洛树搜索

    (00:32:04) – 神经网络的作用

    (01:00:33) – 自我对弈

    (01:25:38) – 替代性 RL 方法

    (01:45:47) – 为什么 MCTS 不适用于 LLM

    (02:01:09) – 离线策略训练

    (02:12:02) – RL 比你想象的更缺乏信息效率

    (02:22:16) – 自动 AI 研究者

    达瓦克什·帕特尔(Dwarkesh Patel)

    今天,我邀请到了埃里克·姜(Eric Jang),他最近担任 1X Technologies 的 AI 副总裁,此前是谷歌 DeepMind Robotics(现为 Google DeepMind Robotics)的高级研究科学家。过去几个月他处于休假状态。其中一项重要工作就是重新构建、改进并对 AlphaGo 进行 hack 式开发。

    今天,他将讲解如何从零开始构建 AlphaGo,以及这如何揭示 AI 研究与发展的未来方向。在我们进入正题之前,为什么 AlphaGo 如此有趣?为什么你选择在休假期间做这个项目,而不是去海滩闲逛?

    埃里克·姜

    我喜欢创造东西,而 AlphaGo 和围棋 AI 正是那些真正让我踏入这个领域的事物之一。当我看到 AlphaGo在2014年、2015年、2016年及之后早期的突破性进展时,深感震撼——原来AI系统可以变得如此智能,并能借助深度学习处理如此复杂的计算问题。这个问题长期以来都被认为对搜索算法而言是难以解决的,然而它却被深度学习攻克了。这对我来说一直是个谜,我一直渴望更深入地理解这一现象。

    我的专业训练集中在机器人领域的深度神经网络,那里的决策相对更直观。但AlphaGo的问题在于,它的每一步都源于极其深层的搜索。我一直很困惑:一个只有十层深的网络,是如何通过“摊销”(amortize)模拟出如此深的游戏树中的复杂决策的?

    Eric Jang

    如果你回顾这些年里构建各种强大围棋AI所需的算力增长曲线,会发现2020年出现了一个名为KataGo的开源项目,由Jane Street的David Wu开发,它在从零开始训练一个真正强大的围棋AI时,将所需算力减少了40倍。我不确定它是否比AlphaGo Zero、AlphaZero或MuZero更强,但它确实非常强大,如今大多数围棋从业者练习时都是与这类AI对弈。

    得益于大语言模型(LLM)编程能力的提升,原本需要DeepMind整个研究团队、数百万美元研发投入和海量算力才能完成的工作,现在只需花费几千美元租用算力就能实现。

    Dwarkesh Patel

    我们首先来讨论围棋本身是如何运作的。这个游戏到底是怎么玩的?

    Eric Jang

    围棋是一个非常简单、可以在计算机上快速轻松实现的游戏。目标是用黑白棋子占领尽可能多的地盘。比如我先在某个位置落下一颗黑子,因为黑方总是先手。接着轮到白方落子。要吃掉对方的棋子,规则是:对于棋盘上的每一个交叉点,如果你的棋子能将其四个相邻方向(上下左右)全部围住,那么该棋子就被切断“氧气”供应,成为死子。现在我不仅控制这颗黑子,还控制了这四个相邻的空位。

    中国规则、日本规则以及所谓的Tromp-Taylor规则之间存在细微差别。Tromp-Taylor规则被设计得完全无歧义,因此所有围棋AI都以它为标准进行训练和测试。在常规的人类对局中,你通常不能在这里下这步白棋——那会立刻导致自杀。但在Tromp-Taylor规则下,这样做是可以的:你落下棋子后,它会立即被判定为死亡,结果是一样的。

    让我们重新开始,下几步棋,然后再深入解释。我就从这里开始。

    Dwarkesh Patel

    我基本上是在随机落子,但我想绕过你的棋子,看看能否包围它们。

    Eric Jang

    这一步棋暴露了你白棋的一个空邻位,就像国际象棋里的将军一样。如果你不立刻在这里回应,我就能马上吃掉这颗棋子。

    Dwarkesh Patel

    明白了,因为是横竖方向的邻接关系决定了是否被包围,而不是对角线。

    Eric Jang

    没错,是横竖方向,不是对角线。这颗棋子现在三面被围,如果你不在那里立刻应对,就有丢失这颗棋子的风险。

    现在你可以看到,我开始对你施加压力了——因为你在这里落子,就不得不在这里回应。

    Dwarkesh Patel

    否则的话,这块两连子就全归你了。

    Eric Jang

    是的。如果你仔细想想,如果你在这里回应,你或许能预见到未来会发生什么,从而推断出我会如何回应你的举动。

    Dwarkesh Patel

    你对我的判断很有信心,但我猜你会把黑子下在这里。

    Eric Jang

    没错,那样我就能吃掉这三颗白子了。

    Dwarkesh Patel

    所以我应该假设这个小块已经没了?

    Eric Jang

    是的。在围棋中,有时候让对手吃掉一些棋子其实是合理的——只要这能让你在其他地方占据更有利的位置,从而吃掉更多棋子。这也是围棋之美所在:你可能输掉局部战斗,却赢得整场战争。随着棋盘变大,这种微观与宏观之间的动态关系会变得更加精妙有趣。

    Dwarkesh Patel

    大概你会把子下在这里吧。

    Eric Jang

    对,那我就能吃掉这一整组白子,这块区域就归我了。

    还有一个情况我想演示一下,我之前写代码时曾在这里犯过错。我们来看这样一个布局,棋盘上还有其他棋子。我们来讨论游戏是如何结束的。在这片区域里,谁控制这些地方?是白方还是黑方?

    Dwarkesh Patel

    白方。

    Eric Jang

    实际上,是黑方控制了这片区域,因为我已经把它完全包围了。假设我在这边还有别的黑子,你几乎不可能突破这个包围圈。

    Dwarkesh Patel

    那最终计分时,这些点也会算作……

    Eric Jang

    好问题。这就是不同规则体系下计分方式不同的地方。我们应该聊聊人类之间如何计分,以及计算机围棋中又是如何处理的,因为人类在评估这类局面时存在一定模糊性。

    大多数人类看到这样的棋局会认为,黑方已经完全包围了白方,白方根本没有活路。我们可以继续下下去,但最终黑方会吃掉所有棋子。不过,如果白方能找到办法突破这个结构并与外部相连,局势就可能逆转。这正是计算机难以判断此类局面的原因所在。

    人类是怎么处理的呢?思考这个问题很重要,因为它将映射到我们后来如何用深度神经网络来理解类似过程。人类基本上会说:“我觉得这盘棋可以结束了。”对方也必须说:“我也觉得该结束了。”然后我们再一起说:“这些是我的棋子。”如果对方不同意,那就继续下。

    本质上,当两个棋手——也就是他们所谓的价值函数——达成共识后,中国规则就会据此判定结果。而 Tromp-Taylor 计分法非常明确,因此计算机可以算法化地决定胜负。如果在终局阶段出现这种情况,计分方式是先数清楚自己控制的棋子数量,这部分是明确的。

    然后再数那些没有被对方棋子占据的空交叉点。这些点不会计入任何一方的得分,因为它们同时与黑白双方的棋子相连。

    如果是这样,白方会得到三分。这有点奇怪,因为人类其实知道白方并不真正拥有这些分数。但 Tromp-Taylor 计分法会把这些点也算给白方,再加上其他点。所以,计算机围棋与人类计分方式之间存在着巨大的差异。

    Dwarkesh Patel

    那这盘棋是怎么结束的?

    Eric Jang

    游戏在以下情况之一时结束:玩家选择认输,或双方连续弃权。这就是规则。

    Dwarkesh Patel

    现在帮我用 AI 破解这个游戏。

    Dwarkesh Patel

    我们来理解一下 AlphaGo 实际上是如何工作的,以及现场观众如何可能实现它。

    Eric Jang

    我们先从对底层搜索过程的直观理解开始,然后逐步引入深度学习中的思想,使其更高效、更易处理。

    围棋是一个只有两名玩家参与的游戏。我们在这里画一个人,再画一个 AI。假设这个人执黑棋,因此他先走。他在这里落子。现在轮到 AI 根据它所看到的局面做出回应。问题在于如何将输入信息编码进 AI 中。也许你可以使用 0 和 1,但你需要表示黑棋、白棋和空位。你至少需要三个不同的值。或许可以使用 0、1 和 2。AI 可能会看到类似 0, 0, 0, 0, 1 这样的输入——这是它在自己回合时的输入状态。

    AI 可以选择落子。我们随机选出三个可能的走法,我刚才也是随手画的。那么,哪一个走法最好呢?嗯,直到游戏结束我们才知道答案。围棋不像某些游戏那样有局部奖励机制来判断某一步是否好棋。这也正是围棋如此困难的原因所在。你只有在真正走到终局时,才能知道谁赢了。

    这棵树的深度有多深?在一个 19×19 的棋盘上,每一步大约有 361 种可能的选择,当然随着棋盘填满,可选位置会越来越少。整盘游戏的步数大概在 250 到 300 之间。专家通常会在远早于此时就决定结束比赛,但在 Tromp-Taylor 计分规则下,你必须一直下到终局。所以这棵树可能有 300 层深度。

    如果你不断扩展可能的走法——比如 AI 走一步,人类回应一步,如此往复——你会发现从当前这个状态衍生出的可能结局数量呈爆炸式增长。这个数字大约是 361^300,远远超过宇宙中的原子总数。当然,由于存在重复和对称性,实际数量并没有那么大;但如果采用朴素树结构且不合并子节点,最终会得到一棵规模如此庞大的树。

    Dwarkesh Patel

    你说的“合并子节点”是什么意思?

    Eric Jang

    我用这个棋盘来解释。如果我们从 A 点开始,你走到 B,我走到 C,你再走到 D;这等同于我从 C 点开始,你走到 B,我走到 A,你再走到 D。虽然路径不同,但最终到达同一状态。因此可以把这个子节点看作共享的共同祖先。

    Dwarkesh Patel

    明白了。我猜分支因子最初是 361,之后每一步都会减一。

    Eric Jang

    是的,每次轮到你走时,分支因子就减少一。无论如何,这是一棵非常大的树。这也是为什么多年来计算机科学家认为本世纪内围棋不是一个可解的问题——要穷举所有可能性所需的计算量实在太过庞大。

    理论上讲,围棋其实是一个确定性游戏。在任何给定状态下,你都可以计算出最优策略以赢得比赛。你可以搜索所有你能获胜的未来路径,并确保始终处于这些有利的未来之中。

    AlphaGo的核心概念突破在于使用神经网络使这个搜索问题变得可行。在我们深入探讨神经网络如何参与之前,先让我们假设有一台足够强大的计算机,来讨论如何搜索这棵树以找到最佳落子。

    一开始,你不会构建整棵树,因为存储它代价高昂。相反,你可能会交互式地判断这棵树的哪些叶子节点值得进一步探索和扩展,看看还有什么内容。博弈论早期有一些算法,比如UCB1,虽然不完全适用于像围棋这样的顺序游戏,但极大地启发了AlphaGo中使用的动作选择算法。UCB1的思路是:在每一步,我们都会选择最佳动作——即最大化Q(a)的a(argmax over a that maximizes Q of a),我稍后会解释Q(a)是什么——再加上某种探索奖励。

    在每个节点,我们将跟踪几个量。让我们把这些都看作一个节点。这是你做出决策的根节点,而这些是根节点的子节点。每个节点本质上是一个数据结构,存储了这个子节点被访问的次数。

    Dwarkesh Patel

    父节点访问这个节点的频率。

    Eric Jang

    是的。如果你来自机器人学或其他强化学习领域,容易困惑的一点是:动作在哪里?我目前只谈节点。这里的节点代表状态,而且由于这是一个完全确定性的游戏,没有随机性,你可以直接根据子节点推断出动作。如果我走到这里,那就意味着一个动作,而这就是我们最终到达的状态。

    如果让大语言模型“ vibe-code”一个MCTS实现,它们很可能会设计出正确的数据结构。但这有点像是厨师的选择。你可以随意重写树的结构。这是我让Claude 4.6写的,这是一个非常合理的选择。

    Qa表示这个动作的平均动作价值。我用下标a来表示这是从根节点采取特定动作到达这里的。采取a就让我们到达这个节点。我们还会存储采取这个动作的概率。

    Dwarkesh Patel

    再次,从父节点?

    Eric Jang

    是的,从父节点。我们采样到这个节点的概率是多少?这在后面会很重要。我们现在先谈确定性树,稍后再引入概率。

    最后,我们有一个子节点字典,这只是经典链表风格引用树中的更多节点。这是实现树的基本数据结构。

    AlphaGo使用了一个稍微不同的动作选择标准,称为PUCT,全称是Predicted Upper Confidence with Trees。当你选择要采取哪个子节点时,你会计算argmax a of Q(s,a)加上一个常数。方程形式很相似。这些都是评分标准。你想argmax这个量,也想argmax这个量来决定采取哪个动作。

    让我们分解一下这里如何选择动作的直觉。Q(s,a)是平均动作价值,所以给定子节点的平均表现如何。如果你真的知道整棵树,这就足以选择最佳动作。你其实不需要做更多。但如果你是在交互式地构建这棵树,同时也在确定Q值应该是什么,那么偶尔你必须尝试其他动作,作为探索与利用之间的权衡。

    在UCB和PUCT中,都存在一个基本奖励项,用于鼓励选择之前未曾采取过的动作。正如我们提到的,每个节点都存储了采取该特定动作的访问次数,且初始值均为零。对于某个动作a来说,其初始访问次数n为零。随着n的增加,如果从根节点出发已经进行了10次动作选择,但尚未选中a,那么针对a的这个项就会变得相当大;反之,若在这10次选择中a已被选中10次,则该项会迅速变小。此处情况相同。

    Dwarkesh Patel

    为了确保我理解正确,让我用自己的话复述一遍。我们重点关注UCB。从概念上讲,它可以被理解为两个部分:Q值和探索项。

    我们需要明确Q值的含义。Q值本质上表示:一旦我们完成这些rollout(即运行所有模拟),沿着树结构向下走,最终到达树的终端状态时,判断是否获胜。然后统计从该节点开始的所有叶子节点中获胜的比例,并将这个平均值赋给Q。因此,Q代表的是从当前节点开始游戏并最终获胜的概率——这就是所谓的“利用”(exploit)。它说明:我已经运行了这些模拟,并据此判断某一步是否为佳着。

    另一项的作用则是评估:相对于其他可能或已探索的动作分支,当前分支是否已被充分探索?如果尚未充分探索该分支,即使它的得分看起来较低,也可能是因为在该树中沿此路径深入搜索的叶子节点数量不足。此时仍应尝试该动作,即便Q值(即利用项)提示其价值不高。

    由于ln(n)的增长速度慢于n,随着时间的推移,argmax将逐渐由探索项主导(即第二项),转变为由Q值主导(即当你已进行足够多的模拟并对某一路径充满信心时)。

    Eric Jang

    是的,没错。UCB算法的设计初衷是提出一种策略,在无法预知各可选动作回报的情况下,通过引入探索项,使遗憾(regret)被限定在一个合理范围内——即你最多能犯多大的错误。

    我不了解具体证明过程,也不确定该算法是否已被证明具有对数级或平方根级别的遗憾上界,但我认为该算法正是基于这种形式推导出来的。可以看到各项的增长速率略有不同,这是为了适应围棋相比传统多臂老虎机问题拥有更多可行落子选择这一事实。

    一个小补充:你提到了模拟与概率。我们应该意识到,围棋本质上是一个确定性游戏。那这里的概率从何而来呢?如果有非常强大的计算机,就不存在概率一说,可以直接计算出真实平均行动价值。

    那么概率究竟出现在哪里?在AlphaGo问世前的计算机围棋系统中,通常采用蒙特卡洛方法,即随机选取一棵树并计算其期望Q值的平均值。正是这种随机选择的树引入了概率因素。此时Q值的解释变为:在某种随机搜索过程所产生的随机分布下,期望的行动价值是多少?

    随机搜索过程在哪里起作用?答案就在动作先验 Pa 中。如果我们假设一个朴素的算法,即每个有效动作被选择的概率是均匀的,那么这实际上就是所有有效走法数量分之一。你将在一个非常稀疏的树结构上计算这个平均值。虽然这是一个有效的积分,但速度极慢,因为你必须评估大量价值极低的子树。本质上,这几乎就是一个重要性采样问题——只有少数几个动作和路径能带来高价值,其余大部分都贡献很低。因此,这是一个棘手的问题。

    这是决定选择哪条路径进行搜索的动作选择标准。随着你在树形搜索中深入,最终会到达一个节点,此时胜负已相当明确。在 Tromp-Taylor 计分规则下游戏结束时(没有更多合法着法),你可以判断自己是否获胜或失败。这就是整局游戏的最终返回值。

    我们可以为树的叶节点分配一个终局价值 U,但如何为这些叶节点之前的父节点赋值呢?这就用到了平均动作价值,它本质上就是你对所有子节点取的平均值。假设这些都是叶节点,那么该节点的平均动作价值就只是这些叶节点处“赢”或“输”结果的平均。相应地,你可以沿着链向上回溯,说这个节点的平均动作价值——我们称之为 Qb——就是这些值的加权平均。

    这个加权平均可能取决于你的采样分布是否不同。但基本直觉是:你想解决的是那种确定性地赢或输的局面,然后可以反向进行——这被称为备份步骤——并根据对最终叶节点的平均来为这些节点或动作赋值。

    如果不使用神经网络,这种方法仍然不可行。你会难以找到应该采样的动作。大多数动作的贡献值都很低,尤其是当你试图从劣势局面中突围时。只有少数几个动作能提供高价值,因此在实践中搜索依然代价高昂。但关键在于,由于围棋遵循树状结构,只要下游的值都是正确的且搜索足够深,你就可以基于它们给出当前节点价值的极好估计。

    Dwarkesh Patel

    你之前关于某些状态的解释——即人类明显知道谁会赢,尽管确定性上仍需走完整个流程——实际上体现了为什么 1)价值函数既是可训练的,2)又是有效学习该游戏所必需的。或许从一开始就有必要明确定义“价值”的概念。

    Eric Jang

    我们讨论过 U 作为你对胜负的最终判断依据,这是针对终端叶节点的情况。人类并不会一直走到树的叶子末端。他们在几十手甚至高水平对局中上百手之前就停止了。

    他们是怎么知道的?可以把人类想象成隐式地拥有一个称为价值函数的神经网络,该网络接收棋盘状态并评估 p(胜)。人类扫一眼棋盘就知道“我大概要输了”。他们实际上是在运行一个神经网络,该网络隐式地对大量可能的棋局展开进行摊销。他们取这个平均值,判断当前局面是否可赢,以及是否应该认输还是继续下棋。

    这非常了不起。如果你想想这种美——人类的大脑中,神经网络竟然能瞬间完成所有这些模拟。他们仅凭几秒钟,无需逻辑性地玩完每一盘棋,就能基于沉淀的知识和经验做出判断。他们可以做到这一点。这给了我们一个启示:在围棋这类游戏中,可以大幅加快搜索过程。这正是 AlphaGo 之所以有效的基本原理之一。你可以训练一个价值函数,让它只看棋盘就能快速判断局势,而无需遍历所有可能的棋局到很深的搜索深度。

    Dwarkesh Patel

    有道理。我要对观众说,在准备往期节目时,如果觉得理解 AlphaGo 的工作原理很重要,我确实会感到相当困惑。但一旦你以这种方式理解了问题,再逐步搭建后续的几个环节,实际上会发现它非常容易理解,而且逻辑上完全说得通。现在感到困惑是正常的,但很可能等到这堂课结束时,你会发现它比你预想的要简单得多。我只是想提醒一下观众。

    Eric Jang

    从宏观角度看,关键直觉是:传统上,对于围棋这类游戏,我们可以构建一棵搜索树,但我们现有的计算机算力不足以支撑如此庞大的计算。评估每一个可能动作的价值也很困难,因为我们只有在游戏结束那一刻才能知道结果。

    虽然可以通过将每步棋都下到底来估算平均值,但这同样困难,因为我们根本不知道该选择哪些动作来进行采样。概念上,存在两个问题:树的广度(分支因子)和树的深度。AlphaGo 提供了一种方法,可以同时缩小这两个维度,使问题变得可处理。这就是它的核心思想。

    我们借鉴这样一个想法:人类可以扫一眼棋盘,瞬间判断胜负。这让我们有机会截断搜索的深度。同时,我们也知道人类能凭直觉,一眼看出哪些走法可能是好的。这两点都可以通过深度神经网络来实现,从而加速搜索过程。

    在讨论神经网络之前,我们先回顾一下“模拟对局”(playout)是如何工作的。我们之前只讲了一步。AI 看到编码后的围棋棋盘,它有一棵树,会深入这棵树,找出哪一步可能是最好的,然后执行这一步,再返回给人类。此时人类看到一个像这样的棋盘,于是他们也落下一子,比如在这里。

    接着我们又回到 AI 这边,它现在面对的是一个新的编码棋盘。我用 2 表示 AI 执白,1 表示人类执黑,0 表示空位。轮到 AI 时,它会从头开始重新进行一次 MCTS 树搜索。它丢弃上一轮搜索的旧树,现在有一个新的根节点,重新开始搜索。

    你可以把 MCTS 看作是一种搜索算法,它在神经网络的辅助下决定每一步的最佳走法,并且每一步都会执行一次。接下来我们来谈谈神经网络在这其中的作用。

    Dwarkesh Patel

    在擦除过程中,另一件让我理解清楚的事情是关于MCTS的数据结构,即节点及其子节点的关系。每次移动都会重新创建这个结构,并在每次移动后重新实例化。人类走了一步棋之后,AI会观察这一步,然后运行大量模拟来预测下一步的最佳走法。

    一次模拟就是在MCT树中探索一个新节点。当你运行了1000次模拟后,就能根据这些结果得出下一步走法的概率分布,正如你将要解释的那样。这就是你要存储的信息。然后你会选择概率最高的那个走法。接着,你丢弃所有这些信息,轮到下一个玩家走棋,然后从每一步棋的开始重新进行这个过程。

    Eric Jang

    正确。补充一点:你并不需要丢弃所有信息。你会保留其中一项,后面我们还会用到它。

    Eric Jang

    现在我们对搜索如何决定走法有了基本了解,接下来要讨论的是神经网络如何通过模拟人类直觉来加速这一过程。这里有两个网络:一个是价值网络,它接收当前局面并预测“我会赢还是会输”,这是一个二分类问题;另一个是策略网络,它为可能的行动生成一个概率分布。

    我画的是一个一维的扁平化走法分布图,但实际上它是一个二维的棋盘网格。这些都是对良好行动的预测概率分布。这两个都属于多类别分类问题。你可以像训练其他分类器一样用深度学习、交叉熵损失等方法来训练它们。

    具体架构其实没那么重要。我尝试过几种不同的架构,Transformer和ResNet都能工作。在小数据场景下,我的经验是ResNet仍然比Transformer表现更好,能以更低的成本获得更高的回报。但这并不总是成立。

    Dwarkesh Patel

    等等,为什么会这样?

    Eric Jang

    因为Transformer提供了局部卷积的归纳偏置(inductive bias)。一般来说,当需要更多全局上下文时,Transformer才会开始优于残差卷积网络。

    KataGo论文中的一个有趣发现是,他们发现在整个网络中聚合和整合全局特征非常有用,这能让网络更好地理解如何将棋盘一侧的价值传递到另一侧。

    Dwarkesh Patel

    那“聚合全局特征”是什么意思?

    Eric Jang

    假设有一个非常大的19x19围棋棋盘,这里正在发生战斗,那里也在发生战斗。当这些信息通过卷积神经网络时,感受野擅长处理局部信息并保持其不变性,但很难将这两处特征联系起来。因此需要将它们汇聚在一起,并通过某种方式相互关注。

    之所以说Transformer适合计算机视觉任务——比如视觉Transformer——是因为它们在整个图像上具有全局注意力机制,更容易建立这种跨区域的连接。不过这也意味着你需要更多的数据来学习那些不变的局部特征。

    我一直很努力想让Transformer在这个问题上发挥作用,因为我很好奇Transformer是否能在围棋中带来突破,从而省去很多技巧性的操作。但无论怎么尝试,目前还没找到让Transformer超越ResNet的方法。

    Dwarkesh Patel

    还有一个旁支问题。如果除了空间信息之外还需要考虑其他信息,那么使用全局信息聚合的 Transformer 模型确实更有道理,因为 CNN 会让人产生一种偏见——即相邻的事物尤其重要。

    Eric Jang

    然后这些信息会被逐步聚合起来。

    Dwarkesh Patel

    对于那些局部情况并不重要的游戏——你只需要关注整体局势——你说 Transformer 会更有效。我们刚才讨论的是空间维度,那时间维度呢?目前我们只考虑前一步,因为这是一个确定性的完全信息博弈。

    但如果像扑克或《外交》这类游戏,对手很久以前的一次诈唬现在仍然相关呢?为了决定下一步行动,你需要回顾所有之前的状态。这是否会影响你对归纳偏置和哪种架构更合适的判断?

    Eric Jang

    很好的问题。《围棋》是完全信息博弈。在完全信息博弈中,确实存在一个纳什均衡策略,使得你采取该策略不会比任何其他策略表现更差。

    如果你知道对手有某种特定倾向,比如特别喜欢激进打法,理论上你可以针对这种具体策略设计出比纳什均衡更好的应对方法。但若要对抗任意给定策略,只需根据当前状态就能确定一个单一的纳什均衡解。这正是 AlphaGo 所做的设计选择,事后看来效果非常好,因为那个纳什均衡似乎达到了超人类水平,没有任何人类策略能胜过它。

    不过也存在一些变体,这时必须考虑时间上的历史信息。这是一个非常令人兴奋的研究方向,我鼓励大家 fork 我的代码库并尝试探索。比如在打 2v2 围棋时,你就需要建模队友的行为。你可能不了解他们的打法,因此必须收集他们如何下棋的信息,以便做出相应回应。这些场景已经不再是完全信息博弈了。在不完全信息或部分可观测的游戏中,确实需要上下文来构建模型。这正是自我对弈或类似《外交》类游戏能带来巨大突破的地方。

    回到神经网络本身,架构其实没那么关键。用 Transformer 可以工作,用 ResNet 也可以。我发现低成本实验中 ResNet 稍微好一点。你也可以采用 Karpathy 风格的 AutoResearch 超参数调优,让架构变得相当不错。这部分不用太纠结,关键是把问题设定得能让目标优化明确。

    我们会选一个对我自己实验有效的、相对随意的架构。但再次强调,这部分并不特别重要。你有编码后的棋盘状态,就像 RGB 图像一样,我们将设置三个通道:一个通道表示黑子,一个表示白子,第三个表示空位或掩码区域(如果你想训练不同尺寸的棋盘)。不过我现在暂时不打算讨论多尺寸棋盘,这有点复杂。

    我们有一个两通道或三通道的类RGB图像,将其输入ResNet。然后有两个分支头:一个分支预测值函数,它只是一个logit,我们姑且称之为R1;另一个是策略分支,即R361。这就是整个架构。我们要训练它根据棋盘状态预测游戏结果,同时也要让它学会预测哪些是好棋。

    AlphaGo Lee的原始论文使用人类专家对局的数据集通过监督学习初始化了网络参数。后来他们移除了这个限制,改为让模型自己教会自己如何下得好。我认为这种做法在实现和面向观众方面非常巧妙——总是从简单的事情开始,先让问题跑通,然后再尝试解决更复杂的全盘学习(tabula rasa)问题。

    在深度学习中,初始化至关重要。你永远应该把研究项目初始化在最接近成功的地方,尤其是当你尝试全新的任务时。与其从一个完全无效的状态开始强行训练,不如选择一个已经有效的方法,然后在此基础上做得更好。

    基于这种理念,选择一个良好的初始化方式是个好主意。我们将利用人类专家的棋谱训练模型预测好棋,对专家获胜的对局中的每一步都进行预测。无论当前局面如何,都要预测最终胜负结果。

    你可能会有疑问:在早期只有寥寥数子的情况下,怎么可能知道谁会赢呢?其实如果你有数十万盘对局数据,平均来看,这类开局有一半会赢,一半会输。因此模型训练后,logit会收敛到0.5。随着棋局推进,胜率要么上升要么下降,这是很自然的结果。

    这是你的第几步棋。当对局进行到数百手之后,根据专家数据分布,哪一方更有可能获胜就会变得非常清晰。

    Dwarkesh Patel

    我不太理解为什么这种价值判断方式特别适用于专家数据。

    Eric Jang

    它与专家数据无关。无论你用什么数据训练,这个规律都成立。即使从零开始学习(tabula rasa),也会出现同样的结果。

    想象你在用" vibe coding "的方式开发AlphaGo:你从KataGo或人类玩家那里收集了一些专家数据集,训练了这个模型。结果发现它已经是一个相当不错的围棋选手,很可能击败大多数人类棋手。如果你直接采用它的策略建议,取概率最高的动作作为落子,就会得到一个反应极快、不经过推理步骤的强手。仅凭不到300万个参数的十层神经网络就能做到这一点,本身就相当神奇。

    你可以这样开始。在实现过程中,验证这一点非常重要——确保你的 Go 规则确实如预期般运作,并且能够相对快速地运行这些模拟。作为检查点,在尝试叠加更复杂的搜索机制之前,务必确认你确实能完成这个基础步骤。

    但我们远不止于直接使用原始神经网络来落子。让我们将神经网络应用于蒙特卡洛树搜索(MCTS)的优化。我们从根节点出发,现在有一个四步迭代过程来完成 MCTS。

    我在最初阅读论文并试图理解时也曾被这点困扰。本质上我们要做的是选择一个模拟次数,这个数值是变化的,通常在 200 到 2,048 之间。我记得在 AlphaGo 对 Lee 的比赛中,他们每步棋使用数万次模拟,因为他们希望尽可能提升模型强度。但在训练阶段,其实不需要那么多。KataGo 似乎也采用了类似的量级。

    Dwarkesh Patel

    你知道他们当时用了……如果你看了纪录片,比赛时他们拿着一台笔记本。但笔记本本身并没有参与运算——它连接的是——

    Eric Jang

    我认为是连在一组 TPU pod 上的。

    Dwarkesh Patel

    说真的,这有点不公平。Lee 并没有用 1E22 FLOPS 的计算能力来下每一步棋。

    Eric Jang

    确实如此。有趣的是,现代围棋 AI 在实际对局中并不需要那么强的算力。随着我们讨论 MCTS 策略改进的机制,会发现随着时间的推移,原始网络实际上承担了所有来自那个强大 TPU pod 的工作负担,并将其全部压缩进一次前向传播中。你完全可以用一个神经网络的单次推理完成所有这些计算。TPU pod 始终提供额外的增强效果,这正是他们在比赛中想要的效果。

    我们将确定这个模拟次数,每次模拟同时进行几项操作:评估当前树中最优的走法;当需要扩展时添加新的叶子节点;更新动作价值;以及反向传播结果。每一次模拟都包含这四个步骤:选择、扩展、评估和回传。

    在蒙特卡洛树搜索开始时,我们的树非常基础,只有根节点,也就是 AI 当前要落子的棋盘状态。我们基本上会从这里选出最佳动作。创建根节点时,我们也知道可以通过神经网络评估它,得到 Vθ 值以及各动作的概率分布。我会把这个称为根节点。对于这里的每一个动作,我们都可以生成若干子节点。例如,我画了一个缺了一角的 3x3 棋盘,因此这个根节点对应八个可能的子节点。每个子节点都有相应的动作概率,比如 P8、P1……一直到 P2 等。

    所以在蒙特卡洛树搜索开始时,我们有根节点,并可以为其初始化一些子节点。策略网络作用于根节点后——在一个已有一个棋子落子的 3x3 棋盘上——给出了八个可能的后续走法,即 AI 可能采取的动作。针对每个子节点,策略网络还提供了选择该动作的概率。第一步是执行树的“选择”过程。再次强调,这是一棵很浅的树,目前我们只拥有一个深度为一的树结构。

    我们的第一步是通过最大化(或 argmax)PUCT 准则来选择动作,其公式为 Q(s,a) + CPUCT × Pa × (√N / (1 + Na))。初始时,所有动作的 Na 均为零,N 也为零。因此,我们根据这个准则进行选择。最初,所选动作很可能偏向于最可能的动作,因为此时每个节点的分布是均匀的。

    假设 P1 是概率最高的节点,因此你选择了它。现在你到达该节点,发现它不是叶子节点,也不是终局状态,无法直接判定胜负。接下来进入扩展阶段:将当前棋盘状态输入策略网络。注意,这是 AI 的回合——AI 正在做出这一决策。当我们展开这棵树时,实际上是在思考人类或其他对手可能如何应对。

    当我们评估该节点时,是从当前玩家的视角出发。该节点有若干可执行动作,我们将这些叶子节点进行扩展。对于每一个可达节点,我们会评估其优劣。例如,这里人类可以下在这里、这里或这里。我们会为每个节点存储 Vθ 值,如 Node1' 的 Vθ、Node1'' 的 Vθ 等。本质上,我们是利用神经网络对从当前玩家角度看这个棋局的优劣做出直观判断。

    幸运的是,由于这是零和博弈,很容易推导出:当前玩家在当前步骤的价值,等于 1 减去对方视角下的价值。只需根据当前轮到哪位玩家,即可轻松翻转搜索过程。这就是扩展步骤:从一个非叶子节点出发,将其展开并评估各子节点的价值。这其实是对“如果我按这条路走到最后,是否会赢”的快速判断。你可以把 Vθ 看作是一种捷径——无需真正遍历整棵树,就能预判任意模拟路径的最终结果。

    这本质上是评估步骤:我们在评估每一步棋局的质量。在 AlphaGo Lee 的原始版本中,他们做了一件很有趣的事:将神经网络的估值 Vθ 与真实围棋 rollout(随机走子)的结果取平均。具体来说,他们会从当前位置开始,用真实规则走完一局完整的对局,直到 Tromp-Taylor 规则下的终局(即黑白一方明确获胜)。我们用这条波浪线表示其中一条路径。最终得到一个 0 或 1 的结果,然后与 Vθ 的值按公式 α×Vθ + (1−α)×rollout_value 进行加权平均。

    你可能会问:他们是如何完成这个 rollout 的?若每次都要在此 rollout 上重新搜索,代价会非常高昂,几乎相当于“树中套树”。但他们并没有这么做。相反,他们直接使用策略网络自我对弈——让同一个模型同时扮演双方角色,一直下到终局。这样做的好处是让前面的估值估计更贴近现实,因为你至少能拿到一个样本,判断自己是否能赢。尤其在残局阶段,棋盘已基本定型,按照策略网络走子往往能给出相当合理的胜负预测,从而避免估值脱离实际。

    事实证明,这一步完全是多余的。在 AlphaGo Lee 之后的所有论文中,都舍弃了这一机制。我在自己的实现中也采用了同样的做法,并且显著提升了速度——因为在每次模拟时都不再需要运行完整的 rollout 了。

    Dwarkesh Patel

    好的,我只是想强化一下自己的理解,顺便再解释一遍。顺便说一句,对观众来说,如果这还不够明显的话,select 中的 P 指的是网络输出的概率。

    Eric Jang

    正确。这就是策略网络。

    Dwarkesh Patel

    从根本上说,这只是一个模拟,你可以把它想象成在搜索过程中再展开一个节点。

    Eric Jang

    差不多吧。当整棵树已经存在时,模拟确实容易理解。你只需沿着树向下走,使用 PUCT 选择准则,然后继续前进。在 AlphaGo 中,数据结构是这样的:我们一开始的树基本上只有一层深度——也就是只有一个子节点——而你想在沿着树选择动作的同时逐步扩展这棵树。这才是核心所在。因为围棋是一个组合复杂度极高的游戏,你无法提前构建完整的树再去搜索。你必须边构建边搜索。

    让我完成最后一步,也就是回传(backup)。一旦你对这些节点进行了评分,分配给这个节点的 Q 值就是你所评估值的平均值。你对所有模拟结果取运行均值,即对子节点值进行平均。这就是回传步骤,一旦你计算出这个值,就可以递归地向上回溯。如果你知道这个节点的动作价值,就可以对其父节点取平均,依此类推。

    你有这样一个四步流程:1)你选择目前所知的最优动作;2)你可能遇到一个之前没访问过的节点,因此需要稍微扩展一下树结构;3)通过网络运行一次前向传播,猜测是否会获胜;4)一直回溯到根节点,更新哪些走法是最优的。

    当你迭代执行这一过程时,由于你始终根据这个准则进行选择,因此在任何给定分支上,你都会选择自认为最好的动作。最终各节点的访问次数将反映通过该搜索过程诱导出的正确策略分布。我们之前在节点中存储的访问次数,实际上会成为我们最终应选择哪个动作的投票依据。

    作为理解程度的检验,值得思考的是:我们能否让这个过程更简单一些?也许可以干脆去掉这一步,系统依然能正常工作吗?回想一下,当你对一个节点进行扩展并评估后,实际上是在检查每个子节点的胜率。所以如果其中一个子节点的值为 1,其余为 0,你就知道某个动作可能更优。那为什么还需要这一步呢?为什么不直接将这些值归一化为一个分布,并将其视为你的策略分布?

    这样做也可以,而且很可能确实有效。但在实践中,单次前向传播就能给出相当不错的猜测,从而实现对宽度的剪枝。这里存在一种对偶性。如果策略推荐了一个与价值判断相矛盾的动作,那就很奇怪了。比如策略认为某动作概率很高,但价值却很低,那么你的策略头和价值头之间就出现了根本性的不一致。它们是相互关联的,如果你能找到一种仅从价值评估中恢复它的方法,或许真的可以舍弃这一步。

    Dwarkesh Patel

    没错。为了确保我理解正确,你们不这样做的原因是为了避免需要进行360次独立的正向传播来“好的,这是所有值的估计。然后我们对它们取argmax”。相反,你们可以通过一次正向传播就得到所有这些动作的概率分布。

    Eric Jang

    实际上,这些计算通常可以相当高效地批量处理,所以在实践中可能并不是一个巨大的计算负担。但确实,为了评估所有值,你可能需要将最多361个局面(board)放入单个小批量更新中,然后进行归一化。

    实际上还有一个更重要的原因,我们仍然这样做,是因为蒙特卡洛树搜索如何被用来反馈自身并递归地改进其自身的预测和搜索能力。这就是为什么将价值建模为一个显式的实体,而不是对价值进行隐式归一化,是一个好主意的地方。

    Dwarkesh Patel

    有道理。好的。

    Eric Jang

    我们讨论过模拟过程。当你运行模拟次数时,最终会得到一棵树,它看起来像……我在画一个非常低维的版本。当然,在真实游戏中,维度要高得多。最终你会得到一棵树结构,其中有很多叶子节点终止了,并且不会被再次访问,因为它们的价值被认为太低。但随着N的增加,沿着一条路径,会有一组动作的访问次数非常高,这些动作会趋向于那一系列决策。

    这就是蒙特卡洛树搜索中树的心理图像。你应该将其与井字棋中的穷举树进行对比,那里有九个动作,然后是八个,然后是七个、六个,依此类推,形成一个九阶乘大小的树。围棋中的蒙特卡洛树搜索是非常稀疏的。它只考虑你已经展开子节点的路径。

    现在我们有了应用价值函数以及策略函数的搜索算法,我们可以讨论蒙特卡洛树搜索算法如何作为这些算法之上的改进操作符。

    Eric Jang

    我们现在讨论这个系统如何通过自我对弈变得更强的强化学习部分。假设我们下了一盘棋。你走了一步。AI会进行搜索,这就是访问次数的分布。让我们称这是你在当前节点的初始策略建议。

    经过MCTS后,它对其中一个动作会更加自信。也许基于搜索,这个分布看起来会更尖锐一些。当然,你可以调整搜索过程使其结果更分散,但这可能不是一个好主意。MCTS应该对其他动作更加自信。它可能最初会对其他动作赋予很大的权重,但随着模拟次数的增加,它应该会收敛到一个非常尖锐的分布。

    让我们称这个分布为π。让我们把这个MCTS操作符记为(a | s)。在应用MCTS过程后,你的策略推荐分布看起来像这样。它比之前稍微尖锐一些。然后你取argmax,或者你也可以直接从这分布中采样。不一定要是argmax。你走了这一步,丢弃这棵树,然后在下一步重新开始。同样,你计算一个新的分布。最初,你的猜测可能看起来像这样,然后通过MCTS进行细化。

    Dwarkesh Patel

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

    Eric Jang

    抱歉,没错,就是这样。每次落子时,你都会根据策略网络给出初始猜测。然后搜索过程会结合你的策略网络和价值网络,得出一个更有把握的动作,如此循环往复。

    游戏结束后,一方获胜,另一方失败。AlphaGo 训练方式的精妙之处在于,它实际上可以利用这个最终的搜索过程——也就是搜索的结果——告诉策略网络:“嘿,与其让 MCTS 费尽周折地走到这一步,不如从一开始你就直接预测出这个结果?为什么不一开始就不用这个猜测,而是直接预测这个动作呢?”如果策略网络一开始就有这个猜测,那么 MCTS 就无需做太多工作就能达成目标。

    如果我们绘制一个测试时的扩展曲线……假设横轴是模拟次数。在零次模拟的情况下,你的隐含胜率在这里。如果你只是采取原始动作,胜率就是这样的水平。假设我们增加模拟次数,胜率曲线可能会像这样上升。当你进行 1,000 次模拟后,就能达到这里的策略,从而获得更高的胜率。

    但如果你将这个 MCTS 的策略网络蒸馏回你的“即兴发挥”型策略网络,那你实际上可以从这里开始。假设通过蒸馏,起点变为零,然后再投入 1,000 次模拟,你最终能达到这里的位置。这几乎像是可以把前 1,000 步的工作量分摊到策略网络中,而不是全部交给搜索过程,这样一来,你就可以从一个好得多的起点出发,在相同模拟次数下取得更好的结果。

    Dwarkesh Patel

    随着模拟次数的增加,测试时的扩展呈现出 sigmoid 曲线的特征,即胜率提升逐渐减小。这种趋势对于蒸馏后的网络也成立吗?也就是说,当我们从蒸馏后的网络出发时,是否还能再次获得早期的增益?还是说这种增长模式本身就是 MCTS 的固有特性?

    Eric Jang

    说实话,我其实并不清楚 MCTS 模拟在测试时的扩展行为。我认为它在实际应用中可能对参数强度非常敏感。我刚才画的只是一个单调递增并最终趋近于 1 的函数。

    不必太关注曲线的具体形状,只要知道它的变化趋势是随模拟次数单调递增即可。MCTS 的思想非常巧妙。我们通过引入搜索机制获得了更强的能力。接下来,在更新网络的下一轮迭代中,我们将训练它来近似模拟 1,000 步搜索的结果。

    这样一来,神经网络不再需要从零开始,而是可以直接从这个更优的起点出发,之后再叠加另外 1,000 步的搜索,整体表现就会更强。这个过程可以不断迭代下去。AlphaGo 的训练算法基本思路是:收集所有走法中应用了搜索的动作(无论最终输赢,这一点非常重要),然后让模型去模仿这个搜索过程。

    这与机器人学中的 DAgger 算法有相似之处。首先,我来画一个状态示意图:S0、S1、S2、S3。假设我们在 MDP 中执行了一系列动作,从而形成了一条轨迹。这些动作可能是次优的——比如最终输掉了游戏。有一类算法的基本思想是:对已有的轨迹重新标注动作,使其导向更优的轨迹。例如,这里原本应采取 A0’,而 A1’、A2’、A3’ 也都是更好的选择。

    MCTS 所做的正是这一点:你虽然输掉了游戏,但在每一步,我都会给你一个严格优于你实际采取的动作。它不能保证你一定会赢,但能保证的是:如果你把这些(状态-动作)元组作为训练数据,并重新训练你的策略网络来预测这些新动作而非原始动作,你的表现一定会更好。

    这在机器人学和模仿学习中非常相关,尤其是在需要收集干预数据时。即使当前状态并不理想——比如一辆自动驾驶汽车偏离了道路——仍然存在一个有效的动作可以纠正错误并带你回到正轨。

    Dwarkesh Patel

    严谨一点的问题是:MCTS 是否一定比当前策略更好?举个例子,在训练初期,由于 MCTS 依赖价值网络的信息,如果该网络尚未通过完整对局充分训练,那么 MCTS 给出的建议可能还不如一个随机初始化的策略。所以,这是否只是一个启发式方法?还是说存在某种理论上的保证?

    Eric Jang

    实际上,这更像是一个启发式方法。虽然在实践中确实有效,但我可以举一个反例说明 MCTS 可能给出比原策略更差的动作分布。这种情况常发生在自我对弈算法已经训练到较好水平,却因缺乏多样性数据等原因导致性能突然下降的时候。

    设想一种局面,此时策略网络 Πθ(a | s) 的建议非常准确。但由于我们大量对局中 bots 提前认输,没有进行到底盘-Taylor 规则的终局判定,结果模型忘记了如何评估那些后期局面下的价值。就像之前角落攻防的例子那样,我们的经验回放缓冲区里 100% 的训练样本都来自“已败”局面,导致无法正确评估这些状态的价值函数。

    最终可能出现终端价值严重偏差的情况。若叶节点的终端估值不佳,这种误差会逐层向上传播,使得 PUCT 选择准则和反向传播过程失准,从而导致访问的动作分布与策略网络的初始推荐大相径庭。

    此外,如果模拟次数(sims)太少,就会因探索不足而产生方差问题。只有当模拟次数 N 趋于无穷大时,MCTS 才具有收敛性保证。搜索过程中的方差以及估值不准确都会严重影响策略建议的质量——这也是为什么它并不能确保带来性能提升。

    这就是我怀疑 AlphaGo Lee 的训练算法中包含了将棋局进行到底的模拟次数,以便让模型基于真实的模拟结果进行训练。实际上,你还可以这样做:在 10% 的对局中,阻止 AI 认输,而是强制“走到底”。这样,你的回放缓冲区就能获得一些真实对局的完整数据,而这些是普通人类玩家通常不会走完的终盘阶段。

    如果你假设价值函数是正确的,那么这就是 MCTS 能给出更好策略的原因。这是一个非常关键的假设链条。只要这个假设成立,你的搜索过程就应该比初始猜测给出更好的推荐。

    Dwarkesh Patel

    如果你从一个冷启动的策略开始——比如像 AlphaZero 那样的模型——在前几个 epoch 里,这个策略基本上是无用的。你所做的只是:“嘿,我们来玩完整的对局吧,一旦我们完成了整局游戏,我们就可以对之前的每一步标记谁赢了、谁没赢。”AlphaZero 的损失有两个组成部分:一是策略相对于 MCTS 的好坏程度,二是价值预测相对于实际胜负的好坏程度。你可以把它应用到每一个动作或每一步棋上。

    AlphaZero 训练初期真正发生的是:我们试图让价值函数能够准确预测,当你处于当前状态且轮到你下时,谁会赢得比赛。从功能上看,这就是全部内容。之后,当价值函数训练得足够好时,策略才开始提升。

    Eric Jang

    没错。我发现一个技巧挺有用的。这不是经过同行评审的说法,所以请谨慎看待。在我的实现中,我发现以下做法很有帮助:你想先确保这个基础是好的,然后再投入大量计算资源做 MCTS。如果价值预测本身就是垃圾,那在上面做搜索也没多大意义。你应该从一个能正常工作的良好起点开始。

    AlphaGo Lee 做得很好的一点是:它直接利用人类对局进行训练,效果很好。你也可以使用一个开源的围棋 AI,让它自己和自己下,生成数据,这也行得通。只要你有一些现实、高质量的离线数据集,就能很容易地学会终盘的价值函数——这是启动搜索过程所需要的。

    Dwarkesh Patel

    抱歉,你能再重复一遍刚才那句话吗?

    Eric Jang

    是的。评估终盘的围棋局面其实很容易。当棋盘几乎摆满棋子时,不确定性越来越小,几乎成了一个可判定的问题。因此,大多数合理玩家会走完的对局,可以作为训练价值函数的良好数据,尤其是在树的末端部分。

    随着你进行更多对局,搜索会将好的估值反向传播到树的中层节点。随着数据量增加,你的价值网络会对“健康的局面”和“不健康局面”形成良好的直觉。这种判断在中盘比开局或终盘要微妙得多。

    最难评估的部分不是开局,因为开局显然胜率是 0.5;也不是终盘,那时胜负已明。你最想在价值函数中学会的是:在中盘时,谁占优势。

    Dwarkesh Patel

    这实际上与 TD(时序差分)学习非常相似。

    Eric Jang

    是的,这里其实和 TD 学习有很美妙的联系,我们稍后再来对比它与蒙特卡洛树搜索的不同。

    首先,你希望获得良好的价值函数,而专家数据可以给你一条捷径。我建议从业者先这么做,用它来初始化一个良好的起点。如果你想实现类似 AlphaZero 或 KataGo 的“白板从头学”(tabula rasa learning),你可以尝试在小棋盘上玩随机对局。就用一个随机代理。如果你玩了 5 万局,实际上也能学到相当不错的价值函数。在 9x9 的棋盘上,通过随机对局就能看到足够多的常见模式。

    如果你同时在 9x9 和 19x19 的数据上训练——KataGo 提出过这类架构——那么从在 9x9 上评估的价值头迁移到 19x19 上,会有相当不错的迁移学习能力。

    Dwarkesh Patel

    没错,因为和其他游戏不同,Go 这个游戏在规模变大时,并没有引入新的棋子类型之类的变化。

    Eric Jang

    如果我们把它推到极限,考虑一个非常小的 4x4 Go 棋盘,如果你玩了 5 万局,你会看到很多看起来像人类下法的终局状态。到这一步,它本质上就变成了井字棋。

    如果你稍微放宽一点,扩展到 5x5 或 9x9,可以合理想象:仅靠纯随机对局就能生成看起来相当合理的局面。这些局面的得分也很容易估算。这就为你提供了“自举”(bootstrapping)的基础,让你能结合搜索来改进策略。

    但 MCTS 拥有准确的价值估计至关重要。你需要为价值函数提供一个“接地”(grounding)机制。如果没有这个基础价值函数,MCTS 最终会失效。

    Dwarkesh Patel

    我很想知道,如果价值和策略在同一网络里训练,能节省多少算力?因为它们共享相同的表征,学习效率能提高多少?我们刚才也讨论了它们在做相似预测,或者说应该彼此一致。所以我很好奇:把两者放在同一个网络里,是不是相当于把计算量减半?

    Eric Jang

    AlphaGo Lee 的原始论文用的是两个独立的网络。之后的所有论文都把它们合并成了两个输出头(heads),显然这能节省计算资源。但要严谨地科学回答这个问题,虽然看似简单,但在实践中要真正把它追到底,还是需要不少工作量才能彻底验证。

    直观来看,它们确实共享了很多表征。正如我们提到的,你的策略网络和价值网络在做评估时应该达成一致。它们之间应该有这种一致性。

    Dwarkesh Patel

    告诉我这是不是错误的理解方式。当我了解了 LLM 的工作原理,以及 RLVR 算法有多简单时,我震惊于它能做到这么多事。它仅仅通过“是”或“否”就能学会构建非常复杂的代码仓库。

    在这里,如果你更深入地理解它,就会发现 AlphaGo 其实没那么令人印象深刻。你是在告诉它如何逐步调整探索策略,给它注入了大量先验偏见。你还为它构建了非常显式的树搜索结构。我不知道你是否也有这种感觉:随着理解的加深,2017 年那个成就反而显得不那么震撼了。

    Eric Jang

    我个人并不同意。我认为它们之所以深刻,原因各不相同。我对 LLM RL 的理解还不够深入,无法在你们的播客中发表评论。但为什么 AlphaGo 是一项深刻的成就呢?让我们稍微退一步来看。它与现代强化学习不同,我们可以稍微讨论一下其中的算法选择。

    我认为最深刻的一点是,一个10层神经网络的前向传播,基本上就是10步推理……当然,这种推理并非只有一条思维路径。它可能是分布式表征,同时发生许多思想。但从结构上看,一个10层的神经网络只能进行10个顺序的思维步骤。然而,通过并行化和分布式表征,10步神经网络思考能够以极高的保真度分摊并近似解决那些几乎无法处理的搜索问题。

    这是一个突破,我认为大多数人至今仍未完全理解其深刻程度。这也是 AlphaFold 的基础——例如,你面对的是一个非常、非常困难的物理模拟过程,需要运行大量微观尺度的模拟,而一个相对较小的神经网络只需10步就能 somehow 捕捉到原本感觉像是 NP 类问题的整体行为。

    这让我不禁怀疑,我们对 P=NP 这类基本计算复杂性问题的理解是否还不完整。显然,这并非 P=NP 的证明,但其中确实存在某种令人不安的东西:那些看似极其困难的问题,竟然可以被一个简单的宏观解决方案所化解。

    Dwarkesh Patel

    这是一个非常有趣的洞察:许多被证明是 NP-难的问题——我不知道围棋是否已被严格证明为 NP-难,但蛋白质折叠等确实是——神经网络却能有效求解。它们在 worst case(最坏情况)下是 NP-难的,但我们通常并不关心最坏情况。这些问题往往具有大量的内在结构。

    Eric Jang

    我认为我们应该反思的是:我们一直以来是如何在最坏情况复杂度下构建 NP-难问题的解决方案的。我并不认为这解决了围棋问题,它并未给出最优解的精确答案,但在实践中极其有用。AlphaTensor 和 AlphaFold 也展示了同样的现象:尽管存在一个在 worst case 下似乎不可解的超难问题,我们依然能取得几乎任意程度的进展。

    极限情况下会是什么样子?如果你想要模拟像天气这样极其复杂的系统,或者预测未来——无论我们是否生活在模拟中——构建这样一个复杂模拟所需的计算资源,可能远比你想象的要小得多。这得益于我们能够将大量计算分摊到单个网络的前向传播中。对我而言,AlphaGo 是第一篇真正展示这种深刻压缩模拟能力的论文。

    Dwarkesh Patel

    我完全不具备计算复杂性或数学背景来评论这些,但我很好奇混沌理论是否在这里扮演了重要角色。天气问题究竟出在哪里?为什么预测一天后的天气所需资源是前一天的10倍,并且每多预测一天,资源消耗就持续翻倍?这是因为系统是混沌的,微小的扰动会随时间推移彻底改变最终结果。我想,围棋和蛋白质折叠可能也是如此。

    Eric Jang

    这里有个关于天气的类比,或许适用于围棋。这是当前的棋局状态。根据我们对两位棋手的信息,未来某个时间点的确切棋局状态会是什么样?这极其依赖于初始条件。哪怕只落下一子,也可能彻底改变预测结果。这太难了。直觉上,这就是一个混沌问题。

    然而不知何故,我们仍能预测谁会赢。这说明存在大量可能性。我们真正关心的是一种更宏观的量——即众多可能未来的平均值、期望值,或某种全局的大尺度结构。

    天气也是如此。我们并不关心在特定经纬度上空6000英尺处风速的确切数值。我们关心的是飓风的位置之类的大尺度现象。在混沌理论中,经典的洛伦兹吸引子就是如此。即便你从洛伦兹吸引子上的任意一点出发,也无法确定最终会到达哪里,但你知道它大致呈现出这样的形态。这其中有一种美。有时我们并不一定关心微观层面的细节,而更关注宏观结构,而这些宏观结构是可以被预测的。

    Dwarkesh Patel

    这与哈希函数形成鲜明对比,后者同样极度依赖初始条件,但缺乏宏观结构(至少我们希望如此,前提是算法设计得当)。

    Eric Jang

    但愿如此。

    Dwarkesh Patel

    在哈希函数中,不存在类似“价值函数”或“整体天气状况”那样的有趣宏观描述。它只关心100步之后棋盘的确切样子。

    Eric Jang

    直觉上这似乎是对的。虽然这不在我的专业领域,但我发现一个有趣的现象:密码学和哈希技术至今未能证明无法构造快速近似算法。如果能够做到这一点,就能证明P不等于NP。

    Dwarkesh Patel

    事实上,许多加密协议中存在结构,比如RSA加密。正是这些结构被量子计算机利用来破解它们。

    Reiner曾写过一篇非常有趣的博客文章(我们在节目中讨论过),他指出:若从高层视角观察,密码协议和神经网络极为相似。它们都由一系列信息混叠层构成,表现出算法上的趋同演化。在密码学中,你希望最终状态对初始条件极度敏感,稍有改动就会变得混乱不堪。在神经网络中,你也希望所有信息相互关联,这样才能处理全部信息并考虑其内在关系。

    Eric Jang

    我认为,神经网络的强大能力出现在混沌边缘。Jascha Sohl-Dickstein的一些研究论文涉及这一观点。混沌并非毫无用处的噪声,其中蕴含着某种根本性的价值,至少在边界区域是如此。不过这只是哲学层面的思考,我对相关数学了解不够深入,无法展开评论。

    我们稍后会讨论 LLM RL,因为两者之间存在一些关联,但现在让我们回到 MCTS。它具体在做什么?关键在于,它并不是直接说我们要提高获胜的概率。它不会简单地将所有获胜动作的概率上调,也不会将所有失败动作的概率下调。

    重要的是,它的做法是:对于每一个我们采取的动作,我们都通过 MCTS 进行了一次相当详尽的搜索,以判断是否有可能做得更好,并且我们会让每一个采取过的动作都变得更好——方法是让策略网络预测出这个结果。这是一个非常好的想法,因为你为每一个单独的动作都设定了一个监督目标。与另一种天真的 RL 方法相比,你学习信号的方差非常低。

    让我们考虑一个非常天真的算法,它看起来更像今天现代 LLM RL 的做法:我们取一场自我对弈游戏的胜者,并鼓励它多采取这些行为。

    Eric Jang

    值得思考一下,除了 MCTS,我们还可以用哪些替代方法来训练自我对弈代理。如今我们大量使用 LLM 风格的 RL。这相关吗?我们可以用这种方法代替吗?

    假设我们有一个非常天真的算法:我们取一组不同检查点的智能体,让它们互相对战。对于那些某一方获胜的对局,我们强化这些动作,并重新训练策略网络去模仿这些胜者,而不是遵循 MCTS 的目标。假设你有一连串导致胜利的动作,以及两个实力基本相当的智能体之间的对决。设策略 a (Πa) 和策略 b (Πb) 势均力敌,因此它们的真实胜率是 50%。

    假设你进行了 100 场对局,每场持续 300 步。你可能采用某种进化策略,或者以某种方式扰动这些策略,让它们表现出不同的行为。或者你可能什么都不做,只是让它们互相对战,偶尔会发现其中一个可能拥有比另一个更好的策略。假设策略 a 赢了 51 场,策略 b 赢了 49 场。这纯粹是运气使然,或者你可能以某种方式扰动了策略 a,让它表现出了这种优势。

    为了简化模型,我们假设其中有 50 场对局双方打得完全一样。在策略 a 赢的那一场中,它只做了一个微小的不同举动。它下了一步通常不会下的关键棋,但由于探索或随机噪声,这一步恰好比之前更聪明。

    因此,你的策略网络只有一个真正的监督信号,然后你有 99 场对局乘以 300 步,模仿这些动作只会让你得到和之前完全一样的策略。你的方差规模实际上非常糟糕,因为在这庞大的监督动作数据集中,你只有一个标签……让我稍微澄清一下。

    Dwarkesh Patel

    我们在讨论的是:那个好的、分布外的动作,在所有你想用来训练的游戏中所进行的动作中,只占一小部分。当然,这让我想起了 LLM 是如何用策略梯度方法训练的。当 Karpathy 上播客时,他称之为“像用吸管吸吮监督信号”。有趣的是,你所说的这种东西——在围棋中会让你无法突破某个水平——竟然是 LLM 默认的训练方式?

    Eric Jang

    这并不意味着它不起作用。如果你设想将游戏数量增加到数百万个样本,实际上可以获得一些有意义的监督样本,只要你能找到一种方法来屏蔽这些样本中的监督信号。这一点开始与强化学习中的优势函数和基线值密切相关。

    让我们来看看一个非常朴素的方法——我称之为梯度 RL——它的基本思想是奖励的总和。这个总和就是回报。在我们这里的朴素设定中,我们只有一个指示变量来表示回报,即你赢了或输了。当你输的时候,你的梯度为零,因此你不会在这些例子上训练;而当你赢的时候,你会尝试预测这些情况。你可以把这个设定看作是这个通用公式的一个特例。

    问题在于这里方差非常高。当你把这些项展开来计算梯度的方差时,它等于期望值……为了简化,我们可以假设这个值平均为零或者类似的情况(如果你把它中心化到无信号状态)。这里的方差基本上意味着你要取这个乘积项的平方。结果你会得到一个随着 T 二次增长的项。在这种设定下,这个项会对这些项产生耦合效应。

    让我们实际映射到一个 LLM 案例中,并回答为什么 LLM 只做一步 RL 而不是多步 RL 场景。在 LLM 中,你有一个解码器可能会预测一些词,比如“hello world”。在当前 LLM RL 中,他们将整个序列视为一个动作,而大 T 只是一个。确实,由于 Transformer 通过条件概率的乘积来构建,整个序列的对数概率等于各个 token 的概率之和。

    在这种情况下,我会说像 log(hel) + log(lo) + log(world) 这样的形式。这是正确的,如果这个项为 1,那么它们将是相同的东西。然而,当你采样时,如果你给每个特定 token 分配了一个奖励项,现在你就有这些项之间的交叉乘法交互效应。问题变成了,你如何把与每个 episode 相关的信用分配给所有这些不同的项?

    Dwarkesh Patel

    我困惑的是,在 LLM 中这样做会是什么样子,因为你只在 episode 结束时才获得奖励。

    Eric Jang

    你可以想象一个奖励机制,它会给你一些过程监督,你在每一步都对每个动作给予奖励。

    Dwarkesh Patel

    好的,所以你说的是,如果不是那样做……嗯,你写的方式最终还是要加起来,所以它们不需要相乘。但你说的是,不是那样做,而是直接把这几个过程奖励加总起来,然后把它当作一个单一的奖励信号?

    Eric Jang

    正确,对于一个单一的 log prob 动作。

    Dwarkesh Patel

    但这不正是最初写的方式吗?奖励的总和?

    Eric Jang

    数学中有一点隐藏在这里:当我们把问题分解成多步问题时,我们引入了动作之间的相关性,通过计算这个项。如果你把这些分开,这会放大这个项的方差。

    如果你不将其分离出来,而只是令 T=1,那么你将只有一个对数概率的估计值和一个奖励的估计值。这个项仍然存在。在大型语言模型(LLMs)中,朴素的REINFORCE估计器看起来有点像单次动作的回报……大致如此。这是基本形式,但它仍然是方差的一个来源。你要确保,类似于在这种情况下我们对大量中性标签进行训练的方式,你实际上是在惩罚那些无益的标签,只奖励那些真正让你表现更好的标签。

    直观地说,类比是:我们能否在训练目标中找到一项,使得它实际上被阻止这样做,或者这些项对梯度没有影响,而这个项对梯度有影响?

    Dwarkesh Patel

    如果你在那里应用它,唯一能做的就是消除49场比赛。至少在你写出来的方式上,会是51倍……

    Eric Jang

    实际上,最优情况是丢弃所有这些走法,只为那个你表现更好的单一走法提供梯度。

    Dwarkesh Patel

    你会怎么做呢?

    Eric Jang

    这在实践中是一个相当棘手的问题。这就是强化学习中进行优势估计的地方。你想从你的乘数中减去一项。不是指示函数的一和零,你想要一个对所有这些都表现为零,而对这些则表现为一的函数。

    Dwarkesh Patel

    如果你能说“嘿,我赢了这场比赛,所以这略高于基线性能”,你就能做到这一点。

    Eric Jang

    嗯,你赢了很多场比赛。但你不知道哪些让你获胜是因为它们确实更好,还是因为侥幸获胜。

    Dwarkesh Patel

    你会如何设计一个真正更好的基线?

    Eric Jang

    这就是在RL中使用像TD学习这样的方法来更好地近似我们之前提到的质量函数Q的地方。你可以尝试从你的回报中减去它。

    理想情况下,你在RL中真正想做的是提升那些使你优于平均水平的动作,并降低那些使你劣于平均水平的动作。他们称此为优势。有几种方法可以计算它。我强烈推荐John Schulman的《广义优势估计》一文,它很好地阐述了如何思考各种计算方法。归根结底,你希望通过尝试让它变小来减少方差,这样它就不会放大这个的方差。

    Dwarkesh Patel

    这说得通。这要求你对从一个状态出发的平均性能有一个非常好的估计。这让我们回到了我们之前讨论的价值函数问题。

    Eric Jang

    请记住,这种免模型的RL设置正在试图解决一个信用分配问题,即你不知道哪些动作实际上是好的,哪些是坏的。蒙特卡洛树搜索所做的非常根本上是不同的。它不是在尝试对胜利进行信用分配。它试图改进你所采取的每一个动作的标签。我们实际上可以考虑一种完全不同的算法,称为神经虚构自我博弈,它在AlphaStar和OpenAI的Dota等系统中取得了巨大成功。

    让我简单谈谈如何在无模型设置和自对弈设置中统一这些强化学习(RL)的思想。如果你无法轻松搜索树结构,会发生什么?在围棋中,这是一个完全可观测的游戏,你可以轻松构建一棵深度足够、能完整捕捉游戏状态的树。但在《星际争霸》这类游戏中,由于你无法完全控制二进制环境,这要困难得多——我甚至不确定它是否是一个确定性游戏。这就给数据结构层面带来了挑战。

    取而代之的做法是:仍然保留一个基本思想——用更好的“老师”来监督你的行为。我们将简要介绍神经虚构自对弈(neural fictitious self-play)的工作原理。核心思路相同:我们要为每一步动作生成更优的标签,就像在蒙特卡洛树搜索(MCTS)中那样。但如何获得这些更优的标签呢?在 MCTS 中,我们执行搜索;假设我们有一个良好的价值函数,那么搜索结果将优于我们的初始猜测。

    而在那些难以模拟搜索过程的游戏里,他们采取的方法是训练所谓的“最佳响应策略”(best response policy)。固定你的对手。比如你现在正在训练策略 Πa 对抗一个强敌 Πb。在《星际争霸》中,这可能意味着你是虫族(Zerg),而对手是人族(Protoss)之类的。一旦对手固定,你就把它当作一个经典的“无模型”强化学习问题,目标只是击败这个特定对手。这时你可以使用标准的 TD 学习技巧,或者 PPO 等任何无模型 RL 算法,尝试通过梯度上升来战胜该玩家。此时奖励函数的设计是:只要赢了 Πb 就返回 1,否则为 0。这不再是自对弈问题,而是一个面对固定对手的优化任务——你只关心如何最大化得分。

    当你用你喜欢的无模型 RL 算法(如 PPO、SAC 或 V-MPO)成功训练出一个良好策略后,你就得到了一个能为特定对手提供高质量动作标签的策略。当你针对多个对手都训练出相应的“最佳响应策略”时,实际上就把整个 RL 算法蒸馏成了针对不同对手的标签体系。例如,你可能有一个对抗 πb 的最佳响应策略,还有一个由 πb、πc、πd 组成的对手联盟。你会把每个固定对手对应的最佳响应策略收集起来,并用它们各自的标签去监督当前策略。

    这几乎相当于 MCTS 老师的代理。与其依赖 MCTS 作为教师信号,不如用一个无模型的 RL 算法找出能够击败对手的最佳搜索动作,然后将此策略蒸馏为一个混合策略(mixed strategy),使其在所有可能对手之间进行平均化决策。这样就能保证性能不低于从对手联盟中随机选取的平均水平。这种方法绕开了直接从 MCTS 推导教学信号的问题,但从根本上讲,依然是通过重新标注状态来提升策略表现。

    Dwarkesh Patel

    只是为了确认我的理解:如果你在与另一条策略的对局中获胜,就会沿着那条轨迹的所有动作进行增强(reinforce)。

    Eric Jang

    是的。在这里,你可以使用多种算法,比如 PPO、V-MPO,甚至如果你愿意的话也可以用 Q-learning。这里的特定算法通常是无模型的(model-free),因为你没有搜索能力,但 MCTS 和 Q-learning 之间有一个有趣的联系值得探讨。

    在 MCTS 中,你有一个树结构,通过在树的近似叶节点上求解价值函数,你可以沿着许多路径反向传播,从而获得某种平均值的估计。你的 Q 值正是来源于大量模拟的平均结果。

    在无模型算法中,通常包含对 Q 值进行估计的组件。Q 值往往通过时序差分学习(TD learning)来学习,不过在 PPO 中,其优势估计的方式不一定依赖于贝尔曼备份。而在 Q-learning 中,有一个非常巧妙的技巧:将 Q(s,a) 更新为即时奖励 r 加上折扣因子乘以下一状态所有动作中最大的 Q 值,即 maxₐ′ Q(s′,a′)。直观地说,如果这是一个终止状态,那么当前状态下能采取的最佳动作的价值就等于执行该动作所获得的奖励,再加上下一状态所能达到的最大收益。

    MDP 具有递归的动态规划性质,你可以训练神经网络来强制实现这种一致性。也就是说,“一旦我知道了某个动作的 Q 值,我就可以用它来推算下一个状态的 Q 值。”

    Dwarkesh Patel

    我之前曾想,“嘿,我们为什么要训练策略?为什么不干脆只训练价值函数呢?”而这正是我们现在要做的。

    Eric Jang

    这是一种在没有前向搜索能力的情况下恢复中间步骤价值估计的算法。你必须先收集一条包含 n 步的完整轨迹,才能应用这个技巧。不过其直觉是相似的:知道某个位置的 Q 值可以告诉你关于另一个位置 Q 值的信息。而且确实,你可以从 Q 值中恢复出策略——你不需要显式地对策略分布建模;只需对 Q 值取 argmax 就能得到最优动作,从而重建策略分布。

    Q-learning 或近似动态规划正是这样将你对未来 Q 值的了解向后传播。可以看到这里存在相似的结构:一种情况是你正在规划那些智能体尚未走过的轨迹,而另一种则是规划智能体已经访问过的轨迹。

    重要的是,为什么 Q-learning 如此重要?因为历史上我们一直缺乏在像机器人这样高维问题上进行搜索的能力。长期以来,我们的假设是:如果我们无法用世界模型建模动力学,那就转而收集轨迹,并仅根据唯一真正重要的指标——奖励——来进行规划。

    Dwarkesh Patel

    这非常有趣。若要将此与我们对大语言模型(LLMs)的讨论统一起来,虽然 LLMs 没有 Q 值,但它们也在进行反向学习:在某个代码环境中找到通过某些单元测试的轨迹,然后强化这些轨迹。

    这与 MCTS 的前向方法有巨大差异。之所以更倾向于使用 MCTS,是因为它可以在每一步都进行规划并逐步提升每步的表现,而不必像 Karpathy 所说的那样,必须按整条轨迹学习,寄希望于……

    Eric Jang

    通过吸管。

    Dwarkesh Patel

    没错,你通过吸管获取监督信号。本质上,你只是升级了一条轨迹中的所有 token,而这些 token 是否与正确回答相关则无关紧要。

    之所以在围棋(Go)中能以更高的样本效率实现这一点,是因为 MCTS 在 Go 上运行良好——你可以确定,只要本地执行搜索(且该搜索由值函数截断,即使未完全展开整条轨迹),就可以直接说“这是我的新策略”,并以更迭代、局部的方式改进,而无需展开所有这些轨迹。

    Eric Jang

    谷歌在 2023 或 2024 年进行了一些研究,尝试将树结构应用于推理。目前尚不清楚这种方法是否可行。未来我们可能会重新审视前向搜索的思路。

    但 MCTS 在围棋中变得非常简单,原因有两个:价值估计是具体的,可以真实计算出来,并用于截断深度(正如你所说);广度也是确定的。关键在于,动作选择算法——即迭代访问和扩展树节点——非常适合围棋问题的规模和深度。

    但对于 LLM 的推理而言,PUCT 可能不是一个足够好的启发式方法。它可能过于贪婪地关注局部 token,并且只能给出看似正确但无法真正解决问题的肤浅想法。我认为,LLM 推理的最终形态仍悬而未决。虽然不能完全排除这种思路回归的可能性,但目前来看难度较大。

    Dwarkesh Patel

    LLM 难道不会原生地学会像 MCTS 那样工作吗?比如尝试一种方法,发现行不通就回溯,再尝试其他路径,最终走向更有成效的方向?

    Eric Jang

    当然,LLM 确实能完成某种看起来像人类真实推理的过程,而无需显式构建树结构。不过,我认为,通过前向搜索和模拟来评估哪些内容更有价值这一理念,即便不完全照搬 AlphaGo 的实现方式,未来仍有可能重新兴起。

    Dwarkesh Patel

    为了确保我理解核心要点:广度来自合法动作数量更多,而深度则源于难以训练值函数,因为……

    Eric Jang

    这里有个例子说明 LLM 的局限:CPUCT 规则中的 √N / (1 + N_a) 项在 LLM 中几乎永远不会重复采样同一个子节点。由于语言极其宽泛且开放,多步思考过程中,离散的动作集合并不适合 LLM。尽管 token 是离散的,但其数量庞大到足以使这类探索启发式方法不再适合作为树搜索的指导策略。

    Dwarkesh Patel

    我想核心问题在于:在围棋中,即使没有探索完任何轨迹的末端,你也知道 MCTS 几乎肯定优于当前策略;但在 LLM 或机器人的一般推理中,根本无法独立于实际解决问题,仅通过局部评估就能优化下一步操作。

    Eric Jang

    “No way” is a strong word. Lots of people have thought about how to apply MCTS or its successors like MuZero to continuous control spaces, and I’m sure very cool research work is still ongoing to try to crack that problem. But yes, the apparent challenge right now is that most problems in much higher-dimensional action spaces, or something combinatorially much bigger like language, don’t seem as amenable to the discrete action-selection heuristics and game-evaluation type stuff that Go has.

    That’s not to say the idea of thinking into the future along multiple parallel tracks might not give you some information about which way to search. If you think about mathematics, it often occupies more of a logical search procedure where you can back up and see which paths seem good or not. There’s more of a rigid structure there, whereas in a business negotiation it’s less of a tree and maybe something a bit different.

    Dwarkesh Patel

    We’re now seated, so I can ask you some more questions about AlphaGo and AI research more generally. In 2021, Andy Jones had a paper called “Scaling Scaling Laws with Board Games”, and he basically anticipated inference compute, or inference scaling, by showing that you can trade off test-time compute and training compute. That is to say, you can spend more compute searching through MCTS, and if you do that, you can get the equivalent performance to having spent more time training the model.

    If you see this pattern, you might think that with LLMs you might do something similar in the future, and in fact that’s what ended up happening.

    What is a fun exploration one could do now to explore other axes of scaling in toy settings, which will be important to understanding what AI development might be like in a few years?

    Eric Jang

    Test-time scaling and reasoning, and how they interact with model size, are quite profound when it comes to how much needs to actually be done as explicit search versus how much can be packed into the forward pass of a neural network. How does a forward pass of a neural network learn to do something that should be sequential and recursive? That’s quite interesting.

    The Andy Jones “Scaling Scaling Laws with Board Games” paper is quite cool. There was another really nice result from that paper. Not only can you predict scaling laws of the LLM variety—where as you increase parameters you can decrease the amount of compute for search or vice versa—but he also showed that you can predict how much compute is needed to solve a larger version of the board game.

    For example with Go, which can scale from 3x3 to an infinitely sized Go board, you might be able to revisit this question and try to reproduce whether this shows up. I actually started this project with the motivation of asking: does the “Bitter Lesson”, or our knowledge of scaling laws, allow us to execute a lot better on a compute-optimal Go bot? Can we build a strong Go bot without all of the KataGo tricks, just by really focusing on the Bitter Lesson and scaling laws?

    I have not been successful so far, but usually when you want scaling laws to work, you want to be in the regime where the recipe already works and the data sets are good, rather than trying to figure out how to do scaling while also trying to figure out what the right data sets are.

    科研中的科学理解部分通常遵循一个步骤:先让某个东西能够运行起来。然后利用这个系统收集数据,这些数据有助于你建立对事物运作方式的心理模型,比如缩放定律(scaling laws)。通常情况下,如果你想要通过缩放定律构建一个强大的围棋(Go)程序,实际上你得先做出一个强大的围棋程序,然后再用缩放定律稍微外推一下未来的表现。

    Dwarkesh Patel

    说详细点吧。你是说缩放定律没用吗?在你的围棋程序里没有发现任何符合缩放定律的模式?

    Eric Jang

    我最初犯的一个错误是:当我在 MCTS 标签(MCTS labeling)的实现上遇到一些 bug 时,我会用专家策略收集大量数据,然后把它当作一个监督学习问题来处理,试图从专家数据集里识别出缩放定律。你确实可以画出看起来像那样的图表,但如果你当前的策略本身表现不佳,那你可能只是在研究糟糕的数据上的缩放定律。

    一个重要的实现细节是:如果你想研究缩放定律的问题,你必须有一个数据质量高、架构合理、且没有 bug 的问题,然后才能在此基础上进行求解。

    在我能应用缩放定律来指导具体研究方向之前,整个系统必须已经正常工作。这对研究人员来说听起来显而易见——当然要在系统无 bug 运行后再去研究缩放定律。但作为实践者的建议,在我刚开始这个项目时,我并没有等到人造系统足够有趣到值得被研究时才开始它的科学研究。

    Dwarkesh Patel

    说到算力,你可以看看过去十年中训练世界上最强 AI 模型所使用的算力趋势图。在 log 空间里是一条非常平滑的指数增长曲线,每年都在翻倍。除了一个巨大的异常值——AlphaGo Zero,它使用的算力远超当时任何其他 AI 模型,达到了 3E23 FLOPS。虽然和前沿大语言模型(LLM)相比还差几个数量级,但仍然很惊人。

    问题是,尤其是考虑到你已经能让它跑起来了,你是自己训练的,还是用了别人的资源?

    Eric Jang

    我从 Prime Intellect 那里获得了一笔约 1 万美元的捐赠。大概花了前 4000 美元做探索性研究,最后阶段又花了 3000 美元。剩下的钱用来部署模型。

    Dwarkesh Patel

    现在你觉得他们当初是不是训练得不够好?毕竟你现在只用 1 万美元就能做到了?

    Eric Jang

    要成为第一个做到某件事的人,所需的算力总是比后来追赶者要多得多。这在 LLM 领域也是一样的故事。一旦别人已经完成了,你就可以使用蒸馏(distillation)等各种技巧,借助各种“拐杖”来快速赶上。

    我自己的那个在线托管的 bot,实际上是通过与 KataGo 模型进行最佳响应训练(best-response training)来获得强力的表现。截至录制时,我正在验证能否完成第一步——也就是从零开始纯自我对弈(tabula rasa play)。

    对研究而言尤为重要的一点是,你通常希望从一个良好的初始状态开始。我最初采取的做法是用KataGo训练最佳响应智能体。AlphaZero团队没有可以对抗的策略,因为他们试图从零开始(tabula rasa)完成一切。成为第一个实现的人意味着优先考虑让系统能够运行起来,而不是追求计算效率最高的实现方式。

    这在机器人领域也是如此。如果你观察为机器人训练的大模型前沿进展,会发现散点图分布杂乱,不像前沿大语言模型那样有一条清晰的趋势线。这是因为这些模型的训练者往往还没有达到那种每一浮点运算都至关重要的规模,他们不需要在预训练阶段将每一点计算性能压榨到极致。相反,他们的关注点是:“我们希望某种能力出现,因此我们优化训练设置,使这种能力的获得变得容易。”

    一旦你拥有了这种能力……随着计算资源的不断扩展,你必然会转向计算高效的方法,因为我们谈论的是数亿美元级别的投入。但在过去,当实验用的计算资源较为充裕——或者研究者无需对其成本负责时——人们往往会优化除计算最优帕累托前沿之外的其他因素。

    Dwarkesh Patel

    我明白,就像速度之类的?

    Eric Jang

    是的,比如结果出现的时间,或者仅仅是让它能工作。最初的AlphaGo可能拥有大量算力,他们并不太担心是否实现了最计算高效的设计。

    Dwarkesh Patel

    那么,在提升计算效率的改进中,有多少是来自2017年之后才出现的方法,又有多少是2017年已经存在但当时未被采用的技术?

    Eric Jang

    很好的问题。在这个项目开始前,我心里就清楚一件事:随着时间的推移,事情总会变得越来越容易实现。我想看看围棋在2020年KataGo之后似乎没有出现其他强开源机器人的情况下,究竟发展到了什么程度。

    阅读KataGo论文时,我发现里面有很多巧妙的设计。我当时在想:“让我们看看‘苦涩教训’(Bitter Lesson)是否已经发生——即随着NVIDIA推出更快的GPU,许多原本需要技巧的方法变得不再必要。大致来说,我们现在处于哪个阶段?”

    再次强调,这不是经过同行评审的主张,只是基于我个人实验得出的初步感觉。看起来架构选择并没有那么重要,Transformer与ResNet之间的差异……现在我们已经处于GPU性能足够快的阶段,模型大小还没大到让这些架构差异产生决定性影响的地步。

    你可以大大简化整个设置。不必使用带有重放缓冲区、推送器和收集器的分布式异步强化学习框架,完全可以采用一种简单的同步方式:收集数据 → 训练一个监督学习模型 → 再收集数据。基础设施方面有很多简化的空间。

    NVIDIA GPU确实变得更强大了。KataGo是在V100上训练的,而现在用一半的桌面级Blackwell GPU就能完成同样的训练任务。如果有一个强大的初始化策略,KataGo开发的一些辅助监督目标其实并不必要。当你以KataGo本身作为最佳响应训练的起点时,你的模型根本不需要KataGo所依赖的那些技巧。最关键的是尽快找到强有力的对手,这一点比具体的架构创新重要得多。

    不过还有一些不错的计算加速方法。我发现,在9x9棋盘上训练对解决终局价值函数非常有效。如果你能在一个既能处理9x9又能处理19x19的架构上联合训练,就能大幅减少从零开始学习的预热时间。AlphaGo Zero的曲线图显示,最初约30小时基本都用于追赶监督学习基线水平。通过在小型棋盘上预训练,再将其热启动到19x19棋盘的游戏中,可以显著缩短这一时间。

    还有一些其他调整,比如在不同回合间改变模拟次数(sims)。结果发现这并不太敏感——你可以固定或增加这个数值,影响不大。总之,从科学角度来看挺有意思:重访旧论文,看看真正关键的因素是什么。

    Dwarkesh Patel

    这是一个旁支问题,但为什么AlphaGo允许使用缓冲区呢?每次跟AI研究员聊天,他们都说离策略(off-policy)很糟糕。而AlphaGo Zero的一种朴素实现方式是:在一次反向传播步骤中,或在一批反向传播步骤中,大多数动作都不是由最新训练模型做出的。那这样为什么还可行?

    Eric Jang

    好问题。这涉及强化学习中离策略与同策略的根本区别。你还记得MCTS吗?你执行的动作会被重新标记为在相同状态下采取不同动作。

    离策略的问题在于:如果你重新标记的状态是你新策略永远不会访问的,那有什么意义?这是在浪费容量。极端情况下,假设你的训练缓冲区中的状态分布全是根本不会遇到的状态,那你就是在监督模型在永远无法达到的状态下做出“好”动作,这样你的策略可能会变得很差。这就是离策略可能严重损害AlphaGo的地方。

    但如果从DAgger的角度来看——本质上是一种根据已有数据纠正自己回到最优轨迹的方法——在这种算法中,你希望训练数据主要包含你会访问的状态,但在最优轨迹附近高维管状区域内的少量或合理比例的其他状态也可以接受。这些状态会提供监督目标,把你引导回最优路径。

    我可以快速画一下。在DAgger风格的设定中,你理想的训练数据分布就是那些最优状态和动作。你希望处于这个状态、这个状态、这个状态,然后在这里获胜。这些都是你最优策略的动作,绝对要重点训练的内容。但为了增强鲁棒性,你需要确保即使偶然偏离到其他状态,也能把你拉回正轨。

    Dwarkesh Patel

    但为什么这不是一个支持普遍使用离策略训练的通用论据呢?

    Eric Jang

    这正是有时需要采用离策略训练的原因。你不希望出现累积误差:一旦犯错,就缺乏如何回到最优分布的数据。

    最优控制其实并没有太多关于如何避免意外陷入困境的方法,因为它假设一旦你学会了策略,就能顺利到达目标状态。但在机器人等实际应用中,一阵风可能让你稍微偏离轨道,这时就需要修正;或者某个轮胎的摩擦力比其他轮子略低,导致车辆漂移,你也得进行纠正。这类情况在更真实的环境中经常出现。

    关于国际象棋和围棋,有个有趣的说法:围棋和国际象棋的问题在于,对手总是试图捣乱。事物可能会偏离预期,而你总希望能重新回到胜利状态。你的回放缓冲区应该包含策略会访问的状态,再加上一些你可能偏离到的状态分布,以及从这些状态返回最优状态的方法。

    现在,如果你走到极端,说“我们没有这些数据,只是用MCTS对那些与我们理想行为相差甚远的状态打标签——比如那边这一堆状态……”那么每个状态都会被赋予一个MCTS标签,你的策略会学习如何采取最佳行动,但你永远也到不了那里。你在训练模型时使用的却是你根本不可能达到的状态。这就是为什么离策略(off-policy)方法可能会带来严重问题。

    作为这个项目的一部分,我确实尝试了一个实验:我从大量轨迹中随机选取一些状态,为了尽可能饱和GPU负载,我对这些状态重新运行MCTS。我没有从头到尾完整地进行一局游戏并在每一步都执行MCTS,而是忽略走棋的因果关系,直接挑选随机的棋盘状态,并用当前网络为其打标签。我可能会重新访问之前已打过标签的旧状态,并用当前网络再次为其标注。

    实际上,这种做法是可行的。你可以选取一些合理且持续更新的状态,在训练过程中不断重新打标签。这开始收敛出一种非常接近机器人学习设置的方式,这在业界非常普遍。你有一个轨迹数据集,然后还有一个类似回放缓冲区推送器的组件。这些都是离策略的离线轨迹。回放缓冲区推送器将转移元组推送到回放缓冲区,接着你有一个任务,即持续重新规划:相比于你实际采取的动作,当时应该采取的最佳动作是什么?

    在机器人学中,最小化TD误差非常常见。你的贝尔曼更新器不断从中提取信息,试图满足Q(s,a)。从这里出发,你有训练器,它努力让Q值逼近Qtarget。你可以把它看作一种规划器:你回访曾经到达过的旧状态,利用当前模型重新思考——如果来到这个状态,我能做得更好吗?这就是通常训练离策略机器人学习系统的方式。如今有更简单的做法,但在Google QT-Opt时代,我们正是这样做的。

    Dwarkesh Patel

    所以,什么是训练器?

    Eric Jang

    训练器就是你试图最小化Q(s,a)与Qtarget的地方。

    Dwarkesh Patel

    你能再整体介绍一下整个架构吗?

    Eric Jang

    你有来自各种策略的离策略数据。你不断把之前看到的转移过程推送到回放缓冲区。

    接着你会有一个叫做贝尔曼更新器(Bellman updater)的东西,它本质上是在重新规划:与其采取这个动作,我在状态s下应该采取什么动作才能获得更高的价值?实现这一点的方式是尽量最小化TD误差。给定s’后,你计算Q(s’,a),然后找出与s’对应的能使Q值尽可能高的动作。

    然后将该奖励加到此处,就得到了你的实际目标值。对于当前的s和a,你的Qtarget就是这样的。现在你把Qtarget发送回这个转移过程。用这个元组,你就配对了一个Qtarget。在训练端,你只需使用监督学习,将当前网络的Q(s, a)与其目标值进行最小化即可。

    Dwarkesh Patel

    明白了。所以你在后台实际上是在思考所有这些动作的实际价值。

    Eric Jang

    是的。在一个更优的策略中,当你试图最大化这个目标时,这个转移的Qtarget是多少?

    Dwarkesh Patel

    这有点像白日梦。

    Eric Jang

    没错。你可以把它想象成事后回顾:根据历史缓冲区中的所见,我本可以采取更好的动作吗?

    这里与围棋的联系在于——我曾尝试过,效果还算不错,但过于复杂而无法开源——就是用MCTS重标记器替换这个部分。不是做这种目标网络计算,而是在每个转移上运行MCTS。此时你有状态、动作以及游戏是否获胜的信息。其实这两个可以扔掉,你不关心这些。你只取状态,并在当前网络上用MCTS规划出最佳策略Π。不是那个执行了此动作的网络,而是你当前的最佳策略网络。你在这些转移上离线重新运行搜索。

    如果这些是你策略可达的转移,这实际上起到了很好的稳定作用。另一个好处是你可以更好地充分利用GPU,因为你不再需要等待围棋游戏生成棋盘状态。你可以并行地在任意深度对所有棋盘状态进行搜索。此时训练器只需尽可能准确地预测MCTS标签。

    这种方式可行,在机器人学领域尤其相关,因为那里有大量离线数据,且无法像MCTS那样进行模拟。但在实践中确实会遇到一个问题:如果当前模型正在查看它永远不会到达的状态,就会浪费计算资源。因此需要格外小心。

    大多数强化学习已转向更on-policy的设置,不再直接对off-policy数据进行训练。最多只是利用off-policy数据来降低方差,而不是直接影响目标函数。

    Dwarkesh Patel

    为什么会这样收敛?

    Eric Jang

    因为它更稳定。你可能用off-policy的Q值来做优势计算,比如Q减去Q的总和。如果有N个动作,这就是你的价值,而这些都是你当前的Q值。某个动作的优势就是平均值减去你当前的Q值。人们可以尝试以off-policy方式估计Q,然后在这里直接使用优势。

    如果动力学中存在一些问题,它不会让你的损失剧烈爆炸。在机器人学中,趋势是使用off-policy数据来塑造奖励,但并不真正直接参与优化。

    Dwarkesh Patel

    这让我想起我们之前关于 MCTS 为何比 REINFORCE 或大语言模型使用的策略梯度方法更受青睐的讨论。虽然可能完全错误,但几个月前我写过一篇博客文章,阐述策略梯度强化学习比你想象中更加低效。

    人们直观上认为的低效之处在于:你必须完整运行一条轨迹才能获得任何学习信号。随着这些轨迹越来越长——比如智能体需要完成两天的任务才能判断项目是否正确,而不是仅仅生成下一个词——每 FLOP 所承载的信息量反而减少了。为了验证一个功能是否实现正确,你需要展开整整两天的思考过程,因此每 FLOP 对应的样本数量一直在下降。

    你在学习过程中试图最大化的是每 FLOP 的比特数(bits per FLOP)。你可以将其理解为每 FLOP 的样本数乘以每个样本的比特数。刚才提到的正是:随着 RL 任务的 horizon 变长,每 FLOP 的样本数会下降。

    但这种 naive 的 RL 方式在“每个样本的比特数”这一维度上也极其糟糕,至少与监督学习相比是如此。假设训练初期 LLM 的词表大小为 10 万,即有 10 万个可能的 token 可供回答。你有一个完全未训练的模型,输入提示如“The sky is…”。在监督学习中,模型会对所有可能的回答形成一个概率分布;标签告诉你此处应为“blue”,模型通过交叉熵损失函数学习其分布距离正确答案“blue”有多远。

    若改用 RL,模型可能会尝试说“The sky is halycon”——不对。“The sky is told”——也不对。这是一个完全未训练的模型,你可能需要尝试约 10 万次才能偶然猜中“blue”并获得一点学习信号。而在监督学习框架下,模型已有概率分布,被告知答案是“blue”,便能通过交叉熵损失计算出自己离正确答案有多远。你学到的东西取决于你的“命中率”:离“blue”越远,通过交叉熵损失向“blue”靠近的学习效果就越强。

    可以这样理解:你的“命中率”即你此前说出“blue”的先验概率。在监督学习中,通过交叉熵损失,你会学到负对数似然——也就是 -log(p),其中 p 是命中率,单位是比特。而在 RL 中,如果你只是随机猜测并看结果是否正确,这本质上就是一个二元随机变量的熵。

    Eric Jang

    更棘手的是,你所采样的分布就是你策略本身的分布。如果你的策略根本不可能采样到“blue”,那你永远也得不到任何信号。

    Dwarkesh Patel

    没错。这正是体现在你采样到“blue”的概率极低这一事实上。如果你真的采样到了“blue”,那么你能学到的东西和你在监督学习中一样多。但在其他所有情况下——对于一个未训练模型来说,这种情况占 99.99%——当你看到“halycon”或“told”不是正确答案时,几乎学不到任何东西。

    这种情况在大多数时候都会发生。你学到的东西非常少。如果把通过率放在 X 轴,把从样本中学习到的信息量(以比特为单位)放在 Y 轴,那么训练结束时你会处于这个位置:0%、50%、100%。如果你使用的是监督学习,负对数通过率大致会呈现这样的形状。对于一个二元随机变量,其熵(无论是用自然单位 nats 还是比特 bits 表示)也会呈现出类似的形式——如果用比特表示,峰值处为 1。这就像抛硬币一样:抛硬币时你学到的最多。这就是监督学习,而这是强化学习(RL)。

    然而问题在于,你在训练过程中大部分时间都处于这种低通过率的状态。你的学习速度取决于每个样本能获得的比特数,而这里信号非常微弱。如果将通过率在 log 尺度上绘制出来——比如训练初期词汇量为 10 万时通过率为 1/100,000,然后是 1/10,000、1/1,000、1/100——那么监督学习会呈现出这样的曲线,而强化学习则会像那样发展。

    Eric Jang

    可以说你几乎把所有时间都花在了这里,甚至可能一次成功都没有。这种状态令人沮丧,因为一旦陷入其中,就完全不清楚该如何突破到更高的水平。虽然你已经掌握了一些东西,但在许多强化学习问题中,你实际上花费了所有时间在这段低效区域。这就引出了一个关键问题:如何初始化策略,使得初始通过率至少不为零。

    关于“每样本比特数”还有一个重要补充,这对任何机器学习问题都很关键:它与软标签(soft targets)和知识蒸馏(distillation)密切相关。如果你不仅能看到 one-hot 的 token 答案,还能访问模型的 logits(原始输出),那么这个分布的熵远高于 one-hot 的情况。也就是说,软标签包含的信息量远大于硬标签。这也是为什么知识蒸馏如此高效——它让每个样本传递了远超硬标签所能提供的信息量。

    Dwarkesh Patel

    我在想这个方程应该是什么形式,但显然……

    Eric Jang

    其实就是这个分布的熵。这个分布的熵为零;而这个分布的熵就是标准的熵公式。

    AlphaGo 之所以优美,原因之一就在于此。在 AlphaGo 中,策略网络不是模仿 MCTS 选择的具体动作,而是模仿 MCTS 输出的概率分布。这两种做法都合理,如果你想做一个科学实验来验证软标签的重要性(即“暗知识蒸馏”),可以重新训练策略网络,让它模仿 MCTS 选择的动作而非软目标分布。

    Dwarkesh Patel

    之前我一直有些困惑。直觉上,为什么这种能够进行迭代搜索的能力——你不需要一开始就能赢棋,只需要能改进当前策略——在 RL 学习中比 LLM 目前的 RL 学习方式更强大?这正是因为它考虑了整个轨迹的通过率。我只是没有一个正式的方式来理解这一点。也许你可以帮我理清思路。

    Eric Jang

    AlphaGo 为何是一个优雅的 RL 算法?主要原因是你根本不必从零成功率开始,也不必解决如何达到非零成功率的探索难题。这使得你能够沿着这条优美的监督学习信号进行梯度上升(hill-climb)。

    如果你仔细研究 AlphaGo 的实际实现,会发现整个过程并没有显式地使用 TD 误差学习或动态规划。它只是基于价值分类进行监督学习,同时最小化策略 KL 散度。本质上,这只是一个在改进标签上进行监督学习的问题。

    训练过程非常稳定。你可以训练任意大的网络,也可以重新在数据集上训练,一切都会平稳运行。基础设施的实现也非常简单,你不需要复杂的分布式系统来维持在线策略。

    归根结底,你只是在说:“我有一些改进后的标签,让我用这个目标重新训练我的监督模型。”你始终处于一个美好的状态,即只需努力优化策略,而不是逃离局部极小值——因为周围所有信号都是平坦的。

    一种绘制曲线的方法是:画出 MCTS 策略与原始网络的胜率对比……假设这条虚线代表原始网络,那么 MCTS 策略大致如此。每一步的监督信号都非常清晰,除非 MCTS 分布恰好收敛到你的策略网络所预测的结果,否则你永远不会遇到 MCTS 没有提供任何信号的情况。

    Dwarkesh Patel

    这是一种很好的解释方式。也许我们可以坐下来,我来问一些关于自动化研究的问题。

    Dwarkesh Patel

    有一件事我一直想和你讨论的是,你在该项目中通过这个自动化的 LLM 编码助手循环完成了大量研究工作。有一种观点认为,如果完全实现 AI 研究的自动化,可能会引发某种奇点。

    显然我们离那还远得很,但就目前对这种流程的早期观察而言,我很想了解你对 AI 擅长什么、不擅长什么,以及你对这种场景最终可能性的看法,还有你对此的总体想法。

    Eric Jang

    我认为自动化科学研究是前沿实验室正在开发的最令人兴奋的技能之一。对于从事任何类型研究的人来说,了解 AI 当前能做什么、不能做什么,以及未来一旦 AI 开始自动化大量探索工作后科学进程可能如何运作,这一点至关重要。

    简而言之,我在这个项目中使用的主要是 Opus 4.6 和 4.7。有效之处在于模型能够出色地完成超参数优化。过去人们会设定诸如学习率、权重衰减、网络层数等超参数搜索空间,然后通过网格搜索或贝叶斯优化方法找到一组调优参数。

    而如今自动化编码真正酷的地方在于,它能搜索一个更加开放的问题集合。它可以判断“我发现这个层的梯度很小,让我在这里调整一下”,或者“让我重写代码,使数据加载器采用我新设计的增强方法”,甚至尝试“寻找满足优化问题约束的最佳方案”。最终你会获得一种高度灵活、高级别的能力,就像研究生一样不断打磨性能指标。

    这能挤出相当可观的性能提升。在固定数据集和固定时间预算下,你能在像LLMs或围棋这类分类问题上显著降低困惑度。现在它在执行任何实验方面都表现出色。我写了一个名为Experiment的Claude技能:只需描述“我想要绘制x轴和y轴,帮我回答这个问题”,它就会自动运行所有实验、整理图表、生成报告,并推测可能的原因等。目前这套流程效果相当不错,我认为未来这些能力还会继续进步。

    但了解它当前不擅长什么也很有用。我在博客版教程里画了一张树状图,汇总了我做过的所有实验——每个节点代表一次失败、成功或混合的实验结果,并延伸出后续实验的子节点。有时我会钻进某个分支(比如离策略MCTS重标记),做了几个实验后发现可能不值得继续,于是立刻跳到完全不同的方向。我把这些称为“行”。

    我发现目前公众可访问的闭源模型似乎不太擅长在一个既定方向上选择下一个实验。它们似乎无法退一步进行横向思考:“等等,这个方向真的合理吗?让我们回到基本原理,想想瓶颈在哪,或者我们真正想实现的目标是什么。”很多时候我得自己通过向Claude提出正确的问题来发现基础设施的bug,然后它才会给出答案。

    随着Mythos类或Mythos++模型的上线,也许这些问题会因规模提升而彻底改变。但同时,我认为开发能激励这种横向思维的强化学习环境大有可为。搭建围棋环境的一个动机是:围棋包含许多与LLMs或机器人重叠的前沿研究问题,且验证速度极快。最终的外层循环很简单:智能体是否按预期行动?判断围棋对局结果非常容易。

    内层循环则涉及大量围绕分布式系统的研究工程,预测某个想法是否可行,以及训练算法的微小改动可能带来的影响。我认为存在丰富的子任务和子环境,可用于训练自动化科学家,并以围棋作为外层验证循环。一旦掌握这些技能,或许可以将其应用到生物科学或机器人等其他领域。

    Dwarkesh Patel

    或者说是自动化AI研究。

    Eric Jang

    或者说是自动化AI研究。

    Dwarkesh Patel

    这才是真正的核心所在——让AI制造下一代AI的想法既可怕又令人难以置信。你刚才提到的外层循环,是否就是指与KataGo对战的胜率?

    Eric Jang

    这是其中之一。我认为还有很多更深层次的问题值得探讨。例如,假设你有一个改进缩放定律计算乘数的方法。结果未必是“打造史上最强围棋程序”,而可能仅仅是“我能预测我的围棋程序的胜率吗?”或者“我能预测我提出的想法所产生的缩放定律曲线吗?”但你可以通过在外层循环中使用像围棋这样高度可验证的游戏来验证自己是否没有进行奖励破解。

    Dwarkesh Patel

    我认为有几个有趣的后续问题值得关注。这些问题涉及内层循环和外层循环。在内层循环中,一个关键问题是:你所做的任何修改在多大程度上是可局部验证的?也就是说,当你尝试某个想法时,你能判断它究竟是改进还是退化吗?你能区分失败是由于代码中的 bug,还是因为根本性的想法本身有误吗?

    Ilya 曾提到,他认为自己是一名优秀研究者的原因之一,是他对什么是正确想法有着强烈的信念。他能够坚持克服各种 bug,并基于一种高层级的信念来判断哪些是 bug、哪些是核心思路的错误——“这个想法应该有效,所以一定存在 bug”,而不是反过来。那么,让我们从这个问题开始吧:好的想法在多大程度上是可局部验证的?

    Eric Jang

    就像深度学习成功案例那样,这可以看作是一个持续了数十年的理念,需要极大的信念才能让它真正运转起来。这构成了一个极具挑战性的长视野强化学习(RL)问题:每一步都有人告诉你这是个坏主意,但最终你还是突破了。我们该如何设计 RL 环境,以便能更早地提供一些反馈?我认为这是一个非常棘手且尚未解决的开放性问题。

    最终,要训练出强大的围棋程序,很可能确实需要发现深度学习。一个难以作弊且具有挑战性的游戏,可以作为外层循环的信号,用于探索类似深度学习原理这样的深层机制。当然,为了让问题变得可行——而这正是研究品味发挥作用的地方——你必须想出办法来初始化你的问题,避免去解决那些极其难以处理的问题。也许可以利用大型语言模型(LLMs)作为中间层的通用语法,为你提供某种局部反馈。

    LLMs 作为通用语法的特性意味着它们几乎可以在整个技术栈的任何层级上运作。它们既能非常局部地思考,也能后退一步,进行宏观层面的规划。我认为这正是人类横向思维能力的重要来源:知道当前所追的路径或目标是否正确,并适时提出不同的问题。

    Dwarkesh Patel

    另一个问题是,在试图优化外层循环结果的过程中,局部改进的叠加效果如何。我听说有些 AI 实验室的问题在于,研究人员各自追求好的想法,但这些想法最终难以有效叠加,导致训练失败——因为两个看似合理的想法之间出现了奇怪的交互。对整体工作方式的顶层设计非常重要。我在多家 AI 实验室工作过,也尝试过让多个智能体并行探索不同思路,你觉得 AI 创新的并行化程度有多高?

    Eric Jang 这是个很好的问题。我认为当前研究中对“苦涩教训”(Bitter Lesson)的执行偏好在于:你需要清楚在当前阶段,“苦涩教训”能为你带来多少收益,以及要求它做到什么程度才是合理的。当然,从长远来看,算力确实是决定一切的最重要因素。随着能源、算力和参数规模的扩大,智能自然会从中涌现出来。这非常美妙,也非常深刻——除了这一点,算法细节其实并不重要。

    但在当下,我们并没有无限的算力、参数和完美的初始化条件,因此必须依靠一些启发式方法来逼近这一目标。这些启发式方法很可能是冗余的。这也解释了为什么很多所谓的“算力乘数”(compute multipliers)并不能很好地叠加。它们可能带来一些相关性较强的收益。而三年后再看,当英伟达的 GPU 性能进一步提升时,这些乘数的叠加效果可能会更差。

    也许在任何特定时间点,某个算力乘数的收益都是短暂的——这也是我对 KataGo 论文的推测。该论文应用了许多算法思想,但如今使用 Blackwell 架构或 Ada 级 GPU(相比 V100 有显著提升)时,那些曾用于加速收敛的技巧相比之下似乎没那么重要了。我认为这反映了当前阶段的技术偏好。

    Dwarkesh Patel 那外层循环呢?如何验证 AI 变得更聪明?比如在围棋中,确实存在一个外层循环:与当前最强的开源模型对战并提升胜率。但正如你所说,还有其他类型的外层循环,比如是否发现了新的现象——而这实际上很难验证……如果你不知道缩放定律(scaling laws)的重要性…… Chinchilla 或 Kaplan 提出的缩放定律是什么时候发布的?

    Eric Jang

    2018 年。

    Dwarkesh Patel 所以回到 2015 年,很难想象有什么自动化流程能轻易区分哪篇论文讲的是缩放定律,哪篇只是普通的图表分析。即使在围棋这种相对明确的情况下,外层循环本身也是难以验证的。整个外层循环的意义在于为进步提供一种保障机制,更不用说通用人工智能(AGI)了,那里我们已经有了一大堆基准测试。

    但这里有个问题:我们知道能测量什么,就改进什么;我们关心的是实现经济上有用的工作能力——这至少在完全自动化之前还不容易量化。那么,对于 AI 自我改进而言,外层验证循环的有效性如何?这真的重要吗?

    Eric Jang

    So if you’re back in 2015, there’s not an automated procedure one can easily imagine for knowing which paper is the scaling laws paper versus which is just another random plot. Even in the Go case, it’s a hard-to-verify outer loop, and the whole idea of an outer loop is to have some backstop on improvement, let alone for general AGI, where of course we have a bunch of these benchmarks.

    But there’s a problem. We know the things we can measure, and we improve on the things we can measure. We care about this broader ability to do economically useful work, which is not super easy to measure, at least until you automate everything. There’s a question of how good the outer verification loop is for AI self-improvement, and does that matter?

    Eric Jang

    我要给出一个不够严谨的论证,但这是我直觉上相信的观点。DeepMind最初专注于游戏领域。他们以游戏作为外部循环,然后研究人员通过解决游戏积累经验,现在他们正在研究大语言模型(LLMs)。

    大概可以认为,他们在 Atari、围棋和《星际争霸》等游戏上的工作经历,对如今开发出优秀的大语言模型产生了积极影响。我假设这种正向迁移确实存在,无论是编程能力、通用科研能力还是项目管理能力方面。这些技能很可能都对他们取得成功有所帮助。

    如果是这样,那为什么自动化的 AI 研究者就不行呢?他们应该能够将快速验证、快速迭代的经验,从这类任务迁移到更宏大的、具有经济价值的目标上,比如实现药物发现的自动化。

    Dwarkesh Patel

    我不知道。问题难道不是……从历史来看,直到几年前 Gemini 3 发布之前,人们一直说“看,Google 在大语言模型上追不上,因为他们固守旧有方法。”虽然也有进步,但旧方法也在某种程度上阻碍了他们的发展。这一点对我来说并不明显。

    Eric Jang

    目前尚无定论。假设 Google 现在表现不错,谁知道长期来看,早期在训练中基于游戏的初始化会不会最终限制他们成为最后的赢家呢?很难确定。

    同样地,谁又能确定他们看似起步较晚,其实只是花了更长时间在 TPU 的扩展预训练上?他们将全部技术投入用于提升 TPU 的性能——这在短期内似乎用处不大,但从长远看却至关重要。即使是人类,在今天的数据基础上,也难以判断最优的研究策略究竟是什么。

    Dwarkesh Patel

    好的,我们应该告诉听众如何进一步了解这个项目:他们可以自己 fork 代码,或者查看你写的这篇博客文章,你在其中非常出色地解释了许多这些想法。接下来大家该去哪里看看呢?

    Eric Jang

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

    Dwarkesh Patel

    我还强烈推荐大家去看看这篇博客:《As Rocks May Think》。我们在这次对话中提到了其中一些观点,但这篇文章提出了一个更宏大的论点——当你把“思考”作为基本原语时,会发生什么?

    Eric Jang

    计算机科学。

    Dwarkesh Patel

    没错。我也强烈推荐大家读一读这篇文章。

    Eric Jang

    我鼓励观众思考“思考”与围棋之间的关系,特别是通过蒙特卡洛树搜索(MCTS)和搜索算法,以及它与大语言模型之间的联系。我认为这其中蕴含着一些深刻而尚未被充分探索的内容,也许正是因为相比大语言模型的爆发式增长,围棋领域的研究相对滞后,才导致这一关联被忽视。

    我并不是说我们应该在大语言模型中加入树结构,但两者之间确实存在某种有趣的对偶性。实际上,用很小的预算就可以在围棋、MCTS 和推理方面开展大量研究。这非常令人兴奋。

    Dwarkesh Patel

    太棒了,Eric。谢谢你参与这次访谈。

    Eric Jang

    谢谢。能参加这个播客是我的荣幸。

    需要完整排版与评论请前往来源站点阅读。