Vizuara-从零开始的推理大模型笔记-全-

Vizuara 从零开始的推理大模型笔记(全)

001:系列介绍

在本节课中,我们将要学*本系列课程的整体介绍,了解什么是推理大语言模型,以及为什么它们代表了人工智能发展的一个重要方向。

大家好,欢迎来到这门关于从零开始构建基于推理的大语言模型的课程。我们非常激动能够推出这门课程,并将这些知识分享给大家。

在开始之前,请允许我做个自我介绍。我是 Ra Ddiker 博士,将是本课程的讲师。这是我第一次在我们的 YouTube 频道上授课。大家可能会把我与 Raj 博士混淆,他曾教授过《从零构建真实大语言模型》、《动手学机器学*》或《从零构建神经网络》等课程。我是他的双胞胎兄弟,请不要混淆。

关于我的背景,我在印度理工学院马德拉斯分校完成了本科和硕士学位,之后在美国普渡大学获得了博士学位。我一直是一位充满激情的教师和教育者。事实上,在大学期间,很多朋友和同学都建议我,说我讲解概念非常清晰,为何不成为一名教师?但我当时对研究充满热情,因此继续攻读并完成了博士学位。最终,我的使命召唤还是到来了,我与 Rajan Srither 共同创立了 Vizuara。现在,我们的使命是让每个人都能接触到人工智能。能够为大家教授这门课程,我感到无比荣幸。

关于我的介绍就到这里。现在,让我们深入了解课程详情。

如果你偶然看到这个视频,我可以向你保证一件事:即使没有任何先验知识,你也能完全理解我在后续所有视频中教授的每一个知识点。

我的教学风格基于两句格言。第一句是:如果我无法向一群初学者讲清楚一个主题,那说明我自己也没有真正理解这个主题。我非常严肃地对待这一点。第二句是:我努力让主题尽可能简单。这些格言可能源自他人,但请允许我暂时将其归功于自己。

这就是我们的教学风格。我们将在每一个视频中,从零开始解释所有概念。并且,我会确保在讲解一个概念 X 时,不会在解释中使用“X”这个词,因为那样就失去了从零开始的意义。

现在,让我们开始了解这门课程的内容,以及为什么我们现在要讨论基于推理的大语言模型。

首先,人类,像我们所有人一样,拥有一种不可思议的能力,即能够对一个主题进行深入思考。例如,当你为母亲的生日订购蛋糕时,你会思考很多事情:她最喜欢的蛋糕是什么?这次要不要尝试点不同的?她上次对我订的蛋糕反应如何?她喜欢吗?她不喜欢吗?过去一年有什么变化吗?她是否对某种特定口味产生了反感?她最*有没有表达过对某种口味的渴望?等等。一系列想法在我们的大脑中闪过。有趣的是,所有这些思考都在极短的时间内发生,速度极快。这就是我所说的“深入思考”。每当我们做决定时,脑海中都会闪过一系列想法,我们称之为“思考”。

这就是我们所说的推理或思考,我们说人类拥有推理的能力。

现在,思考一下推理。推理分为两种类型:快速推理和慢速推理,也称为系统1推理或系统2推理。

什么是系统1推理?系统1帮助我们立即思考出答案。从这张图中可以看到,它几乎占我们大脑活动的95%。这就是系统1。例如,如果我问你“印度的首都是哪里?”,答案会自然而然地出现,因为它由我们的直觉、所有过去的经验以及本能驱动。因此,系统1占我们整个思维过程的95%。

系统2则是我们需要花时间思考一个主题的地方。它需要我们付出努力去思考,这个系统是缓慢的、逻辑的、懒惰的且犹豫不决的。例如,假设今晚录制结束后我想回家看一部电影。现在我需要考虑很多事情:什么类型?哪个流媒体平台?最*有什么新片上映吗?烂番茄上的评价如何?人们怎么评价它?IMDb评分是多少?此刻我脑海中涌现出如此多的事情,以至于我甚至无法快速做出决定。这类问题就属于系统2,即你花时间,以一种缓慢而审慎的方式思考问题。

现在,人工智能领域许多人关注的核心问题是:人工智能能推理吗?你可能会想,是的,它应该会推理,人工智能不就是为了像人类一样思考而创造的吗?答案是,不,人工智能并非为了像人类一样思考而创造,人工智能是为了像人类一样回答问题而创造的。

看看2022年11月发布的第一个版本的 ChatGPT。它能够非常快速地回答问题,例如,你在这里看到的。因为它被设计成像人类一样回答问题。但是,如果你问我,ChatGPT 3.5 会推理吗?那么我不确定,推理体现在哪里?你直接得到了答案,你并没有看到 ChatGPT 3.5 实际思考的逐步过程。所以,ChatGPT 3.5 在某些任务上表现得非常出色,让我重新表述一下,它在系统1类型的任务上表现得非常出色。也就是说,在需要快速、即时答案的任务上,它非常厉害。

对于需要推理的复杂任务,比如解决谜题、思考和规划,它表现得并不好。

因此,从这张图我们可以看出,ChatGPT 3.5 擅长一种类型的思考,但它并未展现出任何能够真正推理的能力。它能够真正思考问题并给出答案,因此作为用户,我能看到我得到了一个答案,但我不确定 ChatGPT 是否真正理解了问题。这一点的一个表现是,ChatGPT 3.5 经常产生幻觉,这意味着有时它会给出一些毫无意义的随机答案。然而,如果你真正理解了问题或者你在推理,你永远不会给出这样随机的答案。这是第一个迹象,表明这是一个被设计成像人类一样回答问题的人工智能,但它并非被设计成像人类一样推理或思考。

但我们没有放弃,研究继续发展。第一个真正意义上的推理模型由 OpenAI 于 2024 年 9 月 2 日发布。在这里,我问了它之前提到的完全相同的问题:“今晚我应该看哪部电影?”你可以看到,它显示“正在为电影推荐进行推理”,持续了几秒钟。在底部,你还可以看到 ChatGPT 说:“我正在为用户思考各种喜剧风格、选项、剧情、动作、经典等。”

本节课中,我们一起学*了本系列课程的介绍,了解了人类推理的两种系统(系统1和系统2),并探讨了早期大语言模型(如 ChatGPT 3.5)在推理能力上的局限性,以及新一代模型向真正推理能力发展的趋势。在接下来的课程中,我们将深入探讨如何从零开始构建具备这种推理能力的大语言模型。

002:思维链推理

大家好,欢迎来到关于基于推理的大语言模型的第二讲。如果你错过了第一讲,强烈建议你回顾介绍视频,我们在那里详细介绍了本系列以及整个课程的结构。

在本节课中,我们将开始介绍第一种可以为大语言模型赋予推理能力的方法。请想象我们开始的时间点是2022年12月,即GPT-3.5首次发布的时候。请记住,它被设计得像人类一样回答问题,但并非像人类一样思考。它不是一个具备推理能力的大语言模型。从那时起,我们逐渐发展到了拥有能够真正进行推理的大语言模型的阶段。这些模型可以在给出最终答案前,展示其思考的步骤序列。OpenAI的O1模型是第一个基于推理的模型,此后又出现了许多基于推理的大语言模型,例如DeepSeek的模型。因此,当你听这节课时,请记住时间框架是2022年之后。因为从那时起,人们才开始认真思考基于推理的大语言模型。如今,许多公司,几乎所有的LLM提供商,都在其产品线中配备了推理型大语言模型。

现在,我们将介绍第一种方法:推理时计算扩展。

什么是推理时计算扩展?

我们所有人都是人类,并且我们知道,当我们花更多时间思考一个答案时,往往会给出更好的答案。回想一下你参加考试的时候:有时你会被一个问题卡住,因为它涉及层层思考,只有在你花费足够时间思考这个问题后,你才能正确回答。其他需要这种深入思考的问题类型包括复杂的数学问题,甚至是像数独这样的谜题。我相信我们所有人都玩过报纸上出现的某种填字游戏。你无法一次性回答所有谜题,对吧?有一些横向的答案,有一些纵向的答案,其中许多是相互关联的。因此,除非你对横向和纵向列中的所有线索都有所了解,否则你将无法填写填字游戏中的每一个条目。另一个例子是一个数学问题:质数的数量是有限的还是无限的?这个问题也不容易回答,可能需要相当多的思考才能得出答案。

想想国际象棋。国际象棋是一个例子,每当棋手走一步棋时,这步棋从来不是立即走出的。你可能见过大师们对弈的比赛,有时他们需要10分钟、20分钟甚至更长时间来走下一步棋。为什么?因为他们在走下一步棋之前,正在思考所有可能的情况。

总的来说,我们观察到,作为人类,当我们对一个问题的思考越多时,我们越倾向于得出正确答案。现在,我们将同样的逻辑应用于大语言模型,并提出一个问题:如果大语言模型在给你答案之前思考更多,会发生什么?在继续观看视频之前,请先暂停片刻,尝试回答这个问题:你认为如果你只是要求大语言模型在给出答案前花费更多时间,它们会给出更好的答案吗?这是一个非常有趣的问题,我们将在本讲座中很快找到答案。

一个简单的例子

让我们看一个非常简单的例子。罗杰有5个网球,他又买了两罐网球。每罐有3个网球。我们问的问题是:他现在有多少个网球?

现在,让我们看看一个常规大语言模型给出的答案。你可以看到,当一个常规大语言模型试图回答这个问题时,它给出的答案是:答案是11。这实际上是正确答案,它使用的令牌数量只有3个。

现在,我们将强制模型在给出答案之前进行更多思考。因此,推理型大语言模型不是直接给出答案是11,而是提出了一系列步骤:

  • 第一步:罗杰一开始有5个球。(此步骤使用4个令牌)
  • 第二步:两罐,每罐3个网球,就是6个网球。(此步骤使用11个令牌)
  • 第三步:5 + 6 = 11。(此步骤使用5个令牌)

因此,当我们要求模型进行更多思考时,它在给出答案之前肯定会使用更多的令牌数量。这就是所谓的测试时计算。模型在给出答案之前所使用的计算资源量被称为测试时计算,如下图所示。

从上面的例子中,你可以清楚地看到,与常规大语言模型相比,推理型大语言模型具有显著更高的测试时计算量(几乎是3比23,大约是7到8倍)。但是,为什么我们要在测试时花费如此多的计算量呢?这有什么意义?因为在之前的例子中,即使准确率保持不变,两种大语言模型都给出了正确答案。然而,事实证明,如果你在测试时花费更多的计算资源,并要求模型进行更多思考,模型也会开始对其他问题进行推理,并且模型的准确率会显著提高。这正是我们将在本课程剩余部分详细探讨的内容。

我们将关注的主要问题是:为什么在测试时分配更多的计算资源有助于提高模型回答复杂推理问题的准确性?这与人类的情况非常相似,对吧?人类在花更多时间思考问题时,也倾向于给出更好的答案。事实证明,大语言模型也发生了完全相同的事情。在这张图中,你可以看到,在推理型大语言模型中,推理阶段使用了大量的计算资源(我在这里用笔标出)。而在常规大语言模型中,推理几乎是瞬间发生的,非常快。

人们这样做是有原因的。原因是,我们看到了一种扩展现象:随着测试时计算量的增加,模型的准确率通常也会随之增加。当我说这句话时,有很多细微差别。然而,我希望你理解“推理时计算扩展”中“扩展”一词的含义。原因是,随着你在测试时增加计算资源的数量,我们看到大语言模型的准确率通常趋于提高。随着本讲座的进行,我们将进一步探讨关于这一说法的更多细微差别。

思维链的提出

好的,这听起来很直观,对吧?给予更多思考时间会带来更好的答案。我们是什么时候想到这一切的呢?

第一篇发表的论文表明,如果你给一个大语言模型一系列提示,这些提示不仅仅是输入-输出对,而是你为它们提供了一个将输入与输出联系起来的思维链,那么大语言模型就能学会对所有其他用户未在示例提示中给出的提示进行推理。

让我们看看论文中是怎么说的:“我们探索了如何通过生成思维链(一系列中间推理步骤)来显著提高大语言模型执行复杂推理的能力。”这意味着什么?我们正在评估大语言模型执行复杂推理任务的能力。事实证明,思维链提示是一种非常有效的方法。

思维链提示的工作原理

以下是思维链提示的工作原理:

  1. 提供示例:在提示中,不仅给出问题和答案,还给出从问题到答案的逐步推理过程。
  2. 模型学*模式:大语言模型从这些示例中学*,理解它需要生成类似的推理步骤,而不仅仅是最终答案。
  3. 应用于新问题:当面对一个新问题时,模型会模仿示例,生成自己的思维链,然后得出最终答案。

这种方法的关键在于,它教会了模型“展示其工作过程”,就像我们在解数学题时被要求做的那样。这使得模型能够处理更复杂、需要多步推理的问题。

本节课总结

在本节课中,我们一起学*了推理大语言模型的第一种赋能方法:推理时计算扩展,其核心是通过思维链提示来实现。我们了解到,就像人类一样,大语言模型在给出答案前进行更多思考(表现为生成中间推理步骤并使用更多计算资源/令牌),能够显著提高其在复杂推理任务上的准确性。我们从简单的例子出发,理解了测试时计算的概念,并介绍了思维链提示的基本思想及其重要性。下一节课中,我们将深入探讨思维链的具体技术细节和变体。

003:验证器与束搜索

在本节课中,我们将学*推理大语言模型的第二类推理时计算扩展方法:基于验证器的搜索。我们将了解什么是验证器,它与之前学*的提示技术有何不同,并深入探讨两种主要的奖励模型。

概述

上一节我们介绍了链式思维推理和零样本推理这两种提示技术,它们通过引导模型在给出答案前进行思考来提升性能。本节中,我们将探讨一种不同的方法:基于验证器的搜索。这种方法的核心不是直接引导模型思考,而是让模型生成多个候选答案,然后通过一个验证层来筛选出最佳答案。

什么是基于验证器的搜索?

验证是指生成不同答案,并最终从所有生成的答案中选择最佳答案的过程。

为了理解验证的必要性,请看下图。我们提出一个问题,问题被传递给推理模型。推理模型不是直接输出一个答案,而是生成四个不同的答案(A1, A2, A3, A4)。中间有一个验证层,负责验证这四个答案中哪一个是最好的,最终将最佳答案输出给用户。这就是验证层的作用。

我们可以用一个简单的类比来理解:假设你的任务是从一大片田地中挑选出质量最好的庄稼。你不会只找到一棵看起来不错的庄稼就停下来。通常,我们会采样五到六棵庄稼,然后从中选出最好的一棵。这样,获得最佳庄稼的概率就增加了。大语言模型也是如此,与其直接生成一个答案,不如先生成一组候选答案样本,然后借助验证层从中选出最佳答案呈现给用户。

验证与推理时计算扩展的关系

现在回到本系列讲座的主题“推理时计算扩展”。验证层如何契合这个主题?请记住,如果引入了验证层,模型在推理过程中使用的计算资源将会增加。这就是它属于“推理时计算扩展”范畴的原因,因为它增加了模型给出答案所需的时间。

我们可以用下图来理解大语言模型的工作流程:首先是预训练,然后是微调,最后是推理。在没有验证的情况下,推理过程是直接的。但当你增加验证步骤时,你实际上增加了模型给出答案的时间,因为你需要从不同答案中采样并选择最佳答案,因此增加了推理时的计算量。

验证层的实现:奖励模型

我们看到的这个验证层,既可以由人类完成,也可以由一个模型来完成。执行验证任务的模型被称为奖励模型

例如,你可以去Hugging Face搜索“reward model”,比如“deberta-v3-large-v2”奖励模型。它的描述是:该模型经过训练,能够预测在给定问题下,人类会认为哪个生成的答案更好。它用于模型评估、RLHF中的奖励评分以及通过排序检测潜在的有害回复。这个模型经过训练后,当你给它一个输入时,它会根据生成答案的好坏给出一个分数。

这个模型的训练数据本身就是由人类生成的。然后利用这些数据来训练模型。因此,我们本质上是在用模型来模拟人类验证答案的能力。

