Hello 啊,大家好。我之前一直有一个想法只用一页纸,把强化学习相关的这些东西,尤其是在大模型应用中的这部分推导给写清楚。通俗地讲,就是达到概念的闭包:我希望把推导中涉及的所有概念,尤其是它所依赖的概念和定义,都给写清楚。
这个事情我其实已经想了很久了,从去年大概十月份学完强化学习,到今天在 Agent 的帮助下,我终于把这件事情给做到了。我也强烈推荐一下我的这个项目,现在已经把 RL 这一章给更新了进去。事实上我越来越觉得,用 Notebook 的形式去组织大量笔记,再用 Agent 去维护它,是一件非常好且高效的事情。我能在几天之内把这些事情给整理和梳理清楚,之前构建的内容框架功不可没。所以如果你对强化学习在大模型中的应用感兴趣的话,可以去看看,链接在这里。如果这个项目能有幸帮到你的话,希望你也能点一个 Star 支持一下,谢谢大家了。
https://github.com/leemojiang/llm-notes-all-in-one
在这篇文章中,我就不准备引入任何公式了,我觉得这是一份导读性的文章,因为在我的笔记里头,公式和排版都花费了大量的时间和精力,推荐大家直接去阅读原文。但是我觉得依然有必要讲一下这几个章节的重点,以及如果我作为一个新人——即假设我对强化学习完全一窍不通的话——我想要最快速度掌握强化学习在大模型中的应用,我应该按照什么样的顺序去阅读?以及我关注的重点是什么?这些算法中间最重要的逻辑过渡又是什么?
是的,这其实是个挺尴尬的事情。我当时学强化学习,把西湖大学赵世玉老师的课程整个给学完了,然后又花了大概两三周的时间把他的公式都手推了一遍。但实际上我当时还是不会把强化学习应用到大规模模型上。因为在大模型语境下的强化学习,跟传统的强化学习的概念引入,其实是两个概念体系——它更像是借用了强化学习的概念体系,但很多细节上的重要事情又都不一样。而偏偏强化学习这个知识体系的概念非常复杂和繁多,很多类似的概念被多次重复定义和引入,导致它的语义非常混乱。这也是我写完后着重梳理,才自己意识到的问题。
对于这份笔记我有一些建议:说实话,我在笔记中的公式上尽量写得非常详细,甚至有一些过于冗余。这其实是两个目的。第一个是希望它能达到一个闭包的效果——你在从任意一段开始阅读时,不需要再去查阅其他资料,相应的公式和概念在前面都有定义,所有的概念都是完备的。说实话这对我来说还是挺有帮助的,因为我发现这种把 context 缓存好的做法,在之后需要做更多的思考和推导时,可以在一份文件里迅速把所有需要的 context 都找齐。就像我专门在公式边上加了 JavaScript 的复制按钮一样。有些内容可能更像是一个公式缓存,但当我知道大概要找一个什么样的公式时,可以迅速去文章里找到它并复制。
但对新手来说,这些公式可能有些吓人,一下来了一大堆。我的建议是忽略它们,把笔记当问题大纲。所有笔记都以问题形式组织,你完全可以把问题复制下来去问大模型,交互式学习也是个好办法。
以下介绍假设阅读对象对强化学习一无所知、只了解一点点大模型。应该按什么顺序和思路阅读这份笔记?
https://leemojiang.github.io/llm-notes-all-in-one/rl/1.rl-basic.html
首先是第一章,最重要的是对强化学习问题的定义和基本概念。这章节 follow 赵老师的课程,从 Markov Decision Process 的视角建立了强化学习的基本框架。核心问题包括:什么是 State?什么是 Action?Reward 又是什么?如何用分布描述 Policy 和 Transition。这是强化学习基本世界观的建立。这只是众多视角中的一种,但后面你会发现所有概念都与此分不开。
另一个重点是 State Value 和 Action Value 这两个概念——如何用一个期望的形式,把未来一系列由随机变量描述的 Reward 变成一个可计算的量。后面大量的优化问题构造和推导都基于此。
之后的 Bellman Equation 章节及大量 Value Based Method 的内容都可以直接跳过。这些在赵老师的课程里占据了第二到第八节课几乎全部的内容,但在大模型语境下关系不大,遇到问题再回头来看。从从这个视角来看,你会发现"大模型的强化学习"这个说法似乎有一点点抽象——因为强化学习里相当多的理论和半壁江山的内容,在大模型里好像都关系不大。
然后我建议着重看这章节的最后一段,它梳理了 RL 语境下经常出现的专业名词——On Policy、Off Policy、Online、Offline、Model Based、Model Free 等等。这很重要,因为后续只要是 RL 语境就会用到。这些概念有点多,系统梳理一下对后续学习很有帮助。
这章节有两个非常重要的 insight,单独强调一下。
第一是 RM 算法。它本身是一种 Stochastic Approximation 算法,用来求方程的根。经过变形后,可以用来对期望进行估计:用一个样本估计期望值,通过迭代修正使其收敛到准确值。这个思想对应的是 TD(Temporal Difference)强化学习算法。这几乎是核心思想的一条主线,所有 Value Based 方法都有这个思路的体现。搞清楚它,后续理解对Value估计的一系列算法会容易很多。
另一个是我总结的思想,可以看作第一点的延伸。强化学习在理论推导时有时非常复杂,梳理清楚的关键是:想明白目标函数到底是什么样的期望,或者说期望里的随机变量是谁。核心在于——期望的真实值很难求,但可以用样本近似(Empirical)地估计。想明白随机变量是谁,需要哪几个样本来估计,再去看相应 RL 算法如何采样。比如只需要下一步的 Reward,还是既需要 Reward 又需要 Action。这个思路能把 RL 算法梳理得清晰且直观。
https://leemojiang.github.io/llm-notes-all-in-one/rl/2.rl-for-llm.html
第二章正式进入 RL for LLM。最惊人的是:大模型相关的强化学习算法跟 Value Based 关系不大,基本都由 Policy Gradient 系列算法衍生而来。虽然Policy Gradient系列的算法也离不开Value的估计,这里我后面会提到.
我的组织思路如下:首先从强化学习视角,从 Policy Gradient 开始推导和梳理——REINFORCE、Actor-Critic、GAE(Generalized Advantage Estimation)、Advantage 等概念。
然后才是如何把大模型应用到这些算法上面。这部分我分成了两个部分,首先是开头描述如何用强化学习的描述方式去建模大模型——比如什么是 State、什么是 Action、Reward 又是什么?
然后是第二部分: https://leemojiang.github.io/llm-notes-all-in-one/rl/3.rl-for-llm-2.html
我觉得这里有几个非常重要的主线值得强调:
第一是 Policy Gradient 这组算法。核心 Trick 是用 Log-Derivative Trick 把策略的导数变成 Action 对 log 导数的期望。原始期望基于 State 定义,State 采样非常困难。但转化为 Action 和 State 的联合期望后,在某些假设下可以用 Roll Out 的轨迹(Trajectory)采样并估计。去进行采样并估计这个期望。这是整个PG算法族的核心。
另一个核心操作是 Importance Sampling。它解决的问题很直观:样本来自的策略跟正在更新的策略可能不是同一个,分布会变成有偏的。如何用另一个分布里产生的样本来估计我当前的分布? Importance Sampling 就是通过加上一个 Ratio 就能解决这个问题。这也是 PPO 改进的核心。
第三点,也是我写这份推导时才意识到的:虽说叫 Policy Gradient Method,但它与 Value Based Method 分不开。无论用样本还是学习拟合函数,都需要估计 State 或 Action Value。传统 RL 的Step wise reward的假设下,所有 Reward 都通过 Value 来体现。不去估计或设计这个 Value,就无法获得 Reward 信息,自然无法优化策略。
但是这一点在大模型的语境下发生了变化,这也是非常重要的一点。首先,大模型的 State 空间非常巨大,传统的 Value Function 的定义会变得有些不太靠谱。具体来说,大模型的 State 其实是整个 Prompt 加上生成前缀的空间,这个空间的维度之高,会让你觉得要用一个网络去拟合它有些过于夸张和困难。另外一点就是大模型的 Reward 是稀疏的。它不像是传统的强化学习,每走一步都会产生一个 Reward,然后需要把这些 Reward 加权求和才能得到最终的 Reward。而大模型一般采用一个 Reward Model,在整个 Sequence 生成结束后(或者是一些 Reward 规则)来给予评价,对应 RL 的语境,它评价的是整个 Trajectory,而不是每一步 Action 的 Reward。所以从这个时候会发现,虽说大模型依旧使用了 Policy Gradient 之类的算法,但是强化学习原本的 Bellman Equation,包括那些复杂的 Reward,以及由它们的期望衍生出来的复杂的 Action Value 和 State Value 的定义,在大模型语境里都消失了。它其实比原本的 RL 算法要简单,省略了很多东西。这也确实是在大模型的训练里头有一种 Value Free 的势头——无论去估计还是去求 Value Function 都是比较困难的。像 GRPO 之类的算法,就是用组间样本去替代,来解决这个问题。
所以甚至你可以完全从另一个视角来构造这个问题。对于大模型,我完全可以把这些损失函数当做直接优化策略,以最大化由这个策略导出的轨迹的期望 Reward 值——即下面这个式子所描述的期望。用这个思路去推导损失函数和优化算法,甚至完全不需要 Policy Gradient 之类的前置知识也可以推导出来。
这其实是个挺尴尬的事情,就是我感觉大模型 LLM 的 RL 更多的是借鉴了强化学习里面的一些概念,然而RL的很多核心的建模思路,比如 Bellman Equation 或者 MDP 这些传统的建模方法其实都没有出现。包括 DPO,它其实更像是一种监督分类的算法,而不像强化学习。
\[J(\theta)=\mathbb{E}_{\tau\sim p_\theta(\tau)}\left[G(\tau)\right]\]\[J(\theta)=\mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi_\theta(\cdot\mid x)}\left[R(x,y)\right]\]总而言之,这篇文章我觉得做到了把所需要用到的概念达到闭包的效果。学了半天的 RL,最后发现对于大模型来说,它的 RL 跟传统的 RL 都只是叫 RL,很多概念可能描述相似的事情,但是具体的公式和定义、问题的核心推导上其实有非常大的区别,并且大模型领域还做了大量的简化。所以不用担心,它其实比传统的 RL 要简单,掌握它并不难。