UCLA-大语言模型的强化学习笔记-全-
UCLA 大语言模型的强化学习笔记(全)
001:课程大纲与序言 🎬
在本节课中,我们将学习UCLA《大语言模型的强化学习》课程的整体框架,并通过一个引人深思的序言,探讨强化学习在当今AI发展中的关键作用。


大家好,我是Ernest View,是加州大学洛杉矶分校的一名教授。这是我在2025年春季讲授的《大语言模型的强化学习》系列讲座的重录版本。
课程背景与计划 📋




首先,我来介绍一下课程背景。我期望观看这些视频的学生或观众对深度学习有基本的了解,例如图像分类的级别。我希望你们理解如何使用反向传播、随机梯度下降和Adam优化器等概念。本课程不预设任何关于强化学习或大语言模型的前置知识。



对于深度强化学习的讲座,学生或观众应熟悉条件期望、塔性质或全期望定律等概念。



以下是本课程的四讲计划:
- 序言:即本视频。
- 第一章:介绍深度强化学习,涵盖马尔可夫决策过程的基本定义,以及PPO和GRPO类型的策略优化算法。
- 第二章:快速概述大语言模型。我们将从自然语言处理的基本概念开始,涵盖基于Transformer的现代语言模型及其预训练过程。
- 第三章:本课程的核心主题——大语言模型的强化学习。我将讨论基于人类反馈的强化学习,以及基于可验证奖励的强化学习。

现在,让我们从题为“强化学习与AI之夏”的序言开始。









苦涩的教训:计算的力量 💡


理查德·萨顿是强化学习的奠基人之一。他与安德鲁·巴托合著了著名的《强化学习》一书,在强化学习和机器学习社区中备受尊敬,最近还获得了图灵奖。可以说,萨顿是一位著名且受人尊敬的研究者。



在他的文章《苦涩的教训》中,萨顿阐述了现代深度学习的一个关键原则,这是任何从事AI领域工作的人都必读的文章。


苦涩的教训
从70年的人工智能研究中可以汲取的最大教训是,利用计算的通用方法最终是最有效的,而且优势巨大。其根本原因在于摩尔定律,或者更广义地说,是单位计算成本持续呈指数级下降的规律。大多数人工智能研究都是在假设智能体可用的计算能力恒定的情况下进行的,在这种情况下,利用人类知识将是提高性能的唯一途径。但在比典型研究项目稍长的时间里,更多的计算能力不可避免地变得可用。为了寻求能在短期内带来显著改进的方法,研究人员试图利用他们对领域的人类知识。但从长远来看,唯一重要的是对计算的利用。这两者本不必相互冲突,但在实践中往往如此。花在一种方法上的时间,就是没有花在另一种方法上的时间。人们对某种方法有心理上的投入。
基于人类知识的方法往往会以使其不太适合利用通用计算方法的复杂方式来设计方法。有许多人工智能研究者迟来地学到这一苦涩教训的例子,回顾其中一些最突出的案例很有启发性。


在计算机国际象棋领域,1997年击败世界冠军卡斯帕罗夫的方法是基于大规模深度搜索。当时,大多数计算机国际象棋研究者对此感到沮丧,他们曾致力于利用人类对国际象棋特殊结构的理解的方法。当一种基于特殊硬件和软件的、更简单的搜索方法被证明远比他们的方法更有效时,这些基于人类知识的国际象棋研究者并不服输。他们说,蛮力搜索这次可能赢了,但这不是一个通用策略,而且这也不是人类下棋的方式。这些研究者希望基于人类输入的方法获胜,当这些方法没有获胜时,他们感到失望。
但让我指出其中的讽刺之处:搜索,无论是否被称为蛮力,实际上是一种通用策略。因此,计算机国际象棋研究者的这种误判,或许正是理查德·萨顿试图警告我们警惕的心理盲点。




在计算机围棋领域,也看到了类似的研究进展模式。搜索和学习是利用AI研究中大量计算的两类最重要的技术。在计算机围棋中,如同在国际象棋中一样,研究者最初的努力方向是利用人类理解,以减少所需的搜索量。直到很久以后,通过拥抱搜索和学习,才取得了更大的成功。这里对“搜索”一词的强调是我加的。

在语音识别、计算机视觉等领域,也存在类似的模式。这是一个深刻的教训。作为一个领域,我们仍未彻底吸取这个教训,因为我们仍在继续犯同样的错误。要看清这一点并有效抵制它,我们必须理解这些错误的吸引力。我们必须吸取这个苦涩的教训:将我们认为的思考方式构建到系统中,从长远来看是行不通的。苦涩的教训基于以下历史观察:
- AI研究者经常试图将知识构建到他们的智能体中。
- 这在短期内总是有帮助的,并且让研究者个人感到满足。
- 但从长远来看,它会达到平台期,甚至阻碍进一步进展。
- 突破性的进展最终来自于一种基于通过搜索和学习来扩展计算的对立方法。最终的成功带有一丝苦涩,并且常常未被完全消化,因为这是对以人为中心的方法的成功。


从苦涩的教训中应该学到的一点是通用方法的巨大力量,即那些能够随着计算能力的增加而持续扩展的方法,即使可用的计算变得非常巨大。似乎能以这种方式无限扩展的两种方法是搜索和学习。再次强调,对“搜索”一词的强调是我加的。
从苦涩的教训中学到的第二个普遍要点是,思维的实际内容是极其复杂且无法简化的。我们应该停止试图寻找思考思维内容的简单方法。相反,我们应该只构建那些能够发现并捕捉这种任意复杂性的元方法。这些方法的关键在于它们能够找到良好的近似解。但对它们的搜索应该由我们的方法来完成,而不是由我们亲自完成。我们希望AI智能体能够像我们一样去发现,而不是包含我们已经发现的东西。将我们的发现构建进去,只会让我们更难看清发现过程是如何完成的。——理查德·M·萨顿,2019年3月13日。
大语言模型的规模与局限 🏗️
我们都知道大语言模型非常出色且有趣,但训练大语言模型所涉及的工程规模确实是一个工程奇迹。为了真正理解其规模,让我用人类熟悉的单位来描述整个LLM训练过程。



训练大语言模型的第一步是获取互联网规模的文本数据。我们希望收集人类有史以来撰写的所有书籍和文字。
- 在2017年的原始Transformer中,使用了1亿个token进行训练。以更易于人类理解的单位来说,这大约相当于10个图书馆书架容量的书籍。
- 2018年的GPT-1,规模扩大到大约60个图书馆书架。
- 在随后越来越大的语言模型中,规模扩大到2800个书架、3万个书架、7万个书架。
- 对于2023年的GPT-4,使用了13万个书架容量的token。如果我们想象一个这样的图书馆书架宽5米,这些书架并排放置将长达约650公里。这确实是用于训练这些模型的惊人文本量。
第二步,现在我们有了所有数据,我们想要创建一个大型Transformer架构。Transformer是一种拥有许多参数的神经网络。这里有一张Transformer架构的图示。我不会在本序言讲座中详细介绍架构细节,但让我们来数一下参数的数量。让我们做一个练习,想象所有参数都是数字,它们被写入Excel电子表格。现在,假设这个电子表格中的每个单元格都是一个1厘米乘1厘米的方框,让我们可视化其大小。如果我们这样做,在一个足球场或英式足球场内,你可以写下6000万个参数,如果你在1厘米乘1厘米的单元格中写一个数字的话。
- 在2017年的原始Transformer论文中,使用了6500万个参数,这相当于一个足球场面积的参数。
- 多年来,参数数量扩大到两个足球场、20个、2.5万个、7.7万个。
- 然后,2023年GPT-4架构的参数相当于3万个足球场的面积。作为比较,这大约相当于美国华盛顿特区的面积。
第三步,现在我们准备好了数据和架构,就是训练模型。我们将使用下一个token预测来训练模型。这是训练过程的可视化:基本上,你取预训练文本,在某个点将其切断,然后要求模型预测下一个单词是什么。为了执行此训练,你需要计算40次这个Transformer架构的前向传播,以及一次反向传播操作,以计算这些架构相对于其参数的梯度。
- 在2017年的原始Transformer论文中,训练使用了大约4×10^17次浮点运算。为了直观理解,这大约相当于在单线程CPU的PC上训练45天。
- 多年来,规模扩大到在PC上训练13年、1600年、10万年、80万年。
- 然后,对于2023年的GPT-4模型,相当于在单线程CPU的单台PC上训练700万年。作为比较,人类学家估计人类发现火发生在200万年前。因此,700万年的训练量确实是惊人的规模。


如果你用这种规模的数据、参数数量和计算能力来训练大语言模型,会发生什么?你会得到一个运行得非常、非常、非常出色的语言模型。大语言模型可以可靠地解决博士一年级水平的数学问题。例如,这里我问ChatGPT-03-mini-high模型一个数值分析问题,这适合博士一年级数学课程的作业或考试题,它给出了完美无瑕的答案。当然,这是一个比较标准的问题,所以这类知识可能存在于教科书和LLM的预训练数据中。结果通常比基于经典信息检索的搜索更好,因为查询对拼写错误、不同符号、不同术语和问题的微小变化更具鲁棒性。作为参考,如果你把这个问题输入谷歌,需要一些时间才能找到符合问题意图的合适答案。这类问题的答案并不总是完美的,尽管这个特定答案是完美的,但你总是可以通过交互式地提出后续问题或指出错误来获得正确答案。

在编码领域,大语言模型现在可以可靠地编写实现非平凡算法的代码。这里有一个来自高年级本科生优化课程的示例任务,具体目标是实现特定函数的交替最小化,ChatGPT为此问题生成了完美的答案。这类编码问题的答案并不总是完美的,尽管对于这个特定示例,答案是完美的,但你总是可以将生成的代码作为起点并进行调试。也就是说,这类编码任务的输出在提高生产力方面非常有用。


然而,大语言模型也可能失败得很惨,这取决于你的看法。这里有一个我认为足够有趣的查询示例,值得我们一起来读一下。问题是:“我将在3月5日与巴黎和洛杉矶的同事进行Zoom会议。我目前在韩国。什么时间开会比较合适?”现在,这个问题有一些隐含的含义和约束。一是通过指定日期,我要求语言模型确保考虑夏令时,这在欧洲和洛杉矶可能生效或失效,具体取决于日期。此外,这个问题还隐含了我和我的任何同事都希望避免在凌晨1点到6点之间开会。这就是问这个问题的全部意义。如果对时间没有限制,那么我们可以在任何时间开会。只是我们都想避开非常不方便的时间。如果你通读ChatGPT-03-mini-high模型提供的答案,实际上语言模型理解了我刚才概述的隐含含义和约束,这相当令人印象深刻。然而,对于这个特定答案,它仍然在一些非常基本的步骤上失败了。错误在于:巴黎时间上午11点确实是韩国时间晚上7点,如果日期是3月5日。但转换到洛杉矶的正确时间应该是凌晨2点,而不是下午2点。所以这个计算是错误的。那么,为什么LLM能解决极其复杂的任务,却同时在一些令人尴尬的简单任务上失败?为什么LLM如此不一致?


双过程理论与LLM的局限 🤔



要回答这个问题,我认为讨论关于人类思维的双过程理论是有启发性的。双过程理论在近几十年由诺贝尔经济学奖得主丹尼尔·卡尼曼和阿莫斯·特沃斯基推广。它假设我们的人类思维由两个不同的系统支配。第一个系统,系统1,是一个快速、自动、直觉的系统。然后我们有系统2,一个更慢、更审慎、更分析性的系统。





在这个类比中,大语言模型擅长于我们称之为人类系统1的思维,即快速、自动、直觉的思维。语言模型在这方面实际上相当不错。但LLM不擅长系统2思维,即较慢、审慎、分析性的思维。大语言模型不具备这种能力。为什么大语言模型擅长系统1思维,又为什么尽管进行了大规模训练,却不擅长系统2思维?





这里有一个假设:系统1思维是关于模式匹配过去的经验和知识,并对相关知识集进行非常基本的快速混合和插值。预训练的大语言模型似乎以这种方式运行,就像插值数据库。

以下是研究员François Chollet的一条推文,我们来读一下。他在推特上说:“‘自动补全’对于理解LLM来说不是一个有用的类比。LLM更像是一个数据库,允许你用自然语言查询信息。你可以查询训练数据中出现的知识和模式,这些模式可以应用于新的输入。”他接着说:“你不仅可以检索训练时看到的内容,还可以检索其任意组合。它是一个具有自然语言界面的插值数据库和程序存储。”在更早的推文中,他提到:“深度学习获取数据点,并将它们转化为可实现点之间检索和插值的可编码结构。你可以将其视为数据库技术的连续泛化。”然后他继续说:“当你将这个想法扩展到互联网上的所有信息时,你会得到一些非常强大的东西。就像搜索一样,它不必复杂就能产生巨大影响。规模是主要特征。”


我要澄清的是,LLM显然不仅仅是记忆原始事实,因为它们可以解决训练时未见过的任务,前提是这些任务在训练中被见过。所以LLM不是纯粹的数据库,纯粹的数据库只会查询现有信息。LLM不止于此。我认为将LLM视为可以混合和插值现有经验、现有知识的插值数据库,是一个恰当的描述。因此,作为插值数据库,LLM和系统1思维通过一揽子启发式方法运作。一种观点认为,LLM可以学习大量的启发式方法,这些方法具有统计相关性,但并不代表根本的因果结构,并将它们组合起来。LLM在预训练期间的训练方式,即通过下一个token预测,可以将其类比为强化学习中的模仿学习。这并不真正迫使LLM学习根本的因果关系。最近有一些研究提供了支持这一观点的证据。

超越预训练:强化学习的崛起 🚀

那么,LLM擅长系统1思维,但不擅长系统2思维,我们如何解决这个问题?也许我们可以直接扩大规模。嗯,可能不行。似乎预训练扩展的时代现在已经结束。扩展预训练,使用更多数据、更大的神经网络、更多的计算,过去曾让一切变得更好,直到现在它已经饱和并停止了。这是Ilya Sutskever在2024年NeurIPS会议上做的“时间检验奖”演讲的截图,他在其中指出,我们所知的预训练将会结束,他将此归因于预训练扩展的终结,因为数据不再增长。他声称,由于我们现在数据即将耗尽,仅仅扩大预训练规模将不再带来我们迄今为止所看到的改进。确实,从GPT-3、GPT-3.5扩展到GPT-4带来了显著的改进。然而,从GPT-4扩展到GPT-4.5却没有。LLM预训练规模已经达到平台期。
以下是2025年2月发布的OpenAI GPT-4.0系统卡中的摘录,其中指出GPT-4.5不是一个前沿模型。对我来说,这似乎承认了投入到GPT-4.5的扩展不足以将其提升到他们能够声称是前沿模型的性能水平。在GPT-4.5系统卡发布后,许多可能拥有内幕消息的OpenAI研究人员证实,扩展预训练已经饱和。这是William在推特上的发言,他声称一个时代结束了,测试时扩展是前进的唯一道路。那么,扩展预训练的时代现在结束了吗?他是这个意思吗?这是Bob McGrew的发言。他说,在2025年,预训练不再是花费计算资源的最佳地方。在更早的年份,这是花费计算资源的最佳地方,但现在也许已经结束了。所以我们需要一个不同的策略来迈出下一步。而这个策略就是强化学习、搜索和测试时扩展。就个人而言,我对近年来强化学习的进展感到非常兴奋。
在2010年之前,强化学习并不被认为是机器学习的主要领域。许多机器学习研究者会说强化学习并不真正有效,如果你想让任何东西有效,你必须使用控制理论。人们会这么说,他们说强化学习……有些人甚至会说强化学习是一场骗局。这个时代强化学习的一篇非常高调的论文是,例如,2003年发表在NeurIPS上的《通过强化学习实现自主直升机飞行》。它相当令人印象深刻,但并没有那么惊人。它肯定不够惊人或稳定到可以部署。
但如今,强化学习开始发挥作用了。我们看到DeepMind的DQN论文解决了Atari视频游戏,这一结果于2015年发表在《自然》杂志上,这对许多机器学习和强化学习研究者来说是一个巨大的警钟。然后AlphaGo出现了。AlphaStar出现了。AlphaStar是一个在视频游戏《星际争霸2》中游戏的RL智能体,它能够击败顶级人类专家职业玩家。Pluribus用于德州扑克,击败了顶级人类扑克玩家。Cicero用于外交棋盘游戏,击败了外交游戏中的顶级人类玩家。这些都是RL智能体在游戏领域取得超人性能的成功故事。
此外,现在自动驾驶出租车已经在几个城市提供服务,这些服务的客户满意度普遍很高。我应该声明,目前尚不清楚这些自动驾驶出租车服务在多大程度上使用了真正的强化学习。运营这些服务的公司声称使用了先进的AI和强化学习,但也许这些服务很多实际上是由经典控制理论驱动的,而不是强化学习。

接下来,基于人类反馈的强化学习现在已成为LLM对齐不可或缺的一部分。再次声明,有些人认为RLHF不是真正的RL,但尽管如此,在我看来,RLHF是大语言模型研究中的一个重要且令人印象深刻的进步。再下一点,许多机器人公司展示了人形或无人机机器人的令人印象深刻的演示。再次声明,目前尚不清楚这些演示有多少是手工制作的,甚至是直接由人类控制的。如果是这样,那就不真正是强化学习。但尽管有所有这些声明,我的解读是,RL正开始真正意义上发挥作用,这非常令人兴奋。

有一种经济学观点认为,AI只是重复训练数据,其中没有创造性。如果人们谈论的仅仅是大语言模型,我认为这基本正确。但如果你谈论的是整个强化学习领域,这肯定是错误的,因为具有强化学习的AI已经展现了创造性。以下是Ilya Sutskever的引述。他指出,强化学习实际上是创造性的。AI中每一个令人惊叹的创造力例子都来自强化学习系统。例如,AlphaZero发明了一种全新的游戏方式,而人类已经完善了这种游戏数千年。是强化学习能够为问题提出创造性的解决方案,这些解决方案我们可能根本无法理解。

确实,RL的创造力改变了国际象棋。以下是顶级职业国际象棋选手马格努斯·卡尔森的引述。“神经网络极大地提高了我们对游戏的理解。在AlphaZero于2018年底问世之后,它只是让我们对游戏的理解好了很多。”然后他继续描述了关于如何使用兵的一种策略。他指出,这是人类在AlphaZero之前没有真正做过的事情。







RL的创造力也改变了扑克游戏。以下是顶级职业扑克玩家Doyle Brunson的引述。他指出,扑克游戏,当我在90年代末开始玩的时候,与今天看到的样子非常不同。许多最高水平的顶级玩家,他们使用AI来改进他们的游戏。以下是领先的AI研究员Noam Brown的引述,他曾从事这些扑克机器人的研究工作。他指出,人类从这些竞赛中学到了一些东西。然后他继续描述了所谓的“过诈”策略。然后他说,这是人类从竞赛中学到的头号心得,他们说,我们需要开始这样做。



RL也改变了围棋游戏。这是被AlphaGo智能体在一场壮观的公开比赛中击败的顶尖职业围棋选手李世石的引述。他指出,AlphaGo之前的棋谱记录与今天的完全不同。旧的记录现在具有历史价值,而不是用于研究围棋。一个令人失望的方面是,AI围棋感觉就像
002:MDP基础、模仿学习与价值函数 🧠
在本节课中,我们将学习强化学习的基础,特别是马尔可夫决策过程(MDP)的数学框架。我们不会试图覆盖现代深度强化学习的全部内容,而是专注于与大型语言模型强化学习及测试时扩展直接相关的部分。在背景知识上,我们假设您对神经网络和反向传播有一定了解,但不要求您事先熟悉强化学习。