之所以称为“奖励模型”,是因为最佳答案会获得最高分作为奖励。如果答案不好,分数就会较低,奖励也就较少。

奖励模型的类型

接下来,我们将详细探讨奖励模型。具体来说,奖励模型主要分为两种类型:结果奖励模型过程奖励模型。它们的目的从名称上就大致可以理解。

结果奖励模型

想象一下,你有一个问题,并将这个问题输入到推理模型中。推理模型会给出一个链式思维过程,即它在给出最终答案前的思考步骤。

结果奖励模型的作用是:它不评估这些思考步骤。它基本上不关心思考过程,只关心最终答案,并且只对最终结果进行评分。

用公式表示其工作流程:

问题 -> 推理模型 -> [思考1, 思考2, ..., 思考N, 最终答案] -> 结果奖励模型 -> 分数

其中,结果奖励模型(ORM)只对“最终答案”部分输出一个分数(例如0.45)。

过程奖励模型

下一类更流行的是过程奖励模型。这类模型更有意义,因为当你使用推理模型时,思考过程对你来说非常重要。因此,需要一种机制来评判不仅仅是最终答案,还包括导致最终答案的各个思考步骤。

如下图所示,思考1被发送给过程奖励模型,模型对这个思考步骤进行评分;思考2再次被发送给过程奖励模型,模型再次评分。与结果奖励模型的主要区别在于,过程奖励模型评估的是推理路径上的每一个中间步骤。

总结

本节课中,我们一起学*了基于验证器的搜索这一推理时计算扩展方法。我们了解到,验证是通过生成多个候选答案并筛选最佳答案来提升模型输出质量的过程。验证层可以由专门的奖励模型实现,其中过程奖励模型通过评估推理的每一步,比只评估最终结果的结果奖励模型更能确保思考过程的质量。这种方法虽然增加了推理时的计算开销,但能有效提高答案的准确性和可靠性。

004:强化学*基础

在本节课中,我们将开始学*一个非常有趣的主题——强化学*。到目前为止,本课程已涵盖了属于“推理时计算扩展”类别的技术,这意味着我们完全没有改动训练好的模型,只是在推理阶段进行一些处理。我们看到了两个例子:第一个是提示工程,包括思维链提示和零样本思维链提示;第二个是验证器方法,即让大语言模型生成多个答案样本,然后通过一个验证层来选择最佳答案。

从本节课开始,我们将聚焦于一个完全不同的、在大语言模型中诱导推理的技术类别:纯粹的强化学*。这种方法不是调整模型的推理阶段,而是直接调整模型本身。为了理解如何应用纯粹的强化学*将一个非推理模型转变为推理模型,我们首先需要打好强化学*的基础。在接下来的几节课中,我们将暂时把推理部分放在一边,纯粹地学*强化学*这门学科。

机器学*范式对比

上一节我们介绍了本课程的新方向。为了更清晰地理解强化学*问题,本节中我们来看看它与监督学*和无监督学*有何不同。监督学*和无监督学*是机器学*领域的两大类别。

监督学*

监督学*是一类问题,其特点是拥有带标签的数据。我们收集这些标注数据并输入模型,然后要求模型对未见过的数据做出预测。

一个典型的例子是:开发一个模型,根据患者的脑部核磁共振扫描图像,判断肿瘤是良性还是恶性。为此,我们首先需要收集大量标注数据,即包含核磁共振扫描图像(输入)和对应标签(良性或恶性)的样本。这些标签由人工标注。然后,我们将这些数据输入AI模型进行训练。模型的任务是观察所有图像,并自行找出区分良性和恶性肿瘤的模式。完成学*后,我们向模型输入一个不在训练集中的新图像,要求它预测该图像属于良性还是恶性。

之所以称为“监督”学*,是因为我们提供了标签数据,模型是在人类已标注数据的“监督”下进行训练的。这类学*的主要目标是能够泛化外推到训练数据集中未出现的情况,这使其极具吸引力。

无监督学*

根据前面的讨论,你可能已经猜到,在无监督学*中,提供给模型的数据没有标签。

一个常用来解释此类问题的例子是:假设你有一个花园,里面种满了鸢尾花。你知道所有这些花都属于鸢尾花,但不知道花园里具体有多少个品种。你作为科学家的目标是,观察整个花园并预测其中鸢尾花品种的数量。这里的问题在于,你没有被提供任何标签。

以下是两种学*范式的主要区别:

  • 目标:监督学*的目标是根据已有标签进行预测或分类。无监督学*的目标是发现数据中隐藏的结构或模式。
  • 数据:监督学*使用带标签的数据。无监督学*使用未标记的数据。
  • 示例任务:监督学*的示例包括图像分类、垃圾邮件检测。无监督学*的示例包括聚类、降维。

强化学*:第三种范式

上一节我们对比了监督学*和无监督学*。本节中我们来看看机器学*中的第三种范式——强化学*,它与我们之前讨论的两种范式有根本不同。

在强化学*中,我们并不直接向模型提供带有“正确答案”的数据集。相反,我们让一个智能体与一个环境进行交互。智能体通过执行动作来影响环境,环境则对每个动作做出响应,反馈给智能体一个新的状态和一个奖励信号。奖励是一个标量值,告诉智能体其动作的好坏。智能体的目标是学*一种行为策略,以最大化长期获得的累积奖励。

这非常类似于训练宠物:当宠物执行了一个你期望的动作(如坐下)时,你给予它奖励(如食物);当它做了你不希望的事(如在地毯上小便)时,你给予惩罚(如责骂)。宠物(智能体)通过反复试验,学*哪些动作能带来奖励,从而调整其行为。

强化学*框架的核心要素可以概括如下:

  • 智能体:做出决策的学*者或决策者。
  • 环境:智能体与之交互的外部系统。
  • 状态:环境在特定时刻的描述。
  • 动作:智能体可以执行的操作。
  • 奖励:环境在智能体执行动作后反馈的标量信号。
  • 策略:智能体根据当前状态选择动作的规则,可以表示为 π(a|s),即在状态 s 下选择动作 a 的概率。

强化学*智能体的目标不是简单地拟合已有数据,而是通过试错进行探索,从而学会在复杂、动态的环境中达成目标。这使得它在游戏、机器人控制、自动驾驶等序列决策问题中非常强大。

本讲总结

本节课中,我们一起学*了强化学*的基础知识。我们首先将强化学*与熟悉的监督学*和无监督学*进行了对比,明确了其通过与环境交互、根据奖励信号学*的特点。然后,我们介绍了强化学*的基本框架,包括智能体、环境、状态、动作、奖励和策略等核心概念。理解这些基础是后续学*更现代、更复杂的强化学*方法,并最终将其与推理大语言模型相结合的关键。在接下来的课程中,我们将继续深入探讨强化学*的经典算法。

005:多臂老丨虎丨机

在本节课中,我们将要学*强化学*中的一个经典问题——多臂老丨虎丨机。我们将理解其基本概念、核心挑战以及如何通过简单的策略来估计每个“手臂”的价值,从而最大化总收益。

上一节我们介绍了强化学*的基础知识,包括其与监督学*和无监督学*的区别,以及强化学*问题的基本要素。本节中,我们来看看一个更具体、更基础的强化学*问题模型:多臂老丨虎丨机。

多臂老丨虎丨机问题简介

首先,让我们理解“多臂老丨虎丨机”这个名称的由来。它源自一种名为“单臂老丨虎丨机”的赌博游戏。玩家拉动一个杠杆,如果机器上的符号对齐,就能赢钱;否则就会输钱。它被称为“老丨虎丨机”是因为这台机器像强盗一样会“偷走”你的钱。

那么,什么是多臂老丨虎丨机呢?顾名思义,它拥有多个杠杆(手臂),而不仅仅是一个。如下图所示,我们可能有四个不同的杠杆。

问题的核心在于:你事先并不知道每个杠杆的真实价值。如果你知道,游戏将变得非常简单——你只需一直拉动价值最高的那个杠杆即可。但在这个游戏中,你必须通过不断尝试来探索每个杠杆,并最终形成一个策略,以选择能带来最大回报的杠杆。

问题形式化:动作与价值

在深入解决方案之前,我们需要将这个问题形式化。我们将拉动一个杠杆的行为称为一个动作。每个动作都有一个真实的、但我们未知的价值,我们用 Q*(a) 来表示动作 a 的真实价值。

既然我们不知道真实价值,游戏的目标就变成了估计每个动作的价值。我们用 Q_t(a) 来表示在时间 t 时,对动作 a 的价值的估计。这个估计值会随着我们不断玩游戏而更新。

那么,如何计算一个动作的估计价值呢?一个直观的方法是计算该动作在过去被选择时,所获奖励的平均值。

以下是计算估计价值的公式:

Q_t(a) = (在时间 t 之前,选择动作 a 所获得的所有奖励之和) / (在时间 t 之前,选择动作 a 的次数)

用更数学的方式表达,如果 R_1, R_2, ..., R_{k_a} 是选择动作 a 所获得的 k_a 次奖励,那么:

Q_t(a) = (R_1 + R_2 + ... + R_{k_a}) / k_a

这个公式非常直接:它只是过去收益的算术平均值。通过这种方式,我们可以根据历史经验来估计每个杠杆的“好坏”。

核心挑战:探索与利用的权衡

现在我们已经知道如何估计动作的价值。一个最直接的策略是:在每一步,都选择当前估计价值最高的那个动作。这个策略被称为贪婪策略

然而,贪婪策略存在一个根本性问题:它可能过早地锁定在一个次优的动作上。例如,你可能在最初几次尝试中,偶然从某个杠杆获得了较高的奖励,从而高估了它。如果你从此只选择这个杠杆,就再也没有机会去尝试其他可能更好的杠杆了。

这就引出了强化学*中的一个核心困境:探索与利用的权衡

  • 利用:选择当前已知最好的动作,以最大化即时收益。
  • 探索:尝试那些目前看来不是最优的动作,以收集更多信息,可能在未来发现更好的选择。

一个只利用不探索的智能体可能无法找到真正的最佳动作。一个只探索不利用的智能体则无法有效积累奖励。

简单的解决方案:ε-贪婪策略

为了解决探索与利用的难题,一个简单而有效的方法是 ε-贪婪策略。这个策略的工作原理如下:

在每一步,智能体以 1 - ε 的概率选择当前估计价值最高的动作(即贪婪动作),进行利用
同时,智能体以 ε 的概率完全随机地从所有动作中选择一个,进行探索

其中,ε 是一个很小的数,例如 0.1 或 0.01,它控制了探索的频率。

以下是 ε-贪婪策略的伪代码描述:

对于每一个时间步 t = 1, 2, 3, ...:
    生成一个 0 到 1 之间的随机数 p
    如果 p < ε:
        随机选择一个动作(探索)
    否则:
        选择具有最高估计值 Q_t(a) 的动作(利用)
    执行选择的动作 a_t,获得奖励 R_t
    更新该动作的估计值 Q_{t+1}(a_t)

通过引入这个小概率的随机探索,智能体能够持续地测试其他选项,避免陷入局部最优,同时大部分时间仍在利用当前的最佳知识。

与完整强化学*问题的联系

现在,让我们将多臂老丨虎丨机问题与上一节介绍的完整强化学*问题联系起来。多臂老丨虎丨机是强化学*的一个简化特例,它只包含一个状态。

在完整的强化学*问题中,智能体身处环境中,其行动不仅影响即时奖励,还会导致状态转移,从而影响未来的奖励序列。而在多臂老丨虎丨机中,环境是静态的——每次拉动杠杆都是一个独立的、相同分布的尝试(尽管奖励是随机的),你的选择不会改变“游戏规则”本身。因此,这里没有“状态”的概念,也没有长期价值函数的计算,问题简化为直接估计每个动作的期望奖励。

学*多臂老丨虎丨机非常重要,因为它剥离了状态转移的复杂性,让我们能够专注于理解和解决“探索与利用”这个核心挑战,这是所有强化学*算法成功的关键。

本节课中我们一起学*了多臂老丨虎丨机问题。我们首先了解了这个问题的现实比喻和基本设定,然后将其形式化为估计动作价值的问题。我们介绍了计算动作价值估计的简单平均方法,并重点探讨了强化学*的核心挑战——探索与利用的权衡。最后,我们学*了一个解决此问题的经典且简单的策略:ε-贪婪策略。理解这个基础模型,为我们后续学*更复杂的、包含状态和长期规划的强化学*算法奠定了坚实的基础。

006:马尔可夫决策过程

欢迎来到“推理LLM从零开始”课程的第6讲。在过去的两讲中,我们一直专注于强化学*这个主题。在强化学*的第一讲中,我们探讨了强化学*的含义,以及强化学*问题与监督学*问题的区别。然后我们研究了一类被称为“多臂老丨虎丨机”的强化学*问题。

在本节课中,我们将开始讨论强化学*的核心,即有限马尔可夫决策过程。这个问题定义了强化学*领域,我们将从头开始完整地理解它。为了理解这个问题,我们首先从定义一种称为“智能体-环境接口”的结构开始。

回想一下关于强化学*的第一讲,我们提到有一个智能体与其周围的环境进行交互。然后它从环境中获得越来越多的经验,不断学*并变得更好,以实现奖励或目标。现在,我们将以这种“智能体-环境接口”的形式来形式化这种直觉。

这个接口表明,在强化学*问题的中心,存在一个智能体。这个智能体从环境中接收关于环境状态的信息,该状态用 S_t 表示。因此,在每个时间步,智能体都会从环境中接收某种信息,记为 S_t

然后,基于从环境接收到的信息或信号,智能体将采取某个动作。这个动作用 A_t 表示。接着,在智能体执行此动作后,经过一个时间步,智能体将收到环境给予的奖励,并进入一个新的状态。

现在,我们在定义状态、奖励和动作时,将遵循某些命名约定。状态集总是用大写 S_t 表示,大写表示集合。而小写,例如 s1s2 等,表示该集合内的实际状态值。类似地,动作用 A_t 表示,动作集用 A_t 表示,该动作集内的单个动作用 a1, a2, a3 等表示。同样,奖励集用 R_t 表示,单个奖励用小写字母 r1, r2, r3 等表示。

因此,智能体从环境接收一个状态信号 S_t,然后基于该信号采取一个动作。在采取动作之后,状态将发生变化,智能体现在将从环境接收一个新状态,记为 S_{t+1},同时智能体还会收到一个奖励。新状态和新奖励是同时发生的,新奖励记为 R_{t+1}。这就是我们将在本讲剩余部分中使用的结构。

现在你可能会想,智能体接收到这个状态后,是如何执行这个动作的呢?

是否存在某种映射来告诉智能体采取什么动作?答案是肯定的。存在一个从每个状态到在该状态下选择每个可能动作的概率的映射。这个映射被称为智能体的策略

因此,策略是从智能体的每个状态到从该状态选择每个可能动作的概率的映射。在某种程度上,策略决定了当智能体从环境接收到特定信号时,它将采取什么动作。我们用 π_t 表示这个策略。你也会经常看到这个符号:π_t(a|s),它的意思是:给定状态 s,选择动作 a 的概率由这个策略给出。所以 a|s 表示“给定状态 s 下的动作 a”,这就是我们阅读这个符号的方式。

现在,让我们尝试理解一些状态的例子。状态的例子可以是传感器读数,或者在下棋或围棋游戏时的中间局面。状态也有一些抽象的概念,例如,“我要去办公室,但我不确定我的车钥匙在哪里”,这种想法就构成了我思维的状态。因此,状态也是一个抽象概念,如果我正在与一个人互动,那么在我与该人进行任何对话之前,我脑海中关于我与那个人关系的任何记忆也可以被视为一种状态。状态是你提供给智能体的任何信息,以使其能够在环境中执行动作,这就是状态的含义。

动作的例子可以是施加到机械臂电机上的电压,决定是否吃午餐,或者小孩第一次学骑自行车时踩踏车轮。所以,状态和动作之间是有区别的。状态就像你拥有的信息,而动作是你从环境获得信息后所做的决策。这就是状态和动作之间的区别。

