☰
强化学习入门:从MDP到Q-learning与策略梯度的核心原理
2026/10/15 1:09:35 网站建设 项目流程

1. 从“试错”说起:强化学习到底在解决什么问题

很多人第一次接触强化学习,脑子里冒出来的画面是机器人在迷宫里撞来撞去,撞到墙就扣分,找到出口就加分。这个画面不算错,但它只描述了最表层的东西。强化学习真正要解决的核心问题,是一个决策者在没有标准答案的情况下,如何通过不断尝试来学会做出一系列好决策。

这跟监督学习有本质区别。监督学习是你手里有一堆标注好的数据,输入猫的图片、输出“猫”这个标签,模型学的是输入到输出的映射关系。但强化学习没有这种“标准答案”,它只有一个环境,你做一个动作,环境给你一个反馈,这个反馈可能延迟很久才出现。比如下棋,你走了三四十步之后输了,到底是哪一步走错了?没人告诉你。这就是强化学习最本质的困难:信用分配问题——最终的结果该归功于或归咎于哪些中间决策。

我刚开始学的时候,最容易犯的一个错误是把强化学习当成“带延迟标签的监督学习”。这个理解会让你在后续推导贝尔曼方程的时候完全卡住。正确的理解方式是:强化学习是一个序贯决策问题,你关心的不是单步做得好不好,而是一整条决策序列累积下来能拿到多少回报。

那强化学习的过程到底包含哪些要素?一个完整的强化学习系统,至少包含以下几个核心组件:

  • 智能体:做决策的那个“人”或“程序”,它负责观察环境、选择动作。
  • 环境:智能体之外的一切,它接收动作、返回新的状态和奖励。
  • 状态:对环境当前情况的一种描述,是智能体做决策的依据。
  • 动作:智能体可以执行的操作,可以是离散的也可以是连续的。
  • 奖励:环境给智能体的即时反馈信号,是学习的方向标。
  • 策略:智能体的行为准则,从状态到动作的映射。

这六个东西构成了强化学习的基本骨架。你后面看到的所有算法,不管是Q-learning、策略梯度还是Actor-Critic,本质上都是在用不同的方式去逼近一个最优策略。

注意:奖励信号的设计是强化学习中最容易被低估的环节。奖励设错了,算法再先进也学不出你想要的行为。这一点我在后面会专门展开讲。

理解了这些基本要素之后,接下来要搞清楚的是:智能体和环境之间到底是怎么交互的,这个交互过程用什么数学工具来描述。

2. 马尔可夫决策过程:把交互过程写成数学语言

2.1 为什么需要马尔可夫性这个假设

智能体和环境的交互看起来杂乱无章,但如果我们想用数学工具来分析它,就必须做一些假设。最核心的假设就是马尔可夫性:当前状态已经包含了做决策所需的全部历史信息,你不需要回头看更早的状态。

这个假设听起来很强,但在很多实际问题中是近似成立的。比如棋类游戏,当前棋盘局面就是全部信息,之前怎么走到这个局面的并不重要。再比如推荐系统,用户当前的浏览行为序列可以在一定程度上概括他的兴趣状态。

为什么这个假设这么重要?因为它让问题变得可计算。如果没有马尔可夫性,你在做决策时需要考虑整个历史轨迹,状态空间会爆炸式增长,任何算法都跑不动。有了马尔可夫性,你只需要定义在当前状态下的转移概率和期望奖励,整个问题就可以用动态规划来求解。

2.2 MDP的五元组拆解

马尔可夫决策过程通常用五元组来表示:状态空间S、动作空间A、转移概率P、奖励函数R、折扣因子γ。这五个东西各有各的作用,缺一不可。

状态空间S决定了智能体能看到什么。状态设计得好不好,直接决定了学习难度。状态太粗,智能体分不清不同情况,学不到精细的策略;状态太细,状态空间太大,学习需要的样本量急剧增加。我在做一个模拟项目时,一开始把状态设计得特别细,结果训练了几十万步还是没什么进展,后来把状态做了离散化聚合,效果立刻好转。

动作空间A决定了智能体能做什么。离散动作空间和连续动作空间对应的算法完全不同。离散动作可以用Q-learning那一套,连续动作就得用策略梯度或者DDPG这类方法。

转移概率P描述的是环境的动态特性:在状态s下执行动作a,有多大概率转移到状态s'。这个概率通常由环境决定,智能体无法改变,但可以学习。

奖励函数R是学习的方向盘。它告诉智能体什么行为是好的、什么行为是坏的。奖励设计是强化学习中最需要经验和直觉的部分,后面会详细讲。