MDP基础
强化学习考虑的是在马尔可夫决策过程中的序贯决策。强化学习与监督学习(如图像分类)的关键区别在于序贯决策方面。例如,在监督学习中,模型查看一张图片并判断其包含的是狗还是猫,这是一个单一决策。而在强化学习中,智能体需要在一段时间内做出多个决策以实现某个目标,例如下棋或控制自动驾驶车辆。
智能体行动的环境被称为马尔可夫决策过程,简称MDP。MDP中有一个时间概念,它可以是字面意义上的时间(如秒),但通常对应于一系列序贯决策的步骤,例如棋类游戏中的回合数。为了简化,并考虑到大型语言模型强化学习的目的,我们将时间视为离散变量,从0开始,到终止时间T结束。


MDP的动态过程
在MDP中,动态过程如下:在时间t,系统处于状态S_t。策略π(代表智能体的行为)会查看当前状态并选择一个动作A_t。给定状态和动作,环境会根据一个转移概率P产生一个奖励R_t和下一个状态S_{t+1}。

整个MDP的动态过程或智能体在其中的行动轨迹记为τ。它从初始状态S_0开始,智能体采取动作a_0,获得奖励r_0,并根据环境转移到状态S_1。然后策略再次根据S_1选择动作a_1,获得奖励r_1,如此继续,直到在状态S_T终止。
状态存在于一个状态集合S中。我们定义非终止状态集合与终止状态的并集为S^+。为了非退化性,我们总是假设MDP的状态集合非空。同样,动作集合A也假设为非空。在时间t,智能体收集的奖励R_t是一个实数(标量),我们假设它是有限的(非正/负无穷)。在MDP中,我们选择一个策略来最大化奖励之和,具体目标稍后解释。奖励定义了MDP中的目标。
大写T表示终止时间或停止时间。轨迹或片段从状态0开始,智能体在环境中行动,环境决定状态如何演化,并在时间T结束,定义为S_T等于终止状态。有些MDP可能没有终止状态,此时终止时间T为无穷大。如果转移到终止状态的概率为0,则终止时间必然为正无穷。当终止时间为正无穷时,MDP被称为持续性任务;当终止时间有限时,任务被称为片段性任务。

初始状态S_0假设是从初始分布P_0中采样的。通常,初始状态是固定的(例如,每次启动视频游戏都从同一状态开始),此时分布P_0对应于一个确定性的随机变量。

转移概率与策略
给定当前状态S,智能体选择一个动作。给定当前状态和采取的动作,转移过程由环境(MDP的马尔可夫部分)而非智能体控制,这被称为转移概率。给定当前状态和动作,我们收集一个奖励(可以是随机变量),并转移到后续状态S‘。

这个转移概率通常不为智能体精确所知。智能体必须通过与环境的交互来学习它。转移概率控制着从状态-动作对(S_t, A_t)到智能体收集的下一个奖励R_t和后续状态S_{t+1}的转移。


有时,奖励是当前状态和动作的确定性函数,我们写作R_t = f(S_t, A_t)。有时,后续状态是当前状态和动作的完全确定性函数;有时,它是一个随机变量。为了我们的目的,我们假设动态是平稳的。通常,MDP的规则(如视频游戏规则)可能随着步骤进展而变化(非平稳动态),此时转移概率记为P_t。但当动态平稳时,转移概率记为P,不依赖于时间t。
动作A由智能体通过策略π选择。智能体观察当前状态S_t并选择动作A_t。策略π可以是随机的,也可以是确定性的。如果策略π是随机的,则π(a|s)定义了一个概率分布。如果策略是确定性的,则动作A_t = π(S_t)。通常,策略由神经网络参数化,我们写作π = π_θ。


完全可观测性假设

通常,智能体可能无法观察到完整状态,系统对于观测可能不是马尔可夫的。这被称为部分可观测马尔可夫决策过程(POMDP),它比MDP更具挑战性。但在本课程中,我们将假设智能体能够完全观测当前状态S,即智能体的观测与使系统成为马尔可夫的完整状态之间没有区别。这是因为在大型语言模型的强化学习中,语言模型能够观测到完整的对话历史,而完整的对话历史本身就是完整状态。
MDP的泛化

MDP有许多进一步的泛化,我们不会在本课程中全部覆盖。例如,非平稳动态、预定终止时间、时间依赖策略、依赖于当前状态的可能动作集合等。在实践中,MDP通常不会具有我们考虑的这种最简单的纯结构。但从这些讲座中,我希望您能理解核心原理,一旦有了这种理解,您就可以将基础理论适应于手头的特定MDP。


终止时间与吸收状态




终止时间T是一个随机变量。由于T是随机变量,从当前时间到终止时间的求和需要谨慎处理。例如,我们不能随意交换期望和求和运算的顺序,因为求和上限T是随机的。

为了简化符号和理论讨论,我们将定义一个等效的、永不停止的MDP,方法是将终止状态变为吸收状态。在这个等效的MDP中,终止时间T等于正无穷。现在,T不再是随机的,我们可以交换期望和求和。具体做法是:一旦处于终止状态,无论采取什么动作,你都不会再收集到任何奖励,并且会永远停留在终止状态。根据这个定义,在终止状态的策略变得无关紧要。

模仿学习
智能体如何在MDP中学习行动?让我们从模仿学习(或行为克隆)的想法开始。我们训练一个由神经网络参数化的策略π_θ,使其模仿一个专家策略π_expert。专家策略通常来自人类演示,智能体学习模仿它。


以下是粗略步骤:
- 使用初始分布P_0、专家策略π_expert和MDP转移概率P,采样从状态S_0开始到终止状态S_T结束的轨迹。
- 形成一个状态-动作对的数据集。给定当前状态,专家智能体选择了动作A_i,这就是我们想要模仿的。注意,在这个过程中没有奖励的概念。
- 通过解决最小化问题来训练模型,例如使用交叉熵损失L,训练策略π_θ在给定当前状态S时,模仿专家智能体采取的动作。

这本质上是监督学习,而不是纯粹的强化学习,因为在学习过程中没有奖励的概念。这个想法很简单:如果有一个做出良好决策的智能体,我们就训练神经网络策略去模仿它。
模仿学习与大型语言模型

在大型语言模型中,大语言模型的预训练是通过下一个词预测来完成的。这可以被视为行为克隆的一个实例。在训练大语言模型时,您向模型展示大量文本,然后要求模型预测这段文本之后的下一个词或标记。这些数据来自互联网上人类实际书写的文本。因此,大语言模型的下一个词预测可以被视为行为克隆,这是一个简单但相关的观察。
行为克隆可以作为一个良好的起点或初始化方法,例如在AlphaGo和大语言模型预训练中。也就是说,行为克隆非常有用。


行为克隆的局限性
然而,在许多强化学习设置中,获取专家演示的要求可能非常昂贵。但在大语言模型设置中,预训练数据非常丰富,因为它只是由人类书写的文本组成。因此,当拥有丰富的专家演示数据时,行为克隆/模仿学习非常好。
但是,纯粹的行为克隆本身在以下意义上效果不佳:在监督学习中,众所周知,如果在一个分布上训练模型并在同一分布上测试,它会表现良好;但如果改变测试分布,性能就会下降。在纯粹的行为克隆中,智能体只在专家演示上训练,这往往会由于协变量偏移而失败。
为什么在仅接受行为克隆训练的智能体中会发生协变量偏移?在测试时,部署的、经过行为克隆训练的模型将观察由该分布给出的轨迹,其中当前智能体正在采取行动,这决定了智能体访问的状态序列。但这不是智能体训练时所处的分布。智能体是在专家采取行动、访问的状态由专家策略的行动决定的分布上训练的。
因此,仅接受行为克隆训练的策略将遇到它未曾训练过的状态。专家策略可能非常好,它从不会将MDP驱动到坏状态,但经过训练的行为克隆策略必然不完美。它可能会漂移到这些坏状态。专家人类可能知道如何从稍微坏的状态中恢复,但行为克隆策略可能从未遇到过这种场景,因此它不知道该怎么办。


认识到分布偏移问题导致了强化学习中的一个关键见解:在强化学习中,训练数据取决于生成训练数据的策略。这与监督学习不同。这导致了离策略学习与在策略学习的区别。在离策略学习中,强化学习智能体在由另一个策略(可能是完全独立的专家策略,也可能是其旧版本生成的数据)采取的行动上进行训练。在在策略学习中,强化学习智能体在由当前策略自身采取的行动上进行训练。离策略强化学习受到分布偏移问题的影响,而行为克隆或模仿学习肯定是离策略学习。
DAgger算法
DAgger(数据聚合)算法是一种更接近在策略的模仿学习。在每一轮中,使用当前策略生成轨迹,专家为这些状态提供标签。通过在这些聚合数据上重新训练,DAgger减轻了分布偏移。
算法步骤如下:
- 从专家策略中采样轨迹,形成状态-动作对数据集。
- 从演示数据中训练一个策略。
- 让训练好的策略采取行动,基于此采样轨迹,并收集该轨迹导致的状态。
- 请人类专家用正确的动作为各个状态添加标签。当前策略π_θ生成状态,它也会生成一系列动作,但我们假设这些动作不好。我们请人类专家用动作为这些状态添加注释,然后将其作为我们的数据。
- 聚合数据:将专家在先前数据上的动作与专家在新状态上的动作结合起来。
- 回到步骤1并重复此过程。
有时DAgger效果很好,但有时这有点不自然。要求人类专家在一个他们并未采取行动的策略生成的状态上采取行动,通常非常不自然。无论如何,这在大语言模型设置中是无法实现的。DAgger类算法在大语言模型中的表现方式可能是:给定一段文本的部分完成,然后询问另一个人,当前文本之后应该是什么词。这是一种不自然的写作方式。
尽管如此,DAgger背后的想法非常有趣,即我们希望使模仿学习尽可能接近在策略,这一概念在我们讨论基于人类反馈的强化学习和专家迭代时会再次变得相关。
纯强化学习与价值函数
现在我们已经介绍了模仿学习,让我们继续讨论纯强化学习。在经典的强化学习和MDP设置中,我们有一个目标。MDP的目标是最大化期望折扣回报。
具体来说,我们希望解决的优化问题是这种形式:max_π E^π[G_0],其中G_0是累积折扣回报。累积折扣回报是所有奖励的总和:R_0 + γR_1 + γ^2 R_2 + ... + γ^{T-1} R_{T-1}。这里γ被称为折扣因子,设置在0到1之间。如果折扣因子小于1,则意味着我们更倾向于尽早获得奖励。当终止时间为无穷大(持续性任务)且奖励有界时,我们通常选择γ小于1以确保回报是有限的。

想象初始状态从分布p_0中采样,我们根据策略π行动,然后生成一个有限或无限的轨迹,我们得到一个累积折扣回报作为随机结果。期望E^π表示在所有动作上的期望,其中我们根据策略π采取动作,并根据转移概率P进行转移。我们想要最大化期望累积折扣回报。
接下来,我们定义价值函数(或状态价值函数),也称为V值函数,记作Vπ。Vπ是一个以当前状态S为输入的函数。对于V^π,我们取G_0的期望,当我们根据策略π行动时,但我们假设在时间0从状态S开始。根据这个定义,终止状态的价值函数定义为0。
我们还定义状态-动作价值函数,也称为Q值函数,记作Q^π。定义基本相同:我们取关于π的累积折扣回报的期望,但这里我们从状态S开始,并且最初承诺采取动作A。初始动作a_0不是根据π采样的,我们选择动作a作为初始动作a_0,然后后续动作将从策略π中采样。同样,根据定义,在终止状态,无论动作如何,Q值函数都定义为0。

V值函数和Q值函数是强化学习中的基本量。
价值函数的基本性质
根据定义,如果我们让初始动作a_0从策略π中采样,那么Q值函数就变成了V值函数:V^π(s) = E_{a∼π(·|s)}[Q^π(s, a)]。
由于MDP的平稳性,从时间t开始、以状态S_t为条件的G_t的期望,与从时间0开始、以状态S_0为条件的G_0的期望是相同的。所以无论从何时开始,期望都不受影响。对于Q值函数也是如此。
接下来是价值函数Vπ的一步转移性质:Vπ(s) = E_{a∼π(·|s), (r,s‘)∼P(·|s,a)}[r + γ V^π(s‘)]。这个性质可以通过条件期望的塔性质和马尔可夫性来证明。
类似地,Q值函数的一步转移性质为:Q^π(s, a) = E_{(r,s‘)∼P(·|s,a)}[r + γ E_{a‘∼π(·|s‘)}[Q^π(s‘, a‘)]]。
贝尔曼方程与巴拿赫不动点定理
接下来,我们将展示贝尔曼方程的一个关键性质,这将需要使用巴拿赫不动点定理。
设X是一个具有度量d的度量空间。我们说一个算子T是γ收缩的,如果对于所有x, y ∈ X,有 d(T(x), T(y)) ≤ γ d(x, y)。在我们的应用中,X将是具有L∞范数(最大范数)的n维空间。

巴拿赫不动点定理:设X是一个具有度量d的完备度量空间。设算子T是γ收缩的,且γ严格小于1。那么算子T有一个唯一的不动点。此外,如果我们取任意点并重复应用算子T,当应用次数k趋于无穷时,它将收敛到该不动点。
巴拿赫不动点定理有两种用途:一是证明某个算子的不动点存在;二是将其用作算法,即我们直接按照定理所述应用算法,重复应用不动点算子,从而在计算上收敛到我们期望的不动点,这将引出价值迭代算法。
价值函数的贝尔曼方程
定理:设π是一个策略。假设折扣因子γ在0和1之间(严格小于1)。假设状态空间是有限的。还假设奖励几乎处处有界。那么,关于π的价值函数Vπ存在,并且满足这个贝尔曼方程:Vπ(s) = E_{a∼π(·|s), (r,s‘)∼P(·|s,a)}[r + γ V^π(s‘)]。反之,如果一个函数满足贝尔曼方程,那么该函数就等于价值函数。
证明概要:价值函数的良好定义性(即期望有限)源于奖励有界且γ<1。定义贝尔曼算子Bπ,它将一个函数映射到另一个函数:Bπ(V)(s) = E_{a∼π(·|s), (r,s‘)∼P(·|s,a)}[r + γ V(s‘)]。根据一步转移性质,价值函数Vπ是贝尔曼算子Bπ的不动点。接下来需要证明V^π是唯一的不动点。定义L∞范数 ||V||_∞ = max_s |V(s)|。可以证明贝尔曼算子Bπ是关于L∞范数的γ收缩算子。然后根据巴拿赫不动点定理,Bπ有唯一的不动点,因此V^π是唯一的不动点。

类似地,我们有Q值函数的贝尔曼方程定理,其证明思路基本相同。



最优策略与贝尔曼最优性方程
我们称一个策略π是最优的,如果它的价值函数V{π*}在所有状态上支配(即大于等于)任何其他策略π的价值函数Vπ。一旦我们有了最优价值函数V^{π},我们简写为V,并记Q为关于策略π的最优Q值函数。最优价值函数V和Q是唯一的,但最优策略π可能不唯一。
贝尔曼最优性方程(V值函数)
定理:假设折扣因子γ严格小于1,状态和动作集合有限,奖励有界。那么最优价值函数V存在,并且满足这个贝尔曼最优性方程:V(s) = max_{a ∈ A} E_{(r,s‘)∼P(·|s,a)}[r + γ V(s‘)]。反之,如果一个函数满足贝尔曼最优性方程,那么它就是最优价值函数。最后,如果我们知道了最优价值函数,那么通过取期望(即最优Q值函数)并对其关于动作a求最大值,就可以得到一个最优确定性策略:π(s) = argmax_a E_{(r,s‘)∼P(·|s,a)}[r + γ V*(s‘)]。

证明概要:定义贝尔曼最优性算子B:B(V)(s) = max_{a ∈ A} E_{(r,s‘)∼P(·|s,a)}[r + γ V(s‘)]。可以证明B是关于L∞范数的γ收缩算子。根据巴拿赫不动点定理,B有唯一的不动点,记作V。然后定义策略π(s) = argmax_a E_{(r,s‘)∼P(·|s,a)}[r + γ V(s‘)]。接着证明V = V{π*},即V*确实是策略π*的价值函数。最后证明π*确实是最优策略,即对于任何其他策略π,有Vπ ≤ V^{π} = V。


贝尔曼最优性方程(Q值函数)

定理:假设同上。那么最优状态-动作价值函数Q存在,并且满足这个贝尔曼最优性方程:Q(s, a) = E_{(r,s‘)∼P(·|s,a)}[r + γ max_{a‘ ∈ A} Q*(s‘, a‘)]。反之,如果一个函数满足这个贝尔曼最优性方程,那么它就是最优Q值函数。最后,如果我们取最优Q值函数并取其关于动作的argmax,那就定义了一个最优确定性策略:
003:深度策略评估 🧠