现在,我们将通过一些实际例子来理解智能体-环境接口,这将具体化你对该接口以及如何用智能体-环境接口来表述问题的理解。

我们举的第一个例子是生物反应器。不用担心生物反应器是什么,即使我也不完全清楚生物反应器的工作原理,但我们不需要知道这些。我们只需要知道,生物反应器是一种用于生产有用化学品的机器。它的工作方式是通过一些传感器获取读数,然后基于这些读数,试图在生物反应器内达到某个温度和某个搅拌速率。根据这些信息,让我们试着思考在智能体和环境接口中,状态、动作和奖励分别是什么。

状态是我们从环境接收到的信息,所以它们是传感器的读数和热电偶的读数。动作是我在生物反应器内设定的目标温度和目标搅拌速率。为了达到目标温度,我将打开加热元件并激活它。为了达到目标搅拌速率,我将激活生物反应器内的电机。这些就是我将基于从环境获得的信息所采取的动作类型。奖励是生物反应器中有用化学品生产速率的瞬时测量值。你可以看到,状态是向量,但奖励是单个标量。例如,状态可以写成这个向量,其中第一个元素是...

007:价值函数

欢迎来到《从零开始构建推理LLM》课程强化学*阶段的下一讲。

在上一讲中,我们介绍了马尔可夫性质的概念,并探讨了如何将强化学*问题描述为马尔可夫决策过程。具体来说,如果一个状态信号保留了所有来自过去的相关信息,它就具有马尔可夫性质。那么,状态信号具有马尔可夫性质的强化学*问题就被称为马尔可夫决策过程。

在本节课中,我们将以马尔可夫决策过程的概念为基础,讨论一个非常重要的概念——价值函数。在我的强化学*研究中,我认识到理解价值函数的概念是理解所有强化学*类型问题的核心。即使在大型语言模型中,例如使用强化学*来改进LLM的DeepSeek等模型,要理解这种改进是如何发生的,理解价值函数的概念也至关重要。因此,我们今天将专门用一整节课来讲解价值函数,不与其他概念合并。

让我们开始理解价值函数的含义。

还记得在强化学*的第一讲中,我们说过“价值”的含义是什么吗?事实上,“价值”是强化学*类型问题的四个要素之一。在第一讲中,我们还说过,价值的含义不是智能体获得的即时奖励,而是长期累积的期望奖励。我们曾用一个很好的类比来理解价值:想象一个团队为锦标赛选择了一名球员,假设是板球比赛,锦标赛有14场比赛,我们假设该球员在前两场比赛中表现不佳。作为团队管理层,他们更关心的是这名球员的“价值”。他们相信,即使这名球员在前两场比赛中表现不佳,他的价值仍然很高,这意味着他最终会在接下来的某些比赛中发挥出色。也就是说,如果你把他14场比赛的所有得分加起来,会得到一个不错的总价值,因此我们可以忽略前两场比赛。所以,价值意味着智能体在长期运行中获得的累积奖励。这与我们在上一讲中看到的“期望回报”概念相似。

状态价值函数

让我们来看状态价值函数。假设我们从某个状态开始,然后从这个状态跳转到另一个状态,再跳转到下一个状态,依此类推。这个状态的价值不是我在此处获得的即时奖励,而是我的智能体在未来获得的所有奖励的总和。本质上,你汇总所有奖励,然后问一个问题:这个累积总和在长期运行中的期望值是多少?这样你就得到了这个状态的价值。

状态价值函数用符号 Vπ(s) 表示。这意味着我们是在智能体遵循策略 π 的情况下计算这个状态 s 的价值。

我们可以根据上一讲关于期望回报的讨论来写出 Vπ(s) 的表达式。期望回报 Gt 是:
Gt = Rt+1 + γRt+2 + γ²Rt+3 + ...
其中 γ 是折扣率。这个公式特别适用于连续任务。

状态价值函数就是这个期望回报的期望值。因此,Vπ(s) 的公式如下:
Vπ(s) = Eπ[Gt | St = s] = Eπ[ Σk=0 γk Rt+k+1 | St = s ]

不要被数学符号困扰。状态价值背后的直觉很简单:本质上,我们是在观察,如果一个智能体处于某个状态,它未来可能获得哪些奖励?然后我们说,如果你把这些奖励加起来,整个奖励总和的期望值是多少?我们引入折扣率 γ,是因为未来的奖励不如即时奖励有价值。还记得我们讨论过,如果你有一张100卢比的钞票,五年后它的价值远低于现在的价值。这里的道理非常相似:我们说的是,与未来收到的奖励相比,更即时的奖励更有价值。这个直觉通过折扣率 γ 得到了很好的体现。

动作价值函数

在讨论了状态价值函数之后,我们现在需要继续看看什么是动作价值函数。

动作价值函数意味着我们仍然在计算从一个状态出发的期望回报,但与状态价值函数唯一的区别在于,这里我们计算的是智能体采取某个特定动作 a 之后,再遵循策略 π 所能获得的期望回报。

状态价值函数和动作价值函数的主要区别在于:假设你有一个智能体,它到达了某个状态 s。状态价值函数 Vπ(s) 问的是:“从这个状态开始,遵循策略 π,我能期望获得多少总回报?”而动作价值函数 Qπ(s, a) 问的是:“在状态 s 下,如果我选择执行动作 a,然后从下一个状态开始遵循策略 π,我能期望获得多少总回报?”

动作价值函数用符号 Qπ(s, a) 表示。其公式与状态价值函数类似,但条件包含了所采取的动作:
Qπ(s, a) = Eπ[Gt | St = s, At = a] = Eπ[ Σk=0 γk Rt+k+1 | St = s, At = a ]

两种价值函数的关系与重要性

理解这两种价值函数的关系至关重要。状态价值 Vπ(s) 可以看作是,在状态 s 下,根据策略 π 选择各个可能动作的动作价值 Qπ(s, a) 的加权平均,权重就是策略 π 在该状态下选择每个动作的概率 π(a|s)。用公式表示就是:
Vπ(s) = Σa π(a|s) * Qπ(s, a)

价值函数是强化学*的核心,因为它们为评估和比较不同的状态或“状态-动作”对提供了标准。智能体的目标就是找到最大化价值函数(无论是状态价值还是动作价值)的策略。在后续的课程中,我们将看到如何利用这些价值函数来改进策略,例如通过策略迭代或价值迭代等方法。在基于人类反馈的强化学*等技术中,价值函数(通常由一个称为“奖励模型”或“价值模型”的独立网络学*)被用来指导语言模型的生成,使其输出更符合人类偏好、更有帮助且更无害的内容。

总结

本节课中,我们一起深入学*了强化学*中的核心概念——价值函数。我们首先回顾了价值的含义,即长期累积的期望奖励。然后,我们分别定义了状态价值函数 Vπ(s)动作价值函数 Qπ(s, a),并给出了它们的数学表达式。我们强调了折扣率 γ 在衡量未来奖励现值时的重要性。最后,我们简要讨论了两类价值函数之间的关系及其在寻找最优策略和高级RL应用(如对齐大语言模型)中的根本作用。理解价值函数是打开强化学*大门的关键钥匙。

008:动态规划与强化学*阶段

在本节课中,我们将学*如何解决强化学*问题,以找到智能体的最优策略。我们将从动态规划方法开始,这是求解价值函数和最优策略的基础算法集合。

上一节我们介绍了价值函数和贝尔曼方程。本节中,我们来看看如何利用这些方程来实际求解价值函数,进而找到最优策略。我们将从动态规划的第一步——策略评估开始。

策略评估:预测问题

动态规划方法的第一步称为策略评估。其含义是:对于一个给定的策略 π,我们能否估计出该策略下的价值函数 V^π(s)

策略评估也被称为预测问题。在动态规划乃至所有求解最优策略的方法中,通常分为两步:首先是预测问题(评估给定策略的好坏),然后是控制问题(改进策略以找到最优策略)。我们先深入理解预测问题。

以下是策略评估的核心思路:利用上一节学*的贝尔曼方程。

贝尔曼方程表明,一个状态 s 的价值函数 V(s) 可以通过其后续状态 s' 的价值函数 V(s') 来表示。具体来说,V(s) 等于所有可能的下一个状态 s' 的期望回报之和,其中考虑了即时奖励 r、折扣因子 γ 以及从状态 s 采取动作 a 后转移到状态 s' 并获得奖励 r 的概率。

我们可以用以下公式来表达给定策略 π 下的贝尔曼方程:

V^π(s) = Σ_a π(a|s) Σ_{s', r} p(s', r | s, a) [ r + γ * V^π(s') ]

其中:

  • π(a|s) 是策略,表示在状态 s 下采取动作 a 的概率。
  • p(s', r | s, a) 是状态转移概率,表示在状态 s 采取动作 a 后,转移到状态 s' 并获得奖励 r 的概率。
  • γ 是折扣因子。

然而,这里存在一个挑战:方程右侧包含了未知的后续状态价值函数 V^π(s')。每个状态的价值函数方程都依赖于其他状态的价值函数,这形成了一个相互关联的方程组。

动态规划求解:迭代策略评估

我们的主要目标就是解决这个预测问题。动态规划提供了一种迭代方法来求解这个方程组。

其核心思想是迭代策略评估。我们从一个对价值函数的初始猜测开始(例如,将所有状态的价值设为0)。然后,我们反复应用贝尔曼方程作为更新规则,来改进我们对每个状态价值的估计。

具体步骤如下:

  1. 初始化:为所有状态 s 设定一个初始价值估计 V_0(s)
  2. 迭代更新:对于第 k+1 次迭代,使用第 k 次迭代的价值估计,按照以下公式更新所有状态的价值:
    V_{k+1}(s) = Σ_a π(a|s) Σ_{s', r} p(s', r | s, a) [ r + γ * V_k(s') ]
  3. 收敛判断:重复步骤2,直到价值函数的变化小于一个设定的阈值,此时我们认为价值函数已经收敛到 V^π

这个过程被称为“自举”,因为我们利用当前的价值估计来更新自身。只要折扣因子 γ < 1 或者所有策略都能保证最终到达终止状态,这个迭代过程就能保证收敛到真实的 V^π

从评估到控制:策略改进

一旦我们能够评估一个给定策略的价值函数(解决了预测问题),下一步自然就是改进策略(解决控制问题)。目标是找到比当前策略更好的策略。

策略改进基于一个简单的思想:策略提升定理。如果在某个状态 s,我们选择一个动作 a(这个动作不同于原策略 π 在该状态建议的动作),并且这个动作能带来更高的期望回报(即 Q^π(s, a) > V^π(s)),那么通过在该状态改为选择这个新动作,并保持其他状态策略不变,我们就能得到一个总体上优于原策略 π 的新策略 π'

这里 Q^π(s, a) 是动作价值函数,表示在状态 s 采取动作 a,然后遵循策略 π 所能获得的期望回报。其公式为:
Q^π(s, a) = Σ_{s', r} p(s', r | s, a) [ r + γ * V^π(s') ]

策略改进的步骤是:对于每个状态 s,我们检查是否有某个动作 aQ^π(s, a) 值大于当前的 V^π(s)。如果有,我们就更新策略,使在该状态选择这个“更优”动作的概率增加(例如,改为确定性地选择该动作)。

策略迭代与价值迭代

结合策略评估和策略改进,我们可以得到两种主要的动态规划算法:

  1. 策略迭代 🔄

    • 步骤一:策略评估:给定当前策略 π,迭代计算其价值函数 V^π 直至收敛。
    • 步骤二:策略改进:基于计算出的 V^π,通过贪心策略(在每个状态选择 Q^π(s, a) 最大的动作 a)生成一个更好的新策略 π'
    • 重复步骤一和步骤二,直到策略不再发生变化,此时我们就找到了最优策略 π*。
  2. 价值迭代

    • 价值迭代将策略评估和策略改进的过程合并为一步。它直接迭代更新状态价值函数,其更新规则基于贝尔曼最优方程:
      V_{k+1}(s) = max_a Σ_{s', r} p(s', r | s, a) [ r + γ * V_k(s') ]
    • 这个公式直接假设在每一步都采取最优动作。当价值函数收敛后,最优策略可以通过对每个状态选择最大化上述表达式的动作来得到:
      π(s) = argmax_a Σ_{s', r} p(s', r | s, a) [ r + γ * V(s') ]

价值迭代通常比策略迭代更快,因为它不需要等待策略评估完全收敛。

动态规划的假设与局限性

动态规划方法功能强大,但它们基于一个关键假设:我们拥有环境的完美模型。具体来说,我们需要知道状态转移概率 p(s', r | s, a) 和奖励函数。在已知模型的情况下,动态规划是计算最优策略的高效方法。

然而,在大多数现实世界的强化学*问题中(例如游戏、机器人控制),我们并不知道环境的精确模型。这正是动态规划的主要局限性。

本节课中我们一起学*了动态规划,它是解决已知模型强化学*问题的经典方法。我们首先通过策略评估(预测问题)学*了如何计算给定策略的价值函数。然后,我们探讨了如何通过策略改进来获得更好的策略,并最终介绍了策略迭代价值迭代这两种寻找最优策略的核心算法。理解动态规划为我们后续学*在未知模型环境中工作的算法(如蒙特卡洛方法和时序差分学*)奠定了重要基础。

009:蒙特卡洛方法 | 强化学*阶段

在本节课中,我们将学*强化学*中的蒙特卡洛方法。我们将了解它如何仅通过与环境的交互经验来估计价值函数和寻找最优策略,并理解其与动态规划方法的根本区别。

概述

上一节我们介绍了动态规划方法,它通过“自举”的方式,利用后续状态的价值来更新当前状态的价值。然而,动态规划的一个核心限制是它需要环境的完整模型,即状态转移概率和奖励函数。在许多实际场景中,我们无法预先获得这个模型。

本节中,我们来看看蒙特卡洛方法。这是一种基于经验的学*方法,它不需要环境的先验知识,只需要智能体与环境交互产生的“经验”序列(或称“幕”),就能学*到价值函数和最优策略。

蒙特卡洛 vs. 动态规划

动态规划的核心是自举,其更新公式基于贝尔曼方程:
V(s) ← Σ_a π(a|s) Σ_s‘ P(s'|s,a) [R(s,a,s') + γV(s')]
这个公式要求我们知道模型 P(s'|s,a)R(s,a,s')

蒙特卡洛方法则完全不同。它通过让智能体遵循策略 π 与环境交互,收集从起始状态到终止状态的完整轨迹(称为一幕),然后计算该轨迹上获得的实际回报,并用这个实际回报的平均值来估计状态的价值。其核心思想是从经验中学*

以下是两者的关键区别:

  • 模型需求:动态规划需要完整的环境模型;蒙特卡洛方法不需要模型,只需要经验。
  • 更新时机:动态规划可以基于其他状态的估计值进行单步更新;蒙特卡洛方法必须等待一幕结束后才能进行更新。
  • 学*方式:动态规划是计算;蒙特卡洛是从样本中学*

一个直观的例子

为了更直观地理解,让我们考虑一个具体场景。假设你是一个智能体(黄色圆圈),你的任务是从起点出发,避开障碍物(黑色方块),到达目标点(绿色方块),并获得最大奖励。

在这个网格世界中:

  • 状态:每个单元格就是一个状态(例如起点、目标点、每个空位)。
  • 动作:在每个状态,你可以选择向上、向下、向左、向右移动。
  • 奖励:到达目标可能获得+1奖励,撞到障碍物或走出边界可能获得-1奖励,每走一步可能获得一个小的负奖励(如-0.01)以鼓励尽快到达目标。

如何用动态规划解决?
你需要知道所有状态转移概率 P(s'|s,a)。例如,在中间的空单元格,执行“向上”动作,成功移动到上方单元格的概率是多少?如果假设动作执行是确定的,那么这个概率就是1。但即使如此,你仍然需要预先定义好整个环境的动态规则。对于火星探测器这样的未知环境,这是不可能的。

如何用蒙特卡洛方法解决?
你不需要知道任何概率。你只需要让智能体(或模拟程序)一次又一次地尝试从起点走到终点。每次尝试(一幕)结束后,你记录下经过的路径和获得的总奖励。例如:

  • 第一幕:起点 -> 右 -> 右 -> 上 -> 撞墙 -> ... -> 最终到达目标,总奖励 = 0.5。
  • 第二幕:起点 -> 上 -> 上 -> 右 -> 右 -> 到达目标,总奖励 = 0.9。
  • ...

然后,对于某个状态(比如起点右边第一个格子),你查看所有经过这个状态的幕,计算这些幕从该状态开始到结束所获奖励的平均值。这个平均值就是该状态价值的估计。通过大量这样的“经验”,价值估计会越来越准确,进而可以改进策略。

蒙特卡洛预测:评估给定策略

蒙特卡洛预测的目标是:给定一个策略 π,估计该策略下的状态价值函数 Vπ(s)

其算法步骤如下:

  1. 初始化:对所有状态 s,初始化价值 V(s) 为一个任意值(如0),并初始化一个计数器 N(s)=0,用于记录状态 s 被访问的次数。
  2. 生成经验:使用策略 π 与环境交互,产生一幕序列:S0, A0, R1, S1, A1, R2, ..., ST(其中 T 是终止时刻)。
  3. 计算回报:从该幕的最后一步向前回溯。对于时间步 t,其回报 Gt 是从 t 开始到幕结束所获奖励的总和(考虑折扣 γ):Gt = Rt+1 + γ*Rt+2 + γ²*Rt+3 + ... + γ^(T-t-1)*RT
  4. 更新价值:对于该幕中出现的每一个状态 St
    • 递增计数器:N(St) ← N(St) + 1
    • 更新价值估计(增量式更新):V(St) ← V(St) + (1/N(St)) * [Gt - V(St)]
      这个公式的含义是:用新观测到的回报 Gt 与旧估计 V(St) 的误差,来调整旧估计。1/N(St) 是学*步长,随着样本增多,调整幅度变小。
  5. 重复:回到步骤2,用新的幕继续更新,直到价值函数收敛。

蒙特卡洛控制:寻找最优策略

仅仅评估一个策略不够,我们的目标是找到最优策略 π*。蒙特卡洛控制将策略评估和策略改进结合起来。

最常见的方法是蒙特卡洛ES(Exploring Starts,探索性起始)算法:

  1. 初始化:随机初始化所有状态 s 和所有动作 aQ(s,a)(动作价值)和 π(s)(策略)。π(s) 通常初始化为等概率随机策略。
  2. 循环(每一幕)
    • 探索性起始:随机选择一幕的起始状态 S0 和起始动作 A0,确保每个状态-动作对都有被访问到的可能。
    • 生成轨迹:从 (S0, A0) 开始,遵循当前策略 π 生成一幕序列,直到终止。
    • 计算回报:同预测步骤,计算该幕中每个状态-动作对 (St, At) 的回报 Gt
    • 更新动作价值:对于该幕中出现的每一个状态-动作对 (St, At)
      • N(St, At) ← N(St, At) + 1
      • Q(St, At) ← Q(St, At) + (1/N(St, At)) * [Gt - Q(St, At)]
    • 策略改进:对于该幕中出现的每一个状态 St,更新策略为贪婪策略:π(St) ← argmax_a Q(St, a)。即选择当前估计下能带来最大价值的动作。

通过不断重复“用策略生成经验 -> 用经验更新Q值 -> 根据Q值改进策略”的循环,最终可以收敛到最优策略和最优动作价值函数。

总结

本节课中我们一起学*了蒙特卡洛方法。我们了解到,与需要完整环境模型的动态规划不同,蒙特卡洛方法是一种基于经验的无模型强化学*方法。它的核心是让智能体通过实际交互收集完整的“幕”序列,然后用这些序列中观测到的实际回报的平均值来估计状态或状态-动作对的价值。

我们学*了两个主要部分:

  1. 蒙特卡洛预测:用于评估一个给定策略的好坏。
  2. 蒙特卡洛控制(如蒙特卡洛ES算法):通过结合策略评估和策略改进(通常采用贪婪策略),来寻找最优策略。

蒙特卡洛方法的优势在于其简单性和对未知环境模型的适用性,但它也有缺点,例如必须等待一幕结束才能更新,且对探索有较高要求。这为我们理解后续更高效的时序差分学*方法奠定了基础。

010:时序差分预测|强化学*阶段

在本节课中,我们将学*强化学*中的时序差分方法。我们将探讨它如何结合蒙特卡洛方法和动态规划的优点,并理解其更新机制。

概述

在本系列课程中,我们正处于强化学*阶段。上一讲我们探讨了蒙特卡洛方法,再上一讲我们学*了动态规划。今天,我们将通过讨论时序差分方法来完善这三种核心方法。

动态规划方法需要环境的完整模型,否则无法求解贝尔曼方程。蒙特卡洛方法解决了这一限制,它不需要环境模型,智能体可以直接从自身经验中学*。这是一个巨大的进步,意味着即使不了解环境的完整动态,也可以让智能体通过与环境的交互来学*,并逐渐收敛到真实的价值函数,从而找到最优策略。

然而,我们在上一讲也讨论了蒙特卡洛方法的一个局限:在更新状态价值之前,必须等待整个回合结束。这是因为要计算一个状态的真实回报,需要访问从该状态开始直到回合结束的所有状态。

今天要讨论的方法,结合了蒙特卡洛和动态规划的思想。它与蒙特卡洛的相似之处在于,它从原始经验中学*,同样不需要环境模型。它与动态规划的相似之处在于,它基于其他已学*的估计值进行更新,并且不需要等待最终结果。现在,让我们深入探讨这些方法的工作原理,以及为什么人们通常更倾向于使用它们。

时序差分预测问题

首先,我们来定义预测问题的含义。给定一个策略 π,目标是估计遵循该策略的所有状态的价值。这就是预测问题。我们已经用动态规划和蒙特卡洛方法解决了预测问题,现在来看看时序差分方法中的预测问题。

假设我们想用蒙特卡洛方法估计一个状态 S 的价值。令之前的估计值为 V_k(S)。我们希望在完成一个获得回报 G_k 的回合后更新这个估计值。这里的下标 k 表示第 k 个回合。我们的目标是找到新的估计值 V_{k+1}(S)

在蒙特卡洛方法中,我们通过计算所有历史回报的平均值来更新价值估计。对于前 k 个回合,状态 S 的价值估计可以表示为所有历史回报的平均值。

当我们获得第 k+1 个回合的新回报 G_k 后,新的价值估计 V_{k+1}(S) 就需要将新回报纳入平均计算。

我们的目标是将 V_{k+1}(S) 表示为 V_k(S) 的函数。通过数学推导,我们可以得到以下更新公式:

V_{k+1}(S) = V_k(S) + α * (G_k - V_k(S))

其中,α = 1/(k+1),可以看作学*率。

这个公式的含义是:新的估计值等于旧的估计值加上一个调整项。调整项是当前回报 G_k 与旧估计值 V_k(S) 之间的差值(称为“误差”或“惊喜”),乘以一个学*率 α。这本质上是一种增量平均的计算方式。

从蒙特卡洛到时序差分

上一节我们推导了蒙特卡洛方法的增量更新公式。然而,这个公式仍然需要等待整个回合结束以获得 G_k。时序差分方法的关键思想是:我们不必等待回合结束,可以基于下一个状态的估计值进行更新。

在时序差分中,我们使用一个估计值来替代完整的未来回报。具体来说,我们使用当前奖励 R_{t+1} 加上下一个状态 S_{t+1} 的折扣估计值 γ * V(S_{t+1}),来*似从状态 S_t 开始的回报。这被称为 TD 目标

因此,时序差分方法的更新公式变为:

V(S_t) ← V(S_t) + α * [ R_{t+1} + γ * V(S_{t+1}) - V(S_t) ]

这个公式就是著名的 TD(0) 更新规则。其中:

  • V(S_t):状态 S_t 的当前估计值。
  • α:学*率,控制更新步长。
  • R_{t+1}:在状态 S_t 执行动作后立即获得的奖励。
  • γ:折扣因子,衡量未来奖励的当前价值。
  • V(S_{t+1}):下一个状态 S_{t+1} 的当前估计值。
  • [ R_{t+1} + γ * V(S_{t+1}) ]:这就是 TD 目标
  • [ TD目标 - V(S_t) ]:这就是 TD 误差,它驱动着价值估计的更新。

这个更新的核心思想是:用对下一步的即时估计(TD目标)来修正当前状态的估计值。它结合了蒙特卡洛(从经验学*)和动态规划(基于其他估计值进行更新,即“自举”)的思想。

时序差分方法的优势

以下是时序差分方法相较于蒙特卡洛和动态规划的主要优势:

在线学*
时序差分方法可以在每一步之后立即更新价值估计,无需等待回合结束。这使得学*更加高效,尤其适用于长回合或连续任务。

无需环境模型
与动态规划不同,时序差分方法像蒙特卡洛一样,不需要知道环境的转移概率和奖励函数。它直接从经验中学*。

方差更低
与蒙特卡洛方法相比,时序差分更新依赖于当前的估计值,而不是整个回合的随机回报序列,因此通常具有更低的方差,学*过程更稳定。

收敛性
在适当的条件下,时序差分方法能够收敛到真实的价值函数。

算法:TD(0) 预测

以下是用于策略评估(预测)的 TD(0) 算法的伪代码描述:

输入:待评估的策略 π
参数:学*率 α ∈ (0, 1],折扣因子 γ ∈ [0, 1]
初始化:对于所有状态 s ∈ S,任意初始化 V(s)(例如,初始化为0)

循环每个回合:
    初始化状态 S
    当状态 S 不是终止状态时:
        根据策略 π,在状态 S 选择动作 A
        执行动作 A,观察奖励 R 和下一个状态 S‘
        # TD(0) 更新
        V(S) ← V(S) + α * [ R + γ * V(S') - V(S) ]
        S ← S‘

该算法持续运行,直到价值函数 V(s) 收敛或达到预设的迭代次数。

总结

本节课我们一起学*了时序差分预测方法。我们首先回顾了蒙特卡洛方法的增量更新形式,然后引入了时序差分的核心思想:用下一步的估计(TD目标)来替代完整的蒙特卡洛回报,从而实现每一步的在线更新。

我们推导了 TD(0) 的更新公式 V(S_t) ← V(S_t) + α * [ R_{t+1} + γ * V(S_{t+1}) - V(S_t) ],并解释了其中 TD 目标和 TD 误差的含义。最后,我们讨论了时序差分方法结合蒙特卡洛和动态规划优点的特性,并给出了 TD(0) 预测算法的具体步骤。

时序差分方法是现代强化学*的基石之一,为后续更高级的算法(如 Q-learning、SARSA)奠定了基础。

011:时序差分控制

在本节课中,我们将基于上一讲的内容,讨论时序差分方法中的控制问题。

上一节我们介绍了如何使用时序差分方法解决预测问题。本节中我们来看看如何将其扩展到控制问题,以寻找最优策略。

概述

在强化学*中,预测问题是给定一个策略,我们试图确定该策略的价值函数。控制问题则是要找出最优策略。我们已经学*了动态规划和蒙特卡洛方法中的控制问题,现在将探讨如何在时序差分框架下解决它。

预测问题回顾

首先,快速回顾一下预测问题。在预测问题中,给定一个策略,我们尝试确定该策略的价值函数。我们在上一讲中看到,时序差分方法用于写出更新规则。

更新规则如下:
V(s) ← V(s) + α * [R_{t+1} + γ * V(S') - V(s)]
其中,V(S') 是下一步的状态价值,这个更新规则用于更新所有状态的价值。这正是使用时序差分方法解决预测问题的方式。

我们还看到,与蒙特卡洛方法相比,TD方法具有显著优势,特别是你无需等待整个回合结束即可进行更新。它们在某种程度上与动态规划相似,因为都涉及“自举”的元素。

当我们进行自举时,我们使用下一个状态的价值来更新前一个状态的价值。这正是我们在动态规划和时序差分方法中所做的,但在蒙特卡洛方法中我们不这样做,因为蒙特卡洛方法使用整个回合的回报。

从预测到控制

现在,我们将理解如何解决控制问题。请记住,在控制问题中,我们试图找出哪个策略是最优策略。

既然我们已经理解了如何使用时序差分方法来估计给定策略的价值函数,我们能否推动策略向最优策略发展?

我们在动态规划和蒙特卡洛方法中也研究过这个问题,通常这个过程是递归的。换句话说,你更新策略,然后再次改变价值函数,接着再次更新策略,这种来回的算法持续进行,直到获得最优策略及其对应的价值函数。

蒙特卡洛控制方法回顾

为了给本次讨论打下基础,让我们快速回顾一下蒙特卡洛方法中的控制问题。

在蒙特卡洛方法中,代理遵循特定策略经历一系列状态,直到回合结束。然后,你根据整个回合的回报来更新状态的价值函数。

当你试图优化策略时,假设从状态 S 出发,有三个可能的动作:A1A2A3。如果 A3 是能给你最大回报的动作,但你的代理只探索过 A1,那么这对你没有帮助,因为代理根本没有探索过 A2A3。这个问题在动态规划中不会出现,因为我们知道环境模型,所有动作都被探索过了。

因此,我们必须进行一个称为“探索”的过程。探索意味着,即使你的动作价值函数 Q(S, a) 告诉你动作 A1 的价值最大,你也会以概率 ε 采取一个完全随机的动作。这个随机动作可能是 A3,这将允许你探索以前未探索过的更多动作。这种策略被称为 ε-贪心策略

ε-贪心策略允许你探索以前未探索过的动作,并最终以这样的方式更新 Q 函数:所有可能的动作都被代理探索过。因此,对于每个状态,你都知道哪个动作是最好的,因为所有动作都被代理探索过了。

ε-贪心策略与策略迭代

以下是我们在蒙特卡洛方法中用于更新动作价值函数的策略:

  1. 我们首先使用预测方法计算动作价值函数。我多次使用“动作价值函数”这个词,以防你不记得之前的课程。它简单意味着,如果我处于特定状态并采取一个动作,那么我在未来预期的奖励是多少。当策略最优时,它将始终选择具有最大动作价值函数值的动作。
  2. 之后,我们使用 ε-贪心策略 为每个状态选择动作。
  3. 然后我们再次更新这个动作价值函数。

这个过程持续递归进行。我们首先假设一个初始策略(通常是随机策略),然后通过反复经历回合来估计该策略的动作价值函数。接着,我们基于 ε-贪心动作更新该策略,这意味着我们查看更新后的 Q 值,找出每个状态下哪个动作的 Q 值最大,并根据这些更新后的 Q 值决定每个状态的动作。偶尔,我们会采取随机动作。因此,我们遵循 ε-贪心策略。

这在某种程度上也是一种策略迭代,类似于我们在动态规划中看到的,但更加隐式。你并没有明确地说你在迭代策略,但本质上你是,因为 Q 函数(这些 Q 值)在每个回合后都在更新,而你的 ε-贪心策略基于这个 Q 函数决定动作,所以它们也在每个回合后更新。这就是为什么这两个过程是同时发生的。

简而言之,我们所做的是:使用 ε-贪心策略,通过多次执行回合来更新动作价值函数。我们看到,如果你执行足够多的回合,动作价值函数会收敛到最优动作价值函数,策略也会收敛到最优策略。

时序差分控制

现在,在时序差分方法的控制问题中,我们将采用非常相似的方法。我们不是预测状态的价值函数,而是预测“状态-动作对”的价值函数。

这意味着,如果我处于一个状态并采取一个特定动作,那么该动作的价值是多少?换句话说,代理在采取该动作后未来将获得的累积奖励是多少?

然后,这个公式与我们之前看到的用于价值函数的 TD 更新完全相同,唯一的区别是将状态价值 V(s) 替换为动作价值 Q(s, a)

总结

本节课中我们一起学*了如何将时序差分方法从预测问题扩展到控制问题。我们回顾了蒙特卡洛控制中的 ε-贪心策略,它通过平衡探索与利用来寻找最优策略。在时序差分控制中,核心思想是将状态价值更新转变为状态-动作价值更新,并同样结合策略改进(如 ε-贪心策略)来迭代地逼*最优策略和最优价值函数。这构成了像 Q-learning 和 SARSA 这类重要算法的基础。

012:函数逼*方法|强化学*阶段

在本节课中,我们将学*强化学*中的函数逼*方法。我们将探讨如何利用有限的状态访问经验,来*似估计整个巨大状态空间的价值函数,从而解决表格方法在处理大规模问题时的局限性。

课程回顾与问题引入

上一节我们介绍了时序差分方法,它是解决无需环境模型且能即时更新的有效算法。本节中,我们来看看当状态空间变得极其庞大时,传统方法面临的挑战。

到目前为止,我们课程中讨论的所有强化学*方法——动态规划、蒙特卡洛方法和时序差分方法——都属于表格方法。在这些方法中,我们为每个独立的状态 s 计算并存储一个具体的价值 V(s)。这就像为每个状态在表格中预留了一个位置。

表格方法在状态数量有限时是有效且直观的。然而,其主要的缺点在于,对于实际问题,状态的数量往往是极其庞大的。

以国际象棋游戏为例。棋盘上的棋子有多种走法,导致可能的状态组合数量达到了惊人的 10^46 个。如果使用表格方法,我们需要为这 10^46 个状态中的每一个都计算并存储一个价值。这需要巨大的内存和计算时间,在实践中几乎无法实现。

因此,表格方法虽然易于理解和教学,可以作为现代强化学*的入门基础,但其本身并不适用于解决具有巨大状态空间的现实问题。

函数逼*的核心思想

那么,我们该如何解决这个问题呢?关键在于泛化

我们能否让智能体只访问一部分状态,然后利用从这些状态中学到的知识,去估计它尚未访问过的其他状态的价值?这正是函数逼*方法要解决的问题。

当你听到“泛化”这个词时,可能会联想到回归问题。例如,我们有一些数据点:学生学*了2小时、4小时和8小时后的考试成绩。我们希望通过这些已知的点,拟合出一条曲线或直线,从而预测学*了6小时(一个未知点)的成绩。

函数逼*在强化学*中的思想与此类似。我们不再为每个状态 s 存储单独的价值 V(s),而是尝试找到一个函数 V̂(s, w)。这个函数以状态 s 作为输入,并输出该状态的*似价值。参数 w 是我们要学*的权重,它定义了函数的具体形式。

核心公式
V(s) ≈ V̂(s, w)

我们的目标是通过调整参数 w,使得函数 对已访问状态的价值预测尽可能准确,同时也能对未访问状态给出合理的估计。

函数逼*的优势

以下是采用函数逼*方法的主要好处:

  1. 节省内存:我们不再需要存储一个与状态数量等大的表格,只需要存储函数 的参数 w。参数的数量通常远小于状态的数量。
  2. 泛化能力:智能体可以从有限的经验中学*,并将其知识推广到未见过的状态。例如,在象棋中,即使智能体从未见过某个具体的棋盘布局,如果该布局与它见过的某些布局相似,函数 也能给出一个合理的价值估计。
  3. 处理连续状态:表格方法只能处理离散的、可枚举的状态。而函数逼*可以自然地处理连续状态空间(例如,机器人的关节角度、汽车的速度),只需将连续状态作为函数的输入即可。

学*方法与损失函数

我们如何学*参数 w 呢?这通常通过梯度下降类算法来完成。

我们定义一个损失函数 J(w),用于衡量当前参数 w 下,预测值 V̂(s, w) 与目标值(例如,蒙特卡洛回报 G_t 或时序差分目标 R_{t+1} + γV̂(s_{t+1}, w))之间的差异。

核心思想是:计算损失函数 J(w) 关于参数 w 的梯度,然后沿着梯度反方向(即减小损失的方向)更新参数。

参数更新公式(梯度下降)
w ← w - α * ∇_w J(w)
其中,α 是学*率。

不同的强化学*算法(如蒙特卡洛或时序差分)会提供不同的目标值,从而定义不同的具体损失函数和更新规则。但它们的共同目标都是最小化预测值与目标值之间的误差。

总结

本节课中我们一起学*了强化学*中的函数逼*方法。我们首先指出了传统表格方法在处理海量状态空间时的局限性。接着,我们引入了函数逼*的核心思想:使用一个带参数的函数 V̂(s, w) 来*似真实的价值函数 V(s),从而实现状态的泛化。这种方法不仅能大幅节省存储和计算资源,还能让智能体将经验推广到未知状态,并处理连续状态空间。最后,我们了解到参数 w 的学*通常通过基于梯度下降最小化预测误差来完成。函数逼*是连接经典强化学*与能够解决复杂实际问题(如游戏、机器人控制)的现代深度强化学*的关键桥梁。

013:P13 使用价值函数*似的策略控制

在本节课中,我们将学*如何使用价值函数*似进行策略控制。我们将探讨线性与非线性两种*似方法,理解它们如何帮助我们处理大规模状态空间问题,并最终实现有效的策略优化。

概述

上一讲我们完成了一次重要的思维转变,即价值函数的表示方式。之前我们使用表格化方法,但在状态空间巨大(例如国际象棋有超过10^46个状态)时,这种方法会消耗大量内存且不切实际。因此,我们引入了泛化的概念,即通过观察部分状态来估计所有状态的价值。这类似于函数*似,但强化学*中的目标是未知且非平稳的,因此需要特殊处理。我们定义了损失函数,并使用梯度下降来更新*似价值函数的权重。然而,更新规则依赖于真实价值函数,我们通过用蒙特卡洛回报或时序差分回报来*似真实价值函数解决了这个问题。上一讲我们涵盖了这些方法,但尚未详细讨论如何用权重精确表示价值函数。本节我们将深入探讨这一点。

线性方法

线性方法,顾名思义,使用一个非常简单的函数来表示价值函数。这个函数由权重向量与一个称为特征向量的向量相乘得到。

核心公式
如果权重为 w1w2,特征向量为 x1x2,则价值函数 V(s) 可表示为:
V(s) = w1 * x1(s) + w2 * x2(s)

我们根据问题的已知信息预先定义特征向量 x1x2,然后只需要估计权重 w1w2 即可。

关于梯度,在更新规则中我们需要计算价值函数对权重的梯度。对于线性情况,梯度计算非常简单:

梯度计算
∇V(s) = [∂V/∂w1, ∂V/∂w2] = [x1(s), x2(s)] = x(s)

因此,梯度就是特征向量本身。

有了梯度的表达式,我们就可以写出具体的更新规则。以下是两种主要方法的更新规则:

蒙特卡洛方法更新规则
w ← w + α * [G_t - V(s_t)] * x(s_t)
其中,G_t 是从时间 t 开始的回报,α 是学*率。

时序差分方法更新规则
w ← w + α * [r_{t+1} + γ * V(s_{t+1}) - V(s_t)] * x(s_t)
其中,r_{t+1} 是即时奖励,γ 是折扣因子。

由于其简洁性,线性方法在许多问题中非常受欢迎。在线性方法内部,还有多种子类型,例如粗粒度编码,可以高效地估计特征向量。根据问题类型,人们通常使用不同的特征向量(例如,对于周期函数,使用周期性的特征向量)。我们不会深入探讨线性特征向量的各种构造方法,但感兴趣的读者可以参考相关教材。至此,我们使用线性方法的整个分析框架就完整了。

非线性方法

对于许多有趣的用例,线性方法并不适用,因为它在可*似的函数类型上非常有限(毕竟是权重的线性组合)。

然而,像击败人类围棋冠军的AlphaGo这样的问题,就使用了神经网络来*似价值函数,即采用了非线性方法。同样,在人类反馈强化学*或推理模型(如DeepSeek使用的GRPO算法)等系统中,也广泛使用神经网络进行价值函数*似。神经网络是用于非线性函数*似的强大工具。

总结

本节课我们一起学*了价值函数*似的策略控制。我们回顾了从表格方法转向函数*似的必要性,并重点介绍了两种主要的*似方法:线性方法和非线性方法。线性方法通过简单的权重与特征向量相乘来构建价值函数,其梯度就是特征向量本身,从而导出了简洁的更新规则。然而,线性方法的表达能力有限。因此,对于更复杂的问题(如AlphaGo),我们转向使用神经网络等非线性方法,它们能够*似更复杂的函数关系,是当前强化学*领域的主流工具。

014:策略梯度方法

在本节课中,我们将要学*强化学*阶段的一个核心方法:策略梯度方法。我们将了解它为何重要,以及它如何直接优化策略本身,而不是像之前的方法那样通过价值函数间接优化。

在之前的几节课中,我们探讨了课程强化学*阶段的内容。这些内容都是为了理解如何为大型语言模型提供推理能力而做的铺垫。今天,我们离这个理解更*了一步。到目前为止,我们在强化学*阶段学*的所有概念,都将在今天关于策略梯度方法的章节中汇聚起来。

这一章对于理解如何利用强化学*赋予语言模型推理能力至关重要。所有语言模型中的强化学*应用都涉及策略梯度方法。它们是DeepSeek等模型中使用的策略或算法的核心,也是OpenAI的O1、O3等推理模型所用算法的核心。每一个使用了强化学*的推理LLM,都使用了策略梯度方法。因此,从理解推理LLM如何工作的角度来看,本节课极其重要。我们正稳步迈向理解强化学*究竟如何为大型语言模型提供推理能力的目标。

为何需要策略梯度方法?🤔

首先,让我们尝试理解为什么需要策略梯度方法。请记住,强化学*的目标是找到最优策略。到目前为止,我们学*的寻找最优策略的方法都大同小异。我们的做法是:观察一个特定状态S,假设在这个状态下有四个可能的动作A1、A2、A3和A4。然后我们说,要找出智能体在遵循这四个轨迹中的每一个之后,将获得的期望回报。接着我们为所有这四种情况计算这个期望回报,称之为Q1、Q2、Q3和Q4。然后我们据此制作一个表格:左边是动作,右边是智能体执行该动作后获得的期望回报。这里有四个动作A1、A2、A3、A4和四个不同的期望回报Q1、Q2、Q3、Q4。记住,这些也被称为动作价值。但为了从头解释,我将避免使用那个术语,只说期望回报。然后你要做的是对这四种回报进行排序,找出具有最高期望回报的值,假设是Q2,然后当智能体处于状态S时,你就选择动作A2。

为了首先得到这个表格本身,你可以使用多种算法,我们在过去已经看过一些算法,例如蒙特卡洛方法、时序差分法以及动态规划。我刚才写的内容,你可以看到是一种表格形式,这被称为表格化方法。在上一节课中我们看到,如果你有很多状态,那么使用表格就没有意义了,因为你会有一个巨大的表格,需要大量内存。国际象棋游戏有10^46个状态,因此你需要海量内存来以这种形式存储这个表格。所以,你转而做的是:构建一个函数,该函数以状态和动作为输入,并告诉我期望回报是多少。在许多情况下,正如我们在上一节课中看到的,这是一个神经网络。

在本节课中,我们不关注如何获得这些期望回报值,正如我所说,有两个大类:第一是表格化方法,第二是使用函数*似。但核心思想是,一旦你得到表格或函数,你就找到能给你最大期望回报的动作,然后智能体将执行该动作。这就是我们到目前为止一直在做的。

然而,这类方法在某种程度上是有用的,但它们并不直接评估策略。我们所做的是首先为每个动作计算一个数值,然后检查哪个数值最高。问题是,我们能否直接优化策略,而不是优化一个作为策略优化代理的函数?这正是策略梯度方法所做的。

因此,我们将逐步了解这些策略梯度方法究竟如何工作,以及它们与我们迄今为止一直固守的这种方法有何不同。

直接学*策略 🎯

现在,我们要做的是学*策略,即智能体必须遵循的最优策略,而不考虑动作价值函数,也就是不考虑这些Q值。所以我们要摆脱那个公式。让我们看看如何做到这一点。

首先,我们将用 π(a|s) 来表示我们的策略。这表示当智能体处于状态s时,采取动作a的概率。这意味着在状态s下选择动作a的概率。我们将在后续几节课中坚持使用这个符号,所以我希望你能对此感到适应。

然后,既然我们想要评估这个最优策略,我们将引入一个名为 θ 的参数。我们将策略写为 π(a|s; θ)。这被称为策略参数。我们引入策略参数θ的原因是,根据θ的值,我们的策略将会改变。因此,我们将用这个策略参数θ来表示策略,然后尝试找出能给我们最佳策略的θ值。这是一种对策略本身进行参数化的方式。

θ属于一个D维空间。例如,如果D=2,那么θ就是一个二维向量,我们可以将其写为[θ1, θ2];如果D=3,那么θ就变成[θ1, θ2, θ3]。

策略梯度方法的核心思想 💡

上一节我们介绍了策略参数化的概念,本节中我们来看看策略梯度方法的核心思想。策略梯度方法的目标是直接优化策略参数θ,以最大化智能体在整个任务中获得的期望总回报

我们定义一个目标函数 J(θ),它表示在策略π(θ)下,从起始状态开始的期望总回报。我们的目标就是找到使J(θ)最大化的θ值:

目标: max_θ J(θ)

为了最大化J(θ),我们可以使用梯度上升法。梯度上升是梯度下降的反向操作:我们沿着梯度方向更新参数,以增加目标函数的值。参数更新公式如下:

θ ← θ + α * ∇_θ J(θ)

其中,α是学*率,∇_θ J(θ) 是目标函数J关于参数θ的梯度。

关键在于如何计算这个梯度 ∇_θ J(θ)。策略梯度定理提供了一个优雅的解决方案。它指出,期望回报的梯度可以表示为期望的形式:

∇_θ J(θ) = E_π[ ∇_θ log π(a|s; θ) * Q^π(s, a) ]

这个公式就是策略梯度定理的核心。其中:

  • E_π[...] 表示在策略π下,关于状态和动作分布的期望。
  • ∇_θ log π(a|s; θ) 是策略的对数关于参数θ的梯度。
  • Q^π(s, a) 是在策略π下,在状态s采取动作a后的期望回报(即动作价值函数)。

这个公式的美妙之处在于,它允许我们通过采样轨迹(智能体在环境中实际运行的经验)来估计梯度。我们不需要知道环境的完整模型,只需要根据当前策略与环境交互,收集(s, a, r, s')这样的转移样本,然后使用这些样本来计算梯度的无偏估计。

策略梯度算法步骤 📝

理解了核心思想后,以下是实现一个基本策略梯度算法(如REINFORCE算法)的典型步骤:

  1. 初始化策略参数θ:随机初始化神经网络的权重或其他参数化策略的参数。
  2. 循环多轮(episodes)
    a. 根据当前策略π(θ)生成一条轨迹:让智能体从起始状态开始,根据π(a|s; θ)选择动作,与环境交互,直到回合结束,收集状态、动作和奖励序列:τ = (s0, a0, r1, s1, a1, r2, ..., sT)。
    b. 计算每个时间步的回报G_t:对于轨迹中的每个时间步t,计算从该步开始到回合结束的累积折扣回报:G_t = Σ_{k=t}^{T} γ^{k-t} * r_{k+1},其中γ是折扣因子。
    c. 计算梯度估计:对于轨迹中的每个时间步t,计算 ∇_θ log π(a_t|s_t; θ) * G_t。这里用实际获得的回报G_t来*似Q^π(s_t, a_t)。
    d. 更新策略参数:将所有时间步的梯度估计进行平均或求和,然后执行梯度上升更新:θ ← θ + α * Σ_t ∇_θ log π(a_t|s_t; θ) * G_t

通过重复这个过程,策略参数θ逐渐调整,使得产生更高回报的动作被选择的概率增加,从而优化策略。

策略梯度方法的优势与挑战 ⚖️

策略梯度方法相对于基于价值的方法(如Q-learning)有几个显著优势:

  • 直接优化目标:直接对期望回报进行优化,更自然。
  • 能处理随机策略:策略梯度可以学*随机策略(输出动作概率分布),这在某些需要探索或具有部分可观测性的环境中很重要。
  • 适用于连续动作空间:基于价值的方法在连续动作空间中难以处理最大化操作(max over actions),而策略梯度方法天然适合连续动作空间。
  • 更好的收敛性:在某些情况下,策略梯度方法具有更好的收敛保证。

然而,策略梯度方法也面临一些挑战:

  • 高方差:使用蒙特卡洛估计回报G_t会导致梯度估计的方差很高,使得训练不稳定且缓慢。
  • 样本效率低:通常需要大量样本(与环境交互的次数)才能学*到一个好的策略。
  • 局部最优:可能会收敛到局部最优策略而非全局最优。

为了应对高方差问题,后续发展出了许多改进算法,例如:

  • 使用基线(Baseline):从回报G_t中减去一个基线(如状态价值函数V(s)),减少方差而不引入偏差。这引出了优势函数A(s,a) = Q(s,a) - V(s) 的使用。
  • Actor-Critic方法:结合策略梯度(Actor)和价值函数*似(Critic)。Critic用来估计价值函数(作为基线或优势函数),指导Actor的更新。这是现代深度强化学*(如PPO、A3C)的基础,也是大型语言模型强化学*微调(如RLHF中的PPO)的核心。

总结 🎓

本节课中我们一起学*了强化学*中至关重要的策略梯度方法。我们从回顾基于价值的方法的局限性开始,引出了直接优化策略的必要性。我们学*了如何用参数θ表示策略,并定义了最大化期望回报J(θ)的目标。核心在于策略梯度定理,它给出了计算目标函数梯度的公式:∇_θ J(θ) = E_π[ ∇_θ log π(a|s; θ) * Q^π(s, a) ]。基于此,我们介绍了基本的REINFORCE算法步骤:采样轨迹、计算回报、估计梯度并更新参数。最后,我们讨论了策略梯度方法的优势(如处理连续动作、随机策略)和挑战(如高方差),并简要提到了通过使用基线和Actor-Critic框架等改进方法。策略梯度方法是连接强化学*与大型语言模型推理能力培养的桥梁,是理解如RLHF等关键技术的基础。在接下来的课程中,我们将看到这些方法如何具体应用于训练具有推理能力的LLM。

015:REINFORCE算法|强化学*阶段

在本节课中,我们将基于策略梯度定理,学*第一个利用该定理结果的算法——REINFORCE算法。我们将结合参数化策略的表达式和梯度上升算法,来寻找能最大化性能度量的策略参数。

上一节我们介绍了策略梯度定理,它告诉我们策略性能度量的梯度与状态分布、动作价值函数以及策略的梯度成正比。我们还了解到,这个梯度不涉及状态分布本身的梯度,这避免了繁琐的计算,为我们提供了一种计算性能度量梯度的简便方法。

梯度上升与策略更新

在梯度上升方法中,我们从非最优的策略参数点A开始,沿着梯度的方向缓慢上升,逐步向最优点B移动。每一步,我们都会根据当前策略参数处的梯度方向来更新参数。

具体更新规则如下:

θ_{t+1} = θ_t + α * ∇J(θ_t)

其中,θ_t是当前时间步的策略参数,α是学*率,∇J(θ_t)是性能度量Jθ_t处的梯度。这个更新确保我们朝着性能度量最大的方向移动。

策略梯度定理告诉我们,这个梯度与所有状态的状态分布、所有动作的动作价值函数以及策略梯度的乘积之和成正比。

从求和到期望

在REINFORCE算法中,我们将重点关注策略梯度定理中的求和符号。这些求和意味着对所有可能的状态和所有可能的动作进行求和。

我们将利用概率论中的期望概念来简化这个表达式。对于一个随机变量X,其每个可能结果x的概率为P(x),那么X的期望值E[X]计算公式为:

E[X] = Σ_x [ P(x) * x ]

类似地,函数f(X)的期望值为:

E[f(X)] = Σ_x [ P(x) * f(x) ]

在策略梯度定理的表达式中,状态分布μ(s)可以看作是智能体处于状态s的概率。因此,对状态s的求和Σ_s μ(s) * Y(s),实际上就是Y(s)在状态分布μ下的期望值E[Y(s)]

应用这个原理,策略梯度定理中的梯度可以重写为一个期望值的形式。这使我们能够用期望值内部的量作为梯度本身的*似。

REINFORCE算法更新规则

基于以上推导,策略参数的更新规则可以简化为:

θ_{t+1} = θ_t + α * Σ_a [ Q̂(s, a; w) * ∇π(a|s, θ) ]

这里,Q̂(s, a; w)是*似动作价值函数(由参数w参数化),∇π(a|s, θ)是策略π关于其参数θ的梯度。

这意味着,当智能体处于某个状态s时,它会计算所有可能动作a的*似动作价值,然后对这些值进行加权求和(权重是策略梯度的方向),并用这个结果来更新策略参数θ。我们之所以能用这个表达式直接替换梯度∇J(θ),是因为我们已经证明了它的期望值等于∇J(θ)

算法步骤概述

以下是REINFORCE算法的核心步骤:

  1. 初始化:随机初始化策略参数θ
  2. 生成轨迹:使用当前策略π(θ)与环境交互,生成一个完整的轨迹(状态、动作、奖励序列)。
  3. 计算回报:从轨迹的末端开始,反向计算每个时间步的动作价值估计(例如,使用蒙特卡洛回报)。
  4. 计算梯度:对于轨迹中的每个时间步,计算策略梯度∇ log π(a_t|s_t, θ)
  5. 参数更新:使用计算出的梯度更新策略参数:θ ← θ + α * G_t * ∇ log π(a_t|s_t, θ),其中G_t是从时间步t开始的累积回报。
  6. 重复:重复步骤2-5,直到策略收敛。

总结

本节课我们一起学*了REINFORCE算法。我们从策略梯度定理出发,通过引入期望的概念,将复杂的梯度求和表达式转化为更易于计算的期望形式。基于此,我们推导出了REINFORCE算法的核心更新规则,该规则使用采样得到的轨迹和*似价值函数来估计梯度,并通过梯度上升来优化策略参数。REINFORCE是一种经典的蒙特卡洛策略梯度方法,为后续更复杂的策略优化算法奠定了基础。

016:广义优势估计

在本节课中,我们将学*强化学*阶段的一个重要概念:广义优势估计。上一节我们介绍了策略梯度方法,本节我们将在此基础上,探讨如何更高效地估计优势函数,从而优化策略更新。

概述

策略梯度方法的核心是沿着性能指标 J(θ) 的梯度方向更新策略参数 θ,以最大化长期累积奖励。然而,直接计算梯度中的优势函数 Q(s, a) 通常方差较大,导致训练不稳定。广义优势估计提供了一种平衡偏差与方差的通用框架。

策略梯度方法回顾

首先,让我们快速回顾一下策略梯度方法。我们主要关注了两个步骤。

第一步是参数化策略。这意味着将策略 π(a|s)(即在状态 s 下采取动作 a 的概率)表示为带参数 θ 的函数 π_θ(a|s)。一个简单的参数化方式是使用基于偏好的Softmax函数。

第二步是定义并最大化性能指标 J(θ)。我们通常将其定义为初始状态 s_0 的价值函数 V_π(s_0),即从初始状态开始所获累积奖励的期望值。我们的目标是找到使 J(θ) 最大的参数 θ

为了最大化 J(θ),我们需要计算其关于 θ 的梯度 ∇J(θ),并使用梯度上升法更新参数:
θ_{t+1} = θ_t + α * ∇J(θ_t)

计算梯度的主要挑战在于,改变策略参数 θ 会同时影响状态分布和策略本身。然而,策略梯度定理告诉我们,梯度计算可以简化,无需考虑状态分布的变化,只关注策略本身的变化。最终,我们得到了一个可计算的梯度表达式。

广义优势估计的引入

上一节我们推导的策略梯度公式中,包含一个关键项:优势函数 A(s, a) = Q(s, a) - V(s)。它衡量了在状态 s 下采取特定动作 a 相对于平均水平的优劣。准确估计优势函数对于降低梯度方差至关重要。

直接估计 Q(s, a)A(s, a) 可能很困难且方差高。广义优势估计通过结合不同时间步的奖励估计,提供了一种更稳健的估计方法。

以下是GAE的核心思想:

  • n步回报:首先,我们可以定义n步回报来估计价值。n步回报结合了接下来n步的实际奖励和第n步之后的估计价值。
  • 优势函数混合:GAE的核心是将不同n值的n步优势估计进行指数加权平均。这允许我们在低偏差(小n)和低方差(大n)之间进行平滑的权衡。
  • 调节参数λ:GAE引入了一个参数 λ(取值范围[0,1]),用于控制不同n步估计的权重。λ=0 对应于仅使用一步优势估计(高偏差,低方差),λ=1 对应于使用蒙特卡洛回报直至终局(低偏差,高方差)。

广义优势估计 A^{GAE(γ, λ)} 的公式如下:
A^{GAE(γ, λ)}_t = Σ_{l=0}^{∞} (γλ)^l δ_{t+l}
其中,δ_t = r_t + γV(s_{t+1}) - V(s_t) 是时序差分误差,γ 是折扣因子。

GAE的优势与实现

使用GAE估计优势函数后,我们可以将其代入策略梯度公式。这通常能带来更稳定、更高效的策略学*。

在实践中,GAE常与演员-评论家算法结合使用。评论家网络用于估计状态价值函数 V(s),演员网络则代表策略 π_θ(a|s)。GAE利用评论家的价值估计来计算优势,进而指导演员网络的策略更新。

总结

本节课我们一起学*了广义优势估计。我们首先回顾了策略梯度方法及其梯度计算。接着,我们指出了直接估计优势函数的挑战,并引入了广义优势估计作为解决方案。GAE通过混合不同时间跨度的优势估计,并利用参数 λ 在偏差和方差之间取得平衡,从而为策略梯度提供了更优的更新信号。这构成了许多现代强化学*算法(如PPO、TRPO)的重要组成部分。

017:信赖域策略优化

欢迎来到“从零开始构建推理LLM”课程的今日讲座。在上一讲中,我们探讨了一个名为优势函数的函数。我们看到,优势函数表示状态-动作价值函数与状态价值函数之间的差值,其公式为 A(S, A) = Q(S, A) - V(S)。直观上,这意味着当前动作与策略默认行为相比是更好还是更差。

例如,从状态 S_t 出发,有多个可选动作。假设当前策略的默认行为是选择动作 a_0。接着,我们查看其他动作 a_1, a_2, a_3 的预期累积奖励。假设 a_0 的价值函数值是 50,而其他动作的预期奖励分别是 30、40 和 60。我们观察到,对于动作 a_3,其预期奖励高于智能体根据策略默认行为预期获得的奖励,这表明存在改进空间。这意味着当前策略并非最优,存在比智能体在该状态下选择的当前动作更好的动作。

这种直觉可以用优势函数的数学形式来表示。对于这些不同动作,优势函数值分别是 -20、-10 和 +10。因此,优势函数的符号告诉我们策略的最优程度或改进空间的大小,这也是它在许多策略梯度算法中流行的原因。

随后,我们学*了一种估计优势函数的方法,即使用广义优势估计。最简单的*似方法是使用时序差分目标来估计动作价值函数,即 A(S_t, A_t) ≈ R_t + γ * V(S_{t+1}) - V(S_t)。但这种估计可能存在偏差,因为它只使用了一个步骤的信息。因此,我们使用复合回报,结合一步、两步直至 n 步的备份,这正是广义优势估计的做法。为了理解后续内容,对这些概念有一个宏观层面的理解就足够了。

课程概述

在本节课中,我们将学*一种名为信赖域策略优化的技术。这篇论文发表于2015年,从那时起到2025年,包括PPO、GRPO(用于DeepSeek)在内的所有现代算法发展,都建立在TRPO论文的推导之上。它引入了一个非常重要的概念——信赖域,这是我们后续将看到的所有算法的核心。因此,理解信赖域策略优化对我们课程下一部分的学*至关重要。

需要强调的是,本节课与课程中的其他讲座略有不同,会涉及一些理论数学推导。然而,一旦你理解了这些数学内容,我们将探讨一些直观解释,以便即使你日后忘记了数学细节,直觉仍能保留。通常,理解数学能让我们在面对这些符号时更有信心,在阅读论文或查看其他算法时,能够识别出其中的信赖域概念。

核心问题与符号定义

我们首先从一些符号定义开始。我们将策略的性能度量记为 η(π)。请记住,我们之前用 J(θ) 表示它,现在改用 η(π) 的原因稍后会变得清晰。η(π) 的定义是智能体从初始状态 s_0 开始,预期获得的累积奖励之和的期望值,这也就是给定状态的价值函数的定义。这里我们只是将 J(θ) 改写为 η(π)

接下来我们要理解的核心问题是:假设存在另一个策略 π‘。我们整个讲座要回答的关键问题是:对于策略 π’,其性能度量 η(π‘) 能否用 η(π) 来表示?换句话说,我想了解一个策略的性能度量相比另一个策略是提高了还是降低了。我有两个策略 π 和 π‘,由于它们不同,其性能度量也会不同。现在的问题是,我能否用一个简单的数学方程写出这两个性能度量之间的差值,即 η(π’) - η(π)

性能差异的直观理解与公式推导

带着这个问题,并结合之前对优势函数的讨论,你能对 η(π‘) - η(π) 这个差值有一些直观的理解吗?或者思考一下这个项可能与什么成比例?让我们尝试理解这一点,然后再深入公式。

考虑一个状态。根据策略 π,假设它告诉我对于这个状态要采取动作 A。

现在,如果我们改用新策略 π‘,它可能会建议一个不同的动作。性能的差异本质上源于新策略在不同状态下选择不同动作所带来的累积优势(或劣势)。直观上,新策略 π‘ 的性能提升,可以看作是遵循 π’ 的轨迹时,所遇到的所有状态的优势函数(针对旧策略 π 计算)的期望值之和。因为优势函数衡量了特定动作相对于旧策略平均表现的优劣。

经过严谨推导(此处省略详细数学步骤),我们可以得到策略性能差异的精确公式:

η(π‘) = η(π) + E_{τ∼π‘} [ Σ_{t=0}^{∞} γ^t A_π(s_t, a_t) ]

其中,E_{τ∼π‘} 表示期望基于新策略 π‘ 采样得到的轨迹 τ,A_π(s_t, a_t) 是在状态 s_t 下执行动作 a_t 时,相对于旧策略 π 的优势函数。

这个公式非常强大,它将新策略的性能直接表达为旧策略性能加上一个修正项。这个修正项是新策略轨迹上优势函数期望的折扣和。如果新策略总是选择优势为正的动作,那么性能就会提升。

然而,直接优化这个公式是困难的,因为期望依赖于新策略 π‘ 来采样轨迹,而 π‘ 正是我们想要优化的对象。这引出了信赖域策略优化的核心思想。

信赖域策略优化核心思想

TRPO的核心思想是:在优化过程中,我们需要确保新策略 π‘ 不会偏离旧策略 π 太远。如果更新步幅太大,上述性能公式的估计可能不准确,导致实际性能反而下降。因此,我们需要一个“信赖域”,在这个区域内,我们对性能的*似是可靠的。

TRPO通过引入一个约束来实现这一点,即限制新旧策略之间的KL散度。KL散度衡量了两个概率分布(在这里是策略分布)的差异。优化问题被表述为:

在约束条件 D_KL(π || π‘) ≤ δ 下,最大化 η(π) + E_{τ∼π} [ Σ_{t=0}^{∞} γ^t A_π(s_t, a_t) * (π‘(a_t|s_t) / π(a_t|s_t)) ]

其中:

  • δ 是一个小的阈值,定义了信赖域的大小。
  • π‘(a_t|s_t) / π(a_t|s_t) 是重要性采样比率,用于将期望从依赖新策略 π‘ 采样,转换为依赖旧策略 π 采样(这样我们就可以用旧策略收集的数据来估计新策略的性能增益)。

这个约束确保了新策略与旧策略足够接*,从而保证在信赖域内,我们的目标函数*似是有效的。通过解决这个带约束的优化问题,我们可以稳定地、单调地改进策略性能。

算法步骤与总结

以下是TRPO算法的高级步骤:

  1. 使用当前策略 π 与环境交互,收集轨迹数据。
  2. 使用收集的数据,估计优势函数 A_π(s, a)
  3. 构建替代目标函数(即上述最大化目标),它使用重要性采样来估计新策略的性能提升。
  4. 求解带KL散度约束的优化问题,找到在信赖域内能使替代目标最大化的新策略参数。
  5. 用新策略参数更新策略,并重复过程。

本节课我们一起学*了信赖域策略优化。我们从回顾优势函数及其直观含义开始,引出了比较两个策略性能的核心问题。通过数学推导,我们得到了策略性能差异的公式。为了解决直接优化该公式的困难,TRPO引入了信赖域的概念,通过约束新旧策略之间的KL散度来确保更新的稳定性和单调性能提升。理解TRPO的理论基础,对于我们后续学*PPO等更现代的强化学*算法至关重要。

018:TRPO求解方法论

在本节课中,我们将学*如何求解上一节提出的带约束优化问题,以完成信任域策略优化算法的构建。我们将看到,最终的求解表达式将与基础的策略梯度方法非常相似。

概述

上一节我们介绍了信任域策略优化算法。我们从一个策略的性能度量目标函数 η(π) 开始,目标是找到最大化该性能的策略。我们推导出,新策略 π' 的性能 η(π') 可以用旧策略 π 的性能加上一个与优势函数和状态分布相关的项来表示。由于新策略的状态分布未知,我们转而优化一个替代目标函数 L_π(π'),并引入KL散度作为约束,确保新策略不会偏离旧策略太远。这最终将问题转化为一个带约束的优化问题:

最大化:L_π(π') = η(π) + Σ_s ρ_π(s) Σ_a π'(a|s) A_π(s, a)

约束条件:D_KL(π || π') ≤ δ

本节课,我们的核心任务就是求解这个优化问题。

简化目标函数

首先,我们来简化需要最大化的目标函数 L_π(π')

目标函数展开后包含两项:旧策略的性能 η(π) 和一项关于优势函数的加权和。其中,ρ_π(s) 是旧策略下的状态分布,A_π(s, a) 是旧策略下的优势函数。

L_π(π') = η(π) + Σ_s ρ_π(s) Σ_a π'(a|s) A_π(s, a)

由于 η(π) 是已知的常数,不依赖于待优化的新策略参数 θ',因此在最大化过程中可以忽略。我们的优化问题简化为:

最大化:Σ_s ρ_π(s) Σ_a π'(a|s) A_π(s, a)

约束条件:D_KL(π || π') ≤ δ

优势函数 A_π(s, a) 的含义至关重要。如果某个状态-动作对的优势值为正,意味着在该状态下存在比旧策略默认行为更好的动作。如果对所有状态,新策略选择的动作都能产生正优势,那么新策略的性能就会优于旧策略。这类似于动态规划中的策略改进步骤。

处理约束:拉格朗日乘子法

现在我们面临一个带不等式约束的最大化问题。一个标准的求解方法是使用拉格朗日乘子法。

我们可以将约束优化问题转化为一个无约束的拉格朗日函数来求解。引入拉格朗日乘子 λ,构造如下拉格朗日函数 L(θ', λ)

L(θ', λ) = Σ_s ρ_π(s) Σ_a π'(a|s) A_π(s, a) - λ * (D_KL(π || π') - δ)

我们的目标是找到 θ'λ,使得 L(θ', λ) 最大化,同时满足 λ ≥ 0 以及原约束条件(互补松弛条件)。

然而,直接精确求解这个优化问题计算量很大,因为它需要对所有状态和动作求和,并且涉及复杂的KL散度计算。

*似与简化:单步策略梯度

为了得到实用的算法,我们需要进行*似。关键的一步是注意到,当新旧策略非常接*时(这正是KL散度约束所保证的),我们可以做出一系列简化。

  1. 状态分布*似:当 π' 接* π 时,ρ_π'(s)ρ_π(s) 也接*。在目标函数中,我们原本使用了 ρ_π(s),这已经是一个合理的*似。
  2. 目标函数局部*似:在 θ(旧策略参数)附*对目标函数进行一阶泰勒展开。其梯度恰好就是策略梯度!
    ∇_{θ'} [Σ_s ρ_π(s) Σ_a π'(a|s) A_π(s, a)] |_{θ'=θ} = ∇_θ η(π)
    这正是我们之前推导的策略梯度定理的结果。
  3. 约束函数局部*似:同样,在 θ 附*对KL散度约束进行二阶泰勒展开。可以证明,KL散度在 θ' = θ 处的一阶导数为零,因此其主要贡献来自二阶项(即费舍尔信息矩阵 F)。
    D_KL(π_θ || π_{θ'}) ≈ 1/2 * (θ' - θ)^T * F(θ) * (θ' - θ)

将这些*似代入原问题,我们得到一个大大简化后的优化问题:

最大化:g^T * (θ' - θ)
约束条件:1/2 * (θ' - θ)^T * F(θ) * (θ' - θ) ≤ δ

其中,g = ∇_θ η(π) 是策略梯度,F(θ) 是费舍尔信息矩阵。

求解*似问题

现在,我们有一个在局部二次*似下的约束优化问题。这是一个经典的二次型在线性约束下的优化问题,其解具有解析形式。

利用拉格朗日乘子法求解上述*似问题,可以得到参数更新步长 Δθ 的表达式:

θ' = θ + α * F(θ)^{-1} * g

其中,α 是一个与约束边界 δ 和梯度、费舍尔信息矩阵相关的步长系数,通常通过线性搜索确定。这个更新公式被称为自然策略梯度TRPO的*似更新规则

这个形式非常优美且富有启发性:

  • F(θ)^{-1} * g 被称为自然梯度。它不仅考虑了性能提升的方向(g),还考虑了参数空间的曲率(通过 F(θ)^{-1})。
  • 与普通的策略梯度更新 θ' = θ + β * g 相比,自然梯度通过 F(θ)^{-1} 对更新进行了缩放,使其在概率分布的流形上遵循最速上升方向,而不是在原始的欧几里得参数空间。这通常能带来更稳定、更高效的更新。

与策略梯度的联系

现在我们可以看到TRPO与原始策略梯度方法的深刻联系。原始的REINFORCE或策略梯度算法直接沿着 g 的方向更新。而TRPO通过理论推导,引入了信任域约束,最终导出的更新方向是自然梯度 F^{-1}g

这解释了为什么我们要经历复杂的推导过程:虽然最终更新式看起来像是策略梯度加了一个“预处理矩阵”,但信任域的推导为我们提供了坚实的理论保证(单调改进性),并指导我们如何设置步长 α 以确保约束被满足,从而在实践中带来更稳定的训练。

总结

本节课中,我们一起学*了TRPO算法的求解方法论。我们从带KL散度约束的优化问题出发,通过拉格朗日乘子法将其转化为无约束形式。为了实际求解,我们在当前策略参数点对目标和约束进行了局部*似(一阶泰勒展开用于目标,二阶泰勒展开用于KL散度),从而将问题简化为一个可解析求解的二次规划问题。最终,我们推导出了参数更新规则:θ' = θ + α * F(θ)^{-1} * g,即沿着自然梯度方向更新。这个结果将TRPO与基础的策略梯度方法清晰地联系起来,并揭示了通过引入信任域约束,算法如何获得更稳定、理论保证更强的策略更新方式。

019:40分钟详解GRPO 🚀

在本节课中,我们将学*GRPO算法。GRPO是一种强化学*算法,被DeepSeek等团队用于训练模型。我们将从经典的强化学*概念出发,逐步构建对GRPO的理解,并解释它为何在构建推理大语言模型时如此有效和流行。

经典强化学*基础

上一节我们介绍了课程目标,本节中我们来看看强化学*的基本框架。

在典型的强化学*问题中,我们有一个智能体和一个环境。智能体与环境进行交互。

以下是强化学*中常用的核心概念:

  • 状态:智能体所处的特定情况。例如,一个在房间内移动的机器人。
  • 动作:智能体在特定状态下可以执行的操作。例如,机器人移动或返回充电站。
  • 奖励:环境根据智能体的动作给予的反馈。例如,机器人收集垃圾获得正奖励,电池耗尽获得负奖励。

任何强化学*问题都可以用这三个变量来描述。以国际象棋为例:

  • 状态 = 棋盘上棋子的当前布局。
  • 动作 = 移动棋子。
  • 奖励 = 赢棋得+1,输棋得-1。

这就是典型的智能体-环境交互界面。

大语言模型中的强化学*

上一节我们了解了经典框架,本节中我们来看看如何将其应用于大语言模型。

主要问题是:如果将强化学*应用于大语言模型,状态、动作和奖励分别是什么?

首先,在大语言模型中:

  • 智能体 是LLM本身(如DeepSeek、GPT等)。
  • 环境 是LLM交互的对象,可以是Python解释器、数据集或人类。本质上,环境是在你输入提示后给出答案的东西。

让我们通过一个例子来理解状态和动作。

示例提示Roger has five tennis balls, and he buys two more cans of tennis balls, each can has three tennis balls each. How many tennis balls does Roger have now?
我们知道答案是 5 + 2 * 3 = 11

以下是状态和动作的分解过程:

  1. 初始状态 S0:提示文本本身。
  2. 动作 A0:LLM输出第一个词元,例如 Roger
  3. 新状态 S1S0 + A0(即提示 + Roger)。
  4. 动作 A1:LLM基于S1输出下一个词元,例如 has
  5. 此过程持续进行,依次输出 11tennisballs,直到答案完成。

所以,状态是不断增长的文本序列(之前的输出 + 新的输入),动作是LLM在每一步预测的下一个词元。

那么奖励呢?这与经典强化学*有显著不同。

在传统强化学*中,智能体每执行一个动作通常会获得奖励。但在大语言模型中,在生成完整答案之前,奖励始终为0。只有当答案完全生成后,我们才能判断其正确性,并给予最终奖励(例如,答案正确为+1,错误为0)。

这意味着,LLM需要经历一长串状态和动作(可能非常长),最终只获得一个稀疏的奖励信号。然后,无论奖励是正还是负,我们都必须沿着这整个生成链回溯,来更新LLM的权重。这是一个巨大的挑战。

核心挑战与GRPO的引入

上一节我们看到了LLM中强化学*的独特之处,本节中我们来看看其中的核心挑战。

主要挑战在于:如何根据最终稀疏的奖励信号,有效地更新生成长序列的模型?

如果答案很长,追溯整个链条并计算每个决策的贡献会非常复杂和低效。这就是GRPO等算法要解决的核心问题。

总结

本节课中我们一起学*了:

  1. 强化学*基础:理解了智能体、环境、状态、动作和奖励的概念。
  2. LLM中的强化学*:将LLM视为智能体,其生成过程视为一系列状态和动作,并认识到奖励的稀疏性(仅在答案完成后给出)。
  3. 核心挑战:指出了基于稀疏奖励更新长序列生成模型的困难,这引出了对GRPO等高效算法的需求。

在接下来的课程中,我们将深入GRPO算法本身,看它如何巧妙地解决这些挑战。

020:*端策略优化(PPO)

在本节课中,我们将学*一个名为*端策略优化的新算法。该算法是基于人类反馈的强化学*的核心。我们将从上一节介绍的信任区域策略优化出发,理解PPO算法的由来。

概述

在之前的课程中,我们学*了策略梯度方法。其核心是优化策略的性能度量。性能度量的梯度表达式为:

公式: ∇J(θ) = E[∇ log π(a|s) * A(s, a)]

其中,A(s, a) 是优势函数估计,它衡量了在状态s下采取动作a相比策略的平均表现是好是坏。如果优势为正,我们希望加强该动作;如果为负,则希望抑制它。

一个梯度为上述表达式的目标函数可以写作:

公式: L(θ) = E[log π(a|s) * A(s, a)]

这个函数描述了我们在参数空间中要攀登的“性能山峰”。然而,在实践中,人们发现直接使用这个目标函数进行优化并不稳定。

从信任区域方法到PPO

为了解决稳定性问题,研究者引入了信任区域方法。这类方法在优化目标函数的同时,对策略的更新幅度施加了约束,防止新策略偏离旧策略太远。

其核心是一个带约束的优化问题:

目标: 最大化替代目标函数 L(θ) = E[(π_θ(a|s) / π_θ_old(a|s)) * A(s, a)]
约束: D_KL(π_θ_old || π_θ) ≤ δ

这里,D_KL 是KL散度,用于衡量新旧策略之间的差异,δ 是一个小常数,定义了信任区域的大小。

这个约束优化问题计算复杂,尤其是涉及矩阵求逆,非常耗时。因此,人们开始思考:能否找到一种方法,既具备信任区域方法限制大幅更新的优点,又像普通策略梯度方法那样简单易实现

这个问题的答案就是*端策略优化算法。

PPO的核心:裁剪替代目标函数

PPO通过一个巧妙的技巧来*似实现信任区域的效果,而无需解决复杂的约束优化问题。首先,我们定义一个比率:

公式: r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)

这个比率 r_t(θ) 衡量了新策略相对于旧策略的变化程度。如果比率远大于1,说明新策略显著增加了该动作的概率;如果比率远小于1,则说明新策略显著降低了该动作的概率。

PPO的裁剪替代目标函数定义如下:

公式: L^CLIP(θ) = E[ min( r_t(θ) * A_t, clip(r_t(θ), 1-ε, 1+ε) * A_t ) ]

让我们来分解这个公式:

  1. 未裁剪部分r_t(θ) * A_t。这就是TRPO中替代目标函数的核心部分。
  2. 裁剪操作clip(r_t(θ), 1-ε, 1+ε)。这个函数将比率 r_t(θ) 限制在区间 [1-ε, 1+ε] 内。ε 是一个超参数(例如0.2)。
    • 如果 r_t(θ) > 1+ε,它被裁剪为 1+ε
    • 如果 r_t(θ) < 1-ε,它被裁剪为 1-ε
    • 否则,保持不变。
  3. 取最小值:最终目标函数是未裁剪项裁剪项中的较小值。

这个设计非常精妙:

  • 当优势函数 A_t 为正时,我们希望增加 r_t(θ)。但通过取 min,即使未裁剪项很大,目标函数值也会被裁剪项限制住,从而防止策略更新过大(即 r_t(θ) 变得远大于1)。
  • 当优势函数 A_t 为负时,我们希望减小 r_t(θ)。同样,取 min 操作会确保目标函数值由裁剪项主导,防止策略更新过大(即 r_t(θ) 变得远小于1)。

代码描述:

def ppo_clip_loss(r_t, A_t, epsilon=0.2):
    # r_t: 策略比率 (pi_new / pi_old)
    # A_t: 优势函数估计值
    # epsilon: 裁剪参数

    unclipped = r_t * A_t
    clipped = torch.clamp(r_t, 1-epsilon, 1+epsilon) * A_t

    loss = -torch.min(unclipped, clipped).mean() # 取负号是因为我们要最大化目标,但优化器通常最小化损失
    return loss

通过这种裁剪机制,PPO在鼓励策略向好的方向更新的同时,自然地将新策略约束在旧策略的邻域内,无需显式地计算KL散度约束。它获得了信任区域方法的稳定性,同时保持了算法实现的简洁性。

总结

本节课我们一起学*了*端策略优化算法。我们从标准的策略梯度方法出发,指出了其训练不稳定的问题。接着,我们回顾了通过引入KL散度约束来稳定训练的信任区域方法,并指出了其计算复杂的缺点。最后,我们重点讲解了PPO算法如何通过裁剪替代目标函数这一创新设计,巧妙地结合了两种方法的优点:它使用比率裁剪机制隐式地限制了策略的更新幅度,从而实现了稳定训练,同时其算法形式简单,易于实现和调优,这使其成为现代强化学*,特别是RLHF领域最流行的算法之一。

021:在LLM中应用强化学*|强化学*阶段|推理

在本节课中,我们将学*如何将强化学*应用于大型语言模型。我们将探讨如何将LLM的文本生成过程建模为强化学*问题,并理解其中的状态、动作和奖励机制。

到目前为止,我们已经探讨了强化学*的含义,回顾了经典的表格方法,并学*了如何处理状态空间巨大的情况,即使用函数逼*方法。随后,我们深入研究了策略梯度方法,该方法旨在直接寻找最优策略,而非通过动作价值函数间接优化。

在策略梯度方法中,我们首先学*了策略梯度定理,它允许我们计算性能指标的梯度。这为后续所有方法奠定了基础。我们首先学*了第一个策略梯度算法——REINFORCE算法。接着,我们探讨了演员-评论家方法,该方法从蒙特卡洛回报中减去一个基线,这个基线可以是价值函数本身。

之后,我们研究了如何修改这些策略梯度方法,以限制新策略与旧策略或基础策略之间的偏离。第一个引入此思想的算法是信任区域策略优化。它指出,虽然策略梯度方法有效,但如果不加以限制,策略更新可能导致学*过程不稳定。TRPO通过施加策略变化的约束来解决这个问题。

在TRPO的基础上,我们学*了*端策略优化。PPO认为TRPO的计算较为复杂,涉及难以计算的矩阵求逆。因此,PPO旨在结合普通策略梯度方法的简单性和TRPO引入的信任区域约束。PPO本质上使用一个裁剪函数来限制策略与基础策略的偏离,但避免了KL散度计算,使得计算大大简化。

如果您尚未学*这些内容,建议回顾之前讨论PPO和TRPO的三节课。

现在,我们的课程进入一个转折点。此前,我们一直在讨论作为通用方法的强化学*。接下来,我们将理解如何将这种方法应用于大型语言模型。

如何利用强化学*改进LLM本身就是一个极其有趣的问题。因为乍看之下,LLM并不明显能被表示为强化学*问题。原因在于,在强化学*中,有一个智能体与环境交互、接收奖励并改进。但LLM如何能表示为强化学*问题呢?最初思考这个概念时,我也感到困惑,甚至难以理解其中的状态、动作、策略和环境分别是什么。

然而,后来这变得非常清晰。尽管不那么直观,但将LLM建模为智能体-环境交互界面是直接可行的。现在,我将通过幻灯片帮助您理解如何将大型语言模型表示为强化学*问题。

在典型的强化学*设置中,有一个智能体执行动作,并从环境接收奖励。在智能体执行任何动作之前,它拥有一个特定的信息,称为状态。根据状态或接收到的信息,智能体采取动作并接收奖励。这就是智能体-环境交互界面。

现在的问题是,如何将其适配到大型语言模型?我们将具体看看状态和动作是什么。

首先,这里的智能体就是LLM本身。大型语言模型接收一些信息作为状态,这些信息可以来自用户或Python解释器。然后,动作是大型语言模型预测的下一个词

让我们考虑一个具体例子。提示词是:“Roger有五个网球,他又买了两罐网球,每罐有三个网球。问题:Roger现在有多少个网球?”

智能体接收到的信息是提示词,因此第一个状态 S0 就是提示词本身。智能体接收此信息后,将采取一个动作,即预测下一个词。这里,智能体预测的下一个词是“Roger”。

然后,“Roger”被传递回环境,信息被更新。现在LLM拥有初始提示词和“Roger”,因此它采取的下一个动作是“has”。以此类推,您可以完成所有状态:状态 S0 是提示词;状态 S1 是 S0 + “Roger”;状态 S2 是 S1 + “has”;状态 S3 是 S2 + “11”;状态 S4 是 S3 + “tennis”。本质上,智能体采取的任何动作,都会被添加到LLM在下一轮迭代中接收的信息中。

因此,这就像一个迭代问题:智能体从状态 S0 开始,采取动作 a0,转移到状态 S1,采取动作 a1,转移到状态 S2,等等。我们在这里所做的是,将答案补全过程建模为一个智能体-环境交互界面,其中智能体是LLM本身,答案补全过程用状态和动作来描述。

状态是LLM到当前迭代为止已完成的所有词或标记的信息。动作是LLM预测的下一个标记或词。通过这种方式,答案补全可以被视为一系列状态-动作转换。

本节课中,我们一起学*了如何将大型语言模型的文本生成过程框架化为一个强化学*问题。我们明确了LLM作为智能体,其生成的下一个词作为动作,而不断累积的生成文本则构成了状态。这为后续应用PPO等强化学*算法来优化LLM的生成策略奠定了理论基础。

022:GRPO|强化学*阶段

在本节课中,我们将要学*GRPO算法。这是首个成功利用强化学*在大语言模型中诱导推理能力的算法,它建立了强化学*与推理之间的关键联系。

概述

我们正处于完成课程中强化学*阶段的最后部分。现在,我们来到了一个非常关键的节点,将探讨首个利用强化学*在大语言模型中诱导推理能力的算法——GRPO。在GRPO发布之前,强化学*主要用于根据人类偏好对齐大语言模型,但强化学*与推理之间并无实质联系。这一联系是在GRPO算法发布后才得以建立。本节课,我们将理解GRPO的独特之处,以及它为何成为构建大型推理模型的标准方法。

强化学*框架下的LLM回顾

上一节我们介绍了如何将大语言模型表示为智能体-环境交互的强化学*框架,包括状态、动作、奖励和策略。现在,我们快速回顾一下。

考虑这个例子:提示是“Roger has five tennis balls he buys two more cans of tennis balls. Each can has three tennis balls, how many tennis balls does he have now.”,答案是“Roger has 11 tennis balls”。

答案本身可以被视为一系列状态和动作。第一个状态S0是LLM接收到的提示信息。之后,LLM采取一个动作,输出“Roger”。接着,状态更新为包含提示和“Roger”。LLM的下一个动作是输出“has”,这个过程持续到句子完成。

我们理解了状态和动作。那么奖励呢?在大语言模型中,奖励可以是主观的,也可以是客观的。例如,如果要求“写一首诗”,不同的人对同一首诗可能有不同看法。因此,LLM没有标准化的奖励。人们通常使用奖励模型,这些模型基于人类偏好数据进行训练。在ChatGPT等应用中,系统会尝试理解我们更喜欢哪个回复,这些数据被用来训练奖励模型以理解人类偏好。

关于策略,其定义是告诉智能体在给定状态下应采取哪个动作。根据我们对状态和动作的表示,我们的策略就是LLM本身。因为从定义上讲,LLM是一个被训练来预测下一个词概率的模型。因此,这是一个智能体与策略相同的特例。

关键符号定义

现在,我们来理解上一节讨论过的一些符号表示。

  • 提示:记为 x,由一系列词元 x1, x2, ..., xp 组成。
  • 补全/输出:记为 y,是大语言模型针对给定提示生成的输出文本。
  • 策略:记为 π_θ,即LLM本身。因为LLM被训练来预测下一个词,并给出在给定序列后出现概率最大的词。

本质上,整个步骤可以这样表示:模型接收状态(即LLM输出的信息)。假设接收到状态S1(提示和“Roger”),它需要预测下一个词。我们的策略是LLM,它为我们提供所有动作的概率。我们知道“has”的概率最大,因此我们得到的输出是“Roger has”。

这可以表示为 π_θ(y2 | x, y1),其中 x 是提示,y1 是之前的输出“Roger”。对于序列中遇到的所有状态,在完整答案生成之前,我们都进行此操作。第二个词元预测的概率分布由策略 π_θ 给出。第 t 个词元预测的策略符号为 π_θ(yt | x, y<t),其中 y<t 是此时已生成的所有输出词元。

例如,如果我们需要在“Roger has”之后进行预测,即 y3 给定 x, y1, y2,其中 y1 是“Roger”,y2 是“has”,那么 y3 将是“11”,此时概率分布会不同,“11”将具有最大概率。

*端策略优化在LLM中的应用

现在的问题是,我们如何将目前学到的算法应用于这种表示为智能体-环境交互的大语言模型?我们首先来看*端策略优化,以及它究竟如何应用于微调大语言模型。

还记得PPO目标函数的作用吗?PPO告诉我们,你有一个给定的策略,需要根据获得的奖励来改进它。它构建了一个目标函数,以不允许策略与旧策略偏离太多。因此,它引入了一个裁剪操作,防止策略与旧策略产生过大偏差。

如果你现在不记得这个公式也没关系,我们来理解其背后的直觉。假设你处在这个参数空间 θ1θ2 中。在策略梯度方法中,你试图做的是:你有一个由某个动作(例如 π(y2 | x, y1))给出的曲面。假设我们位于此处。如果奖励是正的,那么我想沿着这个曲面上山以最大化这个概率;如果奖励是负的,我想下山。是上山还是下山,以及如何沿着这座山移动,由沿着该轨迹的梯度给出。因此,这个项应该包含梯度 ∇_θ。我们使用梯度上升方法来上山或下山。

这些是普通的策略梯度方法。PPO所做的就是:PPO说,你可以根据梯度的符号上山或下山,但不允许更新超出这个区域。如果更新超出,就裁剪它,不要让策略更新变得太大。它施加了一个界限,以稳定策略的训练过程。这就是裁剪操作的作用,它本质上裁剪了你的目标。

普通策略梯度的目标实际上看起来像这样:(π_θ / π_θ_old) * A_t,其中 A_t 表示优势函数。而PPO所做的就是在这里施加一个裁剪函数,除此之外与普通策略梯度非常相似。

总结

本节课我们一起学*了GRPO算法的重要性及其出现的背景。我们回顾了如何将大语言模型置于强化学*框架下,定义了关键的状态、动作、奖励和策略。我们还探讨了*端策略优化算法如何通过引入裁剪操作来稳定大语言模型的训练过程,防止策略更新过大,这为理解GRPO算法奠定了基础。在接下来的课程中,我们将深入GRPO算法本身,看看它如何具体实现推理能力的诱导。

023:使用GRPO构建你的第一个推理模型

概述

在本节课中,我们将学*如何将GRPO强化学*算法与推理大语言模型连接起来。我们将回顾课程目标,理解DeepSeek R0模型如何利用GRPO和可验证奖励来构建推理能力,并最终了解如何将一个非推理模型转化为推理模型。

课程回顾与目标

我们已经完成了大约20节课,即将结束专注于纯强化学*的第二个章节。在开始第二章节的最后一课之前,让我们快速回顾一下本课程开始时设定的目标。

本课程的目标是理解推理模型如何工作以及如何构建它们。我们看到构建推理模型有四种主要方法。第一种是推理时计算扩展,我们的前三节课专门讨论了这种方法。

第二种方法是使用纯强化学*,接下来的15到16节课都致力于此。我们从经典强化学*基础,学*到现代强化学*算法,如TRPO、PPO和GRPO。

然而,我们尚未建立GRPO与推理模型之间的联系。这个联系在我们目前的方法中是缺失的。在今天的课程中,我们将搭建GRPO与推理模型之间的桥梁。这将标志着专注于纯强化学*的第二个模块的完成。

最后,我们还将看到如何通过使用GRPO技术,将一个非推理模型转化为推理模型,从而构建我们自己的推理模型。通过这个过程,我们将看到强化学*的力量与美妙。

连接GRPO与推理模型

现在,让我们深入本节课。今天的主要目标是建立GRPO与推理模型之间的联系。我们在本课程强化学*阶段所看到的一切,最终都是为了这节课做铺垫。

这个联系首次在2025年1月DeepSeek R论文发表时建立。这篇论文于1月22日发布,彻底改变了大语言模型的开发进程。此后,推理模型的进展非常迅速,一个接一个的新模型不断涌现,因为DeepSeek R为设计推理模型提供了一个蓝图。

在DeepSeek R1之前,他们推出的第一个模型是DeepSeek R0。这个模型有趣的部分在于,它使用GRPO作为强化学*算法,并且没有使用任何监督训练样本。这一点为什么重要,稍后会变得清晰,但请记住,DeepSeek R0使用了纯强化学*,而没有依赖可以用于微调模型的训练输入输出对。

GRPO流程回顾

以下是GRPO流程。请记住,从上节课我们了解到,我们移除了价值函数模型。大语言模型给出不同的输出,采样多个输出,这些输出用于计算个体奖励,最终优势值直接从这些奖励中计算得出,我们不需要单独的价值函数模型。因此,GRPO流程的简洁性非常吸引人。

注意,这里我们仍然需要一个奖励模型来估计奖励。在开发DeepSeek R0时提出的问题是:我们能否也摆脱奖励模型?我们已经摆脱了价值函数模型,能否也摆脱奖励模型?答案是肯定的。

他们通过使用不需要模型、但可以通过外部工具验证的奖励,摆脱了奖励模型。这是什么意思?想象这个例子:我们给出输入“计算5乘以3加4”,我们的大语言模型给出答案“35”。为了交叉验证这个答案是否正确,你不需要一个基于输入输出数据训练的奖励模型,你可以简单地通过计算器验证,看看答案是否正确。

对于编码示例也是如此,如果你有一个要求对这些数字进行排序的输入,并且你编写了代码,你不需要奖励模型来验证代码是否正确。该论文使用LeetCode编译器来检查答案是否正确。因此,通过使用外部工具,我们可以获得客观的、具有特定值的奖励,其中没有主观性,我们不需要为这些数据训练奖励模型。

在没有奖励模型的情况下,修改后的GRPO流程如下所示。现在我们既没有价值函数,也没有奖励模型。因此,通过消除对单独奖励模型的需求,这个过程变得更加简单。

DeepSeek R0的创新

这就是DeepSeek R0中使用的流程,但他们在此基础上增加了一个额外元素。除了这些用计算器、LeetCode编译器检查的准确性奖励外,他们还添加了所谓的格式奖励。

添加格式奖励是为了确保模型的“思考”过程被强制放在特定的标签内。因此,如果模型给出的答案没有包含思考标签,它就会受到惩罚,即获得负奖励。这样,模型就学会了提供能适应这些标签的答案。这些被称为格式奖励。

在DeepSeek R0中,强化学*算法是GRPO,奖励分为两种类型:第一种是针对可通过工具验证的准确性奖励;第二种是格式奖励。这个过程也被称为RLVR,即可验证奖励强化学*。

训练模板

在此之后,他们又增加了一个元素:训练模板。训练模板内容如下:用户和助手之间的对话。用户提出问题,助手解决问题。助手首先在脑海中思考推理过程,然后向用户提供答案。推理过程和答案分别包含在`` <answer> 答案 </answer>。因此,我们基本上是给出了一个训练模板,并要求我们的模型在编写答案时遵循此模板。我们没有告诉它如何思考,而是给出了一个更广泛的训练模板。我们只是告诉模型:首先在脑海中思考推理过程,然后给用户答案,并确保答案的格式正确。

这就是DeepSeek R0的训练模板。本质上,他们引入了三样东西:第一,他们摆脱了奖励模型;第二,他们引入了格式奖励;第三,他们添加了训练模板。其核心是用于计算优势值的GRPO算法。

核心发现

那么,这有什么特别之处呢?事实证明,随着训练的进行,模型的推理能力会自主提高。

总结

本节课中,我们一起学*了如何将GRPO算法应用于构建推理大语言模型。我们探讨了DeepSeek R0如何通过结合GRPO、可验证的客观奖励(如计算器验证)和格式奖励,在没有监督数据的情况下,引导模型自主发展出链式推理能力。关键在于利用外部工具提供奖励信号,并通过训练模板规范模型的输出格式。这标志着我们纯强化学*模块的完成,并为理解现代推理模型的构建原理奠定了坚实基础。

posted @ 2026-03-26 12:20  布客飞龙III  阅读(6)  评论(0)    收藏  举报