折扣因子γ取值在0到1之间,它决定了智能体有多“短视”。γ接近0,智能体只看眼前利益;γ接近1,智能体更看重长远回报。这个参数的设置需要根据具体任务来定,一般设置在0.9到0.99之间。

2.3 回报、值函数与贝尔曼方程

有了MDP的框架之后,我们需要定义什么叫“好”。最直接的定义是累积折扣回报:从当前时刻开始,把未来所有奖励加起来,但越远的奖励打的折扣越大。用公式表示就是G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ...。

但光有回报还不够,因为回报是一个随机变量,同样的策略在不同回合可能得到不同的回报。所以我们引入值函数来描述期望回报。状态值函数V(s)表示从状态s出发,按照某个策略走下去,期望能拿到多少回报。动作值函数Q(s,a)表示在状态s下先执行动作a,然后再按照某个策略走,期望能拿到多少回报。

值函数之间有一个非常优雅的关系,叫做贝尔曼方程。它的核心思想是递归:当前状态的价值等于即时奖励加上折扣后的下一状态价值。写成公式就是V(s) = E[R + γV(s')]。这个方程是整个强化学习的理论基石,几乎所有算法都在围绕它做文章。

我个人的经验是,贝尔曼方程一定要自己动手推导几遍,不要只是看公式。推导的过程中你会真正理解为什么强化学习可以只用局部信息来更新全局策略,这个直觉对后面理解TD学习、Q-learning都至关重要。

3. 从预测到控制:强化学习的两大任务

3.1 策略评估:给定策略,算出它到底有多好

强化学习的问题可以分成两类:预测问题和控制问题。预测问题是:给定一个策略,算出它的值函数。控制问题是:找到一个最优策略,使得值函数最大。

策略评估属于预测问题。最直接的方法是动态规划:反复迭代贝尔曼方程,直到值函数收敛。具体做法是初始化所有状态的价值为0,然后每一轮用V(s) = Σ p(s',r|s,a)[r + γV(s')]来更新,直到所有状态的价值变化小于某个阈值。

这个方法在状态空间小的时候很好用,但状态空间一大就完蛋了,因为你需要遍历所有状态。更实用的方法是蒙特卡洛方法:让智能体按照策略跑很多个完整的回合,然后用实际得到的回报来估计值函数。蒙特卡洛的好处是不需要知道环境模型,坏处是必须等到回合结束才能更新,方差也比较大。

介于两者之间的是时序差分学习,简称TD学习。TD学习不需要等到回合结束,每走一步就可以更新:V(s) = V(s) + α[r + γV(s') - V(s)]。这个更新公式里的r + γV(s') - V(s)叫做TD误差,它衡量的是“实际得到的”和“原本以为的”之间的差距。TD学习结合了动态规划和蒙特卡洛的优点,是现代强化学习最核心的估计方法。

3.2 策略改进:怎么从“还行”变成“最好”

策略评估告诉你当前策略有多好,策略改进则是要找到一个更好的策略。最基本的想法是贪心策略改进:对于每个状态,选择那个能让Q值最大的动作。如果Q值估计是准确的,那么贪心策略至少不会比原策略差。

把策略评估和策略改进交替进行,就得到了策略迭代算法。先评估当前策略的值函数,然后根据值函数改进策略,再评估新策略,再改进,如此反复,直到策略不再变化。理论上可以证明,策略迭代会收敛到最优策略。

但策略迭代有一个问题:每次策略改进之后都要重新做完整的策略评估,计算量很大。于是有了值迭代:不等到策略评估完全收敛就进行策略改进,把两步合并成一步。值迭代的更新公式是V(s) = max_a Σ p(s',r|s,a)[r + γV(s')],直接对每个状态取最大值。

3.3 探索与利用:强化学习中最经典的权衡

不管是策略评估还是策略改进,都面临一个根本性的矛盾:探索与利用的权衡。利用是指选择当前认为最好的动作,探索是指尝试那些当前认为不太好但可能实际上更好的动作。

如果只利用不探索,智能体可能永远困在一个次优策略里。如果只探索不利用,智能体就学不到任何有用的东西。这个权衡贯穿强化学习的始终,所有的算法设计都要考虑这个问题。

最常见的解决方案是ε-贪心策略:以ε的概率随机选择一个动作,以1-ε的概率选择当前最优动作。ε通常从一个较大的值开始,随着训练逐渐减小。这样在训练初期智能体更多地探索,后期更多地利用。

还有一个更优雅的方案是软最大化策略:根据Q值的大小按概率选择动作,Q值越大的动作被选中的概率越高,但Q值小的动作也有机会被选中。这种方法比ε-贪心更平滑,但计算量稍大。

我在实际项目中的体会是,探索策略的设计往往比算法本身更影响最终效果。一个精心设计的探索策略可以让简单的算法发挥出惊人的效果,而一个糟糕的探索策略会让最先进的算法也学不出东西。

4. 值函数逼近:当状态空间大到无法枚举

4.1 表格方法的局限与函数逼近的动机

前面讲的方法都隐含了一个假设:状态空间是离散的、有限的,我们可以用一个表格来存储每个状态的值。但现实问题中,状态空间往往大得离谱。比如图像输入,一张100×100的灰度图就有256的10000次方种可能,你不可能为每个状态单独存一个值。

解决方法是函数逼近:用一个参数化的函数来近似值函数,输入状态,输出值。这个函数可以是一个线性模型,也可以是一个深度神经网络。参数的数量远远小于状态的数量,而且函数逼近具有泛化能力:相似的状态会有相似的值。

函数逼近引入了一个新的问题:泛化可能带来干扰。在表格方法中,更新一个状态的值不会影响其他状态。但在函数逼近中,更新一个状态的估计值会通过参数影响到其他状态的估计值。如果这种影响是正向的,那很好,泛化帮你加速学习;如果这种影响是负向的,那就会导致学习不稳定甚至发散。

4.2 线性逼近与神经网络逼近的取舍

最简单的函数逼近是线性逼近:V(s) = w^T φ(s),其中φ(s)是状态的特征向量,w是权重向量。线性逼近的优点是理论分析成熟、收敛性有保障,缺点是表达能力有限,需要人工设计特征。

神经网络逼近则强大得多,可以自动从原始输入中提取特征。但神经网络是非线性的,收敛性没有理论保证,训练过程中容易出现不稳定。深度强化学习中的很多技巧,比如经验回放、目标网络、梯度裁剪,本质上都是在解决神经网络逼近带来的不稳定性。

选择哪种逼近方式,取决于问题的复杂度和你对稳定性的要求。如果状态特征容易设计、问题规模不大,线性逼近是更稳妥的选择。如果输入是图像、语音这类高维原始数据,那就只能上神经网络。

4.3 死亡三要素:函数逼近、自举、离策略

在强化学习中,有三个东西单独出现都没问题,但凑在一起就容易导致发散。它们分别是:函数逼近、自举和离策略。

自举是指用当前的估计值来更新估计值,TD学习就是典型的自举方法。离策略是指行为策略和目标策略不是同一个策略,Q-learning就是典型的离策略方法。当这三者同时出现时,更新过程可能不收敛。

这个结论来自经典的“死亡三要素”理论。理解这个理论的意义在于:当你发现训练不收敛时,可以从这三个角度去排查。比如把离策略改成同策略,或者把神经网络换成线性模型,或者用蒙特卡洛代替TD,往往能解决一部分稳定性问题。

提示:深度强化学习中常用的DQN通过经验回放和目标网络来缓解这个问题。经验回放打破了样本之间的时序相关性,目标网络减缓了自举带来的估计偏差传播。这两个技巧几乎是深度强化学习的标配。

5. 从Q-learning到策略梯度:算法家族的演化逻辑

5.1 基于值的方法:先学好值函数,策略自然就有了

基于值的方法的核心思路是:先学好Q值函数,然后策略就是每个状态选Q值最大的动作。Q-learning是最经典的代表,它的更新公式是Q(s,a) = Q(s,a) + α[r + γmax_{a'}Q(s',a') - Q(s,a)]。

Q-learning有几个很好的性质:它是离策略的,可以用旧策略产生的数据来更新当前策略;它的更新目标是max操作,直接逼近最优Q值;它在表格情况下有收敛性保证。

但Q-learning也有明显的局限。首先,它只能处理离散动作空间,因为max操作需要遍历所有动作。其次,当Q值估计有偏差时,max操作会放大这种偏差,导致过估计问题。Double Q-learning通过维护两个Q函数来缓解这个问题。

5.2 基于策略的方法:直接优化策略本身

基于策略的方法跳过了值函数,直接参数化策略π(a|s;θ),然后通过梯度上升来优化参数θ,使得期望回报最大。最基础的是REINFORCE算法,它用蒙特卡洛采样来估计策略梯度。

基于策略的方法有几个优势:可以处理连续动作空间,因为不需要遍历所有动作;可以学习随机策略,这在某些场景下是必要的;策略的更新更平滑,收敛性更好。

但它的缺点也很明显:蒙特卡洛估计的方差很大,需要大量样本才能稳定;它是同策略的,旧数据不能直接用;容易陷入局部最优。

5.3 Actor-Critic:取两家之长

Actor-Critic方法结合了基于值和基于策略的方法。Actor是策略网络,负责选择动作;Critic是值网络,负责评估Actor选的动作好不好。Actor根据Critic的评价来更新策略,Critic根据实际回报来更新值函数。

这种结构的好处是:Critic提供了低方差的梯度估计,比纯策略梯度更稳定;Actor直接优化策略,可以处理连续动作空间。A2C、A3C、PPO、SAC这些算法都是Actor-Critic家族的成员。

我在实际使用中的感受是,Actor-Critic类算法是目前最实用的选择。PPO在稳定性和样本效率之间取得了很好的平衡,SAC在连续控制任务上表现优异。如果你的任务不是特别简单,建议直接从PPO或SAC入手,不要从最原始的REINFORCE开始。

6. 奖励设计:最容易被忽视的关键环节

6.1 稀疏奖励与奖励塑形

很多实际任务的奖励是稀疏的:只有到达目标时才给一个正奖励,其他时候都是0。比如机器人抓取物体,只有成功抓起来才有奖励。这种稀疏奖励让学习变得极其困难,因为智能体在随机探索时几乎不可能碰巧到达目标。

奖励塑形是一种解决方案:在原始奖励的基础上增加一些辅助奖励,引导智能体朝着目标前进。比如机器人抓取任务中,可以给“手靠近物体”这个行为一个小奖励。但奖励塑形有风险:如果辅助奖励设计不当,智能体可能学会只追求辅助奖励而忽略真正的目标。

6.2 奖励尺度与折扣因子的配合

奖励的绝对大小会影响学习效果。如果奖励太大,梯度更新会很不稳定;如果奖励太小,学习信号会被噪声淹没。一般建议把奖励归一化到[-1, 1]或者[0, 1]的范围内。

折扣因子γ和奖励尺度是配合使用的。γ越大,智能体越看重长远回报,但方差也越大。γ越小,智能体越短视,但学习更稳定。在实际项目中,我通常先设γ=0.99,如果训练不稳定再逐步降低。

6.3 从实际项目中总结的奖励设计原则

经过多个项目的摸索,我总结了几个奖励设计的原则。第一,奖励要密集但不要误导:尽量提供频繁的反馈信号,但每个信号都要和最终目标相关。第二,惩罚要谨慎:过多的惩罚会让智能体学会“什么都不做”来避免惩罚。第三,奖励要可比较:不同轨迹的累积奖励要有可比性,否则值函数很难学。

还有一个很实用的技巧是课程学习:先从简单的任务开始,逐步增加难度。比如训练机器人走路,可以先在平地上学,再在斜坡上学,最后在复杂地形上学。这样智能体在简单任务中学到的技能可以迁移到困难任务中。

7. 训练稳定性:那些文档里不会写的坑

7.1 超参数敏感性:学习率只是冰山一角

强化学习对超参数极其敏感,这一点和 supervised learning 很不一样。学习率、折扣因子、探索率、网络结构、批量大小、目标网络更新频率,这些参数每一个都能显著影响最终效果。

我的经验是,学习率是最关键的参数。强化学习的学习率通常比监督学习小一到两个数量级,常见范围是1e-4到1e-3。如果学习率太大,值函数会震荡甚至发散;如果太小,学习速度慢到无法接受。

另一个容易被忽视的参数是目标网络的更新频率。在DQN中,目标网络每隔C步才更新一次,C的设置很关键。C太小,目标网络变化太快,自举带来的偏差无法有效缓解;C太大,目标网络太旧,学习信号滞后。

7.2 样本效率:为什么强化学习这么“吃”数据

强化学习的样本效率通常远低于监督学习。一个在监督学习中几千个样本就能学会的任务,在强化学习中可能需要几十万甚至几百万步的交互。这是因为强化学习的信号更弱、更延迟、更嘈杂。

提高样本效率的方法有几种。经验回放是最常用的,它让每个样本可以被多次使用。优先经验回放更进一步,优先采样那些TD误差大的样本。并行环境可以同时收集多个环境的数据,加速训练。模型学习则是让智能体学习环境模型,然后用模型生成虚拟数据。

7.3 调试强化学习系统的实用检查清单

调试强化学习系统是一件很痛苦的事情,因为失败往往是静默的:程序不报错,但就是不收敛。我总结了一个检查清单,按顺序排查通常能定位大部分问题。

检查项常见问题排查方法
环境接口状态/奖励返回格式错误打印几个step的返回值,人工检查
奖励尺度奖励范围过大或过小统计奖励的均值和方差
网络输出输出范围与动作空间不匹配检查最后一层的激活函数
学习率过大导致震荡,过小导致不学习尝试1e-4、3e-4、1e-3
探索策略探索不足或探索过度观察动作分布的熵
目标网络更新频率不合理尝试不同的C值
梯度梯度爆炸或消失打印梯度范数,加梯度裁剪

这个清单看起来简单,但实际排查时非常有效。我遇到过好几次训练不收敛的情况,最后发现是环境返回的奖励没有做归一化,导致值函数估计爆炸。

8. 从理论到落地:一个完整训练流程的拆解

8.1 环境搭建与接口设计

假设我们要训练一个智能体玩一个简单的格子世界游戏。第一步是定义环境接口。环境需要提供两个核心方法:reset()返回初始状态,step(action)返回(next_state, reward, done, info)。

状态设计上,我用一个二维坐标表示智能体的位置,再加上目标位置,组成一个四维向量。动作空间是四个方向:上下左右。奖励设计上,每走一步给-0.01的小惩罚,到达目标给+1的奖励,撞墙给-0.1的惩罚。

这个设计看起来简单,但每一步都有讲究。小惩罚是为了鼓励智能体尽快到达目标,避免在原地打转。撞墙惩罚是为了让智能体学会避开障碍。奖励的尺度控制在合理范围内,避免值函数估计不稳定。

8.2 算法选型与参数初始化

对于这个任务,我选择DQN作为基线算法。原因是状态空间小、动作离散、任务相对简单,DQN足够胜任。网络结构用两层全连接,每层64个神经元,激活函数用ReLU。

参数初始化上,学习率设1e-3,折扣因子0.99,经验回放池大小10000,批量大小64,目标网络更新频率100步,ε从1.0线性衰减到0.1。这些参数不是拍脑袋定的,而是根据任务规模和计算资源做的权衡。

8.3 训练监控与效果评估

训练过程中需要监控几个关键指标:每回合的总奖励、每回合的步数、平均Q值、损失函数值。总奖励应该随着训练逐渐上升,步数应该逐渐下降,Q值应该收敛到一个稳定范围。

如果总奖励不升反降,通常是学习率太大或者奖励设计有问题。如果Q值持续增大不收敛,通常是折扣因子太接近1或者奖励没有归一化。如果损失函数震荡剧烈,通常是批量大小太小或者目标网络更新太频繁。

评估阶段要用独立的测试环境,不能用训练时的环境。测试时关闭探索,完全按照贪心策略选择动作。测试多个回合取平均值,避免单次测试的偶然性。

8.4 调参经验:从失败中总结的优先级

调参要有优先级,不要所有参数一起调。我的经验是按以下顺序排查:先调学习率,再调探索策略,然后调网络结构,最后调折扣因子和目标网络更新频率。

学习率的影响最大,通常先固定其他参数,只调学习率。如果学习率调好了还是不收敛,再考虑探索策略。探索不足会导致智能体困在局部最优,探索过度会导致学习信号被噪声淹没。

网络结构的影响相对较小,但也不能忽视。网络太小,表达能力不足,学不到复杂策略;网络太大,容易过拟合,训练也不稳定。一般从两层64神经元开始,根据任务复杂度调整。

9. 写在最后:一些个人体会

强化学习的过程本质上是一个从无序到有序、从随机到策略的演化过程。理解这个过程的关键,不在于记住多少算法公式,而在于建立起对“交互、反馈、优化”这个循环的直觉。

我刚开始学的时候,花了很多时间纠结于算法的数学推导,却忽略了去实际跑一个简单的环境。后来我发现,跑通一个最简单的例子,比看十篇论文都管用。当你亲眼看到智能体从随机乱撞到学会走最短路径,你对强化学习的理解会瞬间上一个台阶。

另一个体会是,强化学习的很多技巧是“经验性”的,没有严格的理论证明,但在实践中就是有效。比如经验回放、目标网络、梯度裁剪,这些东西你在教科书上找不到严格的收敛性证明,但它们是深度强化学习能work的关键。所以不要只盯着理论,多动手、多试错,经验会告诉你哪些技巧在什么场景下管用。

最后说一个很实际的问题:计算资源。强化学习对算力的需求很大,尤其是深度强化学习。如果你只有一块普通显卡,建议从简单的环境和小的网络开始,不要一上来就挑战Atari或者复杂机器人控制。先把简单任务跑通,建立起完整的训练和调试流程,再逐步增加难度。这个循序渐进的过程,比一上来就啃硬骨头要高效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询