在本节课中,我们将学习如何评估一个给定的策略,这是理解后续策略优化的基础。我们将介绍两种核心方法:蒙特卡洛方法和时序差分学习,并学习如何使用神经网络来近似价值函数。
概述
强化学习的目标是找到一个好的策略。但在学习如何优化策略之前,我们首先需要理解如何评估一个给定的策略。这个过程被称为策略评估。我们将学习如何计算或近似一个策略的价值函数,这是衡量策略好坏的关键指标。本节将重点介绍两种深度策略评估方法:基于完整轨迹的蒙特卡洛方法和基于单步更新的时序差分学习。
策略评估与策略优化
首先,让我们明确策略评估与策略优化的区别。
强化学习的最终目标是找到一个好的策略,最好是最优策略。但在这些课程中,我们将从研究如何评估一个给定的策略 π 开始。也就是说,如果我指定了一个策略 π,我们如何从理论上衡量它的好坏?有哪些计算手段可以近似这个评估?这个过程就叫做策略评估。
我们之后会继续讨论如何优化和改进策略 π,这被称为策略优化、策略改进或控制,这才是强化学习的主要目标。然而,为了循序渐进地学习,先理解策略评估再学习策略优化是有益的,因为策略优化通常将策略评估作为其子程序。因此,我们应该先理解这个更简单的子程序。
蒙特卡洛策略评估
第一种策略评估方法很简单,叫做蒙特卡洛方法。
我们首先考虑近似给定策略 π 的价值函数 V^π。我们使用蒙特卡洛近似来实现这一点。具体做法是,我们简单地执行 N 次轨迹滚动。
以下是具体步骤:
- 模拟 N 条独立的轨迹。
- 对于所有轨迹,计算其累积折扣回报。
- 对这 N 条独立轨迹的回报取经验平均值。
公式:
V^π(s) ≈ (1/N) * Σ_{i=1}^{N} G_i,其中 G_i 是第 i 条轨迹从状态 s 开始的累积折扣回报。
这种方法之所以有效,是因为等式右边是价值函数的无偏估计。如果数量 N 足够大,根据大数定律,这应该是一个足够好的近似。
然而,这个近似依赖于初始状态 S。如果我们从一个不同的初始状态开始,就会得到不同的奖励序列。因此,如果状态空间 S 的规模很小,我们可以为所有状态单独进行这种近似,从而将 V^π 近似为 S 的函数。
但是,当状态空间 S 很大甚至是无限时,为每个独立的状态单独近似价值函数在计算上是不可行的。在这种情况下,我们必须用一个神经网络来近似价值函数 V^π,我们将其表示为 V_φ。V_φ 是一个以 φ 为参数的神经网络。
我们需要通过优化参数 φ 来拟合这个神经网络。具体做法是解决以下最小化问题:
公式:
min_φ L(φ) = E_{s~p0} [ (V^π(s) - V_φ(s))^2 ]
其中,p0 是初始状态分布。我们称 V_φ 为价值网络,因为它是一个旨在近似价值函数的神经网络。
这个损失函数最初有点问题,因为它需要访问未知的量 V^π。我们无法直接获得 V^π。那么该怎么办呢?让我们先计算 L 的梯度。
公式:
∇_φ L(φ) = E_{s~p0} [ 2 * (V_φ(s) - V^π(s)) * ∇_φ V_φ(s) ]
然后,我们根据定义写出 Vπ。Vπ 是在初始状态 s0 = s 的条件下,遵循策略 π 所获得的累积折扣回报的期望。我们可以将 V_φ(s) 移入期望内部,因为在这个期望中,s 甚至不是随机变量。然后,我们可以利用塔性质将这两个期望合并为一个单一的期望。
最终,我们得到一个可计算的量 G,它作为损失函数 L 的随机梯度。G 是可计算的,因为它需要访问神经网络的梯度(我们可以通过反向传播获得),并且我们可以使用当前策略 π 通过蒙特卡洛模拟来估计它。
以下是使用价值网络 V_φ 进行策略评估的算法步骤:
- 当未收敛时,重复以下步骤:
- 使用当前策略 π 采样一条轨迹。
- 使用该轨迹计算累积折扣回报 G。
- 形成随机梯度
G = 2 * (V_φ(s0) - G) * ∇_φ V_φ(s0)。 - 使用随机梯度 G 通过优化器(如 SGD、Adam)更新神经网络参数 φ。
蒙特卡洛策略评估的一个问题是,我们需要模拟完整的轨迹才能形成这个随机梯度,这似乎效率不高。我们真的需要模拟整个轨迹吗?
时序差分学习
时序差分学习试图弥补这种低效性。
在时序差分学习中,我们利用单步转移的性质。我们认识到 V^π 满足贝尔曼方程:
公式:
V^π(s) = E_{a~π(·|s), s‘~P(·|s,a)} [ r(s, a) + γ * V^π(s‘) ]
我们如何近似这个期望呢?我们将对这个单步转移进行蒙特卡洛近似。我们从状态 s0 开始,采取一个动作,获得一个奖励,并转移到状态 s1。我们独立地进行 N 次这样的单步转移,然后形成经验平均值。根据大数定律,如果 N 足够大,这个求和应该能很好地近似真实的期望。
但这个方法有一个问题:为了执行这个公式,我们必须精确地知道在状态 s1 的价值函数 V^π。而进行策略评估的整个前提就是我们不知道 V^π。因此,这里需要使用未知量 V^π 是有点问题的。
尽管如此,我们继续推进。我们像之前一样定义损失函数,并计算其梯度。经过类似的推导(利用塔性质和马尔可夫性),我们最终会得到一个随机梯度,但它仍然依赖于真实的价值函数 V^π。
如果我们想象执行这种拟合,即使用时序差分学习进行策略评估,那么我们会这样做:在状态 s0,我们采样动作 a0,采样转移,并形成这个量作为随机梯度,然后将其传递给像 Adam 或 SGD 这样的优化器。
但这个实现的问题在于,由于它依赖于真实的 V^π,所以并不可行。
因此,一个近似的 SGD 实现简单地用我们的价值网络 V_φ 替换 V_π。现在,这个 G 不再是损失函数梯度的无偏估计(当我们使用 V^π 时,它是无偏的)。但这是一种人们经常使用的启发式方法,在许多情况下效果很好。
更准确地说,实现应该如下所示:
- 在状态 s0,采样动作 a0,转移到状态 s1。
- 有两种情况:
- 转移到非终止状态:目标值
y = r0 + γ * V_φ(s1) - 转移到终止状态:目标值
y = r0(因为终止状态的价值为 0)
- 转移到非终止状态:目标值
- 形成有偏的随机梯度
G = 2 * (V_φ(s0) - y) * ∇_φ V_φ(s0)。 - 将这个有偏的随机梯度 G 传递给优化器以进行价值网络拟合。
在 PyTorch 中,我们使用梯度截断操作符来实现这一点。这确保了在计算梯度时,我们将目标值 y 视为常数,从而得到我们想要的有偏随机梯度。
代码示例(概念):
# s0: 当前状态, r0: 即时奖励, s1: 下一个状态, done: 是否终止
value_s0 = value_network(s0)
with torch.no_grad(): # 梯度截断
target = r0 + (1 - done) * gamma * value_network(s1)
loss = F.mse_loss(value_s0, target)
loss.backward()
optimizer.step()
这种方法被称为半梯度方法,因为它类似于梯度方法,但进行了一个小的修改(用近似值替换真实值)。虽然理论上不如真正的梯度方法严谨,但实践表明,半梯度 TD 方法通常比更理论化的替代方法(如梯度 TD)表现更好。
K步时序差分学习
我们可以将时序差分学习进一步推广,进行 K 步时序差分学习,这介于需要完整轨迹的蒙特卡洛方法(可视为无限步 TD)和单步 TD 之间。
利用 K 步转移性质,价值函数可以表示为:
公式:
V^π(s) = E [ Σ_{t=0}^{min(K,T)-1} γ^t * r_t + γ^K * V^π(s_K) ]
其中,期望是在遵循策略 π 的 K 步轨迹上进行的。如果 episode 在 K 步之前终止,则求和到终止步为止。
为了拟合价值网络,我们采用与单步 TD 类似的流程。我们考虑相同的平方差损失,计算其梯度,并进行类似的分析,最终得到一个随机梯度。
理想化的 K 步 TD SGD 拟合算法如下:
- 采样一条长达 K 步的部分轨迹。
- 形成随机梯度,其中我们求和前 K 个奖励,并转移到状态 s_K,然后将其代入价值函数 V^π。
同样,如果我们无法访问 V^π,这就不可行。因此,我们使用近似版本,用价值网络 V_φ 替换 V^π 的使用。这再次导致了一个有偏的随机梯度,但在实践中往往效果很好。
这同样可以使用梯度截断操作符简洁地表达。
方法对比与总结
现在我们已经有了两种策略评估方法:蒙特卡洛和时序差分(单步或 K 步)。让我们做一个比较。
两者的目标都是执行策略评估,即训练一个近似真实价值函数的价值网络。主要区别在于:
- 蒙特卡洛评估:通过等待 episode 终止来更新价值网络 V_φ。它使用从开始到结束的完整回报,是无偏的,但方差可能较高,且必须等待 episode 结束。
- 时序差分评估:无需等待 episode 终止即可更新 V_φ。如果 episode 尚未终止,TD 会进行自举,使用价值网络在下一个状态(或 K 步后的状态)的估计值。它是有偏的(因为使用了网络自身的估计),但通常方差更低,且数据效率更高。
在训练初期,V_φ 是一个随机初始化的神经网络,其值完全不准确。此时使用 TD 自举可能会导致不稳定性。然而,后期当 V_φ 变得准确时,等待 episode 完全终止可能变得低效。因此,这里存在一个权衡。根据经验,选择中间值(例如 K=5)的 K 步 TD 通常是一个很好的折衷方案。
扩展到Q函数评估
我们讨论了关于 V 价值函数的策略评估,但我们也可以对 Q 函数执行策略评估。
这基本上遵循相同的原则。你可以为 Q 函数执行蒙特卡洛策略评估,其形式与 V 函数情况基本相同,只是梯度计算需要稍微不同的条件(因为 Q 函数还依赖于动作)。同样,我们也可以为 Q 函数使用时序差分学习,包括单步和 K 步版本。所有的考虑因素——无偏梯度与有偏近似、自举、半梯度方法——都与 V 值函数的情况非常相似。
因此,Q 函数和 V 函数评估之间的差异是微小的,核心思想和方法论是一致的。
总结
在本节课中,我们一起学习了深度策略评估的核心方法。我们首先明确了策略评估是策略优化的基础。接着,我们深入探讨了:
- 蒙特卡洛方法:通过采样完整轨迹并计算平均回报来无偏地估计价值函数,适合状态空间小或需要无偏估计的场景,但可能存在高方差和低效的问题。
- 时序差分学习:利用贝尔曼方程和自举思想,通过单步或 K 步转移来更新价值网络,提高了数据效率并降低了方差,但引入了估计偏差。
- 价值网络拟合:我们学习了如何定义损失函数,推导随机梯度(无论是无偏的还是有偏的),并使用随机梯度下降来训练神经网络以近似真实的价值函数。
- 实践实现:我们特别介绍了在 PyTorch 中使用梯度截断操作符来实现 TD 学习中的关键步骤。

理解这些评估方法是至关重要的,因为它们为后续学习如何改进和优化策略(即策略优化)奠定了坚实的基础。
004:深度策略梯度方法 (A3C) 🧠

在本节课中,我们将学习深度策略梯度方法,这类方法通过优化策略本身来提升智能体的表现。我们将重点介绍A3C(异步优势演员-评论家)算法及其核心思想,并解释如何将其应用于离散和连续动作空间。
概述
上一节我们讨论了策略评估,即如何近似给定策略的价值函数。本节中,我们来看看策略优化,其目标是直接找到能最大化期望累积回报的策略。我们将从策略梯度定理的基本形式出发,逐步引入降低方差、提升算法稳定性的技巧,最终推导出实用的A2C/A3C算法框架。
策略优化目标
策略优化的核心是求解一个最大化问题。我们希望通过调整神经网络参数 θ 来最大化目标函数 J(θ)。该函数定义为参数化策略 π_θ 下价值函数的期望:
J(θ) = E_{s_0 ~ p_0} [ v_{π_θ}(s_0) ]
其中,π_θ 是我们的策略,由一个参数为 θ 的神经网络表示。初始状态 s_0 从分布 p_0 中采样,我们的目标是最大化从初始状态开始、遵循策略 π_θ 所能获得的期望累积折现回报。
为了简化分析,我们假设在有限时间内以概率1终止。用 τ 表示完整的轨迹(从开始到终止的状态、动作、奖励序列)。目标函数可以重写为:
J(θ) = E_{τ ~ (p_0, π_θ, P)} [ G_0 ]
这里,G_0 是从时间0开始的累积折现回报,是轨迹 τ 的函数。轨迹 τ 的概率分布 P_θ(τ) 是初始分布、转移概率和策略概率的乘积。
策略梯度定理与方差缩减
我们的目标是计算目标函数 J(θ) 关于参数 θ 的梯度。应用对数导数技巧(log derivative trick),我们可以得到梯度的表达式:
∇_θ J(θ) = E_{τ ~ π_θ} [ G_0 · ∇_θ log P_θ(τ) ]
其中,g = G_0 · ∇_θ log P_θ(τ) 是梯度的一个无偏估计量。然而,这个估计量的方差通常非常大,直接使用会导致训练不稳定。因此,我们需要一系列技巧来降低方差。
以下是降低方差的三个核心技巧:
技巧一:移除过去奖励
在梯度估计中,当前时间步 t 的动作不会影响过去已发生的奖励。因此,在计算梯度时,可以移除当前时间步之前的所有奖励,这不会引入偏差,但能有效降低方差。经过推导,梯度估计可简化为:
∇_θ J(θ) = E [ Σ_{t=0}^{∞} γ^t · G_t · ∇_θ log π_θ(a_t | s_t) ]
其中,G_t 是从时间 t 开始的累积折现回报。
技巧二:引入状态相关的基线
我们可以从梯度估计中减去一个只依赖于状态 s_t(而不依赖于动作 a_t)的函数 B(s_t),这被称为基线。只要基线不依赖于动作,它就不会改变梯度估计的期望值(即仍是无偏的),但通过精心选择基线,可以进一步降低方差。梯度估计变为:
∇_θ J(θ) = E [ Σ_{t=0}^{∞} γ^t · (G_t - B(s_t)) · ∇_θ log π_θ(a_t | s_t) ]
技巧三:使用优势函数与Rao-Blackwell化
最有效的方差缩减方法是使用优势函数(Advantage Function)。优势函数 A(s, a) 定义为动作价值函数 Q(s, a) 与状态价值函数 V(s) 之差:
A(s, a) = Q_{π_θ}(s, a) - V_{π_θ}(s)
它衡量了在状态 s 下采取特定动作 a 相对于遵循当前策略的平均表现有多好。如果 A(s, a) > 0,说明动作 a 优于平均;如果 A(s, a) < 0,则劣于平均。
根据Rao-Blackwell定理,使用条件期望 Q_{π_θ}(s, a) 代替原始的回报 G_t 能获得方差更小的估计量。同时,根据最小方差条件估计器引理,最优的基线函数正是状态价值函数 V(s)。因此,我们使用优势函数 A(s, a) 来构建梯度估计:
∇_θ J(θ) = E [ Σ_{t=0}^{∞} γ^t · A_{π_θ}(s_t, a_t) · ∇_θ log π_θ(a_t | s_t) ]
这个形式非常直观:如果优势函数为正(好动作),梯度更新会使该动作的概率增加;如果为负(坏动作),梯度更新会使该动作的概率降低。
从理论到实践:A2C/A3C算法
在实际中,我们无法获得真实的 Q_{π_θ} 和 V_{π_θ}。因此,我们需要用神经网络来近似它们。
- 演员(Actor): 策略网络 π_θ,参数为 θ,负责选择动作。
- 评论家(Critic): 价值网络 V_φ,参数为 φ,负责评估状态的好坏,用于计算优势函数估计。
我们使用 k-步时序差分(TD)来估计优势函数:
Â_t = (Σ_{i=0}^{k-1} γ^i r_{t+i}) + γ^k V_φ(s_{t+k}) - V_φ(s_t)
这个估计量混合了前 k 步的真实奖励和 k 步后的价值网络估计,在偏差和方差之间取得了良好的平衡。
基于此,我们得到了 A2C(优势演员-评论家) 算法。其核心步骤如下:
- 使用策略网络 π_θ 与环境交互,采样一段轨迹(或几个步骤)。
- 使用价值网络 V_φ 和采集到的奖励,计算每个时间步的优势估计 Â_t。
- 计算策略梯度:∇_θ J ≈ Σ_t Â_t · ∇_θ log π_θ(a_t | s_t),并更新策略网络参数 θ(梯度上升)。
- 计算价值网络的损失,例如均方误差:L(φ) = Σ_t (V_φ(s_t) - Target_t)^2,其中 Target_t 可以是 Â_t + V_φ(s_t) 或其他目标,并更新价值网络参数 φ(梯度下降)。
A3C(异步优势演员-评论家) 是 A2C 的并行化版本,多个工作者(worker)并行地在环境的不同副本中采集经验,并异步地更新共享的全局网络参数,从而大大提升了数据采集和训练效率。
应用于不同动作空间
离散动作空间(如Atari游戏)
- 策略网络架构: 输入为状态(如图像帧),输出层是一个Softmax层,产生所有可能动作的概率分布。
# 伪代码示例:离散动作策略网络前向传播 action_probs = softmax(neural_net(state)) action = sample_from_distribution(action_probs) # 采样动作 log_prob = log(action_probs[selected_action]) # 计算所选动作的对数概率 - 采样: 根据网络输出的概率分布随机采样一个动作。
- 计算对数概率: 在计算梯度时,只需提取所选动作对应的概率,然后计算其对数。
连续动作空间(如MuJoCo机器人控制)
- 策略网络架构: 输入为状态,输出为动作分布的参数。例如,对于每个动作维度,输出一个均值 μ 和一个用于控制方差的参数 τ。
# 伪代码示例:连续动作策略网络前向传播 mu, tau = neural_net(state) # 网络输出均值和方差参数 sigma = exp(tau) # 确保标准差为正 z = sample_gaussian(mu, sigma) # 从高斯分布采样 action = tanh(z) # 使用tanh将动作限制在[-1, 1]范围内 - 采样: 根据网络输出的分布参数(如高斯分布)采样一个连续值,通常还会经过一个变换(如tanh)以符合动作空间边界。
- 计算对数概率: 需要考虑采样过程中所有的变换(如tanh),使用变量变换公式来计算最终动作的对数概率密度。
算法稳定化技巧
Gamma 技巧
在理论推导中,策略梯度公式包含 γ^t 项。但在实践中,为了降低方差、稳定训练,常常在计算优势估计时使用一个折扣因子 γ,而在策略梯度项中忽略 γ^t。这个用于优势估计的 γ 被称为“人工折扣因子”,它虽然引入了轻微偏差,但能显著提升算法稳定性。
非均匀采样与高效更新
理论上,最纯粹的无偏随机梯度下降要求从轨迹中均匀采样单个时间步进行更新。但这效率低下。实践中,我们更常使用:
- 批量更新: 采集整条轨迹,计算所有时间步的梯度之和后进行更新(类似批量梯度下降)。
- 在线/逐步更新: 每与环境交互一步或几步(k步)就立即计算梯度并更新网络(类似随机梯度下降或小批量梯度下降)。A2C/A3C通常采用这种方式,它虽然不是严格无偏的,但更新频率高,实践效果很好。
总结

本节课中我们一起学习了深度策略梯度方法的核心。我们从策略优化目标出发,推导了策略梯度定理,并深入探讨了通过引入优势函数和价值网络作为基线来降低方差的关键技术。我们最终得到了实用的 A2C/A3C算法框架,它包含一个负责决策的演员网络和一个负责评估的评论家网络。我们还分析了如何将此框架应用于离散和连续动作空间,并介绍了一些重要的工程实践技巧,如 Gamma 技巧,这些技巧对于算法的稳定训练至关重要。策略梯度方法为直接优化策略提供了一套强大而灵活的工具,是深度强化学习中的基石算法之一。
005:深度策略梯度方法 (PPO, GRPO) 🚀

在本节课中,我们将要学习两种重要的深度强化学习算法:近端策略优化(PPO)和组相对策略优化(GRPO)。我们将从A2C方法的局限性出发,探讨如何通过引入替代目标和信任区域约束来提高样本效率,并最终理解这些方法如何被应用于大语言模型的强化学习。

概述
上一节我们介绍了A2C方法,它虽然简单有效,但存在样本效率低的问题。本节中,我们将看看如何通过构建替代目标函数和引入信任区域约束来改进策略梯度方法,从而发展出更强大的PPO算法。我们还将探讨专门为大语言模型场景设计的简化版本——GRPO算法。
从A2C到样本效率问题

A2C方法在许多方面表现良好,但它有一个缺点:样本效率低。
在机器学习中,样本效率指的是一个方法用较少数据点进行学习的能力。相比之下,人类具有非常好的样本效率,我们仅凭少量经验就能学习。而机器学习模型通常需要大量数据才能学习某个概念。即使在机器学习方法中,有些样本效率更高,有些则更低。




在模拟环境中进行强化学习时,例如学习玩Atari 2600视频游戏,样本效率实际上根本不是问题,只有计算效率才重要。在像Atari 2600这样拥有完整模拟器的环境中,样本是免费的,唯一需要付出成本的是计算时间。

然而,在许多强化学习设置中,样本(这里指的是完整的轨迹或状态-动作对)是通过与环境交互获得的,这可能非常昂贵。在这种情况下,我们更倾向于使用具有良好样本效率的方法。

例如,假设我们试图训练一个物理机器人在现实世界中执行某项任务。为了在这个强化学习环境中获得样本,你需要一个物理机器人。物理机器人需要在现实世界中采取某些行动,这可能会产生某些成本:消耗燃料、可能损坏物品。此外,物理机器人每天最多只能运行24小时,每台机器人的操作和维护成本都很高。
另一个例子是,当你让一个大语言模型生成一段文本,并让人类提供关于这段文本好坏的反馈时,人类阅读大语言模型的输出并提供反馈是一件成本非常高的事情。你需要支付这些人类的小时工资来提供此类反馈,因此你会希望学习算法对这些成本具有较高的样本效率。
构建替代目标以提高效率
那么,我们如何从一个轨迹 τ 中学习更多呢?A2C算法使用一个轨迹来执行T次随机梯度下降更新。现在,我们能否从一个给定的轨迹 τ 中学到更多?能否提高一点样本效率?

A2C的问题在于,对于每个时间步,最多只能获得一个随机梯度,然后该转移基本上就被遗忘了。但也许从一个特定的转移中可以提取出不止一个梯度步长的信息。A2C使用一个轨迹 τ 来执行T次SGD更新,由于每个轨迹有T个时间步,所以每个时间步进行一次SGD更新。
为了从一个轨迹中提取更多信息,一种方法是使用所谓的替代目标。
令 θ 和 θ₀ 为策略参数。考虑在 θ 和 θ₀ 处评估的目标函数 J(θ) 与 J(θ₀) 的差值。我们进行一系列推导,最终可以证明:


J(θ) - J(θ₀) = E_{τ~π_θ} [ Σ_{t=0}^{T-1} γ^t * (π_θ(a_t|s_t) / π_θ₀(a_t|s_t)) * A^{π_θ₀}(s_t, a_t) ]
其中 A^{π_θ₀}(s_t, a_t) 是策略 π_θ₀ 下的优势函数。

这个推导的关键步骤是重要性采样,它将从策略 π_θ 采样的期望,转换为从策略 π_θ₀ 采样的期望,并通过似然比 π_θ(a|s) / π_θ₀(a|s) 进行修正。



然而,这个期望中的 θ 出现在分布部分(即轨迹 τ 是从 π_θ 采样的),这在优化时不太方便。因此,我们用一个近似值 K(θ, θ₀) 来替代 J(θ),其中将采样分布固定为 π_θ₀:

K(θ, θ₀) = J(θ₀) + E_{τ~π_θ₀} [ Σ_{t=0}^{T-1} γ^t * (π_θ(a_t|s_t) / π_θ₀(a_t|s_t)) * A^{π_θ₀}(s_t, a_t) ]
可以证明,当 θ 接近 θ₀ 时,K(θ, θ₀) 与 J(θ) 的一阶梯度相同。虽然二阶及更高阶导数可能不同,但这一阶近似在实践中被证明是有效的。
信任区域策略优化 (TRPO)
我们使用 K(θ, θ₀) 作为 J(θ) 的替代目标进行优化。由于 K 仍然是一个期望,我们需要通过采样来近似它。我们会采样 n 个独立同分布的轨迹 τ₁, ..., τₙ,并进行经验平均。
然而,这种重要性采样估计器只有在采样分布 π_θ₀ 与名义分布 π_θ 相差不大时才准确。因此,我们需要在优化时施加一个信任区域约束,确保 θ 不会离 θ₀ 太远。


这就引出了信任区域策略优化算法。TRPO通过求解一系列带约束的优化问题来改进策略:
最大化: L(θ) = (1/n) Σ_{i=1}^n Σ_{t=0}^{T-1} (π_θ(a_t^i|s_t^i) / π_θ₀(a_t^i|s_t^i)) * Â_t^i
约束条件: D_KL(π_θ(·|s) || π_θ₀(·|s)) ≤ δ, 对于所有在样本中出现的状态 s

其中 Â_t^i 是优势函数的估计值,D_KL 是KL散度,用于度量两个策略分布的差异。


TRPO算法流程如下:
- 使用当前策略
π_θ_current采样n个轨迹。 - 使用这些轨迹计算优势估计
Â(通常配合一个价值网络)。 - 求解上述带KL散度约束的优化问题,得到新参数
θ_new。 - 更新策略参数:
θ_current = θ_new。 - 使用新采样的数据更新价值网络(作为基线)。
- 重复步骤1-5。





TRPO的挑战在于,求解带KL散度约束的优化问题需要二阶优化方法(如共轭梯度法),实现起来较为复杂。

近端策略优化 (PPO)
为了解决TRPO实现复杂的问题,近端策略优化算法回归到一阶优化,同时保留了信任区域的思想。PPO论文提出了两种算法,其中PPO-Clip是现今最常用的。
PPO使用裁剪替代目标,其形式如下:
L^{CLIP}(θ) = E_t [ min( r_t(θ) * Â_t, clip(r_t(θ), 1-ε, 1+ε) * Â_t ) ]
其中 r_t(θ) = π_θ(a_t|s_t) / π_θ₀(a_t|s_t) 是似然比,ε 是一个超参数(例如0.2)。

这个目标函数的直观解释是:
- 当优势估计
Â_t为正时,我们希望增加该动作的概率(即增大r_t(θ))。但裁剪机制确保我们只鼓励r_t(θ)增长到1+ε,超过此值后目标函数不再提供增长激励。 - 当优势估计
Â_t为负时,我们希望减少该动作的概率(即减小r_t(θ))。裁剪机制确保我们只鼓励r_t(θ)减少到1-ε,超过此值后不再提供减少激励。
因此,裁剪机制隐式地限制了新策略 π_θ 不能偏离旧策略 π_θ₀ 太远。
PPO算法流程如下:
- 使用当前策略
π_θ_k采样n个轨迹。 - 计算优势估计
Â_t(例如使用GAE)。 - 在采样的数据上,通过几轮(例如10轮)SGD或Adam优化来近似最大化裁剪替代目标
L^{CLIP}(θ)。提前停止是关键,它进一步确保了信任区域约束。 - 更新策略参数:
θ_{k+1} = θ。 - 更新价值网络。
- 重复。
PPO通过裁剪目标和提前停止这两个机制,巧妙地用一阶优化实现了信任区域约束,大大简化了实现并保持了良好的性能。
优势估计:从TD到GAE

在PPO等算法中,我们需要优势函数 A(s, a) 的估计值 Â。以下是几种常见的估计器:

