Eric Jang:从零开始构建 AlphaGo
Eric Jang – Building AlphaGo from scratch
嘉宾:Eric Jang
全文文稿 · 按对话顺序保留完整内容,深入理解上下文。
§01围棋基础
Dwarkesh Patel
今天我请到了 Eric Jang。他最近担任 1X Technologies 的 AI 副总裁,在那之前则是如今 Google DeepMind Robotics 的高级研究科学家。过去几个月你一直在休假,其中一件事就是重建、改进并动手改造 AlphaGo。
今天你要讲讲如何从零开始构建 AlphaGo,以及这件事对 AI 研发未来意味着什么。在进入正题前,为什么 AlphaGo 值得关注?你为什么选择在休假期间做这个项目,而不是去海边放松?
Eric Jang
我喜欢动手创造东西,而 AlphaGo 和围棋 AI 正是让我进入这个领域的事物之一。2014、2015、2016 年前后,我看到 AlphaGo 的早期突破时,深受震撼:原来 AI 系统能变得如此聪明,借助深度学习竟能处理这样的计算复杂度问题。长期以来,人们一直认为搜索无法解决这个问题,但它最终通过深度学习得到了解决。这让我觉得很神秘,我一直想更深入地理解这一现象。
我的训练背景是用于机器人的深度神经网络。在机器人领域,神经网络做出的决策更容易凭直觉理解。AlphaGo 却不同,它的决策来自极其深入的搜索。一个十层网络究竟如何把对博弈树深处局面的模拟能力摊销出来,这一直让我觉得很神秘。
Eric Jang
如果把这些年打造各种强大围棋程序所需的算力画出来,就会看到 2020 年 Jane Street 的 David Wu 开源了 KataGo 项目,它把从零训练一个很强的围棋程序所需的算力降低到了原来的四十分之一。我不确定它是否强过 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
这样我就能吃掉这一整组棋子,它们也就归我了。
我还想演示一种情况。最近我的代码里就曾在这里出过 bug。假设棋盘上还有其他棋子,我们摆出这样的形状。我们来聊聊棋局如何结束:这一片领地由谁控制,白棋还是黑棋?
Dwarkesh Patel
白棋。
Eric Jang
其实是黑棋,因为我把整个区域都围住了。假设这里还有其他黑子,你很难冲出这些棋子的控制。
Dwarkesh Patel
最后计算分数时,这些位置也会算作……
Eric Jang
问得好。不同规则集在计分方式上各不相同。我们应该谈谈人类之间如何确认分数,以及电脑围棋如何计算分数,因为人类判断这种局面时存在一些模糊之处。
大多数人看到这个棋盘局面,会认为黑棋已经把白棋完全包围,白棋没有活下来的机会。我们可以继续下几手,但最后我会把它们全部吃掉。不过,如果你有办法打破这个形状,把白棋连到外面的棋子上,局面就可能翻转。电脑要判断这种情况会有点困难。
人类是怎么做的?想一想人类如何判定局面很有价值,因为这会对应到我们稍后讨论深度神经网络的方式。人类大致会说:“我觉得棋局结束了。”然后你也得说:“我觉得棋局结束了。”接着我们会说:“我认为这些是我的棋子。”你必须同意。如果你不同意,我们就继续下。
本质上,两个——所谓的价值函数——达成共识后,中国规则就据此判定结果。Tromp-Taylor 计分则完全没有歧义,电脑可以通过算法判定。假如终局时出现这样的局面,计分方法是先数你控制了多少颗棋子,这一点没有歧义。
然后再数有多少个空交叉点没有被对手的棋子接触到。这些交叉点不会算给任何一方,因为它们都同时连通着白子和黑子。
如果是这样的形状,白棋就会得三分。这有点奇怪,因为人类会知道白棋实际上保不住这些分数。但按 Tromp-Taylor 计分,白棋会得到这些点以及这些点。因此,电脑围棋和人类围棋的计分方式有很大差异。
Dwarkesh Patel
棋局怎么结束?
Eric Jang
有一方选择认输,或者双方连续停一手,棋局就结束了。这就是规则。
Dwarkesh Patel
现在帮我用 AI 破解这个问题吧。
§02蒙特卡洛树搜索
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
我用这个棋盘说明。假设从这里开始,你在这里下,我在这里下,然后你又在这里下。它和我从这里开始、你在这里下、我在这里下、然后你再在这里下,是等价的。两条路径都到达同一个局面。因此,这个子节点可以看作一个共享祖先。
Dwarkesh Patel
懂了。我猜起初是 361 种,然后每下一手就少一种。
Eric Jang
对,分支因子每次都会减少一。不过无论如何,这都是一棵非常庞大的树。这也是为什么多年来计算机科学家认为,围棋在本世纪都不是一个可行的计算问题。要穷尽搜索所有可能性,需要的算力实在太大。
如果做得到,围棋实际上是一个确定性游戏。对于任意给定局面,你都可以算出能够获胜的最佳策略。你可以搜索所有能赢的未来局面,然后只要确保自己始终留在这些未来局面构成的集合里就行。
AlphaGo 的核心概念突破,是用神经网络让这个搜索问题变得可行。在讲神经网络如何参与之前,先假设我们有一台足够强大的电脑,聊聊怎样搜索这棵树并找到最佳着法。
一开始你不会把整棵树都建出来,因为存储成本太高。相反,你可以交互式地判断哪些叶节点值得继续探索、向未来扩展,看看那里还有什么。赌博机研究中有一些早期算法,例如 UCB1。它并不完全适用于围棋这种序贯游戏,却对 AlphaGo 使用的动作选择算法有很大启发。UCB1 的形式是:每一步选最佳动作,也就是找出使 Q(a) 最大的 a 的 argmax——我马上会解释 Q(a) 是什么——再加上某种探索奖励。
我们会在每个节点跟踪几个量。把这里的每个位置都看作一个节点。这是你要据以决策的根节点,这些则是根节点的子节点。每个节点本质上是一种数据结构,记录这个子节点被访问的次数。
Dwarkesh Patel
也就是父节点访问这个节点的次数。
Eric Jang
没错。来自机器人或其他强化学习领域的人容易在这里卡住的一个问题是:动作在哪里?我这里只谈节点。节点代表状态,而因为这是一个完全确定、没有随机性的游戏,你可以根据子节点推断动作。我走到这里,就意味着采取了某个动作,而局面会转移到这里。
如果让 LLM 用氛围编程的方式实现 MCTS,它们很可能会设计出正确的数据结构。不过这多少取决于个人偏好。你可以随意重写这棵树的结构。这是我问 Claude 4.6 时它为我写的方案,设计得相当合理。
Q(a) 表示这个动作的平均动作价值。我会用下标 a 表示,这是从根节点采取某个特定动作后抵达这里。采取 a 就会来到这个节点。我们还要存储采取这个动作的概率。
Dwarkesh Patel
再说一次,是相对于父节点而言?
Eric Jang
对,是从父节点出发。我们采样这个节点的概率有多大?稍后这会派上用场。到目前为止我们谈的是确定性树,概率的部分我之后再引入。
最后,我们会有一个子节点字典,也就是一组更多节点,用经典链表式的引用树连接起来。这就是实现一棵树的基本数据结构。
在 AlphaGo 里,他们使用一种略有不同的动作选择标准,叫作 PUCT,即“基于树的预测上置信界”(Predicted Upper Confidence with Trees)。选择要走哪个子节点时,会对 a 求 argmax,最大化 Q(s,a) 加上一个常数。两种公式的形式很相似,它们都是评分标准。你分别求这两个量的 argmax,以决定采取哪个动作。
我们拆开看看如何直观地选择动作。Q(s,a) 是平均动作价值,也就是某个子节点平均来说有多好。如果你真的知道整棵树的情况,只靠它就足以选出最佳动作,不需要更多信息。但如果你是在交互式地构建这棵树、逐步估算 Q 值,就必须偶尔尝试其他动作,在探索与利用之间权衡。
UCB 和 PUCT 都有一项,基本上会奖励那些你以前没选过的动作。正如前面说的,每个节点都会记录选择特定动作的访问次数,起初都初始化为零。以动作 a 为例,一开始它的访问次数是零。随着 n 增大,假如我们已经从根节点选择了 10 次动作,却一次都没有选 a,那么这一项对 a 来说就会变得很大。反过来,假如 10 次里我们选了 a 10 次,这一项就会很小,而且很快减弱。这里的情况也是一样。
Dwarkesh Patel
我确认一下自己是否理解了。先看 UCB,概念上可以把它理解为两部分:Q 值和探索项。
先说清楚 Q 是什么。你进行这些 rollout,也就是实际运行这些模拟,沿着树往下走,判断如果最终到达树的终局节点,我能不能赢。然后从这个节点出发,把树上所有叶节点中我赢或输的结果取平均。这个平均值就是 Q。因此,Q 表示从这个节点开始,我赢下棋局的概率。这就是利用项:我已经运行了这些模拟,并据此判断这步棋好不好。
另一项是在问:相对于其他可能探索或已经探索过的动作,我对这条分支探索得够不够?如果我还没探索过这条分支,它的分数也许看起来低,但我沿着这棵树从这个节点往下探索的叶节点还不够多。因此,即使利用项 Q 告诉我它不太有价值,我也应该尝试一下。
因为 ln(n) 的增长速度比 n 慢,随着时间推移,argmax 会从主要受探索项(这里的第二项)支配,转为主要受 Q 值支配。这时你已经做了足够多的模拟,也有把握认定应该沿这条分支继续搜索。
Eric Jang
没错。UCB 的出发点是设计这样一种算法:如果你不知道各个可选动作的回报,那么加入这里的某个探索项后,这种策略就能给出一个界限,限制你的后悔值,也就是你可能错得有多离谱。
我不知道这个证明,也不清楚这套方法是否已被证明具有对数级或平方根级的后悔界,但我认为这个算法的推导大致会得到这样的形式。你能看出这些项的增长方式略有不同,这是为了考虑到围棋每手可选动作比标准赌博机问题多得多。
我再补充一点说明:你刚才谈到了模拟和概率。要记住,围棋本质上是一个确定性游戏。这里的概率从哪里来?如果你有一台足够强大的电脑,实际上不存在概率,你可以直接计算平均动作价值的真实均值。
那么概率从哪里来?在 AlphaGo 之前的电脑围棋里,我们一直在做某种蒙特卡洛方法:从随机抽取的树中计算预期 Q 值的平均值。概率正是来自随机抽取的树。Q 的解释是:在某种随机搜索过程诱导出的随机分布下,动作价值的期望是多少?
随机搜索过程是怎么来的?这就涉及动作的概率 P(a)。假设一个朴素算法对所有合法动作赋予均匀概率,那每个动作的概率就是合法着法数量的倒数。你会在一棵非常分散的树上取这个平均值。这个积分在数学上成立,但速度很慢,因为你会考虑许多价值很低的树。本质上,这几乎像是一个重要性采样问题:只有少数动作和路径贡献了较高价值,其他几乎都价值很低,所以这是个棘手问题。
这就是用来决定沿哪些着法继续搜索的动作选择标准。沿着树向下搜索,最终会遇到一个节点,那里已经很清楚你赢了还是输了。游戏末尾,在 Tromp-Taylor 计分下已经没有合法着法可下时,就能判断输赢。这就是整局游戏的最终回报。
我们可以给树上的终局叶节点赋一个值 U,但怎么给它之前的节点,也就是父节点赋值呢?你要计算平均动作价值,本质上就是取平均。假设这些都是叶节点,这个节点的平均动作价值就是你在叶节点输赢结果的平均值。同理,你可以沿着链往上走,并说这个节点的平均动作价值——我们把它叫作 Q_b——就是这些值的加权平均。
加权平均的权重可能取决于你采用了不同的采样分布。但基本思路是,先把游戏推演到确定的胜负,再倒着往回走——这一步叫作 backup(回传)——给这些节点或动作赋值,对应于终局叶节点的平均结果。
如果没有神经网络,这样做依然不可行。你会很难找出应该采样哪些动作。许多动作贡献的价值都很低,尤其是在你试图从劣势中奋力翻盘时。只有少数动作能带来较高价值,所以实际搜索仍然非常昂贵。不过,围棋具有树状结构,因此只要下游节点的值是正确的,而且搜索足够深入,你就可以据此对这个节点的价值作出很好的估计。
Dwarkesh Patel
你先前谈到:有些局面人类一眼就能看出谁会赢,但按确定性规则仍然必须把棋下完。这其实引出了两个直觉:第一,价值函数为什么可以训练;第二,为什么要有效地学会这个游戏就离不开它。也许先定义一下价值会比较好。
Eric Jang
我们刚才说,U 是对最终输赢的判定,也就是终局叶节点的条件。人类不会一路下到树的叶节点。在人类高水平对局中,他们会提前几十手停下,有时甚至提前 100 手。
他们怎么知道该停?你可以把人类想成隐含地拥有一个叫作价值函数的神经网络,它接收棋盘状态并预测我获胜的概率 p。人类扫一眼棋盘就知道:“我大概会输。”本质上,他们在运行一个神经网络:观察棋盘,并隐含地摊销大量可能的对局推演。他们把这些结果取平均,判断局面能不能赢,以及应该认输还是继续下。
这很了不起。想想其中的美妙之处:人脑里的神经网络竟能一眼完成所有这些模拟。人只需几秒,不必在逻辑上逐一把每盘棋下完,就能凭借沉淀的知识和经验作出判断。这说明,在围棋这类游戏中,有办法大幅加快搜索过程。这是理解 AlphaGo 为何有效的一个基本直觉。你可以训练一个价值函数,让它看一眼棋盘就快速判断胜负,而不必把这些树一路搜索到很深。
Dwarkesh Patel
有道理。我想替听众说一句:以前准备节目时,如果觉得理解 AlphaGo 的原理很重要,我总会被它弄糊涂。但只要用这种方式理解问题,再逐步搭起后面的几个部分,整件事就容易理解得多,也很讲得通。现在听不懂也没关系;等这场讲解结束时,你大概会发现它比预想中简单。我只是替听众提个醒。
Eric Jang
退一步从更高层次看,我们接下来要讲的核心直觉是:传统上,对围棋这类游戏,你可以构建一棵树,但我们没有足够强大的电脑来搜索它。估算每个可能动作的价值也很困难,因为不到棋局结束你就不知道结果。
你可以一路下到终局,再计算平均值,但这也很难,因为你不知道该选择哪些动作来采样这些平均值。概念上有两个问题:树的宽度和树的深度。AlphaGo 提供了一种方法,让这两者都缩减到可行的规模。这就是它的核心思想。
我们可以借鉴人类看一眼棋盘就能预测输赢的能力,也许据此减少搜索深度。我们也知道,人类能凭直觉一眼判断棋盘上哪些着法可能不错。这两种能力都可以用深度神经网络实现,从而加快搜索。
谈神经网络之前,我们回到刚才的对局过程。到目前为止我们只讲了一步棋:AI 看着编码后的围棋棋盘和一棵树,深入搜索,找出可能最好的动作,然后落子,把棋盘交还给人类。现在人类看到这样的棋盘并走一步棋,比如把棋子放在这里。
接下来轮到 AI,它现在看到的是一块新编码的棋盘。我用 2 表示 AI 执白,用 1 表示人类执黑,用 0 表示空位。轮到 AI 时,它会从头再运行一次 MCTS 树搜索,把上一轮搜索的旧树丢掉。现在有了新的根节点,它会重新开始搜索。
你可以把 MCTS 看成一种搜索算法:在神经网络的帮助下,它决定应该走哪些着法;每一手都会运行一次。我们来谈谈神经网络的部分。
Dwarkesh Patel
你擦黑板的时候,我再补充一个对我很重要的理解点:MCTS 的数据结构由节点和节点的子节点组成。它是按每一手建立的,一旦走完一步就重新初始化。人类落子后,AI 看棋盘并运行许多模拟,以确定下一步怎么走。
一次模拟就是在 MCTS 树中再探索一个节点。运行 1,000 次模拟后,就能得到下一步棋的概率分布,具体做法你马上会解释。你保存这份分布,根据概率选出最佳着法。然后丢掉其他信息,等下一位玩家落子,再重新开始。每一手都从头运行这套流程。
Eric Jang
没错。我稍微补充一点:其实并不是把所有东西都丢掉,后面我们会用到并保留其中一样东西。
§03价值网络的作用
Eric Jang
现在我们已经大致了解如何通过搜索来决定着法,接下来要讲神经网络如何类比人类直觉、加速这个过程。这里有两个网络。一个是价值网络,输入一个状态并预测我会赢还是输,这是一个二元分类问题。另一个是策略网络,它会对值得采取的动作生成一个概率分布。
我会画出一维摊平的着法分布,但实际上它是一个方格。这里展示的是各个好着法的概率分布。两者都是类别分类问题。你可以像训练其他分类器那样,用深度学习、交叉熵损失之类的方法来训练。
具体架构并不是特别重要。我试过几种架构,Transformer 可以,ResNet 也可以。根据我的经验,在小数据规模下,ResNet 仍然胜过 Transformer,在较低预算下也更划算。不过情况未必总是如此。
Dwarkesh Patel
等等,为什么?
Eric Jang
它们带有局部卷积这种归纳偏置。一般来说,当你需要更多全局上下文时,Transformer 才开始胜过残差卷积网络。
KataGo 论文里有个有意思的发现:把全局特征汇聚并整合到网络各处相当有用,这样网络就能从全局角度理解如何把棋盘一侧的价值和另一侧连接起来。
Dwarkesh Patel
汇聚全局特征是什么意思?
Eric Jang
假设棋盘很大,是 19×19,一些战斗发生在这里,另一些发生在那边。把棋盘输入卷积神经网络后,感受野很擅长计算局部特征并让表示具有不变性,但不容易把这两个特征联系起来。它们需要以某种方式汇聚并相互关注。
支持 Transformer 用于计算机视觉任务(例如视觉 Transformer)的一个理由是,它能对整个输入进行全局注意力计算,因此更容易建立这些联系。不过,要通过数据学到不变的局部特征,你确实需要更多数据。
我非常努力地尝试让 Transformer 适用于这个问题,因为我很好奇 Transformer 会不会给围棋带来某种突破,省掉很多技巧。但无论怎么试,目前我还没找到让 Transformer 胜过 ResNet 的办法。
Dwarkesh Patel
再问一个相关但不太相干的问题。如果需要考虑的不只是空间信息,那么 Transformer 能利用全局信息这一点显然会更有优势……CNN 则会带来一种偏置,让模型特别重视邻近事物。
Eric Jang
然后它们会逐渐汇聚起来。
Dwarkesh Patel
对于局部发生什么没那么重要、必须考虑整体情况的游戏,你是说 Transformer 会更合适。我们谈的是空间维度。那时间维度呢?现在我们只考虑上一步,因为围棋是完全信息的确定性游戏。
如果是扑克或外交家(Diplomacy)这类游戏,之前某一刻的虚张声势会影响你对当前局势的理解,你就必须考虑以前的所有状态来决定下一步。这会改变我们对归纳偏置以及哪种架构更合适的判断吗?
Eric Jang
好问题。围棋是完全信息游戏。在完全信息游戏里,确实存在一种纳什均衡策略,采用它不会比采用任何其他策略更差。
如果你知道对手有某种偏好,比如特别喜欢进攻,原则上你可以针对这一特定策略采取更好的应对,效果胜过纳什均衡策略。但要应对任意给定策略,总存在一种只由当前状态决定的纳什均衡策略。这是 AlphaGo 做出的设计选择,事后看来效果非常好,因为这个纳什均衡似乎达到了超人水平,任何人类策略都赢不了它。
也有一些情况需要考虑时间历史,这是很令人兴奋的研究方向,我鼓励大家 fork 我的仓库试试。假如下的是 2 对 2 围棋,你就需要对搭档的行为建模。你可能不了解他们的下法,因此必须汇总其行为信息,才能据此回应。这些情形就不再是完全信息游戏了。在不完全信息或部分可观测的游戏里,你确实需要上下文来构建模型。自我对弈或外交家这类游戏中的相关方向会非常令人兴奋。
回到神经网络,具体架构还是没那么重要。Transformer 可以,ResNet 也可以。我发现低预算实验里 ResNet 效果稍好。你也可以用 Karpathy 风格的 AutoResearch 调参,让架构表现得相当好。没必要过分担心这个问题,你只要把任务设置好,让模型有明确的优化目标即可。
我们会选一个相对任意、但在我做的项目里有效的架构。再说一次,这一部分不太重要。输入是编码后的棋盘状态;类似 RGB 图像,我们用三个通道,一个表示黑子,一个表示白子,一个表示空位,或者用来表示屏蔽区域,以便训练不同尺寸的棋盘。现在我先不讲多种棋盘尺寸,那有些复杂。
我们把这张类似 RGB 的双通道或三通道图像输入 ResNet,然后分成两个输出头。一个预测价值函数,输出单个 logit,姑且称为 R1。另一个是策略,输出 R361。这就是架构。训练时要让它根据棋盘状态预测棋局结果,同时也预测哪些着法是好棋。
最初那篇名为 AlphaGo Lee 的论文,用专家人类对局数据集来初始化这个网络。后来他们取消了这个限制,让模型自己学会下好棋。我认为,对于实现项目以及听众来说,先用简单的东西初始化实验、让问题跑通,再尝试从零开始学习整个问题,是很好的做法。
在深度学习中,初始化至关重要。研究项目一开始总要尽量靠近成功,尤其是你在做从未做过的新事时。先选一个能工作的方案,再让它变得更好;不要从完全不能工作的东西起步,然后再想办法让它运行。
按照这个思路,先做一个良好的初始化是很好的选择。我们会用人类专家的棋局来训练模型预测好着法:取专家获胜的棋局中的每一步,让模型预测这些动作。不管棋盘处于什么状态,也不管你最终赢没赢,都要预测棋局结果。
你可能会想,棋盘上才刚放下一颗棋子时,怎么可能知道赢家是谁?如果你有几十万盘棋,平均来看,从这样的棋盘局面出发,可能一半棋局后来走向胜利,另一半走向失败。所以这并不成问题。训练模型预测这些结果时,logit 会趋近 0.5。预期就是模型训练完后,开局局面的预测会是 0.5;随着棋局进行,胜率会升高或降低。
这是你的手数。随着棋局进行到几百步,在专家数据分布下,谁更可能赢或输就会越来越清楚。
Dwarkesh Patel
我没明白这种价值观为什么特别适用于专家数据。
Eric Jang
它并不特别适用于专家数据。对任何训练数据都是如此。如果你从零开始学习,也会预期出现这种现象。
想象一下,你正在用氛围编程构建 AlphaGo。你从网上收集一些 KataGo 专家对局数据,或者有一份人类棋手数据集,然后用它训练模型。结果这个模型已经是相当不错的围棋棋手,很可能能赢大多数人类。你只要取策略网络给出的建议,对这些概率求 argmax,然后把最大概率对应的动作作为棋步,就能得到一个下得很快、不会逐步推理、只凭直觉出招的强大棋手。想到可能仅用 10 层神经网络、不到 300 万参数,就已经能做到如此出色,这本身就很不可思议。
你可以从这里起步。实现时很重要的一点,是确认这大概确实可行。要验证围棋规则实现正确,也要确认能比较快速地运行这些模拟。把这当成检查点:在叠加搜索等复杂功能前,先确认这个基本步骤确实做得到。
不过,只让原始神经网络直接下棋,还远远不够。我们可以用神经网络来改进蒙特卡洛树搜索。先从根节点开始,现在有一个四步迭代流程来进行 MCTS。
我第一次读论文、试着理解时,这一点把我难住了。本质上,我们要选择模拟次数,这个数并不固定,可能在 200 到 2,048 之间。我记得 AlphaGo 对阵李世石时,每手用了数万次模拟,因为他们想尽量提升模型实力。但训练过程中其实用不了那么多。我想 KataGo 使用的数量级也大致如此。
Dwarkesh Patel
你知道他们是否用了……你看那部纪录片时,比赛期间桌上摆着一台笔记本电脑。他们没有用那台笔记本,而是用了某个……
Eric Jang
我觉得他们用的是某个 TPU pod。
Dwarkesh Patel
说真的,这有点不公平。李世石下每一步时可没有用 1E22 FLOPS。
Eric Jang
确实有道理。有意思的是,现代围棋程序在测试时不需要那么多算力。我们讲到 MCTS 策略改进如何运作时会看到,随着时间推移,原始网络会把那个大型 TPU pod 承担的工作逐步吸收进网络里。所有工作都可以通过一次神经网络前向传播完成。TPU pod 始终能在此基础上再增加额外算力,而这正是他们比赛时想要的。
我们会选定模拟次数,对每一次模拟同时做几件事:查看当前树里哪些着法最好;走到需要添加叶节点的位置时,就为树添加更多叶节点;更新树中的动作价值。每次模拟都包含四步:选择、扩展、评估和回传。
蒙特卡洛树搜索开始时,树的结构非常简单,只有根节点,也就是 AI 当前要落子的棋盘状态。我们要为它选出最佳动作。创建根节点时,我们也知道可以用神经网络评估它,得到 Vθ 以及动作概率分布。我把它称为根节点。我们可以为所有动作创建一批子节点。这里我画的是 3×3 棋盘,其中一个位置已占,所以根节点对应八个可能的子节点。每个子节点都有采取相应动作的概率,比如 P8、P1……P2,依此类推。
因此,蒙特卡洛树搜索刚开始时,我们有根节点,也可以用一些子节点初始化它。策略网络评估根节点后会给出结果:在 3×3 棋盘上已经放了一颗棋子的情况下,AI 可以采取八种可能的动作。对每个子节点,策略网络也会给出选择它的概率。第一步是执行树搜索中的选择阶段。再说一次,这时树很浅;目前本质上只有深度为一的树。
我们的第一步是选择能最大化 PUCT 标准的动作,也就是求 argmax。它大致是 Q(s,a) + C_PUCT × P_a × (√N / (1 + N_a))。起初所有动作的 N_a 都是 0,N 也是 0,所以我们按这个准则选。最初选中的动作很可能偏向概率最高的动作,因为每个节点的相关访问量都一样。
假设 P1 是概率最高的节点,所以你选择了它。到达这个节点后,你会发现它不是叶节点,也不是终局,因此无法判定最终结果。下一步是扩展。于是你把这个棋盘状态输入策略网络。注意,这是 AI 在走棋。扩展树时,我们接下来考虑的是人类或其他对手可能会怎么走。
评估这里的节点时,我们要从当前玩家的角度来评估。这个节点有我们可以采取的可能动作,于是我们扩展这里的叶节点。对于每个可能到达的节点,我们要判断局面有多好。从这里开始,人类可以走这里、这里或那里。我们会为每个节点保存 Vθ,例如 Vθ(Node 1′)、Vθ(Node 1″) 等等。本质上,我们用神经网络从当前玩家的角度,直觉地估算这些棋盘局面有多好。
幸运的是,因为这是零和游戏,很容易推得当前这一步对这个玩家的价值等于从另一方角度看的价值减去 1。你可以根据轮到哪一方,轻松翻转搜索过程。这就是扩展步骤:你拿到一个非叶节点,扩展它,并评估它的价值。这本质上是快速猜测:如果我继续下到终局,我会不会赢?你几乎可以把 Vθ 看成捷径:在每一次模拟里,不必搜索到树的末端,就能估算结果。
这就是评估步骤,我们要评估这些棋盘局面各自的质量。在最初的 AlphaGo Lee 中,他们做了一件挺有意思的事:把这个价值与真实围棋对局推演的价值取平均。他们真的从这里开始下完一整盘棋。我用这条曲线表示某条路径。他们一路下到完整棋盘的 Tromp-Taylor 判定结果,因此结果是 0 或 1。随后他们把该结果和这里的价值取平均。公式是 α × 某个节点的 Vθ + (1 − α) × 一次真正随机采样的对局推演。
你可能会想,他们怎么把棋下完?再对这个推演做一次搜索,代价会很高,就像在一棵树里又嵌了一棵树。他们没有这么做,而是直接让策略网络自己和自己对弈。它同时充当双方,一直下到终局。这样能让这里的估计结果扎根于现实,因为你可以通过单次采样估算是否获胜。到残局阶段,棋盘几乎已经定型时,这很有用:按策略下出来的结果很可能是对棋局相当合理的估计,不会脱离现实。
后来事实证明,这一步完全没必要。AlphaGo Lee 之后的论文都删掉了它。我在自己的实现里也同样删掉了,这能大幅提速,因为每一次模拟都不必把整盘棋下完。
Dwarkesh Patel
我再确认一下自己的理解,重新解释一遍。顺便说给听众听,以免不明显:选择公式里的 P 是来自网络的概率。
Eric Jang
没错,是这里的策略网络给出的。
Dwarkesh Patel
从根本上说,一次模拟就是在搜索过程中再向前推演一个节点。
Eric Jang
差不多。如果整棵树都已经存在,那么模拟很好理解:只要按照 PUCT 选择标准沿树往下走,继续搜索即可。AlphaGo 的数据结构则让我们从一棵基本上只有一层深度的树开始,也就是只有根节点和它的子节点;你要一边沿树选择动作,一边逐步扩展这棵树。这正是核心所在。围棋的组合复杂度如此之高,你不能先把树建好再搜索。必须在构建树的同时搜索。
最后一步是回传。给这些结果评分后,分配给该节点(即采取这个动作)的 Q 值,就是你评估结果的平均值。你要对所有模拟的值持续计算运行均值,也就是对各个子节点的值求平均。这就是回传步骤。评估完之后,可以递归地往上回溯:如果知道这个节点的动作价值,就能计算父节点的平均值,依此类推。
整个过程有四步:一,选择你目前所知的最佳动作;二,如果遇到此前未到达过的节点,就稍微扩展一下树;三,把节点输入网络,猜测自己是否会赢;四,一路回到根节点,更新你对最佳着法的估计。
随着你反复进行这些步骤,因为每次选择都遵循这个标准,你总会在每个分支选择自己认为最好的动作。最后,各动作的访问次数会反映搜索过程诱导出的正确策略分布。我们之前记录在节点中的访问次数,最终其实就成了投票,用来决定该选哪个动作。
为了检验理解是否到位,值得想想能不能把流程进一步简化。我们有没有可能去掉这一项,系统仍然能正常运行?回想一下,在这个节点扩展并评估后,你就知道每个子节点的获胜概率。如果这里是 1,而其他位置是 0,你已经能判断哪个动作可能更好。那为什么还需要这一项?为什么不直接把这些值归一化成一个分布,作为策略分布?
这样做没问题,可能确实有效。但在实践中,靠一次前向传播给出相当不错的猜测,正是剪枝树宽的办法。这里存在一种对偶关系:如果策略推荐的动作与价值判断不一致,就很奇怪。假如策略说某个动作概率非常高,但价值头却说它价值很低,那么策略头与价值头之间就存在根本问题。两者是关联的;如果能想出一种从价值评估中恢复策略分布的方法,确实可以去掉这一项。
Dwarkesh Patel
对,我确认一下是否理解:你们不这么做,是因为这样就不必为 360 个独立动作分别做一次前向传播,再说“好,现在所有动作的价值都算出来了,我们从中取 argmax”。相反,一次前向传播就能得到所有动作的概率。
Eric Jang
通常可以比较高效地把它们组成批次,所以实践中这可能不会带来很大的计算负担。不过,是的,你得把最多 361 个棋盘状态放进一个小批次里,计算它们各自的价值,然后再归一化。
其实我们保留这一项还有个更重要的原因:蒙特卡洛树搜索如何反馈自身,并递归地改进自身预测和搜索能力。把策略作为一个明确建模的对象,而不是对价值作隐式归一化,在这里是个好主意。
Dwarkesh Patel
明白了,好。
Eric Jang
我们刚才讲了模拟。随着模拟次数不断增加,搜索得到的树大致会像这样……我画的是非常低维的简化图,真实棋局当然维度高得多。最终会得到一棵树,其中有许多叶节点会终止且不再被访问,因为它们的价值被认为太低。但沿着某一条路径,会有一组访问次数很高的动作;随着 N 增大,搜索会逐渐聚焦到这组决策上。
这就是蒙特卡洛树搜索的树在脑海中应该呈现的样子。可以把它与井字棋的穷尽搜索树对比:先有 9 种动作,再有 8 种,然后 7 种、6 种,最终树的规模是 9!。围棋中的蒙特卡洛树搜索非常稀疏,只考虑已经扩展出子节点的那些路径。
现在我们已经有了一个同时使用价值函数和策略函数的搜索算法,可以讨论蒙特卡洛树搜索算法如何在它们的基础上充当改进算子。
§04自我对弈
Eric Jang
现在来讲强化学习部分:这个系统如何通过自我对弈变得更强。假设我们开始下一盘棋。你走一步,AI 进行搜索,得到这个访问次数分布。假设这就是策略网络对当前节点的初始建议。
经过 MCTS,模型对其中一个动作更有信心,分布可能会像这样变得更尖。当然,你可以调整搜索过程,让分布保持得更分散,但那可能不是好主意。MCTS 应该会对某些动作比其他动作更有把握。初始时,它可能会把很多概率分配给其他动作;随着模拟次数增加,分布应该会逐渐收敛为非常尖的形状。
我们把它记作 π,并用 (a | s) 的 MCTS 算子包起来。应用 MCTS 后,策略推荐的分布会变成这样,比之前更尖一些。然后你可以取 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 的做法是说:你下了这盘最终输掉的棋,但我会针对每一步动作都给出一个严格更好的替代动作。它不保证你一定会赢,却能保证:如果把这些状态—动作对作为训练数据,重新训练策略网络去预测这些替代动作而非原始动作,你的表现就会更好。
这和机器人学及模仿学习中的 DAgger 密切相关。你想在这里收集一次干预,即使处于不理想状态也一样。比如自动驾驶汽车偏离道路,此时仍存在一个能纠正它、让它回到路上的有效动作。
Dwarkesh Patel
这是个吹毛求疵的问题:MCTS 一定比策略网络好吗?例如在训练早期,MCTS 依赖价值网络;如果价值网络还没用完整棋局训练好,它可能还不如随机初始化的策略网络。MCTS 会优于策略网络只是一个启发式,还是有什么保证?
Eric Jang
实践中这是一种启发式。它在实践中确实有效。不过我举个例子说明 MCTS 可能给出比策略网络更差的分布。这种情况可能发生在自我对弈算法已经训练到不错的水平,但之后由于没有使用多样化数据或其他原因而崩溃。
假设棋盘局面下策略网络的建议非常好,也就是 Πθ(a|s) 表现不错。但也许由于机器人经常认输,而不是一直下到 Tromp-Taylor 规则判定的终局,我们逐渐忘记如何评估残局计划。比如刚才讲的角落局面,经验回放缓冲区里 100% 的训练数据都没有留下这类状态的价值评估样本。
结果可能出现一种情况:终局价值非常差。如果叶节点的终局价值不准确,这种误差就会一路向上传播,让 PUCT 选择标准和回传都出错。最后你访问到的分布就会和策略网络最初建议的分布大不相同。
另外,如果模拟次数很少,可能会有方差问题,导致探索不足。只有当 N 趋于无穷大时,它才保证收敛。搜索过程的方差以及评估不准确,肯定会损害策略建议的质量。因此,它并不保证一定改进。
这也是我猜 AlphaGo Lee 在训练算法中让棋局一直下完的原因:这样就能用真实对局来校准。如果是我来做,另一种办法是让 10% 的棋局不准机器人认输,而是要求“下到终局”。这样经验回放缓冲区里就会有一些训练数据,真正推演到通常人类玩家不会继续下的残局。
如果假设价值函数正确,这就是 MCTS 能给出更好策略的原因。这是一连串非常关键的假设。假设价值函数准确,搜索过程理应给出比初始猜测更好的建议。
Dwarkesh Patel
如果策略是从冷启动开始——比如 AlphaZero 那样——那么最初几个训练轮次里,策略基本没有用。实际上你做的只是:“好,我们来下一整盘棋;下完之后,就给此前的每一步标注谁赢了、谁没赢。”AlphaZero 的损失有两部分:策略相对于 MCTS 表现得怎么样,以及从这一步开始,价值预测与实际赢家是否一致。你可以把它看作应用在每一个动作、每一手棋上。
AlphaZero 训练初期实际上只是在让价值函数学会预测:假如你处于这个局面,并且轮到你下棋,你会赢吗?实际上只发生了这些。等价值函数训练好后,策略也开始改进。
Eric Jang
没错。我发现一个挺有用的技巧。这不是经过同行评审的结论,所以请谨慎看待。不过,在我自己的实现中,以下做法很有用。投入大量时间运行 MCTS 之前,先确认这个环节表现良好。对垃圾价值预测做搜索没什么意义。你得先把它初始化到一个能正常工作的起点。
AlphaGo Lee 有个非常好的做法:直接拿人类棋局训练,效果确实非常好。你也可以让开源围棋程序互相对弈生成数据,这同样有效。如果手上有一个包含真实优秀棋局的离线数据集,就很容易把残局价值函数学得很好。搜索过程需要从这里起步。
Dwarkesh Patel
抱歉,你能再重复一遍那句话吗?
Eric Jang
当然。评估围棋残局相当容易。棋盘上几乎都落满棋子时,这几乎是个可判定问题,因为博弈树的剩余深度带来的不确定性已经非常低。因此,只要是由水平不错的人下到终局的大多数棋局,都可以作为优秀训练数据,训练出能在树的终局部分作出良好预测的价值函数。
继续下棋后,搜索会把好的价值回传到树的中间节点。随着数据量增加,价值头就会形成良好直觉,知道什么样的棋盘局面是健康的、什么样的不是。中盘的判断要比开局或终局微妙得多。
最难评分的不是开局,因为开局的胜率显然是 0.5;终局谁在赢也很明显。价值函数要学会的难点,是判断中盘谁占优势。
Dwarkesh Patel
所以这其实和时序差分学习(TD learning)很相似。
Eric Jang
没错。这里和 TD 学习有个很漂亮的联系,稍后我们可以把它与蒙特卡洛树搜索对比着谈。
你首先要获得良好的价值函数,专家数据能提供一条捷径。我建议实践者先这样做,初始化到一个良好的起点。如果你想尝试 AlphaZero 或 KataGo 的从零学习,可以在小棋盘上尝试下随机棋局。拿一个随机智能体来下,比如下 50,000 盘,你也能学到相当不错的价值函数。在 9×9 棋盘上,随机落子足以让你看到一些常见棋形。
如果同时用 9×9 和 19×19 的数据训练——KataGo 提出过这样一种架构——价值头从 9×9 学到的东西迁移到 19×19 时,效果相当不错。
Dwarkesh Patel
对,因为这和其他游戏不同,棋盘变大时,不会突然加入一种新棋子之类的东西。
Eric Jang
如果把棋盘缩到极小的 4×4,随机下 50,000 盘,你会得到许多看起来像人类棋局的终局状态。这时它就像井字棋了。
把棋盘稍微扩大到 5×5 或 9×9 后,纯随机落子也可能生成相当合理的棋盘局面,这并不难想象。这些局面也容易计分。这就给你提供了引导数据,让你随后可以通过搜索改进策略。
不过,MCTS 得到准确的价值估计至关重要。你必须让价值评估有可靠的依据。归根结底,如果价值函数没有扎实依据,MCTS 就会崩溃。
Dwarkesh Patel
我很好奇,让价值和策略共用一个网络,可以节省多少算力。既然它们共用表示,学习效率能提高多少?我们刚才说过,它们做出的预测相似,或者应该保持一致。我想知道,把它们放在同一个网络里,是否能让所需算力减半。
Eric Jang
原始的 AlphaGo 论文 AlphaGo Lee 使用了两个独立网络。之后的论文都把它们合并成一个双头网络,推测这样能节省算力。但要用严谨的科学方法回答这个问题,看起来简单,真要彻底研究清楚却需要相当多工作。
直觉上,它们确实共享很多表示。正如我们说过的,策略网络和价值网络在评估局面时应该一致,两者理应保持这种一致性。
Dwarkesh Patel
如果这种理解不对,你就告诉我。每次我学习 LLM 的工作原理,发现 RLVR 作为算法这么简单,却能实现那些能力时,都会感到震惊。仅仅给出是或否的反馈,它就能学会构建非常复杂的代码库。
但对 AlphaGo,越深入理解 MCTS 的预测方式,回头看它就越没那么令人惊叹。你通过规定探索过程该如何逐步调整,加入了大量归纳偏置,还给它搭建了非常明确的树搜索。我不知道你是否也有这种感觉:越理解 AlphaGo,越觉得它在 2017 年取得的成果没那么惊人。
Eric Jang
我个人不同意。我认为它们各自有不同的深刻之处。我对 LLM 强化学习了解不够,没法在你的节目里评论。不过,AlphaGo 为什么是一项深刻的成就?我们值得退一步想想。它与现代强化学习不同,我们也可以聊聊其中一些算法选择。
我认为最深刻之处在于:一次 10 层神经网络前向传播,基本上也就是 10 步推理……当然,这种推理不只是沿着一条思路前进,而可能通过分布式表示并行进行许多思考。但从结构上说,假设一个 10 层网络最多只能进行 10 步串行思考,那么这 10 步通过神经网络进行的并行分布式表示计算,竟然能把一个几乎不可处理的搜索问题摊销掉,并以极高保真度近似解决它。
这是一个突破,我认为今天大多数人甚至还没有完全理解这项成就有多深刻。比如 AlphaFold 也建立在这个思路上:你需要做极其困难的物理模拟,必须展开许多微观尺度模拟;然而一个规模不大的神经网络只需 10 步,就能把一个感觉属于 NP 类的问题压缩为单个问题。
这让我不禁怀疑,我们对 P=NP 这类问题或计算难度基础问题的理解是不是不完整。显然,这并不能证明 P=NP,但其中有些东西令人不安:一个看起来很难的问题,竟可能被一个非常简单、宏观的解法攻克。
Dwarkesh Patel
这是个很有意思的见解。许多已被证明为 NP-hard 的问题——我不确定围棋是否已被证明为 NP-hard,但蛋白质折叠等问题是——神经网络都能解决。它们在最坏情况下是 NP-hard,但我们通常不关心最坏情况。这些问题往往有很多结构。
Eric Jang
我认为我们应该反思:面对 NP-hard 问题,我们是如何按照最坏情况下的复杂度来构造解法的。我不会说这就解决了围棋,它没有给出精确的最优解,但在实践中极为有用。AlphaTensor 和 AlphaFold 也展示了同样现象。没错,这是个最坏情况下看似不可处理的难题,但我们仍能取得几乎任意程度的进展。
把它推到极限会是什么样?假如你想模拟天气这类复杂现象,或者预测未来——比如我们是否生活在模拟之中——构建复杂模拟所需的计算资源,可能远小于我们的预期,因为大量计算可以摊销到单个网络的前向传播中。对我来说,AlphaGo 是第一篇真正表明:大量模拟计算可以压缩到少量计算中的论文。
Dwarkesh Patel
我完全没有资格从计算复杂度或数学角度评论这件事,不过我想知道混沌在这里是否起了重要作用。天气预测的问题是什么?为什么往前预测一天就需要十倍算力,而且每多预测一天都如此?因为天气是混沌系统,微小扰动会随着时间推移彻底改变最终估计。我猜围棋和蛋白质折叠也会有这种情况。
Eric Jang
围棋里有个可能相关的天气类比。这里是我们当前的棋盘状态。根据对双方的了解,未来的精确棋盘会是什么样?这个结果对初始条件极其敏感,只要在这里放一颗棋子,整个预测就可能被打乱。这很难,直觉上这就是混沌问题。
但我们仍能预测谁会赢。这种预测涵盖了大量可能性。我们真正关心的,是更宏观的量:许多可能未来的平均值、期望值,或者某种全局宏观结构。
天气也可能是一样的。我们并不特别关心某个经纬度上空 6,000 英尺处的风速,而关心飓风的位置等宏观信息。经典的洛伦兹吸引子就是混沌的例子。如果你从洛伦兹吸引子上的任何一点出发,不知道最后会到哪里,但你知道轨迹整体会呈现这种形状,其中自有一种美。有时我们不太关心微观尺度的细节,而真正关心宏观结构;这些结构可能是可预测的。
Dwarkesh Patel
这和哈希函数不同。哈希函数同样极度依赖初始条件,但没有宏观结构,至少如果算法有效的话,希望不会有。
Eric Jang
但愿如此。
Dwarkesh Patel
那里不存在价值函数,也不存在值得关注的天气整体状况之类的等价物。真正要关心的只有 100 手之后棋盘精确会变成什么样。
Eric Jang
直觉上这似乎没错。这也超出我的专业范围,不过我觉得有意思的是,密码学和哈希领域同样无法证明你不可能找到快速近似方法。你无法找到快速近似方法。要是能证明这一点,就能证明 P 不等于 NP。
Dwarkesh Patel
事实上,我们知道许多密码协议中存在结构,RSA 密码学就是明显例子。量子计算机正是利用这种结构来破解它们。
Reiner 有篇很有意思的博客文章,我们在节目里也谈过。他指出,从较高层次看,密码协议与神经网络非常相似:它们都通过连续的层把信息混合起来。算法中存在趋同演化。密码学希望最终状态对初始条件极其敏感,这样只要改动一点,输出就会变得混乱。神经网络也希望每个部分都依赖所有信息,因为它要处理全部信息并考虑彼此关系。
Eric Jang
神经网络在混沌边缘时能力最强。我记得 Jascha Sohl-Dickstein 有几篇相关论文。混沌有某种根本性,它并非毫无希望的噪声。至少在边界处,混沌系统里有些有用的东西。不过这只是哲学层面的思考,我对相关数学不够了解,没法置评。
稍后我们会聊 LLM 强化学习,因为两者有些联系,但先回到 MCTS。它究竟做了什么?关键是,它并不是直接提高获胜概率;也不是把所有获胜动作的权重提高、把所有失败动作的权重降低。
重要的是,它在说:对于我们采取的每一个动作,都用 MCTS 做了一次相当全面的搜索,看看有没有更好的选择;然后让策略网络预测那个搜索结果,把每一个动作都变得更好。这是很好的想法,因为每一个动作都有一个监督目标。相较于朴素 RL 的替代方法,学习信号的方差要小得多。
我们来想一个非常朴素的算法,它和如今 LLM 强化学习更相似:从一次自我对弈的胜者出发,鼓励模型多做类似的事。
§05其他强化学习方法
Eric Jang
值得想想,除了 MCTS 之外,我们还可以用哪些方法训练自我对弈智能体。如今我们常用 LLM 风格的强化学习。这是否适用?能不能改用它?
假设有个非常朴素的算法:让一组处于不同训练检查点的智能体互相对弈。对于一方胜出的棋局,我们就提高那些动作的权重,再训练策略网络去模仿赢家,而不是采用 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 只做单步强化学习,而不做多步强化学习。在 LLM 中,解码器可能会预测出“hello world”这样的几个词。当前的 LLM 强化学习把整个序列当作单个动作 a_t,而大写 T 就是 1。确实,由于 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,就只有一个 log prob 估计值和一个奖励估计值。这一项依然存在。对 LLM 来说,朴素 REINFORCE 估计器大概就是单个动作的回报……形式大致如此,但它仍然会贡献方差。你想确保训练时和这里对大量中性标签的处理类似:惩罚没有帮助的标签,只奖励那些真正能带来改进的标签。
直觉上的类比是:我们能否在训练目标中加入某一项,使这些动作受到抑制,或者它们对梯度没有影响,而这一项则会影响梯度?
Dwarkesh Patel
如果在那里用这种做法,你最多只能删掉 49 盘。至少按你写的形式,应该是 51 次乘以……
Eric Jang
实际上,最理想的做法是丢掉所有这些动作,只对那唯一一个变好的动作计算梯度。
Dwarkesh Patel
那要怎么做到?
Eric Jang
实践中这是个相当棘手的问题。强化学习里的优势估计就是为此而来。你要从乘数项中减去一个量。你不希望它是这种取值为 1 和 0 的指示函数,而希望它对这些动作的效果近似为 0,对这些动作的效果则近似为 1。
Dwarkesh Patel
如果你能说“我赢了这盘棋,所以这一步比基线表现略好”,就可以做到。
Eric Jang
可你赢了很多盘,却不知道哪些棋局是因为着法真正更好才赢的,哪些只是碰巧赢了。
Dwarkesh Patel
那要怎么设计一个真正反映优劣的基线?
Eric Jang
这就是强化学习里用 TD 学习等方法更好地估计质量函数,也就是前面提到的 Q 值的地方。你可以试着从回报中减去它。
理想情况下,强化学习真正要做的是提高那些让你超过平均水平的动作的权重,降低那些让你低于平均水平的动作的权重。这叫作优势。有多种计算方法。我很推荐 John Schulman 的论文《广义优势估计》(Generalized Advantage Estimation),它很好地介绍了如何理解各种计算方法。归根结底,你要通过缩小这一项来降低方差,避免它放大这一项的方差。
Dwarkesh Patel
有道理。这要求你能非常准确地估计某个状态下的平均表现。这让我们回到了刚才谈的价值函数。
Eric Jang
请记住,这种无模型强化学习设置是在解决信用分配问题:你不知道哪些动作实际上好、哪些不好。蒙特卡洛树搜索做的是本质上不同的事。它不是根据输赢分配信用,而是试图改进你采取的任意一个动作的标签。我们还可以讨论一种完全不同的算法——神经虚假自我对弈(neural fictitious self-play),它在 AlphaStar 和 OpenAI 的 Dota 等系统中取得了很好的效果。
我来谈谈如何在无模型设置和自我对弈设置中统一一些强化学习思路。如果你无法轻易搜索一棵树,会发生什么?围棋是完全可观测游戏,很容易构建一棵足够深、能完全涵盖游戏状态的树。但像《星际争霸》这样的游戏,你无法完全控制底层二进制环境,因此很难这么做,而且我甚至不确定它是否是确定性游戏。从数据结构角度看,这就带来了困难。
替代做法仍然保留了一个基本思路:用更好的教师来监督动作。我们来讲讲神经虚假自我对弈如何运作。想法相同:像 MCTS 一样,为我们采取的每个动作生成更好的标签。问题是怎么得到这些更好的标签?在 MCTS 中,我们通过搜索来得到它。假设价值函数足够好,搜索就会比我们的初始猜测给出更好的结果。
如果某个游戏无法轻易模拟搜索过程,研究者会改为训练所谓的最佳响应策略。他们固定住对手。假设你正在用策略 Πa 对抗一个强大的对手 Πb。在《星际争霸》里,也许对手是虫族,你操作的是神族。固定对手后,你就可以把它当作经典无模型强化学习算法,目标只是击败它。这里可以使用标准的 TD 学习技巧、PPO 或任何无模型强化学习算法,逐步提升胜率。奖励函数规定:如果赢过 Πb,回报为 1,否则为 0。这不再是自我对弈,而是面对固定对手,试图最大化对它的得分。你的环境固定不变,唯一关心的就是打败它。
用你喜欢的无模型强化学习算法(PPO、SAC 或 V-MPO)训练出不错的策略后,就得到一个良好的策略标签,告诉模型面对该对手时应该怎么做。训练多个最佳响应策略后,你就能把强化学习算法的结果蒸馏成针对特定对手的标签。你可以有一个针对 πb 的最佳响应策略,还可能有 πb、πc、πd 等一组对手。然后拿针对每个固定对手训练出的最佳响应策略,监督它们,使用它提供的标签。
这几乎可以作为 MCTS 教师的替代品。你不再用 MCTS 当教师,而是通过无模型强化学习算法找出能够击败对手的最佳搜索动作。然后把这个策略蒸馏成所谓的混合策略,让它对可能遇到的所有对手进行平均。这样得到的策略不会比从对手联盟中平均挑选的对手表现更差。这就避开了必须从 MCTS 得到教学信号的问题,但根本上仍是在为状态重新标注更好的动作,从而改进策略。
Dwarkesh Patel
我确认一下:如果你赢了与另一个策略的对局,就会提高这条轨迹上所有动作的权重。
Eric Jang
是的。你可以使用 PPO、V-MPO 等算法,甚至可以用 Q-learning。这里通常使用无模型算法,因为没有搜索,但我想指出 MCTS 和 Q-learning 之间一个有意思的联系。
在 MCTS 中,你有一棵树。通过在树的近似叶节点处用价值函数求值,你可以沿许多序列回传结果,得到某种平均价值估计。你的 Q 值来自一系列模拟的平均值。
在无模型算法中,往往也有估计 Q 值的环节。Q 值通常通过 TD 学习获得,尽管 PPO 计算优势的方式不一定使用贝尔曼回传。在 Q-learning 中,有个很巧妙的技巧:把 Q(s,a) 更新为 r 加上折扣因子乘以对下一步所有 a 取 Q 值最大值的结果。直观来说,在 MDP 中,如果这是终止状态,那么它表示这个状态下最好的动作价值,等于执行该动作获得的奖励,加上下一状态下能取得的最佳结果。
MDP 有一种递归的动态规划性质,你可以训练神经网络来强制实现这种一致性。你可以说:“好,既然我知道这个动作的 Q 值,就能用它计算下一步的 Q 值。”
Dwarkesh Patel
我之前还问:“为什么要训练策略?为什么不只训练价值?”这就是答案。
Eric Jang
这是一种算法:当你无法进行前向搜索时,用它恢复中间步骤的价值估计。你必须先收集一段 n 步轨迹,才能使用这个技巧,但直觉其实类似。知道这里的 Q 值,就能推断这里的 Q 值。同样,你可以根据 Q 值恢复策略,不必明确地对策略分布建模,只要对 Q 值求 argmax,就能得到策略分布。
Q-learning 或近似动态规划会像这样,把你对未来 Q 值的了解向前传播。你可以看到这里有类似结构:一种情况下,你规划的是智能体尚未访问过的轨迹;另一种情况下,规划的则是智能体已经访问过的轨迹。
重要的是,Q-learning 为什么意义重大?因为历史上我们无法对机器人等高维问题进行搜索。很长一段时间里,我们的假设是:如果不能用世界模型模拟系统动力学,就只能收集轨迹,并围绕唯一真正重要的数字——奖励——进行规划。
§06为什么 MCTS 不适用于 LLM?
Dwarkesh Patel
这很有意思。要把它和 LLM 的讨论统一起来,你没有 Q 值,而是在做这种反向学习:在某个代码环境里找到通过单元测试的轨迹,然后强化这些轨迹。
这和 MCTS 这种前向方法有很大区别。MCTS 更可取的原因,是你可以逐手棋进行操作,让每一步都变得更好;不用像 Karpathy 说的那样,必须按轨迹学习并希望能……
Eric Jang
用吸管吸取监督信号。
Dwarkesh Patel
对,监督信号就像用吸管吸取。你基本上会提高一段轨迹里所有 token 的权重,但这些 token 可能与正确答案有关,也可能无关。
围棋能用更高效、更有利的样本方式来做这件事,是因为 MCTS 适用于围棋。你可以在局部进行搜索——并由一个价值函数在搜索末端截断搜索,即使整段轨迹还没有全部展开也能评估——然后直接说:“这就是我的新策略。”这样就能以迭代的局部方式改进,而不必展开所有轨迹。
Eric Jang
2023 或 2024 年,Google 有些研究尝试把树结构应用于推理。这个想法到底能不能成功,目前还没有定论。我们未来可能会重新审视前向搜索这个概念。
MCTS 对围棋之所以很简单,有两个原因。第一,价值估计很具体,你能真正确定它,然后像你说的那样用来截断搜索深度。第二,树的宽度也已知。关键在于,迭代访问并扩展树的动作选择算法,很适合围棋问题的规模和深度。
但对 LLM 推理这类问题,PUCT 可能不是足够好的启发式。它可能过分贪婪地选择局部 token,只给出显而易见、确实正确,却无法解决最终问题的想法。我认为,LLM 推理最终会以什么方式实现,目前仍然没有定论。我不会排除这种方法重新出现的可能性,只是比较难。
Dwarkesh Patel
LLM 难道不会原生地学习 MCTS 吗?它们会先尝试一种方法,然后说:“哦,这不行。回退一下,再试另一种。”接着沿着更有希望的方向走。
Eric Jang
当然,LLM 的确能做到一些看起来像人类真实推理的事,却不必明确采用树结构。即便如此,我仍认为前向搜索和模拟能帮助判断什么有价值,这个想法可能会重新出现,尽管未必和 AlphaGo 的实现完全相同。
Dwarkesh Patel
我确认一下核心问题:树的宽度来自合法动作数量更多;树的深度则来自我们更难训练出价值函数,因为……
Eric Jang
这里有个 LLM 会遇到困难的例子。C_PUCT 规则里有 √N / (1 + N_a)。在 LLM 中,你很可能永远不会对同一个子节点采样超过一次。如果你要进行多步思考,语言的可能性太宽泛、太开放,离散动作集合并不是适用于 LLM 的选择。虽然 token 是离散的,但数量实在太多,因此这种探索启发式可能不适合引导树搜索。
Dwarkesh Patel
我想核心在于:围棋中,即使你没有探索任何轨迹的末端,也基本能确定 MCTS 会比当前策略更好。可对于 LLM 或机器人的常规推理,似乎无法只在局部评估并改进下一步,而不必真正解决问题。
Eric Jang
“无法”是个很强的词。很多人一直在研究如何把 MCTS 或 MuZero 这类后续方法应用于连续控制空间。我相信仍有人在进行很酷的研究,试图解决这个问题。不过,是的,目前显而易见的难点是:对大多数高得多维的动作空间问题,或像语言这样组合规模大得多的问题,围棋所用的离散动作选择启发式和对局评估方法似乎不太适用。
这不代表沿着多条并行路径思考未来,无法给出一些搜索方向的信息。比如数学往往更像一种逻辑搜索流程,你可以回溯并判断哪些路径看起来有希望。数学里的结构更严格,而商业谈判的结构没那么像树,也许更不一样。
Dwarkesh Patel
现在我们坐下来了,我可以问你更多关于 AlphaGo 以及 AI 研究一般性的问题。2021 年,Andy Jones 发表了《用棋盘游戏扩展 Scaling Laws》(Scaling Scaling Laws with Board Games)这篇论文。他基本上预见了推理算力或推理扩展的做法,展示了测试时算力和训练算力之间可以互相权衡。也就是说,你可以花更多算力用 MCTS 搜索;这样做,就能达到相当于多训练一段时间的模型性能。
看到这种模式,你可能会想,未来 LLM 也许会做类似的事,事实上后来确实如此。
现在有哪种有趣的探索,能让人通过玩具环境研究扩展的其他维度,从而帮助我们理解几年后 AI 的发展会是什么样?
Eric Jang
测试时扩展、推理和模型规模之间的交互很有深意,它关系到有多少工作必须以显式搜索完成,又有多少可以压进神经网络前向传播里。神经网络的前向传播如何学会做某种本该是序贯、递归的事?这很有意思。
Andy Jones 的《用棋盘游戏扩展 Scaling Laws》很不错。那篇论文还有另一个很好的结果:不仅能预测 LLM 类似的扩展规律——参数增加时,搜索所需算力可以下降,反过来也一样——他还展示了如何预测解决更大棋盘游戏所需的算力。
比如围棋棋盘可以从 3×3 扩展到无限大。你可以重新研究这个问题,并尝试复现这种现象。我启动项目时,真正想问的是:“更通用的 Bitter Lesson(苦涩教训),或我们对扩展规律的认识,能不能帮助我们更好地打造计算最优的围棋程序?不借助 KataGo 的各种技巧,仅仅依靠苦涩教训和扩展规律,能否构建强大的围棋程序?”
目前我还没成功。通常要让扩展规律发挥作用,你得先处在方法已经有效、数据集也不错的情形下,而不是一边摸索如何扩展,一边还在寻找合适的数据集。
研究中的科学理解,往往要先让系统跑起来,然后用这个系统收集数据,帮助你形成关于其运作方式的心智模型,例如扩展规律。通常,如果你想用扩展规律构建强大的围棋程序,实际上得先把程序做强,再用扩展规律向未来稍微外推。
Dwarkesh Patel
多说一点。为了确认我理解了,你是说扩展规律没有奏效?你的围棋程序里没有出现能观察到的 scaling law 模式?
Eric Jang
最初我犯过一个错误,当时 MCTS 标注出了几个 bug。我会拿专家策略收集一批数据,把它当作监督学习问题,再用专家数据集尝试找扩展规律。你确实能画出看起来像这样的曲线;但如果策略本身还不好,你研究的可能只是坏数据的扩展规律。
一个重要的实现细节是:如果想研究扩展规律问题,你必须先确保数据好、架构好、没有 bug,然后再从那里着手解决。
事先来看,在其他系统部分还没跑通之前,我没能用扩展规律来指导该研究什么。这听起来对研究者来说很显然:研究扩展规律前,当然要有一个能运行、没有 bug 的系统。但对实践者来说,尤其是在我刚开始这个项目时踩过坑的情况下,这意味着你不一定应该在自创的成果还不够有趣、尚不值得研究时,就直接跳进研究这个人工产物的科学原理。
Dwarkesh Patel
说到算力,可以看这些图表,展示过去 10 年世界上最强 AI 模型训练算力的变化。它在对数空间里是一条非常平滑、逐年指数增长的曲线。但有个巨大的异常值,那就是 AlphaGo Zero;它使用的算力比当时任何其他 AI 模型都多得多,达到了 3E23 FLOPS。它和前沿 LLM 的量级差不多,但差了好几个数量级,尽管如此还是很惊人。
问题是,尤其是你现在能够把系统做起来了,你是自己训练的吗?
Eric Jang
Prime Intellect 捐给了我约 1 万美元。我可能先花了 4,000 美元做探索性研究,最终训练跑花了约 3,000 美元,剩下一部分用于提供模型服务。
Dwarkesh Patel
如果现在只花 1 万美元就能做出来,你觉得他们当时训练得很糟吗?
Eric Jang
第一个完成某件事所需的算力,总是远大于后来追上所需的算力。LLM 领域也在发生同样的事。别人完成之后,你可以用蒸馏等技巧,也可以用各种辅助办法逐步引导自己成功。
我在线托管的围棋程序,实际上就是用 KataGo 模型做最佳响应训练,达到了很强的水平。录制节目时,我正在验证能否完成第一步,也就是从零开始自我对弈。
从研究角度看,重要的是通常要从良好的初始化开始。我最先做的简单尝试,是用 KataGo 训练最佳响应智能体。AlphaZero 团队没有任何策略可供训练,因为他们想要从零开始完成一切。第一个完成一件事的人,优先考虑的是把系统做出来,而不是让实现达到最高的算力效率。
机器人领域也有这种情况。如果你看机器人领域训练的大型前沿模型,散点图会铺得到处都是,不像前沿 LLM 那样有很清晰的趋势线。这是因为训练这些模型的人往往还没到每个 FLOP 都至关重要、必须在预训练中榨出每个 FLOP 性能的规模。他们更关注:“我们想让某项能力出现,所以要优化训练设置,让推导出这项能力变得容易。”
一旦具备这项能力……只要扩大算力规模,你不可避免地会被迫提高算力效率,因为我们谈的是数亿美元。但过去实验算力更充裕时——或者研究人员不必真正为算力负责——最终就会有人选择优化那些不属于算力最优帕累托前沿的目标。
Dwarkesh Patel
我明白,比如速度之类的?
Eric Jang
没错,缩短得到结果的时间,或者只要系统能跑起来就行。最初的 AlphaGo 可能用了大量算力,他们不需要过度担心怎样把它做成最具算力效率的系统。
Dwarkesh Patel
算力效率的提升中,有多少来自 2017 年还不存在的方法,又有多少是当时本可以用、但他们没用的方法?
Eric Jang
好问题。开始这个项目时,我一直记得一件事:随着时间推移,事情总会越来越容易。我想看看围棋领域进展到哪了,因为 2020 年 KataGo 之后,似乎没有什么主要的开源强力围棋程序出现。
读 KataGo 论文时,我看到许多巧妙的想法。我在想:“如果苦涩教训已经发生,其中很多技巧也许会随着 Nvidia 制造出更快的 GPU 而消失。大致来说,目前情况如何?”
再说一次,这不是同行评审过的结论,只是根据我自己的实验观察得出的初步直觉。我觉得架构选择没那么重要。Transformer 还是 ResNet……目前 GPU 速度已经很快,模型规模也没大到让这点差别真正重要。
可以把系统简化很多。不必使用带有经验回放缓冲区、任务推送器和数据收集器的分布式异步强化学习架构,可以采用一种简单的同步方式:收集数据,训练监督学习模型,然后再收集数据。基础设施有不少简化空间。
Nvidia GPU 的确变快了。KataGo 当年用 V100 训练,而现在用一半数量的桌面级 Blackwell GPU 也能训练成功。只要有良好的初始化,KataGo 提出的某些辅助监督目标就不是真正必需的。如果你从针对 KataGo 本身的最佳响应训练开始,你自己的模型不需要 KataGo 用到的那些技巧。关键是尽快找到一些强大对手。这远比具体的架构创新重要。
不过仍有一些能提高算力效率的方法。我发现,用 9×9 棋盘训练很适合解决残局价值函数的问题。如果能在一种可迁移于 9×9 和 19×19 的架构上联合训练,就能大幅缩短从零学习前的热身时间。AlphaGo Zero 的图表显示,头 30 小时左右基本都花在追上监督学习基线上。你可以先用小棋盘预训练,再把模型用于 19×19 棋盘,从而大幅缩短这段时间。
还有一些其他做法,比如在不同对局中改变模拟次数。结果发现这并不太敏感。可以固定次数,也可以增加次数,影响都不大。总之,从科学角度看,重新审视旧论文、看看什么真正重要,是件好事。
§07离策略训练
Dwarkesh Patel
这是个相关但有点偏题的问题:AlphaGo 为什么可以用经验缓冲区?我每次和 AI 研究人员交谈,他们都会告诉我离策略有多糟。但按 AlphaGo Zero 的朴素实现方式,在任何一轮反向步骤或一批反向步骤里,大部分棋步都不是最近训练出的模型走出来的。为什么这样可以?
Eric Jang
好问题。这涉及离策略与在策略强化学习的基本问题。你还记得在 MCTS 中,会把已采取的动作重新标注为:在同一状态下本应采取另一个动作。
离策略的问题在于:如果你重新标注的是新策略永远不会访问的状态,那有什么意义?你是在浪费模型容量。极端情况下,假设训练缓冲区里的所有状态都是你永远不会访问的状态。那你就是在监督模型,让它在永远无法到达的状态上采取好动作,结果策略可能会变得很糟。这就是离策略训练可能严重损害 AlphaGo 的地方。
不过,如果从 DAgger 的角度理解——它基本上是利用已有数据把自己纠正回最优轨迹的方法——那么这种算法需要大部分状态都是你会访问的状态,同时在最优轨迹周围的高维区域中,也有少量或合理比例的其他状态。在这些状态上都要给出监督目标,把策略引回最优轨迹。
我可以很快画一下。DAgger 风格的设置中,最优训练数据分布由最优状态和动作构成。你要处于这个状态,再到这个状态,再到这个状态,最后在这里获胜。这些都是最优策略动作,也是你肯定想训练的内容。但要让系统能抵抗扰动,就得确保如果它偏到其他状态,也能把自己引回来。
Dwarkesh Patel
不过,为什么这不是一个关于离策略训练的完全通用论证?
Eric Jang
这其实正是有时想采用离策略训练的原因。如果你犯了错误,却没有如何回到最优分布的数据,就会产生累积误差。
最优控制对于如何避免意外到达这里讲得不多,因为它假设学会策略后,你就会到这里。但在机器人等应用中,一阵风可能把你吹偏一点,这时你需要纠正;或者某个轮胎的摩擦力比另一侧略低,汽车就开始漂移,你也得纠正。在真实环境中,这类情况经常发生。
关于国际象棋和围棋,有句很有趣的话:它们的问题在于,对手总会搞出些事情来。局面可能会偏离预期,你必须能把它纠正回获胜状态。你的经验回放缓冲区应该包含策略会访问的状态,以及你可能偏离到的一系列状态,还要记录如何回到最优状态。
但如果走向另一个极端,说“我们没有任何这类数据,只拿 MCTS 对那些离最优行为很远的状态做标注,比如这边这堆状态……”那么每个状态都会得到一个 MCTS 标签,策略也学会了在这些状态采取最佳动作,但它永远不会到达这些状态。你是在用模型不可能到达的状态训练它。这就是离策略训练可能严重损害模型的地方。
作为这个项目的一部分,我试过一个实验:收集一批轨迹,为了尽量把 GPU 利用率拉满,我从数据集中随机抽取状态,只对这些状态重新运行 MCTS。我不再下一整盘棋、每一步都跑 MCTS,而是忽略动作之间的因果关系,随机挑选棋盘状态,再用当前网络给它们打标签。我可能会再次访问以前标注过的状态,并用当前网络重新标注。
实践中这确实有效。你可以拿一些合理状态,在训练期间持续重新标注。这就开始接近机器人领域很常见的设置:你有一组轨迹数据和类似经验回放缓冲区推送器的东西。这些是离策略的离线轨迹。推送器把转移元组推入缓冲区,另有一个任务持续重新规划:当初没有采取所选动作的话,最佳动作应该是什么?
机器人领域很常见的做法是最小化 TD 误差。贝尔曼更新器不断从这里取出数据,尝试满足 Q(s,a)。接下来是训练器,它会努力让 Q 与目标 Q 拟合。你可以把它看作某种规划器:重新访问过去去过的状态,用当前模型重新思考:如果我当时到了这个状态,还能做得更好吗?离策略机器人学习系统通常就是这样训练的。现在已有更简单的方案,但在 Google QT-Opt 时代,我们会采用类似做法。
Dwarkesh Patel
那训练器是什么?
Eric Jang
训练器就是尝试让 Q(s,a) 接近目标 Q 的部分。
Dwarkesh Patel
你能从高层次把整个设置再讲一遍吗?
Eric Jang
你有来自各种策略的离策略数据,并持续把之前观察到的转移推入经验回放缓冲区。
然后有个叫贝尔曼更新器的东西,负责重新规划:在状态 s 下,除了这个动作,我本该采取什么动作,才能获得更高价值?具体做法是尝试最小化 TD 误差。给定状态 s 后会到达 s′。你计算 Q(s′,a),再找出 s′ 下与之配套、能够令 Q 值最大的动作。
然后把这个值加到这里的奖励上,得到实际目标。因此,对于当前的 s 和 a,目标 Q 就是这个值。接着把目标 Q 传回这条转移。你把目标 Q 与这个元组配对。训练器随后简单地用监督学习,让当前网络的 Q(s,a) 接近目标值。
Dwarkesh Patel
明白了。所以你在后台基本上是在思考所有这些动作实际上有多大价值。
Eric Jang
是的。假设策略更优、目标是最大化这个值,那么这次转移的目标 Q 是多少?
Dwarkesh Patel
有点像做白日梦。
Eric Jang
正是。你可以把它想成回头复盘。根据历史缓冲区里见过的情况,当时有没有更好的动作可选?
我试过把这里与围棋联系起来,效果中等,但复杂到无法开源:用 MCTS 重新标注来替代这一环节。你不做目标网络计算,而是在转移上运行 MCTS。这里有状态、动作以及这盘棋的输赢结果。实际上,后两项可以直接丢掉,因为你不需要它们。只要拿到状态,就可以用当前网络规划 MCTS,得到最佳策略 Π。不是采取这个动作时用的网络,而是你当前最好的策略网络。然后在这些转移上离线重新运行搜索。
如果这些转移是你的策略能够到达的状态,这就能产生很好的稳定作用。另一个好处是能让 GPU 更充分地运转,因为不用等围棋棋局产生新的棋盘状态。你可以在任意深度的所有棋盘状态上并行搜索。这里训练器只需尽可能准确地预测 MCTS 标签。
这种方法有一定效果,在机器人领域也很相关,因为那里有大量离线数据,却无法像 MCTS 那样模拟。但实践中会遇到一个问题:如果当前模型看到的是它永远不会到达的状态,就会浪费容量,所以必须谨慎。
很多强化学习已经转向更偏在策略的设置,不会直接用离策略数据训练。最多把离策略数据用于降低方差,但不会让它直接影响优化目标。
Dwarkesh Patel
为什么会转向这种做法?
Eric Jang
因为它更稳定。你可以用离策略 Q 值来计算优势,比如 Q 减去 Q 值总和。如果有 N 个动作,这里就是价值,这些则是当前 Q 值。某个动作的优势,就是平均值减去它当前的 Q 值。人们可以用离策略方式估计 Q,然后在这里使用优势值。
如果这些动力学中存在问题,损失就不会像之前那样膨胀。在机器人领域,人们越来越倾向于用离策略数据来塑造奖励,而不直接把它放在这里。
§08强化学习的信息效率比你想象的还低
Dwarkesh Patel
这让我想起我们之前谈过 MCTS 为什么比 LLM 使用的 REINFORCE 或策略梯度方法更有利。这可能完全错了,但几个月前我写过一篇博客,讨论策略梯度强化学习的低效程度可能比想象中更严重。
人们直觉上想到的低效,是必须完整运行一段轨迹才能获得任何学习信号。随着轨迹变长——智能体可能要工作两天才能知道项目是否正确完成,而不再是预测句子中的下一个词——每 FLOP 所能获得的信息就会减少。你得展开两天的思考,才能知道某个功能是否实现正确,所以每 FLOP 的样本量一直在下降。
学习时,你要尽量提高每 FLOP 能获得的信息比特数。可以把每 FLOP 的比特数理解为每 FLOP 样本数乘以每个样本的比特数。刚才说的是,随着强化学习任务的时间跨度变长,每 FLOP 样本数会下降。
但至少和监督学习相比,这种朴素强化学习在每样本比特数方面也很糟。训练早期,假设 LLM 的词表有 10 万个词,也就是有 10 万个可能 token 可供回答。模型完全没有训练过,收到“天空是……”这样的提示。监督学习会给模型一个涵盖所有可能输出的概率分布。标签会告诉你这里的词是“蓝色”,模型通过交叉熵损失直接学习自己的分布与正确输出“蓝色”之间差多远。
如果通过强化学习做这件事,模型会试着回答:“天空是碧蓝的(halycon)。”不对;“天空是……(told)。”也不对。模型完全没训练过的话,你大概要尝试 10 万次,才能碰巧说出“蓝色”并获得学习信号。监督学习则会给你概率分布,明确告诉你正确标签是“蓝色”,让你弄清楚差多远。学习量取决于命中概率:如果离“蓝色”差得越远,交叉熵损失就会推动你越接近“蓝色”。
你可以把它看作命中率,也就是模型先验中说出“蓝色”的概率。在监督学习中,一旦得到标签,交叉熵损失带来的学习量是 −log(p) 个比特,p 是命中率。而强化学习只是随机猜答案,再观察是否有效,这基本上相当于一个二元随机变量的熵。
Eric Jang
这里还有个难点:采样所依据的分布就是策略本身的分布。如果策略没有机会采样“蓝色”,你就永远得不到学习信号。
Dwarkesh Patel
这由模型采样到“蓝色”的概率极低这一点来表示。如果采样到了,你就能像监督学习那样学到同等多的信息。而在其他所有情况中——对于一个未训练模型来说,有 99.99% 的时间都是如此——看到“碧蓝”(halycon)或“……(told)”不是正确的词,你能学到的信息少得惊人。
大多数时候就是这样,你学到的东西非常少。如果把命中率放在横轴、从每个样本中学到的比特数放在纵轴,横轴标出 0%、50% 和 100%,训练结束时你就在这里。监督学习中,负对数命中率大致会长这样。二元随机变量的熵会根据你用 nat 还是 bit 作单位呈现另一种曲线。如果用 bit,峰值这里就是 1。这就像抛硬币,抛硬币时学到最多。这里是监督学习,这里是强化学习。
问题是,你的大部分训练时间都在这个区域,也就是命中率很低的区域。学习速度取决于每个样本能得到多少比特,你在这里得到的信号极少。如果把命中率用对数刻度表示——训练开始时,词表大小是 10 万,命中率为 1/100,000,接着是 1/10,000、1/1,000、1/100——那么图形大致是这样:监督学习会呈现这条线,强化学习则是那条。
Eric Jang
可以说,你可能始终都待在这里,甚至连一次成功都拿不到。这张图让人沮丧,因为一旦落在这里,根本看不出怎样才能走到那里。到了那里至少还有点东西,但许多强化学习问题会让你一直待在这里。问题是如何初始化,至少让命中率不为零。
关于每样本比特数,我还想补充一点,这和任何机器学习问题都密切相关:它与软目标和蒸馏有关。如果你能访问 logits,而不只是 one-hot token 答案,能拿到软目标,那么这个分布的熵远高于 one-hot 标签。软标签每个样本包含的比特信息多得多。这就是蒸馏为什么每个样本都如此有效:它每个样本给你的信息更多。
Dwarkesh Patel
我想知道这个等式会是什么样,但显然它是……
Eric Jang
它就是这个分布的熵。这个分布的熵为零,另一个的熵就是熵的公式。
AlphaGo 的另一个优美之处也在这里。AlphaGo 不会让策略网络模仿 MCTS 选出的动作,而是让它模仿 MCTS 给出的分布。这两种都可以。如果你想通过科学实验研究这种软标签、暗知识蒸馏有多重要,可以重新训练策略网络,只让它模仿 MCTS 选中的动作,而非软目标。
Dwarkesh Patel
我刚才还在摸索这个问题的直觉:这种迭代搜索为什么是一种比 LLM 当前所用的强化学习更强大的学习能力?一开始不一定要能赢下整盘棋,只需要改进当前策略即可。恰恰是考虑整条轨迹的命中率这件事。我不知道该怎么正式表述,也许你能帮我理清。
Eric Jang
AlphaGo 为什么是一种优雅的强化学习算法?主要原因是,你永远不必从零成功率开始,也不用解决如何达到非零成功率的探索问题。这让你可以不断沿着这条漂亮的监督学习信号爬坡。
看看 AlphaGo 的实际实现,每个阶段都没有 TD 误差学习或动态规划,至少没有明确地使用。它只是在价值分类上做监督学习,并最小化策略 KL 散度。归根结底,它就是在改进后的标签上做监督学习。
训练非常稳定。你想训练多大的网络都可以,也可以在这个数据集上重新训练,一切都会稳定运行。基础设施也很容易实现,不需要复杂的分布式系统来保持在策略。
归根结底,你只是在说:“我有一些改进后的标签,我们用这些目标重新训练监督模型。”你始终处在这种理想状态,只是想改进策略,而不是从四周信号都平坦的局部最优中逃脱。
一种画法是比较 MCTS 策略与原始网络的胜率……假设这条虚线是原始网络,MCTS 策略则是这样。每一步中,监督信号都非常清晰。除非 MCTS 分布与策略网络预测完全一致,否则你绝不会遇到 MCTS 没有信号的情况。
Dwarkesh Patel
这个解释太好了。也许我们坐下来聊聊自动化研究,我再问你一些问题。
§09自动化 AI 研究
Dwarkesh Patel
我很想谈谈这个项目的研究过程。你通过自动化的 LLM 编程助手循环做了大量研究。有人认为,如果 AI 研究实现完全自动化,就可能出现某种奇点。
显然我们还没到那一步,但既然已有一些早期迹象,我很好奇你的观察:AI 擅长什么、不擅长什么,你认为这种情形最终发生的可能性有多大,以及你对此还有什么总体想法。
Eric Jang
我认为自动化科学研究是目前前沿实验室正在开发的最令人兴奋的能力之一。任何从事研究的人都应该对它现在能做什么、不能做什么,以及未来 AI 自动化大量研究工作后科学流程可能如何运作,形成良好直觉。
简单说,我做这个项目时主要用了 Opus 4.6 和 4.7。模型擅长的是超参数优化,做得相当不错。过去,人们会列出学习率、权重衰减、网络层数等超参数的搜索空间,然后用网格搜索或贝叶斯超参数优化,找到一组经过调优的参数。
如今自动化编程真正厉害的地方,是能搜索开放程度更高的问题。它会说:“我发现这一层的梯度很小,我来调整一下;我来重写代码,让数据加载器使用我想到的新数据增强;我们来找出最适合这个优化问题约束的办法。”于是你得到了一种更加灵活、更高层次、近似研究生的能力,能持续打磨性能指标。
这能挤出相当多的性能。在固定数据集和时间预算下,你可以明显改善 LLM 或围棋这类分类问题的困惑度。它现在还特别擅长执行任意实验。我写过一个叫 Experiment 的 Claude Skill:我告诉它想画什么图,只需描述“横轴要这个,纵轴要那个”,让它回答问题。它会自己运行实验、制作图表、写报告,还会提出可能的原因。现在这方面做得很好,我认为未来还会继续进步。
但也要知道它现在不擅长什么。在这份教程的博客版本中,我把做过的所有实验画成一棵树,每个节点代表失败、成功或结果混合的实验,然后分叉到后续实验。我有时会在某条方向上钻牛角尖,比如离策略 MCTS 重新标注,做几次实验后才发现可能不值得,于是跳到完全不同的方向。我把这些方向叫作研究路线。
我发现,公众现在能使用的闭源模型不太擅长为某条路线选择下一步实验。它们似乎不能退一步横向思考:“等等,这条路线根本不合理。我们回到基本原理,想想瓶颈可能是什么,或者我们到底要达到什么目标。”我往往得自己发现基础设施 bug,然后向 Claude 提出正确的问题,让它调查差异原因,这时它才会回答。
等 Mythos 级别或 Mythos++ 模型上线后,这些问题也许会随着规模提升彻底消失。但与此同时,我认为开发能鼓励横向思考的强化学习环境也有很大机会。我搭建围棋环境的动机之一,是因为围棋包含许多有意思的研究问题,常常和 LLM 或机器人研究重叠,却能很快验证。最外层循环最终要问的是:智能体做的事情是否符合预期?围棋对局的结果很容易检查。
内层循环则包括围绕分布式系统进行研究工程、预测某个想法是否有效,以及预测训练算法中的特定改动会带来什么影响。我认为,有丰富的子任务和子环境库可以供你训练自动化科学家,外层用围棋做验证。掌握这些能力之后,也许可以把它们应用于生物科学或机器人等其他领域。
Dwarkesh Patel
或者自动化 AI 研究。
Eric Jang
或者自动化 AI 研究。
Dwarkesh Patel
这才是真正关键、既令人害怕又不可思议的部分:让 AI 制造未来版本的 AI。你是说,外层循环可以只看它对 KataGo 的胜率吗?
Eric Jang
这是其中一种。我认为还可以研究许多更深的问题。比如,假设你有个提高扩展规律算力乘数的想法。结果未必是“造出有史以来最强围棋程序”。结果也可能只是“我能预测自己的围棋程序胜率吗?”或者“我能预测这个想法会产生怎样的扩展规律曲线吗?”不过你可以在外层循环里使用围棋这样容易验证的游戏,确认自己没有通过奖励 hack 欺骗指标。
Dwarkesh Patel
我觉得有几个值得追问的问题,分别关于内层循环和外层循环。内层循环的问题是,你做的每种改动在局部上有多容易验证?也就是说,你能知道自己试的某个想法到底让结果变好了还是变差了吗?如果没起作用,你能判断这是 bug 导致的,还是想法本身错了吗?
Ilya 曾说,他认为自己之所以是优秀研究者,原因之一是坚信某个想法是对的。因此遇到 bug 时他能够坚持下去,区分 bug 与基本想法的错误;他的高层信念是“这个想法应该有效,所以一定有 bug”,而不是反过来。我们就先从这个问题开始:好想法在局部上有多容易验证?
Eric Jang
深度学习成功的故事就像一个持续数十年的想法,靠着大量信念才最终奏效。这构成了一个极具挑战性的长时程强化学习问题:每一步都有一群人告诉你这个想法不行,最后你却突破了。怎样设计强化学习环境,才能给你更早的反馈?我觉得这是个非常难的开放问题,我没有答案。
归根结底,要下赢一个非常强的围棋程序,你可能确实得发现深度学习。外层循环可以采用一种不容易被作弊的困难游戏,作为发现深度学习原则之类研究工作的信号。当然,为了让它可行——这就需要研究品味——你必须想办法给问题良好初始化,不要一上来就试图解决极难的问题。也许可以把 LLM 当作中间的通用语法,提供某种局部反馈。
LLM 之所以是通用语法,是因为它们可以在技术栈的几乎任何层次上行动。它们可以很局部地思考,也能退一步从很宽泛的角度思考。我认为,人类的许多横向思考能力就来自这里:知道自己正在探索的路线或追求的目标不对,应该换个问题来问。
Dwarkesh Patel
另一个问题是,局部改进在多大程度上能够叠加,从而改善外层循环的结果。我听说有些 AI 实验室出问题的原因,是人们各自提出了不错的想法,但它们叠加后效果不佳;两个看似不错的想法相互作用,导致训练失败。因此,拥有统一的自上而下愿景非常重要。你在不同 AI 实验室工作过,也试过让多个智能体并行探索不同想法,你觉得 AI 创新有多容易并行化?
Eric Jang
好问题。我认为,要落实苦涩教训,需要有研究品味,知道在任何特定时刻它能带来多大收益、又不能指望它解决多少问题。当然,长远来看,算力是影响一切的最重要因素。扩大能量、算力和参数规模后,智能几乎必然会涌现。这非常美妙,也极其深刻。除此之外,算法细节其实都不重要。
但现在我们没有无限算力、无限参数和任意优良的初始化,所以得用启发式方法来达到目标。这些启发式方法可能有些冗余。这或许就是为什么许多算力乘数不一定能叠加,它们可能带来相关的收益。三年后,当 Nvidia GPU 更强时,它们可能就更难叠加。
或许任何一种算力乘数在特定时刻带来的收益都是暂时的,我读 KataGo 论文时就有这种怀疑。论文使用了许多算法想法,而现在的 Blackwell 和 Ada 级 GPU 远强于论文采用的 V100 级 GPU;在这类硬件上,一些加快收敛的算法技巧,相较于其他因素就没那么重要。我认为,如何看待这一点取决于当下的研究品味。
Dwarkesh Patel
那外层循环呢?对提升 AI 的效果有多容易验证?围棋确实有一个外层循环:看它对最强开源模型的胜率。即便如此,像你说的那样,还有其他外层循环,比如是否发现了新现象,这其实很难……如果你不知道扩展规律重要……Chinchilla 或 Kaplan 扩展规律是什么时候发表的?
Eric Jang
2018 年。
Dwarkesh Patel
所以如果回到 2015 年,并没有一种容易想象的自动化流程,能判断哪篇论文是关于扩展规律的,哪篇只是又一张随意的图表。即便对围棋来说,外层循环也很难验证;而外层循环的全部意义,就是为改进提供某种后备保障。更不用说通用 AGI 了,尽管我们当然有一批基准测试。
但这里有个问题:我们知道能测量什么,也会在能测量的事情上取得改进。我们真正关心的是更广泛的经济实用工作能力,这不太容易衡量,至少要到一切都自动化后才行。AI 自我改进的外部验证循环到底有多好?这重要吗?
Eric Jang
我要给出一个不严谨、但我直觉上相信的论点。DeepMind 起初专注于游戏,用游戏作为外层循环。研究人员在解决游戏的过程中积累经验,如今他们开始研究 LLM。
我猜他们在游戏、Atari、围棋和《星际争霸》上投入的时间,带来了某种正向迁移,帮助他们开发出优秀的 LLM。我想无论是编程、总体研究能力还是项目管理,都存在某种正向迁移。所有这些很可能都有助于他们取得好成绩。
如果确实如此,为什么自动化 AI 研究人员也不能受益?他们在容易验证、容易迭代的环境中积累的经验,应该能正向迁移到更有雄心、具有经济效益的任务,例如自动化药物发现。
Dwarkesh Patel
我不确定。问题难道不是……历史上直到 Gemini 3 或几年前,人们还在说:“你看,Google 在 LLM 上没追上,因为他们太受旧路线束缚。”确实有收益,但也有一些方面会主动拖累你。我不太确定。
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 和搜索进行思考,这和 LLM 有什么联系。我认为其中有很深刻的东西,只是围棋相较于 LLM 热潮来说受到的关注少,所以可能还没有充分探索。
我不是说 LLM 里应该有树,但两者之间确实存在一些很有意思的对偶关系。用很少的预算,你就能对围棋、MCTS 和推理进行大量研究。这令人很振奋。
Dwarkesh Patel
太棒了,Eric,谢谢你来做客。
Eric Jang
能上节目是我的荣幸,谢谢。