- TD(1)估计器:
Â_t = r_t + γ * V(s_{t+1}) - V(s_t)。方差小,偏差大。 - TD(k)估计器:使用未来k步的奖励和状态值估计。k越大,偏差越小,但方差越大。
- TD(∞) / Monte Carlo估计器:
Â_t = (Σ_{i=t}^{T-1} γ^{i-t} r_i) - V(s_t)。偏差小(若V准确),方差大。
为了在偏差和方差之间取得更好的平衡,我们使用广义优势估计。GAE是TD(k)估计器的指数加权平均,引入了一个参数 λ ∈ [0, 1]:
Â_t^{GAE(γ, λ)} = Σ_{l=0}^{∞} (γλ)^l * δ_{t+l}
其中 δ_t = r_t + γ * V(s_{t+1}) - V(s_t)
当 λ=0 时,GAE退化为TD(1);当 λ=1 时,GAE退化为TD(∞)(蒙特卡洛估计)。λ 提供了连续的偏差-方差权衡调节:λ 越小,偏差越大,方差越小;λ 越大,偏差越小,方差越大。
在实践中,PPO常配合GAE使用,典型超参数为 γ=0.995, λ=0.96。
策略优势与近似策略迭代视角
TRPO和PPO也可以从近似策略迭代的角度来理解。我们定义策略 π 相对于当前策略 π_k 的策略优势:
I(π, π_k) = E_{τ~π_k} [ Σ_{t=0}^{T-1} γ^t * A^{π_k}(s_t, a_t') ]
其中 a_t' ~ π(·|s_t)
它衡量了在 π_k 生成的状态序列上,执行 π 的动作会比执行 π_k 的动作好多少。

可以证明,经典的策略迭代算法等价于在每一步最大化策略优势。然而,在大型问题中,我们无法精确计算 I(π, π_k),只能通过重要性采样来估计:


Î(π, π_k) = (1/n) Σ_{i=1}^n Σ_{t=0}^{T-1} (π(a_t^i|s_t^i) / π_k(a_t^i|s_t^i)) * Â_t^i
如果我们直接最大化这个估计量 Î,会因为重要性采样权重的不稳定性而失败。因此,我们需要信任区域约束(TRPO)或裁剪机制(PPO)来确保 π 不会离 π_k 太远。从这个角度看,TRPO/PPO可以视为一种能够利用当前策略信息的近似策略迭代方法。
组相对策略优化 (GRPO) 🤖


TRPO和PPO的一个共同点是需要学习两个神经网络:策略网络 π_θ 和价值网络 V_φ。价值网络在训练后会被丢弃,只用于训练过程中降低方差。能否避免学习这个额外的网络呢?
考虑大语言模型强化学习中的一个常见设定:
- 无折扣的MDP(
γ=1)。 - 只有在回合结束时才获得一个非零的奖励(无中间奖励)。
在这种设定下,一个朴素的想法是使用PPO,但不用价值网络作为基线,而是直接用最终奖励 R 作为优势估计(即 Â_t = R)。但这样做方差会非常大,导致训练不稳定或低效。

组相对策略优化 就是为此设计的一种简化算法。GRPO用批归一化风格的奖励标准化替代了价值网络基线。
GRPO算法流程:
- 使用当前策略
π_θ采样n个独立同分布的轨迹。 - 收集这
n个轨迹的最终奖励,构成一个奖励向量R = [R_1, R_2, ..., R_n]。 - 计算标准化后的“优势”估计:
其中Â_i = (R_i - mean(R)) / (std(R) + ε)ε是一个很小的数(如1e-4),防止除零。 - 将这些
Â_i代入PPO的裁剪目标函数中(每个轨迹的所有时间步都使用相同的Â_i)。 - 优化策略参数
θ,提前停止。 - 重复。
核心思想:mean(R) 充当了基线,它代表了当前策略预期能获得的平均回报。std(R) 用于归一化,使更新步长更稳定。这个 Â 虽然不是真实优势函数的无偏估计,但它衡量了一个轨迹的回报相对于同批内其他轨迹的好坏程度,提供了有效的学习信号。





需要注意:
- GRPO目前主要在大语言模型强化学习场景中验证有效,尚未成为通用的深度强化学习方法。
- 它的流行很大程度上是因为被用于训练DeepSeek-R1等知名模型。未来可能会有更好的算法出现来改进或替代它。


为什么大语言模型RL常用PPO/GRPO?



最后,我们讨论一下为什么大语言模型的强化学习通常使用PPO/GRPO这类策略梯度方法,而不是其他深度强化学习算法(如DQN、DDPG、SAC等)。


大语言模型强化学习设置的关键特性:
- 离散动作空间:每一步从词汇表中生成一个token。
- 强大的预训练模型:我们有一个经过大规模预训练的语言模型作为策略网络的优质初始点。这是RLHF成功的关键。如果从头开始随机初始化进行纯强化学习,几乎不可能成功。

与其他深度RL算法的对比:
- DQN/Rainbow:这类方法学习一个Q函数网络,策略是隐式地通过贪心选择Q值最大的动作得到的。它们没有显式的策略网络,因此难以有效利用预训练的语言模型(策略)作为先验知识。
- DDPG/TD3/SAC:这类方法通常为连续动作空间设计(尽管有离散变体)。它们同时学习策略网络
π_θ和Q网络Q_φ。策略网络的更新依赖于Q网络的准确性。在这种框架下,我们只有策略网络的好初始化,而没有Q网络的好初始化,因此难以有效利用预训练模型。此外,奖励信号是通过Q网络间接影响策略更新的,不如PPO中奖励直接作用于策略更新来得直观和可能更高效。






因此,PPO这类直接优化策略、能够自然融入信任区域以防止灾难性遗忘、且能直接利用预训练策略作为起点的方法,特别适合大语言模型的强化学习微调场景。GRPO则在此基础上进一步简化,去掉了需要单独训练的价值网络,更适合某些LLM RL的特定简化设定。









总结








本节课中我们一起学习了深度策略梯度方法的重要进展。我们从A2C的样本效率问题出发,推导了替代目标函数,并引出了需要信任区域约束的思想。TRPO通过严格的KL散度约束实现了这一点,但计算复杂。PPO则巧妙地使用裁剪替代目标和提前停止机制,用一阶优化近似了信任区域,成为实践中最流行的算法之一。我们还探讨了优势估计的偏差-方差权衡以及GAE估计器。最后,我们看到了针对大语言模型场景简化的GRPO算法,它用批归一化奖励替代了价值网络。理解这些算法的发展脉络和设计思想,对于掌握现代大语言模型强化学习技术至关重要。
006:AlphaGo、测试时计算与专家迭代 🎮

在本节中,我们将探讨AlphaGo、测试时计算与专家迭代。虽然大语言模型的强化学习并未直接使用这些思想,但它们之间存在着紧密且重要的概念联系。
从双人零和博弈开始
上一节我们介绍了强化学习的基础概念。本节中,我们来看看一个特殊的场景:双人零和博弈。在这种博弈中,两名玩家相互竞争,一方的收益恰好是另一方的损失。例如,一方获胜,则另一方失败。
在同步行动博弈中,双方同时做出决策,例如“石头剪刀布”游戏。而在序贯行动博弈(或称回合制游戏)中,双方轮流行动,例如国际象棋和围棋。
我们可以将序贯行动博弈视为一种特殊的同步行动博弈:在游戏开始时,双方各自提供一个策略 π₁ 和 π₂。在现实比赛中,玩家的大脑就是他们的策略,这些策略可以制定计划、适应对手的行动,并在必要时做出随机化决策。
极小极大优化
在标准强化学习中,我们求解的是最大化问题,目标是最大化期望累积折扣回报。然而,在涉及对抗性训练的双人零和博弈中,问题被表述为极小极大优化。
公式:
min_{θ₂} max_{θ₁} R(θ₁, θ₂)
其中,玩家1(参数θ₁)希望最大化奖励R,而玩家2(参数θ₂)希望最小化玩家1的奖励(即最大化自己的奖励)。
如果配置 (θ₁, θ₂) 是一个纳什均衡,那么它就是该极小极大问题的一个解。这意味着,任何玩家单方面偏离此配置都不会带来收益。
一个简单例子:石头剪刀布
以下是石头剪刀布游戏的收益矩阵示例:
- 玩家1的策略是概率分布 [P₁(石头), P₁(剪刀), P₁(布)]。
- 玩家2的策略是概率分布 [P₂(石头), P₂(剪刀), P₂(布)]。
- 收益规则:石头胜剪刀,剪刀胜布,布胜石头,相同则为平局。
在深度学习中,我们可以用参数化的softmax分布来表示这些策略。该游戏的纳什均衡是双方都以 1/3 的等概率选择每个动作。
求解极小极大优化:挑战与算法
在深度学习中,我们通常使用一阶方法(如SGD、Adam)进行优化。然而,极小极大优化的收敛性并非理所当然,其训练过程比单纯的极小化或极大化问题更加不稳定。
代码:一个简单的算法是同步梯度上升/下降法:
# 同时更新两个玩家
θ₁ = θ₁ + α * ∇_{θ₁} R(θ₁, θ₂) # 玩家1:梯度上升
θ₂ = θ₂ - α * ∇_{θ₂} R(θ₁, θ₂) # 玩家2:梯度下降
但即使在石头剪刀布这样的简单例子中,该算法也可能导致策略振荡且幅度不断增大,无法收敛到纳什均衡。
为了解决不稳定的循环动力学问题,可以采用以下方法:
- 额外梯度法:玩家先计算一个“前瞻”步骤的梯度,然后基于该梯度进行实际更新。
- 锚定/权重衰减:在更新中引入向零点(或某个锚点)收缩的项,可以稳定训练动态。
对称博弈与自我对弈
国际象棋和围棋等游戏具有反对称收益特性。当收益函数具有这种对称性时,纳什均衡出现在双方策略相同且收益为零的点。此时,两个玩家的梯度在相同输入下具有关联性。
这意味着,我们可以只训练一个策略网络,让这个智能体与自身进行对抗。这极大地简化了问题,也是AlphaGo等算法的核心思想之一。
AlphaGo 训练流程
AlphaGo结合了学习与搜索,实现了超越人类的围棋水平。其训练主要分为几个阶段:
第一阶段:监督学习(模仿学习)
- 使用卷积神经网络(CNN)初始化策略网络 π_θ。
- 网络输入是棋盘状态 s,输出是下一步动作的概率分布。
- 利用人类高手对弈记录的数据集 (s, a_expert) 进行训练,最小化交叉熵损失,让网络预测专家的走法。
第二阶段:强化学习(自我对弈)
- 以上一阶段训练的策略网络作为起点。
- 让当前策略与其较早版本进行对弈(使用延迟机制以稳定训练)。
- 由于是反对称博弈,使用策略梯度方法更新网络参数,目标是最大化获胜概率 z(+1为胜,-1为负)。
- 经过RL训练的策略网络,能击败纯模仿学习策略,但尚不足以战胜顶尖人类选手。
第三阶段:价值网络训练
- 训练一个价值网络 V_φ(s),用于评估棋盘状态的优劣。
- 通过自我对弈收集数据 (s, z),其中 z 是从状态 s 出发的最终胜负结果。
- 使用蒙特卡洛策略评估方法,通过随机梯度下降来拟合价值函数。
- 由于围棋动态是确定性的,状态-动作值函数 Q(s, a) 与 V(s‘) 包含的信息等价(需注意玩家交替导致的符号变化)。
第四阶段:快速走子策略
- 训练一个轻量级、快速的策略网络,用于后续的蒙特卡洛树搜索中的快速模拟( rollout)。
- 该策略计算极快(微秒级),虽棋力不强,但懂基本规则。
蒙特卡洛树搜索:测试时计算的核心
纯神经网络策略在有限算力下无法达到顶尖水平,因此需要引入搜索。人类棋手也会在行动前进行“深思”,这类似于系统二思维。
MCTS原则:
- 逐步构建搜索树:在给定的计算预算内,有选择地扩展树的宽度和深度。
- 控制搜索宽度:只考虑“好”的动作,这些动作由策略网络的高概率动作、高Q值动作以及尚未充分探索的动作共同决定。
- 评估叶节点:当搜索达到一定深度(如30步)的叶节点状态 s̃ 时,通过两种方式评估:
- 使用价值网络 V_φ(s̃) 直接评估。
- 使用快速走子策略从 s̃ 开始模拟对局直到终局,以胜负结果 z 作为评估。
- 结合以上两种评估。
基于叶节点的评估,通过回溯更新搜索树中路径上动作的统计值。最终,在根节点处选择统计值最好的动作作为当前步的决策。MCTS的关键在于:为未来多步进行规划,但只立即执行一步。
从AlphaGo到AlphaGo Zero:专家迭代
AlphaGo Zero是AlphaGo的改进版,其主要进步包括:
- 无需人类数据:完全从随机初始化开始,通过自我对弈学习。
- 更优网络架构:使用带残差连接和批归一化的更深网络,并共享策略头与价值头的底层特征。
- 整合搜索到训练中:采用专家迭代算法。
专家迭代流程:
- 基于当前神经网络(提供策略先验和价值评估),运行蒙特卡洛树搜索。MCTS产生的策略比原始神经网络策略更强。
- 使用这个更强的MCTS策略进行自我对弈,生成对弈数据,包括状态 s 和MCTS推荐的动作 a_MCTS,以及最终胜负 z。
- 用这些数据同时改进神经网络:
- 用 (s, a_MCTS) 数据训练策略网络,使其模仿MCTS的走法(监督学习)。
- 用 (s, z) 数据训练价值网络,使其更准确预测胜负。
- 改进后的神经网络会使得下一次MCTS更强大,如此循环迭代。
核心洞察:通过让神经网络模仿一个由“搜索”增强的、更强大的“专家策略”,可以比纯强化学习更高效地提升性能。
测试时计算的威力与启示
在围棋和扑克等领域,测试时计算(即在对弈时进行大量搜索)被证明是达到超高水平的关键。
- 性能差距:纯神经网络要达到与结合搜索的智能体相同的水平,可能需要成千上万倍的训练计算量。
- 数学原因:训练一个策略需要应对所有可能的游戏状态。而测试时搜索只需针对当前具体的局面,解决一个更小的、相关的子问题,因此效率极高。
- 通用启示:在答案可验证的领域(如游戏有明确胜负),结合测试时计算的专家迭代方法,能显著加速训练并达到仅靠训练难以企及的性能高峰。
本章总结 🎯
在本节课中,我们一起学习了:
- 双人零和博弈与极小极大优化的基本框架及其训练稳定性挑战。
- AlphaGo 如何结合模仿学习、强化学习、价值网络和蒙特卡洛树搜索,攻克了围棋这一复杂领域。
- AlphaGo Zero 的专家迭代范式,如何通过让神经网络模仿搜索增强的策略,实现更高效、更强大的从零开始学习。
- 测试时计算的核心思想及其重要性:在推理时投入额外计算资源进行搜索或规划,能够解决训练阶段难以完全覆盖的复杂问题,是实现超越性性能的关键技术之一。

这些在游戏AI中发展起来的思想,为后续研究大语言模型中的推理、规划和强化学习提供了重要的概念基础。
007:NLP基础、语言建模与RNN

在本节课中,我们将学习自然语言处理的基础知识、语言建模的核心概念,以及循环神经网络的基本原理。本节内容旨在为后续学习大语言模型和强化学习打下基础。
概述
自然语言处理旨在通过计算处理人类自然语言。其目标是设计或训练能够理解和处理文本信息的系统。现代NLP主要依赖于数据驱动的深度学习方法。
自然语言处理基础
自然语言是指在人类使用和重复中自然演化而成的语言,例如英语或韩语。它们与形式化和构造的语言(如C、Python等编程语言,或世界语等人造语言)不同。
现代NLP领域曾一度依赖语言学洞见,但现在已由数据驱动的深度学习方法主导。
以下是NLP领域内的一个示例任务,称为情感分析。给定一段文本评论X,任务是确定其中包含的情感是消极、中性还是积极。
示例:
- “我不喜欢这部电影。” → 消极情感
- “我爱这部电影。” → 积极情感
此任务的一个特点是输入文本X的长度是可变的,而输出(情感分类)是固定大小的。
词袋模型
解决此类任务的一个经典简单方法是词袋模型。词袋模型通过标记化单词的线性组合进行预测。
工作原理:
- 每个单词被分配一个独热向量。独热向量是除一个坐标为1外其余全为0的向量。
- 将所有单词对应的独热向量相加。
- 将相加后的向量与一个权重向量进行内积运算,并加上一个偏置项,得到一个分数。
- 根据分数判断情感(例如,正分对应积极,负分对应消极)。
公式:
分数 = A · (Σ 独热向量) + b
其中,权重向量A和偏置标量b是可训练参数。
词袋模型将句子视为无序的单词集合。其显著缺点是完全忽略了单词顺序,而自然语言中的大量含义恰恰由单词的精确顺序决定。
序列表示与标记化
我们使用序列符号来表示文本。令U为任意集合,则U的K元组是一个有序列表 (u1, u2, ..., uK)。U* 表示所有有限长度序列的集合。

在NLP中,令C为字符集(如英文字母、空格、标点),则 X = C* 表示我们将要处理的文本集合。
现代NLP使用神经网络处理文本,而神经网络对向量和数字进行算术运算。因此,在流程的某个环节,文本必须转换为向量序列,这就是标记化器的作用。
给定文本X(字符序列),标记化器τ是一个函数,它将文本映射为一个长度为L的向量序列 (u1, u2, ..., uL),其中每个向量 ui 的长度均为n。输入字符长度T和输出向量长度L不一定相等,通常L小于T。
标记化器可以是固定的,也可以是可训练的(如Word2Vec)。对于文本生成任务,我们通常希望标记化器是可逆的。
标记化器选项
字符级标记化器:
- 简单版本:将每个字符映射为一个标量(如‘a’->1, ‘b’->2)。这效果不佳,因为神经网络更擅长区分方向而非大小。
- 改进版本:将每个字符映射为一个独热向量。若字符集大小为30,则输出向量长度为30。输出序列长度L等于输入字符长度T。
词级标记化器:
- 将文本按空格分割为单词序列。
- 每个单词映射为一个独热向量。
- 输出向量长度n等于词典大小|W|。
- 输出序列长度L远小于输入字符长度T,因为单词通常由多个字符组成。

比较:
- 词级标记化器的优势:序列更短;直接利用词典信息,模型学习更快。
- 字符级标记化器的优势:能处理拼写错误和词形变化;更适合多语言模型,因为组合多种语言的词典会非常庞大。
其他标记化器:包括可训练的词级标记化器Word2Vec,以及子词标记化器(如字节对编码),后者在字符和单词之间进行标记化。

我们使用字符串结束标记来表示序列的终止。对于序列 x = (c1, c2, ..., cT),我们等价地将其视为 (c1, c2, ..., cT, EOS)。
语言建模

语言模型的目标通常包括以下两者之一或全部:
- 为目标句子分配概率和似然。
- 生成可能且连贯的句子。
在ChatGPT时代之前,语言模型的用途并不明显。实际上,语言模型非常有用。

应用示例:
- 语音转文字系统:解决听觉歧义。例如,“The parcel was secured by gray tape.” 与 “The parcel was secured by great ape.” 听觉上可能模糊,但语言模型能判断前者更合理。
- 拼写纠正。
- 自动补全:根据已有文本建议可能的后续内容。
- 自监督预训练与通用接口:
- 在大规模语料库上预训练语言模型是一种有用的前置任务,得到的模型称为基础模型。
- 可对此基础模型进行微调,以完成下游任务(如情感分析、翻译)。
- 足够强大的语言模型可以充当基于语言的通用接口,用户只需用自然语言描述需求。
序列概率与自回归模型



假设我们有一个随机生成的序列 U1, U2, ..., UL。序列长度L本身也是随机变量。序列生成的概率可以按链式法则分解为一系列条件概率的乘积。

公式:
P(U1, ..., UL, EOS) = P(EOS | U1, ..., UL) * Π_{i=1}^{L} P(Ui | U1, ..., U{i-1})

此分解未对序列概率分布做任何假设(如马尔可夫性),始终成立。
自回归模型旨在学习一个模型 f_θ,以近似给定过去观测值 U1, ..., U{L-1} 时,下一个元素 UL 的完整条件分布 P(UL | U1, ..., U{L-1})。





如果 f_θ 训练良好,我们可以:
- 近似计算序列似然:用
f_θ的评估值乘积近似真实条件概率的乘积。 - 进行文本生成:给定未终止的部分序列,根据
f_θ定义的分布逐个采样生成后续标记。


循环神经网络





现代NLP使用深度神经网络处理可变长度的序列。我们首先介绍RNN,然后过渡到Transformer架构。尽管当前主流LLM使用Transformer,但了解RNN有助于理解Transformer许多组件的设计动机。



处理可变尺寸输入的简单想法:填充短序列至统一长度。缺点:对长序列扩展性差;需要预设最大长度。

改进想法:逐层处理一个输入。每一步,网络结合当前输入 UL 和前一隐藏状态 H{L-1},通过一个线性层加非线性激活函数,产生新的隐藏状态 HL。
- 优势:短序列计算量小;每层处理较小向量。
- 缺点:参数量随最大序列长度增长;存在梯度爆炸/消失问题。
循环神经网络:通过权重共享解决参数量问题。所有时间步共享相同的线性层参数A和b。
RNN一般形式:
HL = q_θ̃(H{L-1}, UL)
输出 = A * HL + b
其中 θ̃ 是循环函数的参数,θ 包含 θ̃ 和输出层的A、b。
RNN能正常工作,需要循环函数 q_θ̃ 能够缓解梯度爆炸/消失问题。
梯度爆炸与消失

RNN本质上是沿时间维度的极深网络。在反向传播时,梯度涉及许多雅可比矩阵的连乘。
- 梯度爆炸:连乘值变得极大。可通过梯度裁剪缓解:当梯度范数超过阈值v时,保持方向但将范数缩放到v。
- 梯度消失:连乘值趋近于零。导致早期时间步的梯度信号微弱,模型无法学习利用较早的输入信息,即出现“遗忘”。


我们希望梯度流良好时(需记住信息),雅可比矩阵接近单位矩阵;希望梯度流阻断时(需忘记信息),雅可比矩阵接近零矩阵。

LSTM:长短期记忆网络


LSTM设计了一种能显式控制何时记忆、何时遗忘信息的神经电路。

核心思想:引入细胞状态 C 作为记忆单元,并通过门控机制调控信息流。
C_L = C_{L-1} ⊙ F + G
其中 ⊙ 表示逐元素乘法。F(遗忘门)控制保留多少旧记忆,G 控制添加多少新信息。导数 dC_L / dC_{L-1} = F,通过设置F的值可以控制梯度流。



LSTM细胞结构(简化描述):
- 将当前输入
UL和前一隐藏状态H{L-1}拼接,通过线性层生成四个分量:F_bar,I_bar,G_bar,O_bar。 - 遗忘门
F = σ(F_bar):决定从细胞状态中丢弃什么信息。 - 输入门
I = σ(I_bar):决定哪些新信息将被存储。 - 候选值
G = tanh(G_bar):表示可能添加到细胞状态的新信息。 - 更新细胞状态:
C_L = C_{L-1} ⊙ F + G ⊙ I。 - 输出门
O = σ(O_bar):基于细胞状态决定输出什么。 - 最终隐藏状态:
H_L = tanh(C_L) ⊙ O。



LSTM通过门控机制促进了更好的梯度流,比朴素RNN表现更好。有时会使用带输出投影的LSTM,使内部计算维度较小,而输出隐藏状态维度较大,以适应语言建模中较大的词汇表。





使用RNN的任务





- 情感分析:使用RNN(如LSTM)处理标记化后的单词序列,最终隐藏状态(或所有隐藏状态经池化后)通过线性层进行分类。
- 词性标注:RNN在每个时间步都产生输出,损失是所有时间步损失之和。
- 语言建模:训练RNN作为自回归模型。在每个时间步,根据之前的所有单词预测下一个单词,使用交叉熵损失。总训练损失是所有时间步交叉熵损失之和。
深度与双向性:
- 堆叠RNN:将前一RNN层的隐藏状态序列作为下一RNN层的输入序列。通常使用2-8层。
- 双向RNN:结合一个前向RNN和一个反向RNN,同时从两个方向处理序列,能更好地利用上下文信息。最佳实践通常是使用堆叠的双向RNN。
训练与推理的差异
- 训练(教师强制):使用真实的下一个词作为输入,类似于模仿学习。模型始终在真实数据分布上训练。
- 推理(生成):模型使用自己生成的词作为后续输入。一旦生成一个不自然的词,后续生成就可能偏离训练分布,导致性能下降。
解决方案:
- 计划采样:在训练中逐步从教师强制过渡到使用模型自身的预测。
- 大规模数据训练:使用海量且多样的数据(包括优质文本和粗糙的网络文本)进行预训练,使模型获得鲁棒性,即使生成了不完美的部分也能继续合理生成。这是现代大语言模型采用的主要方法。
从Word2Vec到ELMo:更好的标记化

标记化器的重要性:它是语言与算法的首次接触。模型性能很大程度上取决于标记化器提供的向量序列质量。



Word2Vec:基于分布式语义思想——“词的含义由其上下文决定”。通过训练一个模型,使中心词的向量能预测其周围词的概率。训练后,语义相似的词会具有相似的向量表示。
- 优势:相比独热编码,Word2Vec提供的词向量包含了丰富的语义相似性信息,能显著提升下游RNN任务的性能。
- 局限:词向量是静态的,无法解决一词多义问题。

ELMo:生成上下文相关的标记化器。它使用双向LSTM结构,同时考虑单词左右两侧的上下文来生成词向量。
- 训练:通过双向语言建模损失进行自监督预训练(前向预测下一个词,反向预测前一个词)。这使得ELMo是一个非因果语言模型。
- 应用:将ELMo生成的上下文相关向量与原始词向量拼接,作为下游NLP任务的输入。ELMo在多项NLP任务上取得了当时最好的性能,证明了大规模自监督预训练加微调范式的强大威力。
- 局限:基于RNN,计算效率仍有提升空间;仍需为每个下游任务搭配特定的现有NLP方法。
总结
本节课我们一起学习了NLP和语言建模的基础知识。我们了解了词袋模型的局限性,认识了标记化的重要性以及字符级、词级和子词标记化器的特点。我们深入探讨了语言模型的目标和应用,并学习了如何通过自回归模型为序列分配概率和生成文本。
我们重点介绍了循环神经网络,分析了其处理可变长度序列的方式,以及面临的梯度爆炸和消失问题。为此,我们学习了LSTM的门控机制如何缓解这些问题。我们还探讨了如何使用RNN完成情感分析、词性标注和语言建模等任务,并指出了训练(教师强制)与推理(生成)之间的差异。

最后,我们回顾了从静态词向量Word2Vec到上下文相关词向量ELMo的发展,看到了自监督预训练如何革命性地提升了NLP模型的性能,为后续学习更强大的Transformer架构奠定了基础。
008:Transformer I (BERT, GPT-1) 🧠


在本节课中,我们将要学习Transformer架构的基础知识,这是现代大语言模型的核心。我们将从最简单的“仅编码器”Transformer(如BERT)开始,逐步了解其核心组件,然后扩展到“仅解码器”Transformer(如GPT-1)。理解这些基础对于后续学习更复杂的模型至关重要。





从BERT到Transformer架构

上一节我们讨论了基于RNN的语言模型。BERT的出现带来了重大变革。BERT是“来自Transformer的双向编码器表示”的缩写。它用“仅编码器Transformer层”取代了ELMo中的LSTM。BERT提出了一种更通用的方法,统一了各种NLP任务的处理方式,并在几乎所有NLP基准测试中创造了新的最佳性能。
BERT使用了Transformer架构。Transformer是一种序列到序列模型。之所以命名为Transformer,是因为它们在每一层都将一个序列转换为另一个序列。



Transformer主要有三种类型,按复杂度从低到高排列如下:
- 仅编码器Transformer:这是BERT使用的架构。
- 仅解码器Transformer:这是GPT使用的架构。
- 编码器-解码器Transformer:这是Vaswani等人提出的原始Transformer。



我们将采用一种逆时间顺序,首先讨论最简单的“仅编码器Transformer”。


仅编码器Transformer的核心组件

仅编码器Transformer依赖于以下几个核心组件:
- 词元嵌入
- 多头自注意力
- 残差连接
- 层归一化
- 逐位置前馈网络
- 位置编码
鉴于Transformer的重要性(它驱动了整个语言建模领域,如今也通过视觉Transformer应用于计算机视觉),我们值得花时间去理解Transformer架构中的每一个细节。





词元嵌入

我们从词元嵌入开始。令 τ 为一个分词器,它接收文本 X 作为输入,然后产生词元 u₁ 到 u_L。

对于Transformer使用的分词器,我们可以将这些 u 视为独热向量。假设有 N 个可能的词元选择,在第 i 个位置,向量 u 取值为在第 k 个位置为1的独热向量。或者,我们可以等价地将这个分词后的 u 值视为整数 k。我们将在 u_i = 整数k 和 u = 独热向量 e_k 这两种表示法之间切换。N 是不同词元的数量。



词级分词器是其中最简单的实例之一,尽管我们很快会讨论字节对编码。

词元嵌入层作用于分词器之后。分词器和词元嵌入层是分开的。词元嵌入层将这些 u 值作为输入,然后将它们映射到 v 值。有两种等价的理解方式:

u_l是一个介于0和N之间的整数值。我们有向量a₁到a_N。如果u_l是某个整数值k,那么我们就取那个a_k向量,它成为我们的v向量。- 我们可以形成矩阵
A,这是一个D × N的矩阵。所有这些a向量(a₁到a_N)都是长度为D的向量,共有N个。如果我们这样堆叠它们,矩阵A将是一个D × N的矩阵。然后,如果我们将u_l解释为一个独热向量,其第k个分量为1,那么我们可以将其写为A乘以独热向量u。其效果将是提取第k列。如果u_l = e_k,那么第k列将被提取,并且v_l = a_k。因此,如果u_l = 整数k,那么结果就是a_k。这两种是等价的表达式。

这个 D × N 的矩阵 A,或者说这 N 个长度为 D 的向量 a₁ 到 a_N,是词元嵌入层的可训练参数。在PyTorch中,这一层被定义为嵌入层。词元嵌入层应用于Transformer的最开始。第一步是分词器 τ,然后在分词器 τ 之后,应用词元嵌入层。






单头自注意力层
接下来,我们介绍单头自注意力层。让我们深入所有细节。


假设自注意力层的输入是序列 x₁ 到 x_L。L 是序列长度,D_x 是这些 x 向量的维度。我们假设所有 x 向量具有相同的维度。我们将这一层的输出表示为 y 向量,即 y₁ 到 y_L。输出向量 y₁ 到 y_L 的维度为 D_v。D_v 和 D_x 不一定相同,但我们假设所有 y 序列向量具有相同的长度 D_v,并且序列长度保持不变(输入序列长度为 L,输出序列长度也为 L)。注意力层不改变序列长度。

给定这些输入向量 x₁ 到 x_L,我们可以将它们堆叠起来写成这个大 X 矩阵。这个大 X 矩阵有 L 行和 D_x 列。X 的结构是:第一行是 x₁ᵀ,第二行是 x₂ᵀ,最后一行是 x_Lᵀ。你收集所有这些 x 向量并形成这个大 X 矩阵。

然后,我们形成 Q、K 和 V 矩阵:
Q = X W_QK = X W_KV = X W_V




这些 W 矩阵对于 Q、K、V 值是各自独立的。X W_Q 的结果是 L × D_K,这意味着 W_Q 是一个 D_x × D_K 的矩阵。Q 和 K 具有相同的维度,所以 W_K 也是相同的大小。X W_V 的结果是 L × D_V 维,所以 W_V 矩阵的维度是 D_x × D_V。






例如,我们取矩阵 K 并将其每一行表示为 k₁, k₂, ..., k_L。获得这些 k 向量的方法是:取 x 向量 x₁,乘以 W_Kᵀ 得到 k₁;取 x₂ 乘以 W_Kᵀ 得到 k₂;取 x_L 乘以 W_Kᵀ 得到 k_L。
同样地,Q 矩阵也是 L × D_K,它有 L 行。我们将 Q 的第一行称为 q₁,第二行称为 q₂,一直到 q_L。q₂ 是 Q 矩阵的第二行,通过取 x₂ 并乘以 W_Qᵀ 得到。对于 v 向量也是如此。大 V 的第一行称为 v₁,第二行是 v₂,最后一行是 v_L。这些 v 向量被堆叠成这个大 V 矩阵。我们获得这些 v 向量的方法是:取 x₁ 乘以 W_Vᵀ 得到 v₁;取 x₂ 乘以 W_Vᵀ 得到 v₂;取 x_L 乘以 W_Vᵀ 得到 v_L。

自注意力层的输出表示为 y₁ 到 y_L。我们再次将这些 y 堆叠成大 Y。大 Y 的第一行是 y₁ᵀ,第二行是 y₂ᵀ,最后一行是 y_Lᵀ。
这个大 Y 输出可以更紧凑地写成:
Y = softmax( (Q Kᵀ) / √(D_K) ) V





这意味着:Q 和 Kᵀ 作为矩阵相乘,如果计算 Q Kᵀ,会得到一个 L × L 的矩阵。除以 √(D_K) 是为了缩放。然后应用按行的softmax,结果是一个 L × L 的矩阵。V 是一个 L × D_V 的矩阵。执行这个矩阵乘法,然后得到一个 L × D_V 的矩阵作为输出 Y。


但是,解开这个矩阵表示法,按索引来考虑问题是有指导意义的。让我们这样做。Q Kᵀ 作为一个矩阵,如果我们考虑该矩阵的 (i, j) 分量(i, j 各自范围从1到 L),它对应于 q_i 和 k_j 的内积,即 q_i · k_j。取这个值,然后除以 √(D_K) 进行归一化,对其取指数,然后在整个行上进行归一化。
“按行softmax”的意思是:固定行索引 i,然后对列索引 j 求和。这里我们对列索引 j‘ 求和,同时保持行索引 i 固定,这作为归一化。这是一个softmax归一化。现在我们有了这个 a_ij 分量。这个 L × L 矩阵就是 A 矩阵。这里,a_ij 是这个 L × L 矩阵 A 的 (i, j) 分量。由于它是按行应用softmax构造的,所有 a_ij 分量都是正数,并且对于任何给定的行索引 i,对 j 求和的结果为1。因此,给定一个固定的 i,a_ij 值形成了可用于加权平均的系数。

这正是我们为输出 y 要做的事情。输出 y_l 形成为所有 v 向量的线性组合(加权平均)。我们有 v₁, v₂, ..., v_L,共 L 个可能的 v 向量。输出形成为所有 v 向量的加权平均,其权重系数由此 A 矩阵的系数决定。具体来说,对于第 l 个输出,我们将行索引固定为 l,然后对 A 矩阵中的列索引 r 求和。

让我们看一个具体图示。作为输入,我们有 x 向量。让我们考虑输出 y₂ 是如何构建的。y₂ 的构建过程是:首先取 x₂ 向量并得到 q₂(称为查询向量)。然后我们获取所有 x 向量并得到所有 k 向量(称为键向量),以及所有 v 向量(称为值向量)。查询、键、值的术语是借用数据库的隐喻,你查询一个键来提取一个值。在这里,查询向量查询所有的键。查询的方式是通过内积。如果 q₂ 和 k₁ 被认为是相似的(即两个向量在线性代数意义上对齐,意味着内积很大),那么这个键就被认为与这个查询相关。假设 q₂ 查询 k_l,如果内积很小,那么这个键与这个查询的相关性就低;如果内积很大,那么这个键向量就与这个查询向量相关。我们有了所有这些查询分数(ã 值),将其输入softmax。由于我们已经将 A 矩阵的行固定为2,这只是一个向量。我们对这个向量执行softmax,然后得到这些 a 系数,它们都是正数,可用于形成加权平均。最后,输出 y₂ 形成为加权平均,权重由这些 a 系数给出。回想一下,如果查询向量和键向量之间的内积很大,则认为键向量与查询向量相关。因此,如果查询向量和键向量之间的内积很大,就会使这个系数变大。所以,y 向量形成为所有值向量的线性组合(加权平均),但某个值向量在这个加权平均中贡献更突出(即其系数更大),如果查询向量和对应键向量的内积很大,那么它就会更突出地体现。因此,如果 q₂ 和 k₁ 的内积很大,那么 a_{21} 就成为一个大系数,在输出 y₂ 中,值向量 v₁ 就会更突出地体现。如果内积很小,那么值向量 v₁ 的贡献就会被抑制。
这里有很多内容,但Transformer架构非常重要。我强烈鼓励你花时间完全理解本幻灯片中显示的每一个细节。完全详细地理解Transformer架构是值得的。








伪线性操作与多头自注意力




我想快速指出,注意力是一种伪线性操作。一个函数 F 从 R^N 映射到 R^M,如果函数形式为 F(x) = A(x) x,其中 A 是一个 N × M 的矩阵,但矩阵 A 依赖于输入 x,那么这种形式的函数被称为伪线性的。它不是线性的,因为矩阵 A(x) 依赖于 x。如果矩阵不依赖于 x,那么这将是一个线性函数,但如果矩阵 A 依赖于 x,那么它就是伪线性函数。我在上一张幻灯片中描述的注意力机制,这是一个从值向量到输出 y 向量的伪线性映射。伪线性操作在信号处理和核方法中相当常见。我认为这是一个有趣的观察。我也认为指出注意力是从值向量到输出 y 向量的伪线性映射这一事实,有助于你理解注意力机制的运作原理。我不确定这个观察是否有具体用途,但它是一个简洁而简单的观察。所以,我快速指出,你可以自行决定如何使用这个信息。
接下来,我们有多头自注意力,通常缩写为MHA。想象一下卷积神经网络,在每一层,你不仅仅有一个卷积操作,而是有多个卷积通道。每个通道都有自己的卷积滤波器,进行自己独立的卷积,然后所有这些通道都作为输入传递到下一层。同样地,在Transformer中,你使用多个注意力头。我两张幻灯片前描述的是一个单头自注意力。然后你使用多个这样的头,从而形成多头自注意力。


给定一个输入序列 X,你有 H 个独立的注意力头,每个头产生不同的 y 输出。每个输出 y 序列的长度为 L。记住,Transformer中的任何操作都不会改变序列长度,所以序列长度 L 总是被保留。因此,每个输出序列的长度为 L,并且在每个位置,你都有一个长度为 D_v 的向量。

由于你有 H 个单头注意力,我们所做的是将这些输出连接起来。这将导致相同的序列长度 L,但在每个序列位置,我们有 H 个独立的向量,每个长度为 D_v。我们将它们连接起来得到一个更长的向量。因此,在每个序列位置,我们有一个长度为 H * D_v 的更长的向量。

然后,我们将其乘以一个输出投影矩阵,将长度从 H * D_v 减少到 D_z。这样做的结果是这些 Z 向量序列,同样保留了序列长度 L,但现在每个 Z 向量的长度为 D_z。这个多头自注意力操作是一个从 X 到 Z 的序列到序列变换。通常,D_x 维度和 D_z 维度是相同的,因为如果我们想使用残差连接(我们很快就会讨论),就需要这样。









Transformer层结构与层归一化






仅编码器Transformer架构是通过堆叠多个Transformer层构建的,每个Transformer层看起来像这样。每个Transformer层将一个 x 序列映射到另一个 x 序列,我们多次这样做,堆叠多次,就得到了Transformer架构。

如果我们看这个图示,输入 x 序列被输入到一个层归一化操作(我很快会讨论),然后输入到多头注意力,接着我们进行这个加法操作。这里的加法块代表一个残差连接,其中我们有两个分支:一个分支保持输入 x 不变,另一个分支将输入通过层归一化和多头注意力,然后我们将它们相加。这是残差连接,有助于优化,有助于控制Transformer架构深度上的梯度爆炸和消失问题。然后我们有另一个分割操作,我们进行这个残差连接,然后是层归一化,接着输入到FFN层(我们很快会讨论),然后我们进行残差连接,这就构成了Transformer架构中的一个Transformer层。




层归一化是一种归一化操作,通过归一化特征来稳定训练,从而避免梯度爆炸和消失。除了残差连接,层归一化还有助于控制Transformer深度上的梯度爆炸和消失问题。层归一化是在特征维度上进行归一化,而不是在序列长度或批次元素上。


假设输入序列 x 是一个三维张量,索引为批次、序列长度和通道(或特征),那么归一化基本上是在通道/特征维度上进行,而不是沿着批次和序列长度维度。

在这张幻灯片中,我想澄清一些关于批归一化和层归一化具体沿哪些维度进行归一化的误解。实际上,层归一化有两种不同的变体:一种用于卷积神经网络,另一种用于Transformer(包括视觉Transformer),这两者略有不同。





对于卷积神经网络,层归一化是在通道和空间维度上进行归一化。对于Transformer,层归一化只对通道进行归一化,而不对空间维度进行归一化。现在,Transformer中的空间维度对应于序列长度(对于视觉Transformer确实如此;对于语言Transformer,你可以认为序列长度意味着在时间上向前和向后,所以你可以认为这是一个空间维度)。在语言Transformer中,序列长度是一个可变长度参数,沿着序列长度进行归一化可能是一个不稳定的操作。这就是为什么Transformer(尤其是语言Transformer)的层归一化不跨序列长度进行归一化。




对于批归一化,由于名称的原因,人们常常误以为批归一化是在批次元素上进行归一化,但这实际上并不完全正确。批归一化将四维张量作为输入(因为在图像维度中,你有批次维度、通道维度以及空间维度——高度和宽度),批归一化实际上是在三个维度上进行归一化:两个空间维度(水平和垂直)以及批次维度。因此,对于CNN,批归一化在四个维度中的三个上进行归一化;而对于CNN的层归一化,也是在四个维度中的三个上进行归一化。但批归一化和层归一化对于CNN的归一化维度是不同的。然后,对于Transformer架构,层归一化在三个可能维度中的一个上进行归一化。
在Transformer层中,有多头自注意力、残差连接、层归一化和逐位置FFN。










逐位置前馈网络与位置编码



逐位置FFN通常是一个两层MLP,
009:Transformer II(现代Transformer更新与GPT)

在本节课中,我们将学习现代Transformer架构的关键更新,包括字节对编码(BPE)分词器、RMSNorm、门控前馈网络、旋转位置编码(RoPE)、KV缓存、多查询注意力以及文本生成中的各种采样策略。这些改进共同构成了当今主流大语言模型(如GPT系列)的核心技术基础。
字节对编码(BPE)分词器
上一节我们介绍了Transformer的基本架构,本节中我们来看看模型如何处理文本输入。Transformer模型并不直接处理原始文本,而是先将文本转换为一系列称为“令牌”的整数。这个过程由分词器完成,其中字节对编码是一种广泛使用的子词分词方法。
BPE分词器是一种经过训练的分词器,其训练目标是在给定固定词汇表大小的前提下,最小化训练语料库的序列长度。它能够将常见单词编码为单个令牌,同时将罕见单词或专有名词分解为多个子词令牌。
以下是BPE分词器工作方式的一个示例:

右侧截图来自一个交互式分词器网站,展示了GPT-4分词器如何处理一段文本。彩色高亮显示了文本如何被分割成不同的片段,每个片段被单独转换为一个令牌。

例如:
- “in”被转换为令牌编号644。
- “ computer”(注意前面的空格)被转换为令牌编号6500。
- 专有名词“Kasparov”被分解为三个子词令牌:“Kas”、“par”和“ov”。
BPE分词器能够优雅地处理拼写错误。即使单词拼写错误,它也能将其分词为一个令牌序列,尽管这个序列与正确拼写时的序列不同。如果语言模型在训练数据中见过足够多的拼写错误,它就能学会理解这些错误。

关于BPE分词器的一些细节:
- 在单词前添加空格会改变其分词结果。例如,“machine”、“ machine”和“ Machine”可能对应不同的令牌。
- 数字的分割方式可能有些随意,这种特性部分导致了LLM在进行基本算术运算时遇到困难。
分词是一个复杂且精细的主题。机器学习科学家Andrej Karpathy发布的视频教程《让我们构建GPT分词器》是深入了解这一主题的绝佳资源。

现代Transformer架构更新


原始的Transformer架构自2017年提出以来保持了惊人的稳定性。只有少数修改被提出并被证实是有效的。让我们来看看这些现代更新。
RMSNorm(均方根层归一化)

回忆一下,标准的层归一化操作形式如下,它包含减去均值并除以标准差的操作。
# 层归一化 (LayerNorm)
normalized_output = (x - mean(x)) / std(x)
RMSNorm是层归一化的一种简化形式,全称是均方根层归一化。其形式如下:
# RMSNorm
normalized_output = x / sqrt(mean(x^2))
在RMSNorm中,我们不再减去均值,并且不是除以标准差,而是除以向量x的范数。对于可训练参数,RMSNorm保留了缩放参数gamma,但移除了偏置项。

与层归一化相比,RMSNorm在性能上表现相似,但速度明显更快。这种速度差异并非源于浮点运算次数的不同,而是由于GPU架构中高速缓存内存与较慢的高带宽内存之间的底层内存移动问题。归一化层虽然只占总浮点运算的很小一部分(约0.17%),但由于内存问题,却可能占据总运行时间的相当大比例(约25.5%)。RMSNorm的效率提升可以显著减少这部分运行时间。

无偏置项与门控前馈网络
实际上,不仅是RMSNorm,大多数现代Transformer都完全避免了使用偏置项。
- 令牌嵌入层和输出投影层被设计为没有偏置。
- 用于生成Q、K、V向量的注意力线性层也不使用偏置项。
- 原始Transformer在前馈网络层使用了偏置,但现代实现通常也不使用。
现代Transformer还采用了门控线性单元来改进前馈网络层。一个非门控的FFN通常具有以下形式(无偏置项):
FFN(x) = W2 * σ(W1 * x)
而一个GLU门控FFN具有以下形式:


GLU_FFN(x) = W2 * (σ(W1 * x) ⊙ (V * x))
其中⊙表示逐元素乘法。
- 如果σ是ReLU激活函数,则称为ReGLU。
- 如果σ是GELU激活函数,则称为GeGLU。
- 如果σ是Sigmoid激活函数,则称为Sigmoid-GLU。

研究表明,GeGLU和Sigmoid-GLU的性能略优于非门控FFN。为了公平比较,在计算成本大致相同的情况下(通过调整矩阵维度实现),门控FFN往往表现更好。

旋转位置编码
许多现代Transformer已经放弃了经典的 sinusoidal 位置嵌入,转而使用这种更新的RoPE嵌入。RoPE是旋转位置嵌入的缩写。


经典的位置嵌入机制是在令牌嵌入向量V上直接添加位置向量P。RoPE则不同,它作用于注意力机制中的查询向量Q和键向量K。具体来说,它将维度为D的Q和K向量重新解释为D/2个复数,然后让这些复数乘以一系列复数指数(进行旋转)。旋转的角度频率与经典正弦嵌入中使用的频率相同。
经过旋转操作后的Q和K向量被送入注意力函数进行计算。RoPE确保只有相对位置信息影响注意力机制,并且具有长期衰减的特性,即当两个令牌的位置差趋于无穷时,它们之间的注意力分数会趋于0,这符合我们的直觉。RoPE的实现可以非常高效,并且在实际应用中效果很好。需要注意的是,RoPE通常应用于所有注意力层,而经典的位置嵌入只添加在模型开头一次。

需要位置编码吗?
一个有趣的问题是:位置编码是否必需?事实证明,对于仅解码器的Transformer(带有因果掩码),位置编码并不是严格必需的。因为因果掩码的存在使得模型不再是排列等变的,注意力层可以通过计算其能关注到的令牌数量来推断出绝对位置。因此,显式的位置编码对于掩码注意力层来说并非必要。不过,使用RoPE作为显式的位置编码机制仍然是有帮助的,即使不是严格必需。

推理优化技术
KV缓存

KV缓存是一种现代Transformer用来提高推理效率的技术。在推理过程中,语言模型按顺序生成令牌y1, y2, ..., yL。为了计算第L个令牌,我们只需要当前的查询向量,但需要所有之前的键向量和值向量。
KV缓存通过存储(缓存)之前计算好的键和值向量来优化这一过程。这样,在每一步只需要计算当前的键和值向量。这是一种用内存使用换取计算量的机制:存储之前的向量需要内存,但避免了重新计算它们,从而减少了计算量。


上图展示了有无KV缓存的区别(图片来自Joshua Loong的Medium文章)。顶部是没有缓存的情况,每次生成新令牌都需要重新计算所有之前的K和V向量。底部是使用KV缓存的情况,紫色的键值向量被缓存和重用,无需重新计算。
多查询注意力与分组查询注意力


即使使用KV缓存,在标准的多头注意力中,每个头都有独立的K和V向量,在推理时都需要从GPU的慢速内存中加载,这仍然存在效率瓶颈。GPU擅长计算,但在内存I/O方面效率较低。

多查询注意力试图通过在所有头之间共享键和值向量来更好地利用GPU的计算效率,同时避免内存I/O瓶颈。这样,需要从内存中加载的K和V向量体积就减少了H倍(H为头数),从而显著降低了推理成本,尽管可能会带来轻微的性能下降。
分组查询注意力是一种折中方案。它将头分成若干组,组内的查询共享键和值向量。GQA的性能几乎与普通的多头注意力相匹配,同时效率更高。

上图展示了MHA、MQA和GQA的区别。在MQA中,所有查询共享同一套K和V。在GQA中,查询被分组,组内共享K和V。
文本生成与采样策略


现在,假设一个因果语言模型Pθ已经训练完成。我们需要知道如何使用它来生成文本,这个过程也称为解码。
如果语言模型是完美的,那么朴素的采样方法就足以生成好的文本。然而,训练好的语言模型并不完美。因此,有效的采样需要以下技术:带温度的朴素采样、贪婪采样、束搜索、Top-K和Top-P采样。
基础采样方法
设fθ为仅解码器Transformer的最终输出,它给出了下一个令牌的预测向量。我们将其通过softmax函数,得到下一个令牌的概率分布。
朴素采样:给定文本(令牌序列u1到uS-1),下一个令牌uS根据这个概率分布进行随机采样。问题在于,低概率词仍有被采样的可能,而这些词往往质量较差。
带温度的采样:通过一个温度参数β来调整softmax的“尖锐”程度。具体做法是将Transformer的输出fθ除以β,然后再做softmax。
- 当β=1时,就是常规的朴素采样。
- 当β<1时,会放大fθ的幅度,从而抑制低概率词的可能性。
- 当β→0时,就变成了贪婪采样。
在现代大语言模型中,β=0.7或β=1是常见的默认选择。β=1(高温)会导致更多样化的生成,但也可能选择糟糕的续写;β=0.7(低温)则生成更保守、更安全的文本。
贪婪采样:直接选择概率最高的词作为下一个令牌。但贪婪采样存在两个问题:
- 它不能保证生成整体概率最高的令牌序列。
- 概率最高的文本并不总是最好的续写。
理论上,要生成整体概率最高的序列,需要进行精确的最大后验解码,但这需要搜索所有可能的序列,是一个计算上不可行的问题(NP难)。
贪婪采样之所以不等于最优序列,是因为它每一步只选择当前最可能的词,而没有考虑这个选择对后续步骤的全局影响。有时,早期选择一个稍次优的词,可能会开启一条整体更优的生成路径。
束搜索
束搜索是一种折中的、可操作的启发式方法,用于近似精确MAP解码,它产生的序列比贪婪搜索具有更高的似然度。其思想是:我们不完全贪婪,但保持一定的贪婪性。
在解码的每一步,我们跟踪K个最有可能的部分生成序列(K称为束宽,通常为5或10)。在每一步,我们从这K个序列扩展出新的候选序列,然后只保留其中总对数概率最高的K个序列,如此反复,直到生成结束。当束宽K=1时,束搜索就退化为贪婪搜索。

现代采样策略
然而,研究发现,人类书写的高质量文本并不总是由高概率的下一个词组成。束搜索会避免任何出人意料的词,导致生成的文本重复且无趣。有趣且有用的文本应包含一些无法从上下文中完全推断出的信息。
因此,束搜索已不再用于主流LLM的文本生成。随着模型变得更好,低概率词的质量也在提高,刻意避免它们的必要性就降低了。

现代大语言模型主要使用以下采样方法的组合:
Top-K采样:只从概率最高的K个词中进行采样,并使用温度参数β调整其概率分布。采样前,对这K个词的原始分数进行softmax,使其概率之和为1。K≈50是一个常见的默认值。K=∞意味着不使用Top-K。
Top-P采样(核采样):从一个最小的高概率词集合中进行采样,使得这些词的累计概率超过阈值P。例如,P=0.9意味着从前N个最可能的词中采样,使得这N个词的概率之和刚好超过0.9。P≈0.9是一个常见的默认值。P=1.0意味着不使用Top-P。
最后,大多数现代LLM通过结合温度参数β、Top-K和Top-P这三种机制来执行采样。具体如何组合这三种机制因模型而异,但核心思想是利用它们来平衡生成的多样性、流畅性和创造性。

本节课中我们一起学习了现代Transformer架构的关键改进和文本生成策略。我们了解了BPE分词器如何将文本转换为模型可处理的令牌,认识了RMSNorm、无偏置设计、门控FFN和RoPE等架构更新如何提升模型的效率和性能。我们还探讨了KV缓存、MQA/GQA等推理优化技术。最后,我们深入分析了从贪婪采样、束搜索到现代主流的Top-K、Top-P采样等多种文本生成策略的原理与优劣,理解了如何通过温度、Top-K、Top-P等参数来控制生成文本的质量与多样性。这些知识是理解和使用当今大语言模型的基础。
010:上下文学习与指令微调 🧠


在本节课中,我们将要学习大语言模型发展历程中的两个关键能力:上下文学习与指令微调。我们将了解模型如何仅通过文本指令和少量示例来理解并执行任务,以及如何通过专门的微调让模型变得更善于遵循指令。




概述:从数据定义任务到指令定义任务




在GPT-1和BERT取得成功之后,研究人员开始扩大语言模型的规模。随着模型规模的扩大,他们开始注意到大语言模型一个关键能力的涌现:LLM能够直接遵循文本指令。






这与之前的机器学习范式截然不同。之前的范式是:带标签的数据定义了任务。例如,要进行图像分类,你需要提供标注了“猫”和“狗”的图片;要进行情感分析,你需要提供标注了“正面”和“负面”的段落。这种标注数据定义了任务本身。


而新的范式则更接近人类的方式:你只需通过自然语言描述来定义任务,语言模型就能理解。GPT-2、GPT-3、T5、FLAN和FLAN-PaLM等研究逐步确立并完善了这一范式。











GPT-2与GPT-3:任务无关架构的突破



GPT-2和GPT-3的论文标题和核心信息非常相似。GPT-2的标题是“语言模型是无监督的多任务学习者”,GPT-3的标题是“语言模型是少样本学习者”。它们的架构也基本相似,GPT-3主要是对GPT-2进行了规模上的扩展。




以下是GPT系列模型的关键参数对比:
| 模型 | 参数量 | 训练数据量 |
|---|---|---|
| GPT-1 | 1.2 亿 | 40 GB |
| GPT-2 | 15 亿 | 40 GB |
| GPT-3 | 1750 亿 | 600 GB |







GPT-2和GPT-3的核心信息是:GPT可以凭借一个统一的任务无关架构解决许多任务,甚至无需进行有监督的微调。这意味着:
- 零样本:完全不使用任务特定的训练数据。
- 少样本:在推理时仅使用少量任务特定的示例。



相比之下,早期的ELMo模型并非任务无关,它更像一个可训练的标记器。BERT和GPT-1虽然架构更通用,但仍需要为微调目的附加任务特定的“头部”,并且需要任务特定的训练数据。










定义关键概念:零样本、少样本与上下文学习


上一节我们提到了零样本和少样本,本节我们来详细定义这些概念。




少样本学习在传统上指的是模型仅用少量标注样本或演示来学习一种行为。经典的做法是,在一个预训练模型上,用少量标注数据点通过梯度更新进行微调。




零样本学习则意味着在没有演示的情况下执行任务。这如何实现呢?以GPT-2进行文本摘要为例,研究人员通过在文章后添加“TL;DR”(Too Long; Didn‘t Read)这个文本,来“诱导”模型进行摘要生成。模型并没有在显式配对的摘要数据集上训练过,但它从海量预训练文本中隐含地学到了这种模式。
上下文学习(In-Context Learning, ICL)是GPT-3论文中首次明确报告的能力。在上下文学习中,模型通过上下文中的演示(无论是否有显式描述)来推断任务意图。




以下是上下文学习的几个例子:
- 示例1:颜色推断
模型从上下文中推断出任务是询问花朵的颜色。输入:玫瑰:红色,向日葵:黄色,薰衣草: 输出:紫色



- 示例2:规则推断
模型从示例中推断出应用的规则。输入:X, Y -> Y, Z -> Z, X; A, B, C, D -> ? 输出:A, B, C, D, C, D








- 示例3:复杂映射
规则是:将左边的英文单词,映射到同一类别但不同的物品,再翻译成西班牙语。咖啡是饮料,茶是同类饮料,西班牙语是“té”。输入:香蕉 -> manzana,汽车 -> bicicleta,草 -> árbol,咖啡 -> ? 输出:té


上下文学习的关键在于:它是在不更新模型任何参数的情况下进行的“学习”。没有梯度更新,没有反向传播。模型仅通过提供的上下文示例来调整其输出行为。这种能力至关重要,因为现实中人类给彼此的指令也常常不精确,需要依靠上下文和示例来理解。












T5模型:文本到文本的统一框架

上一节我们看到了GPT系列如何通过上下文理解任务,本节我们来看看另一种统一任务的思路:T5模型。



T5是“Text-to-Text Transfer Transformer”的缩写。它使用编码器-解码器架构的Transformer,并将所有预训练和微调任务都格式化为文本到文本的形式。

T5的设计目标是产生一个统一的任务无关架构。所有任务,无论是否语义相关,都被转化为相同的“输入文本 -> 输出文本”格式。模型、目标函数、训练过程和解码过程对所有任务都是一样的。


T5首先在大型无标签语料库上进行预训练,目标多样(如语言建模、掩码语言建模等)。预训练完成后,T5在广泛的任务上同时进行微调。为了让模型知道要解决哪个特定任务,我们只需为每个任务使用不同的提示。



例如:
- 翻译:
translate English to German: That is good. -> Das ist gut. - 语法可接受性:
cola sentence: The course is jumping well -> not acceptable - 摘要:
summarize: (长段落) -> (摘要)





T5论文也是一个里程碑,它推进了“预训练-微调”方法,并进一步证明了语言模型可以理解和响应自然指令。然而,T5使用的提示(如“cola sentence”)并不完全是自然语言,更像是任务标签,没有完整描述任务。









指令微调:走向完全的自然语言指令



T5提示的不足引出了指令微调的想法。这一想法在FLAN和T0论文中提出,其核心是:在通过自然语言指令描述的数据集集合上,对预训练模型进行微调。



指令微调实现了完美的统一。所有自然语言任务现在都变成了“遵循自然语言指令”这个元任务的子任务。我们构建的语言模型只解决一个任务:遵循自然语言指令。






以下是指令微调的示例格式:
- 摘要:
请用几句话概括以下文章:... - 情感分析:
基于以下评论,从1到5星中给出评分:... - 问答:
根据以下引用的文本,回答“黑豹队击败了哪支球队?”这个问题:...
通过这种方式,模型甚至能表现出零样本泛化能力。例如,即使没有在自然语言推理任务上明确微调过,当以指令形式提问时,模型也能正确回答。







FLAN模型是一个1370亿参数的模型,在超过60个用自然语言指令模板表述的NLP数据集上进行了指令微调。随后的FLAN-PaLM论文将指令微调扩展到更大的规模:5400亿参数模型,1836个指令微调任务。


FLAN-PaLM的一个关键发现是:任务多样性不仅能让模型变得多才多艺,还能提升其在单个任务上的表现。即使你只关心任务A,同时训练任务A、B、C也会改善任务A的性能。










技术细节:聊天模板与特殊标记




进行指令微调时,一个技术细节是聊天模板需要包含特殊标记。例如,使用 [INST]、[/INST]、<<SYS>>、<</SYS>> 等标记来格式化对话。这个技巧显著提高了LLM遵循指令和进行多轮对话的能力。



以下是一个聊天模板示例:
[INST] <<SYS>>
你是一个友好的聊天机器人,总是以海盗的风格回应。
<</SYS>>


人类一次性能吃下多少架直升机? [/INST]

使用这些特殊标记不是可选的,否则性能会显著下降。经过大规模的指令微调并使用这些特殊标记后,语言模型就转变成了一个乐于助人的问答机器或聊天机器人。用户可以直接提问,而无需再进行复杂的上下文学习提示。









启示与总结:解决更通用的问题
OpenAI的研究科学家Yong Wancheng曾提出一个反直觉的启示:尝试解决一个更通用的问题,是解决原始问题比直接攻克它更容易的方法。试图解决更通用的问题会促使你找到更通用、更简单的方法,这通常能带来更具扩展性的解决方案。具体的任务反而成为解决通用问题的副产品。



例如:
- 直接解决问答任务 vs. 学习一个通用语言模型并通过下一个词预测来解决任务。
- 直接研究机器翻译 vs. 研究学习所有语言的通用问题。


大语言模型的三阶段训练流程








逐渐地,研究人员为大语言模型采用了一个三阶段的训练流程:


- 预训练:在大型无标签文本语料库上,以自监督方式(如下一个词预测损失)训练模型。这是计算最密集的阶段,产出具有基础能力但只会“续写”文本的模型。
- 指令微调:诱导模型遵循指令并变得乐于助人。在此之后,模型可以进行聊天机器人式的对话。
- 基于人类反馈的强化学习:进一步将大语言模型与人类价值观和期望对齐。



目前,我们已经涵盖了预训练和指令微调阶段。在下一章,我们将继续学习基于人类反馈的强化学习。










本节课中,我们一起学习了上下文学习和指令微调这两个关键概念。我们看到,大语言模型如何通过上下文中的示例理解任务,以及如何通过专门的微调训练来更好地遵循自然语言指令。这标志着机器学习范式从“数据定义任务”向“指令定义任务”的重大转变,使得模型的使用更加直观和人性化。
011:基于人类反馈的强化学习 (PPO, DPO) 🧠

在本节课中,我们将要学习大语言模型训练的第三阶段:基于人类反馈的强化学习。我们将探讨为何需要RLHF,理解其核心算法PPO的工作原理,并介绍一种更简洁的替代方法DPO。



在第二章中,我们总结了大语言模型的三阶段训练流程。第一阶段是预训练,第二阶段是指令微调,第三阶段是RLHF阶段。当预训练和指令微调完成后,我们得到一个语言模型,记作 π_θ。该模型能够生成连贯的语言并遵循指令。在第三阶段,执行基于人类反馈的强化学习,这进一步使大语言模型与人类价值观和期望对齐。我们已在第二章讨论了预训练和指令微调阶段,现在让我们来探讨第三阶段:RLHF。







为何需要RLHF?🤔







预训练和监督式指令微调使用下一个词预测损失。数据提供了正确答案,并迫使模型进行模仿,这类似于模仿学习。换句话说,大语言模型通过模仿学习来模仿互联网上看到的文本生成。如果你上过网,就会知道互联网上充满了不良文本。指令微调的功能是试图让语言模型更有帮助。但这种下一个词预测损失,这种模仿学习,并未提供一种有效的方法来引导语言模型远离这类不良输出。预训练数据包含大量不友好的数据,模型通过在这种数据上的下一个词预测进行模仿学习。因此,语言模型具备对用户不友好的能力。









那么,是否有方法能明确告诉模型要对用户友好呢?下一个词预测和模仿学习的问题在于,它们不适合指定这类抽象目标。例如,如果我们想给模型下达指令,如“有帮助且安全地遵循用户指令”,或“如果用户的命令不道德或危险,则拒绝”。我们如何通过下一个词预测来指定这些?通过下一个词预测来教授这种行为非常困难。我们可以向语言模型展示符合这些要求的生成示例,但这种指令是间接的。更直接的指令形式是让语言模型生成文本,然后当语言模型生成被这些抽象目标定义为不良的文本时,我们会告诉语言模型这是不良生成,它不应该这样做,并以某种方式将其作为学习信号。这便将我们引向了最初为经典强化学习环境开发的、基于人类反馈的强化学习。
经典RLHF示例:后空翻 🤸
如果我们回想一下,强化学习旨在控制智能体以获得高奖励。这是强化学习的核心。但有时,奖励很难被形式化为一个函数。这里展示的是一个很好的例子。这是Mujoco环境中的一个多关节物体,旨在简化人形机器人。我们想教会这个东西做后空翻。
那么,什么是后空翻?我们看到时就知道。如果你看这个,这确实是一个后空翻。我想大家都会同意,这个多关节物体完成了一个相当漂亮的后空翻。但如果你被要求编写一个程序或函数,在看到成功的后空翻时返回正奖励,在看到不成功的尝试时返回负奖励,这实际上会相当困难。因此,基于人类反馈的强化学习使用人类反馈来确定期望的行为,通常通过训练一个奖励模型来实现。
这段GIF视频取自Christiano等人的论文。如果你访问这个OpenAI博客,可以找到关于这项工作的更多信息。在博客中,描述了人类反馈收集机制。基本上,一个人坐在电脑屏幕前,观察这个多关节物体尝试后空翻的各种尝试,然后被要求判断左侧或右侧的尝试哪一个更接近后空翻。论文和博客显示,在获得适量的人工标注后,这个多关节物体能够执行如GIF视频所示的后空翻。
Christiano等人的这篇论文发表于2017年,Ebars等人在2018年发表了一篇后续论文,这些是针对这类经典控制强化学习环境的RLHF方法。然后在2022年,RLHF被应用于大语言模型场景,这篇由Ouyang等人撰写的OpenAI论文被称为Instruct GPT论文,因为他们展示了在大语言模型上使用RLHF,并将得到的模型称为Instruct GPT。
Instruct GPT中的RLHF框架 🏗️
在这篇Instruct GPT论文中,RLHF使用三个神经网络执行。神经网络一是语言模型,我们称之为 π_θ。这是经过预训练和指令微调的语言模型,具体来说,他们为此使用了1750亿参数的GPT-3模型。除了语言模型,还训练了一个奖励模型。该模型从预训练的语言模型(一个60亿参数的GPT-3模型)初始化,然后附加一个新的头部,使输出成为一个标量,因为奖励模型在此上下文中将生成的文本作为输入,然后产生一个标量作为输出。作为第三个神经网络,他们使用并训练了价值函数模型,这是用于PPO的基线函数,在接下来的幻灯片中,它被初始化为与奖励模型相同。我将提供更多关于奖励模型和价值函数模型如何训练和使用的细节。

我很快指出,在这篇论文中,他们为奖励模型和价值函数模型使用了较小的模型,即一个60亿参数的模型,而语言模型有1750亿参数。这是因为,根据论文作者的说法,当你使用更大的奖励模型和价值函数模型时,训练会因某种原因变得更不稳定。其次,使用更大的奖励模型和价值函数模型会增加PPO的计算成本。好的,我将解释这是如何完成的。但在我们进行解释的过程中,我希望你思考以下问题:奖励模型和价值函数模型,它们真的必要吗?
奖励模型的训练 🏆
现在让我们谈谈奖励模型。我们用 X 表示指定任务的提示。将 X 视为一个问题,类似于用户向聊天机器人提供的查询。然后这个查询 X,这个提示 X,需要一个答案。然后,我们将让指令微调模型生成 K 个独立的补全结果,即 y_1 到 y_K。这些是基于相同提示的独立同分布补全,因此它们是同一问题 X 的答案。为了使这些补全结果不同,我们不能使用贪婪采样或束搜索,而应使用具有一定随机性的采样方法,并且使用较高的温度值是有帮助的,例如 β=1 被认为是较高的温度,有助于增加随机性,从而在响应中提供更多多样性。在 Instruct GPT 论文中,作者使用了类似 K=4 到 9 作为独立生成的数量。
然后,作者或 OpenAI 公司雇佣了一组人类标注员。这些人类标注员被给予详细的准则和培训。他们雇佣这些人,按小时支付工资,让他们来到特定的办公空间,并对这些人类标注员进行培训,教他们如何评估这些不同的语言模型响应。然后,人类标注员阅读提示,查看响应,并提供标注,说明 y_i 是否优于 y_j,或者 y_i 是否劣于 y_j。这个大于符号意味着 y_i 是比 y_j 更受偏好的补全结果。这意味着 y_j 是更受偏好的补全结果。这些标注是针对所有配对 (y_i, y_j) 提供的。为了简单起见,我们假设平局永远不会发生。为了简单起见,我们假设当给定一对响应时,人类标注员被迫宣布一个胜者。由于有 K 个可能的补全结果,并且比较是在 K 个补全结果中的两个之间进行,因此人类标注员必须提供 C(K, 2) 个比较标注。
然后,给定这些数据,我们(或 Instruct GPT 论文的作者)将奖励模型训练为 Bradley-Terry 模型。Bradley-Terry 模型使用这种损失进行训练。我稍后会解释这个损失的含义。但首先,让我们看看期望值,以了解数据是如何被使用的。这是对提示以及由语言模型生成的获胜和失败补全结果的期望。获胜和失败的标准由人类标注员通过人类偏好定义。因此,人类标注数据将包含一组提示、语言模型补全结果以及人类标注,指定在所有响应对中,哪一个比另一个更受偏好。然后,利用这些数据,我们训练奖励模型 R_ψ,其中 ψ 是神经网络的可训练参数。我们有一个作为神经网络参数 ψ 函数的损失函数,这就是损失函数。我稍后会解释这个损失,但我们用求和代替这个期望,对提示、获胜响应和失败响应进行求和。
现在,让我们尝试解释这个损失。首先看 -log σ(...),其中 σ 是 sigmoid 函数。这是 sigmoid 函数的定义,它是一个递减函数。因为我们要最小化这个损失,所以训练会朝着使输入 R(获胜) - R(失败) 变大的方向进行。更具体地说,是使 R(获胜) - R(失败) 变大。因此,奖励模型最终被训练成:如果响应 y 好,则输出较大的数值;如果响应坏,则输出较小的数值。确实,如果是这种情况,那么获胜结果的奖励模型输出应该大于失败结果的奖励模型输出,这将产生一个大的正值,并导致小的损失,符合最小化问题的要求。
通过代入 sigmoid 函数的显式公式,也可以明确地写成这种方式。这是完全相同的损失。如果你仔细观察一会儿,实际上可以注意到这可以解释为 softmax 回归的一个实例。因此,Bradley-Terry 模型的训练可以视为具有两个类的 softmax 回归。目标是学习以下两个事件的概率:事件 (x, y_1 更好) 与事件 (x, y_2 更好)。这就是通过以这种方式书写损失得到的解释。

好的,我们已经训练了一个语言模型,进行了指令微调。我们提供了一组提示和一系列响应,并将其展示给我们雇佣的人类标注员以获得人类标注数据,现在我们已经训练了奖励模型 R_ψ。
使用奖励模型:最佳N采样 🎯
给定一个训练好的奖励模型 R_ψ,我们如何使用它来生成高奖励的补全结果呢?答案将是 RLHF,因为这是我们前进的方向。但有一个更简单的选项,称为“最佳N采样”。
以下是“最佳N采样”的工作原理。第一步,给定某个提示,生成 N 个文本输出。第二步,根据奖励模型 R_ψ 的判定选择最好的一个。因为如果奖励模型确实是一个好的奖励模型,能够充分捕捉我们希望语言模型生成所遵循的抽象目标,那么我们应该能够可靠地使用奖励模型来判断哪一个是最好的。


现在,这种“最佳N采样”实际上不是一个坏主意。它有一些优点。它非常简单,并且能有效利用从人类反馈中训练出的奖励模型。这也不需要任何强化学习训练,而强化学习训练可能很棘手。因此,不必进行强化学习训练是一个好处。正因为如此,“最佳N采样”应始终被视为一种基线方法。所以,如果你最终做了类似 RLHF 的事情,并且有充分的理由这样做,你仍然应该实现“最佳N采样”并将其作为基线方法进行比较。然而,“最佳N采样”有一个明显的缺点,那就是你需要采样 N 次生成。这是低效的。但在某些情况下,你可能愿意支付多次生成的额外成本。如果你愿意这样做,那么尽管去做。执行多次生成,将它们输入奖励模型,并选择最好的一个。你生成的次数越多,虽然支付了更大的计算成本来产生多次生成,但从中选出的最佳结果更有机会成为更好的生成。从这个意义上说,你可以将“最佳N采样”视为测试时扩展的一个实例,通过支付多次生成的额外成本,你能够提高生成的质量。
转向RLHF:定义MDP 🎲
但是,如果你不想进行多次生成和选择最佳,那么你可以进行 RLHF。RLHF 代表基于人类反馈的强化学习。实际上,在 RLHF 中,我们已经讨论了 HF(人类反馈)部分,我们已经讨论了收集数据的机制以及基于人类反馈训练奖励模型的过程。因此,剩下需要我们讨论的是 RLHF 中的 RL 部分。


具体来说,在大语言模型上,RLHF 进一步微调语言模型 π_θ,使得补全结果获得由奖励模型测量的高奖励。我们现在有了一个奖励模型,因此我们可以以强化学习的方式训练语言模型以最大化奖励。

但要讨论强化学习,我们需要回答一个问题:这里考虑的是什么样的马尔可夫决策过程?语言模型执行自回归生成,这显然不是马尔可夫的,因为下一个词的生成依赖于整个过去,而不仅仅是前一个词。然而,如果你取任何非马尔可夫过程,并简单地将整个历史定义为先前的状态,那么你实际上可以将这个非马尔可夫过程转化为一个“准”马尔可夫过程,而这正是我们要做的。在标准强化学习中,策略将采用 π(a|s) 的形式,其中当前动作仅依赖于当前状态,因为你具有马尔可夫性质。但在大语言模型中,我们将有一个策略,它根据整个过去选择一个动作,这里我们将整个过去视为我们之前的状态。通过这种处理,我们将语言模型生成视为一个马尔可夫决策过程。再次强调,当前状态是用户提示和迄今为止生成的词元。


动作是什么?每个动作是生成一个单一词元。那么,在这个 MDP 中,策略是随机的,因为语言模型根据迄今为止的生成,会产生一个词元分布或下一步应该生成的动作,并且根据这个概率分布,应该对动作或下一个词元进行采样。但策略是随机的,而转移动态是确定性的,因为一旦语言模型产生动作分布并且你通过采样选择一个动作,如果你选择了一个动作,那么转移到下一个状态就是:你拥有当前文本,然后加上你的当前动作(即下一个词元),你只需将它们组合起来就得到了下一个状态。因此,在这个 MDP 内部,转移动态中没有随机性。
以下是 RL 设置的进一步细节。每个时间步是生成一个字节对编码词元。语言模型是我们的策略,将当前状态(即整个历史)映射到下一个词元或下一个动作的分布。因此,我们将给定提示的响应生成视为一个回合,当语言模型生成字符串结束词元时,回合终止。在这个 MDP 或 RL 环境中,我们将不使用折扣,因此使用折扣因子 γ=1。在这个 MDP 内部,由奖励模型确定的奖励仅在回合结束时提供。因此,没有中间奖励。语言模型仅在提供完整的补全结果、回答了提示的问题时,才收集一次奖励。这种你得不到任何中间奖励、只在回合结束时收集奖励的设置,在学习理论的语言中被称为上下文赌博机。在这个 RL 环境中,我们将使用较大的采样温度,即 β=1。
为了执行 RLHF 中的 RL,Instruct GPT 论文使用了近端策略优化算法。再次,我们将使用符号 π_θ 表示我们的大语言模型,并将其视为 PPO 算法中的 RL 策略。在词元中,我们将用 X 表示文本提示(问题),用 Y 表示由我们的语言模型 π_θ 生成的补全结果。我们将使用一个符号表示回合长度为 T+1,并在回合结束时生成字符串结束词元。让我们使用符号 Y_{1:T} 表示直到词元 T 的部分补全结果,并使用了 PPO 算法。在这项工作中使用了 PPO 裁剪比例为 0.2。如果你回想一下 RL 算法 PPO,它维护一个价值函数模型 V_φ。现在,V_φ 在这个 LLM 上下文中的解释如下:给定 (x, y_{1:t}),即提示和部分补全结果(这是对应于该提示的部分补全结果 y_{1:t}),问题是:如果我们继续用语言模型 π 生成,期望的奖励是多少?然后,奖励模型将输出一个小数字,如果初始生成看起来很好、非常有帮助、非常友好、非常符合人类价值观,那么价值函数模型将输出一个较大的数字。
对于 PPO 算法,优势估计 Â 以这种方式使用:Â = R - V。这是 Instruct GPT 论文使用的方法。以下是解释:这个奖励是回合的最终奖励,它评估完整补全结果的质量;而基线是减去部分补全结果的期望质量。因此,优势估计衡量的是:总补全结果的质量,与价值函数基于部分补全结果所期望的相比,有多好。也许部分补全结果最初看起来有些可疑,但最终证明是一个好的补全,在这种情况下,优势估计会是一个较大的正数。相反,也许最初的部分补全结果看起来很好,但最终总补全结果却是一场灾难,在这种情况下,优势估计会是一个负数。正如我们在 RL 讲座中讨论的那样,当 PPO 算法获得一个正的优势估计时,这被解释为响应是好的。因此,PPO 算法调整策略以使那些动作更有可能发生;相反,当 PPO 看到一个负的优势估计时,那么响应被认为是不良补全,因此 PPO 算法调整策略以使这些动作更不可能发生。实际上,为了完全准确,Instruct GPT 论文使用了 GAE 估计,而不是完全这个,但为了简单起见,我们只考虑更简单的优势估计。
PPO算法初版及其问题 ⚠️
好的,现在我们来到了 PPO 算法版本 0。该算法再次包裹在一个 while 循环中,并运行直到收敛。在 while 循环开始时,PPO 算法采样 N 个独立同分布的轨迹。这些是给定当前语言模型的同一提示的 N 个补全结果。然后我们形成这些优势估计,比较奖励模型的输出(查看总补全结果)与价值函数在当前部分补全结果上的输出。我们利用 PPO 裁剪函数形成这个 PPO 目标,然后我们进行策略评估步骤,拟合价值网络。这个 PPO 算法有很多活动部件,肯定有一些复杂性。
但让我们看看这条推文,这条由 Tom Goldstein 发布的梗图。在这个梗图中,有三个人,X 轴衡量智商,这个人智商低,这是一个普通人,然后这个人是高智商的专家,他们都在谈论基于人类反馈的强化学习。左边的初学者说:“对好东西做梯度下降,对坏东西做梯度上升。”当你在强化学习中进行奖励最大化时,你可能想改变这个人陈述中的符号,但观点是成立的。所以 PPO 所做的是:如果你有一个好的补全结果,那么这是好的,因此使那些导致该补全结果的动作更有可能发生;如果你有一个坏的补全结果,那么导致该补全结果的动作是坏的,因此使那些动作更不可能发生。然后还有这个人,这个中间人,他说你需要学习 PPO,你需要做强化学习,所有这些价值函数、策略强化学习,你必须做很多数学,我们确实做了。但在这个阶段之后,更聪明的人达到了一个更开明的阶段,他只是回到了简单的解释,即 RLHF 就是在好东西上做梯度下降,在坏东西上做梯度上升。
我认为这条推文很有启发性。是的,我们确实经历了这个阶段。这就是我们在某个时刻的样子。我们确实经历了数学,很多数学,强化学习 PPO、RL、价值函数,我们都经历了。在我看来,所有这些对于牢固理解所有活动部件都是必要的。但最终,我们不应忽视这样一个事实:我们所做的事情确实具有简单的解释:当你有一个好的结果时,执行梯度步骤使其更有可能发生;当你有一个坏的结果时,执行梯度步骤使其更不可能发生。
然而,两页幻灯片前所述的 PPO 算法被写为 PPO 版本 0,而这个算法,这个版本 0,由于过度优化的问题而无法工作。
过度优化的思想被这个古德哈特定律很好地捕捉。古德哈特定律指出:当一项措施成为目标时,它就不再是一项好的措施。一个很好的例子是,当某个政府想要控制某个区域内的蛇的数量时,它悬赏让人们捕捉并带来蛇,并根据他们带来的蛇的数量支付报酬。本意是让人们去捕蛇,从而减少蛇的数量。但问题是,人们然后在家里繁殖蛇,并把蛇作为奖励带来。由于繁殖是粗心大意地进行的,一些蛇逃到了环境中。这最终增加了该区域内的蛇的数量。

因此,当你运行上一页幻灯片中所述的 PPO 版本
012:使用可验证奖励的强化学习 (RLVR) 🧠



在本节课中,我们将要学习一种特殊的强化学习方法——使用可验证奖励的强化学习。这种方法特别适用于数学问题求解、代码生成等可以客观判断对错的任务。我们将从几个核心概念入手,逐步理解RLVR的工作原理、关键算法以及它如何让大语言模型学会“思考”。
思维链 (Chain-of-Thought, CoT) 🤔



RLVR与大语言模型结合的基础是使用思维链。思维链是一种让大语言模型在给出最终答案前,先进行自我对话或思考的技术。与直接生成答案相比,思维链能显著提升模型在复杂推理任务上的表现。
为了理解思维链的作用,我们可以看一个例子。如果直接问模型:“一个杂耍演员能抛16个球,一半是高尔夫球,一半的高尔夫球是蓝色的,有多少个蓝色高尔夫球?”,并提示“答案是:”,模型可能会直接给出错误答案。




不理想的直接回答示例:
问题:一个杂耍演员能抛16个球,一半是高尔夫球,一半的高尔夫球是蓝色的,有多少个蓝色高尔夫球?
提示:答案是:
模型输出:8
(正确答案是4,因为16个球的一半是8个高尔夫球,这些高尔夫球的一半是4个蓝色的。)

相反,如果我们鼓励模型先思考,可以使用“让我们一步步思考”这样的提示。当模型这样做时,它会展示推理步骤,并最终得出正确答案。
使用思维链的示例:
提示:一个杂耍演员能抛16个球,一半是高尔夫球,一半的高尔夫球是蓝色的,有多少个蓝色高尔夫球?让我们一步步思考。
模型输出:总共有16个球。一半是高尔夫球,所以有16 / 2 = 8个高尔夫球。这些高尔夫球中有一半是蓝色的,所以有8 / 2 = 4个蓝色高尔夫球。因此,答案是4。
另一种诱导思维链行为的方法是通过上下文学习提示。例如,在提示中提供几个带有详细推理步骤的例子,模型会学习这种模式,在面对新问题时也先进行逐步推理。

定量研究表明,使用思维链提示能极大提升模型在数学问题集上的准确率。因此,现代大语言模型通常会通过指令微调来展现这种思维链行为。



代码协同训练 (Code Co-Training) 💻



RLVR的另一个重要组成部分是使用代码对大语言模型进行协同训练。自动程序合成一直是编程语言领域的长期挑战,而大语言模型的出现提供了解决方案。





早期研究发现,GPT-3仅通过阅读Python文档字符串,就能生成实现相应功能的简单程序,尽管它并未针对代码生成进行专门训练。这非常引人注目。




代码的一个优点是互联网上有大量代码,并且通常伴有自然语言注释。自2021年以来,标准做法是让大语言模型在自然语言文本和代码数据上共同进行训练。


尽管编程语言与自然语言不同,但协同训练这两种类型的数据效果出奇地好。事实上,代码生成已成为大语言模型的主要用途之一。有报告显示,近40%的模型生成内容是为了编码目的。

更有趣的是,编码训练还能提升模型在非代码逻辑推理任务上的能力。多项研究表明,在数学训练之前进行代码训练,能提高模型解决数学问题的能力;形式逻辑问题能增强最先进大语言模型的推理能力;代码是模型实现超越编码任务泛化的关键基石。
大语言模型的数学问题求解 ➗


近期,大量研究关注使用大语言模型解决数学问题。这类研究主要分为两种类型:

- 求解答案型问题:解决高中或以下级别的数学问题,最终报告一个数值答案。例如:“Natalia在四月卖了48个夹子给她的朋友,五月卖的夹子是四月的一半。Natalia在四月和五月总共卖了多少个夹子?”
- 生成证明型问题:生成数学证明,例如证明微积分中的中值定理。这类问题通常没有数值答案,而是产生用自然语言或形式化证明辅助工具(如Lean)编写的证明。


本节课我们主要讨论第一种类型。常用的数据集包括:
- GSM8K:包含8.8K个小学或初中水平的数学问题。
- MATH:包含高中到大学低年级水平的数学问题。
- AIME:美国数学邀请赛的题目,难度较高,答案为0到999之间的整数,便于自动评分。
让AI解决数学问题主要有两个原因:一是希望提升模型在其它需要逻辑推理的自然语言任务上的泛化能力;二是AI可能协助人类做出新颖的数学发现,这已经有一些初步的成功案例。


数学领域的一个优点是它不需要外部真实世界数据验证。证明的正确性即代表了真理,这与棋盘游戏类似,但解决数学问题代表了更高层次的智力成就。





DeepSeek-Math 与 GRPO 算法 🧮
DeepSeek-Math 论文的贡献主要有两点:一是提出从预训练数据集中提取数学问题数据的方法;二是提出了GRPO算法,并使用RL训练大语言模型通过思维链推理解决这些数学问题。



这是一个典型的使用可验证奖励的强化学习实例。这里的奖励是精确的:模型是否产生了正确的数学答案。只要答案本身没错,这个奖励函数就是精确的,不存在奖励黑客攻击或过度优化的可能性。
在DeepSeek-Math中,只提供结果奖励,即仅根据最终答案的正确性进行评分,不对思维链中的中间步骤提供奖励。
以下是GRPO算法的核心步骤:
- 采样一个问题
x。 - 采样
G个回答y_1, ..., y_G(每个回答包含思维链和最终答案)。 - 通过结果奖励检查器计算奖励
R:提取每个回答的最终答案,与正确答案比对,正确则给正奖励,错误则给负奖励。 - 计算优势估计值
\hat{R}:对奖励向量进行标准化(减去均值,除以标准差,并进行长度归一化)。 - 使用PPO-Clip损失函数进行优化,并添加KL散度正则化项,防止RL调优后的模型偏离指令微调模型太远。

值得注意的是,GRPO算法中引入了长度归一化项,即除以响应长度 len(y_g)。这个项并非源于策略梯度或PPO的理论推导,而是作者加入的,我们后续会讨论它可能带来的问题。

DeepSeek-R1 与推理能力的涌现 🚀



DeepSeek-R1 论文在 DeepSeek-Math 的基础上,将RLVR扩展到编码、数学、科学、逻辑推理等更多具有可验证奖励的任务上。

论文发现,随着RLVR训练的进行,模型学会了更广泛地利用思维链,性能显著提升。在解决AIME数学竞赛题时,准确率随着训练而增长,同时模型使用的思维链长度也越来越长。

DeepSeek-R1的完整训练流程非常复杂,但有几个关键步骤值得注意:
- 从DeepSeek-V3基础模型开始。
- 应用RLVR得到DeepSeek-R1-0,但其思维链可读性较差。
- 使用R1-0生成思维链数据,过滤出好的样本,对基础模型进行监督微调,以预热RLVR过程。
- 为了解决思维链中中英文混杂的问题,引入了语言一致性奖励。
- 为了得到通用模型,构建了包含可验证和不可验证任务(如创意写作)的思维链数据集,并对基础模型进行SFT。
- 通过蒸馏训练得到更小的模型版本。
- 最后,对SFT模型进一步进行RLVR训练,并使用GRPO配合奖励模型进行最终的RLHF阶段。
DeepSeek-R1使用特殊的系统提示和标记(如 <think> 和 </think>)来包裹思维链推理过程,这使得结果奖励函数可以忽略标记内的内容,只检查 <answer> 标记内的最终答案。这种做法旨在避免对推理内容施加特定偏见,以便准确观察模型在RL过程中的自然演进。






一个显著的现象是非线性推理能力的涌现。随着测试时计算量的增加,模型自发地出现了复杂行为,如反思(重新评估之前的步骤)、探索替代的问题解决方法等。这些行为并非显式编程,而是模型与强化学习环境交互的结果。





为什么RLVR现在才有效?🔍

RLVR的想法并不新鲜,早期就有研究人员尝试过,但并未观察到如今这种复杂的推理能力涌现。那么,为什么现在它突然奏效了呢?

一篇2025年的论文提供了答案。该研究发现,像Qwen这样的基础模型在经历RLVR之前,就已经表现出某些关键的认知行为,包括:
- 验证:系统性的错误检查。
- 回溯:放弃无效的方法。
- 子目标设定:将问题分解为可管理的步骤。
- 后向链:从期望的结果反向推理到初始输入。
而像Llama这样的基础模型则不具备这些行为。研究表明,RLVR只对已具备这些认知行为的模型有效。如果通过监督微调“引导”Llama模型学会这些行为,那么RLVR在它身上也会开始起作用。


那么,为什么Qwen有而Llama没有这些行为呢?这很可能归因于训练数据。像“OpenWebMath”和“FineMath”这样的数学问题求解数据集中包含了这些认知行为。推测Qwen和DeepSeek-V3在预训练时接触过这类数据,而Llama可能没有。实验也证实,如果在Llama上进一步用这类数学数据集训练,RLVR也会变得有效。

测试时扩展与多数投票 📈

测试时扩展指在推理时使用更多计算资源来提升输出质量或准确性。对于大语言模型,多数投票是一种简单的测试时扩展技术:针对同一个问题生成多个回答,然后报告其中最频繁出现的答案。



DeepSeek-R1的实验显示,使用16次生成并进行多数投票,能比单次生成获得显著更高的准确率。这种性能提升是以额外的计算成本为代价的。


RLVR本身也是一种测试时扩展形式:模型学会使用更长的思维链,这增加了计算成本,但也提高了性能。目前,用户无法直接控制思维链的长度。但可以通过预算强制技术来实现控制:例如,提前追加答案文本来终止过长的思维链,或者删除已生成的答案并追加“继续”提示来延长思维链。


DeepSeek团队也报告了一些测试时扩展的负面结果:尝试使用过程奖励模型来评估中间步骤的效果不佳,因为标注成本高且易受奖励黑客攻击;尝试使用蒙特卡洛树搜索也效果不好,因为语言生成每一步的可能动作(词元)太多,导致搜索树迅速膨胀至难以处理。




GRPO 算法的改进:长度归一化问题 ⚖️







让我们回顾GRPO算法中的长度归一化项。这个在策略梯度或PPO推导中不存在的项,带来了一个意想不到的激励:如果模型认为自己无法正确回答问题,它倾向于生成非常长的响应,因为长响应会因归一化而受到较小的惩罚。




证据显示,使用GRPO训练时,思维链长度会无限制增长,而对于错误答案,其长度增长尤为明显。相比之下,改进后的算法(如Doctor GRPO)移除了长度归一化,模型会找到一个合适的思维链长度并保持稳定,同时性能保持不变。




Doctor GRPO还移除了优势估计中对奖励标准差的归一化,以避免对难度极端(太易或太难)的问题赋予过高权重。从原理上讲,Doctor GRPO的优势估计能提供无偏的策略梯度估计。

RLVR 与泛化:它真的教会了新推理吗?🎓
有论文提出,RLVR能带来比监督微调更好的泛化能力。假设原因是:监督微调缺乏明确的负面信号,模型只能间接推断未出现的行为不可取;而RL提供了明确的负面反馈(低奖励的动作被惩罚),尽管信用分配不精细,但这种直接信号可能更有效地揭示可泛化的因果关系。
然而,关于RLVR是否“教会”模型全新的推理模式,存在争议。一篇论文认为,RLVR主要是强化了模型在预训练中已经知道的正确推理路径,并抑制了错误的路径,而非创造新策略。证据是,当使用“Pass@K”指标(K次生成中至少有一次正确即算成功)评估时,RLVR反而会降低性能,说明它可能缩小了模型的探索范围。


但另一篇论文提出了反驳,认为通过他们改进的延长RL技术,可以避免“熵崩塌”现象(模型输出多样性过早减少),从而使模型能够学习到基础模型无法触及的新推理策略。


还有研究发现,RLVR甚至在仅使用单个训练样本时也能带来性能提升。假设是,即使反复解决同一个问题,模型每次产生的思维链都不同,RLVR通过检查最终答案,为模型提供了关于哪些解题策略正确、哪些错误的信号,从而整体提升了推理能力。


这些看似矛盾的研究发现,反映了这个快速演进领域的前沿特性。在阅读此类文献时,保持审慎的态度是必要的。




无需RL的推理能力诱导:专家迭代 🔄






最后,我们介绍一些不依赖强化学习也能诱导推理能力的方法,核心思想是专家迭代。


专家迭代的元算法描述如下:
- 从当前模型
M_n开始。 - 通过测试时扩展(如多数投票、MCTS)或结果验证,得到一个增强的模型
M_n+。 - 让下一个模型
M_{n+1}去学习模仿增强模型M_n+的行为(例如通过监督微调)。 - 重复此过程。

STaR 是自教推理的缩写。其思路是:
- 原理生成:让模型生成思维链,保留那些得出正确答案的链。
- 原理合理化:对于模型答错的问题,直接给出正确答案,并让模型生成一个证明该答案合理的思维链,然后当作是模型自己推理出来的。
- 迭代此过程,数据集和质量会逐步提升。

递归自我改进 是另一种有趣的方法,适用于难度有明确分级(如整数加法位数)的任务。关键观察是:一个在难度为 n 的问题上训练的模型,能以一定准确率解决难度为 n+1 的问题。通过多数投票可以提高这个准确率,从而为更难的问题生成可靠的标签。然后,用这些新数据训练下一代模型,从而实现从易到难的泛化,而无需任何困难样本的真实标签。



在本节课中,我们一起学习了使用可验证奖励的强化学习。我们从思维链、代码协同训练和数学求解这三个基础概念出发,深入探讨了GRPO算法、DeepSeek-R1的实践、RLVR生效的原因、测试时扩展技术、算法的改进以及关于RLVR本质的学术讨论。最后,我们还了解了不依赖RL的专家迭代方法。当前正是强化学习与人工智能蓬勃发展的时期,这些技术正在推动大语言模型向更深度、更可靠的推理能力迈进。

浙公网安备 33010602011771号