强化学习入门:从MDP、贝尔曼方程到Q-Learning与深度RL实战
1. 从“试错”说起强化学习到底在解决什么问题很多人第一次接触强化学习脑子里冒出来的画面是机器人在迷宫里撞墙、在游戏里刷分。这个直觉其实很准。强化学习Reinforcement Learning简称RL要解决的核心问题就一句话一个智能体在环境里不断做动作根据环境给的反馈调整策略最终学会一套能拿到最多累计奖励的行为方式。你把它想象成教一只小狗握手。你不能直接告诉它“把前爪抬到30厘米高度”你只能在它做对的时候给零食做错的时候不给。小狗慢慢就明白了某种动作组合能换来零食。强化学习里的智能体就是这只小狗环境就是你和零食奖励就是那根肉干。这个类比里藏着几个关键角色先把它们摆清楚智能体Agent做决策的那个“人”比如游戏AI、机器人控制器、推荐系统。环境Environment智能体之外的一切它接收动作、返回新状态和奖励。状态State智能体当前看到的局面信息比如棋盘上所有棋子的位置。动作Action智能体可以做的事比如上下左右移动、出哪张牌。奖励Reward环境给的即时打分可正可负是智能体唯一的学习信号。策略Policy智能体的行为准则从状态到动作的映射。这套框架和 supervised learning监督学习最大的区别在于监督学习每个样本都告诉你“正确答案是什么”强化学习只告诉你“你刚才做得有多好”不告诉你最好该怎么做。这个差别导致强化学习天然更难、更慢但也更接近真实世界里动物和人类的学习方式。我刚开始学的时候最大的困惑是既然只给奖励那智能体怎么知道是哪一个动作导致了奖励比如下了十步棋最后赢了是第一步走得好还是第十步走得好这就是强化学习里最核心的难题之一——信用分配问题Credit Assignment Problem。后面要讲的折扣因子、价值函数、时序差分本质上都在从不同角度解决这个问题。理解了这层你再看那些公式和算法就不会觉得它们是从天上掉下来的。每一个设计都有它要对付的具体困难。2. 强化学习的数学骨架MDP与贝尔曼方程2.1 马尔可夫决策过程把问题写成数学形式要让计算机处理“试错学习”得先把问题形式化。最常用的框架是马尔可夫决策过程Markov Decision ProcessMDP。一个MDP由五元组定义符号含义举例S状态集合棋盘所有合法局面A动作集合所有合法落子位置P状态转移概率落子后局面变化的概率R奖励函数赢棋1输棋-1γ折扣因子0.99越接近1越看重长远“马尔可夫”这个词的意思是下一个状态只取决于当前状态和当前动作和更早的历史无关。这个假设听起来很强但在很多问题里它要么天然成立要么可以通过把历史打包进状态来人为满足。我见过不少初学者在这里卡住为什么一定要马尔可夫因为一旦满足这个性质我们就可以用动态规划的思路来求解数学上会简洁很多。如果不满足理论上你得把整个历史作为决策依据计算量会爆炸。2.2 回报与折扣因子为什么未来的奖励要打折智能体追求的不是某一步的奖励而是从当前时刻开始往后所有奖励的总和这个总和叫回报ReturnG_t R_{t1} γR_{t2} γ²R_{t3} ...折扣因子γ在0到1之间。它有两个作用一是数学上保证无穷级数收敛二是表达“眼前的奖励比未来的奖励更值钱”这个偏好。γ取0.9和取0.99学出来的策略可能完全不同。γ小的时候智能体更短视倾向于快速拿到小奖励γ大的时候它愿意为了长远的大奖励忍受眼前的“痛苦”。实际调参时γ是最需要根据任务时间尺度来定的超参数之一。如果你的任务每一步都很关键γ可以设到0.99甚至0.999如果任务本身很短0.9就够了。注意γ设得过大比如0.9999会让价值估计的方差变大训练不稳定。这不是理论问题是我在实际项目里反复踩过的坑。2.3 价值函数给每个状态“估价”有了回报的定义就可以定义两个核心函数状态价值函数 V(s)从状态s出发按照策略π行动能拿到的期望回报。动作价值函数 Q(s,a)在状态s先做动作a之后按照策略π行动能拿到的期望回报。这两个函数是强化学习的“估价系统”。智能体做决策时本质上就是在比较不同动作的Q值选那个估价最高的。它们之间满足贝尔曼方程这是整个强化学习的数学基石V(s) Σ_a π(a|s) Σ_{s,r} p(s,r|s,a) [r γV(s)]用人话说就是一个状态的价值等于在这个状态下所有可能动作的加权平均每个动作的价值又等于即时奖励加上折扣后的下一个状态价值。这个递归结构是后面所有算法的出发点。2.4 贝尔曼最优方程我们真正想要的东西贝尔曼方程描述的是“按照某个策略行动”的价值。但我们最终想要的是最优策略下的价值也就是贝尔曼最优方程V*(s) max_a Σ_{s,r} p(s,r|s,a) [r γV*(s)]区别就在那个max。它说的是最优状态下你总是选那个能带来最大期望回报的动作。这个方程的美妙之处在于它把一个“序列决策问题”转化成了一个“递归的优化问题”。只要能解出V或Q最优策略就唾手可得——在每个状态选Q值最大的动作就行。但现实是除了极少数玩具问题我们没法直接解这个方程。原因很简单状态空间可能大到无法枚举转移概率p往往未知。这就逼出了后面一系列近似和采样方法。3. 从动态规划到时序差分三条求解路线3.1 动态规划理论完备但要求苛刻如果环境的转移概率p和奖励函数R完全已知而且状态空间不大可以直接用**动态规划Dynamic ProgrammingDP**来迭代求解贝尔曼方程。两种经典做法策略迭代先评估当前策略的价值策略评估再根据价值改进策略策略改进反复交替直到收敛。价值迭代直接把贝尔曼最优方程当作更新规则每轮迭代都取max收敛更快但每步计算量更大。DP的优点是理论保证强收敛性有严格证明。缺点是要求模型完全已知而且每次更新都要遍历所有状态状态一多就崩。我在教学演示里经常用FrozenLake这种小格子世界来跑DP因为状态只有16个能直观看到价值函数一轮轮收敛的过程。但真实项目里DP基本只作为理解其他算法的参照系。3.2 蒙特卡洛方法让智能体跑完整局再学习当模型未知时一个自然的想法是让智能体实际去跑跑完一整局拿到真实回报然后用这个回报来更新价值估计。这就是蒙特卡洛Monte CarloMC方法。MC的更新规则很朴素V(s_t) ← V(s_t) α[G_t - V(s_t)]其中G_t是从t时刻开始的真实回报α是学习率。它用“实际跑出来的结果”去修正“原来的估计”。MC的优点是无偏因为它用的是真实回报。缺点是方差大而且必须等到一局结束才能更新。如果一局特别长学习效率就很低。另外MC只能用于有终止状态的任务episodic tasks。实操心得MC对学习率α很敏感。α太大价值估计会剧烈震荡α太小收敛慢到让人怀疑人生。我一般从0.01或0.05开始试配合多次实验取平均。3.3 时序差分强化学习的核心创新**时序差分Temporal DifferenceTD**把DP的自举bootstrapping思想和MC的采样思想结合了起来。它的更新规则是V(s_t) ← V(s_t) α[r_{t1} γV(s_{t1}) - V(s_t)]关键在括号里那一项用“即时奖励加上下一状态的估计价值”来代替MC里的真实回报。这样就不需要等一局结束每走一步就能更新。TD的优点是方差小、学习快、可以在线学习。缺点是有偏因为它用估计值来更新估计值存在自举偏差。但在实践中TD的偏差通常可以接受而它带来的效率提升是巨大的。TD还有一个重要变体叫TD(λ)通过资格迹eligibility trace在MC和TD之间做插值。λ0就是纯TDλ1就接近MC。这个设计让算法可以在偏差和方差之间灵活权衡。3.4 三条路线的对比维度动态规划DP蒙特卡洛MC时序差分TD是否需要模型需要不需要不需要更新时机每轮全量一局结束每步偏差无无有方差低高低收敛速度快小问题慢中等适用场景模型已知短回合任务大多数在线任务这张表我建议每个学强化学习的人都背下来。面试里问“TD和MC的区别”能把这几个维度说清楚基本就过关了。4. Q-Learning与SARSA两种经典TD控制算法4.1 Q-Learningoff-policy的经典前面讲的TD是策略评估也就是给定策略算价值。要找到最优策略还需要策略控制。Q-Learning是最著名的TD控制算法更新规则Q(s_t, a_t) ← Q(s_t, a_t) α[r_{t1} γ max_a Q(s_{t1}, a) - Q(s_t, a_t)]注意那个max。它表示不管我下一步实际会做什么我都假设未来会选最优动作。这让Q-Learning成为off-policy算法——它学习的策略目标策略和它实际执行的策略行为策略可以不同。这个特性非常有用。比如你可以用一个随机探索的策略去跑数据但学出来的却是最优策略的Q值。经验回放Experience Replay能用在Q-Learning上正是因为它off-policy。4.2 SARSAon-policy的稳健派SARSA的名字来自它的更新用到的五元组(s_t, a_t, r_{t1}, s_{t1}, a_{t1})。更新规则Q(s_t, a_t) ← Q(s_t, a_t) α[r_{t1} γQ(s_{t1}, a_{t1}) - Q(s_t, a_t)]区别还是那个未来项Q-Learning用maxSARSA用实际选出的a_{t1}。这让SARSA成为on-policy算法——它评估和改进的是同一个策略。4.3 悬崖行走一个经典对比实验理解两者差异最好的例子是“悬崖行走”问题。智能体在网格里从起点走到终点中间有一排悬崖掉下去扣大分。Q-Learning会学到一条贴着悬崖边缘的最短路径因为它假设未来总是选最优动作所以它“不怕”掉下去。SARSA会学到一条离悬崖远一点的更安全路径因为它考虑了探索时可能掉下去的风险。哪个更好取决于你的应用。如果训练和部署环境一致Q-Learning更激进、更高效如果探索阶段掉下去代价很高SARSA更稳健。实操心得在真实机器人上我倾向于用SARSA或它的变体因为探索时撞坏硬件的代价太高。在仿真环境里Q-Learning通常学得更快。4.4 ε-贪心最常用的探索策略这两个算法都需要探索。最简单也最常用的方法是ε-贪心以ε的概率随机选动作以1-ε的概率选当前Q值最大的动作。ε通常从一个较大值如1.0逐渐衰减到一个较小值如0.01或0.05。衰减策略很关键衰减太快智能体可能还没探索够就锁死在次优策略衰减太慢训练时间会拉长。我常用的做法是线性衰减或指数衰减配合一个最小ε下限。比如从1.0线性降到0.05用总训练步数的前30%完成衰减。5. 深度强化学习当状态空间大到无法枚举5.1 为什么需要函数逼近前面所有方法都假设Q值可以用表格存下来。但现实问题里状态可能是连续图像、传感器读数、文本根本没法枚举。这时候就需要函数逼近用参数化的函数比如神经网络来近似Q(s,a)。**DQNDeep Q-Network**是深度强化学习的里程碑。它用神经网络代替Q表输入状态输出每个动作的Q值。但直接把Q-Learning和神经网络结合会出问题DQN用两个关键技术解决经验回放把交互数据存进缓冲区训练时随机采样。这打破了数据之间的时序相关性让训练更稳定。目标网络用一个单独的网络计算TD目标定期从主网络同步参数。这避免了“自己追自己”导致的不稳定。5.2 从DQN到策略梯度DQN只能处理离散动作。连续动作空间比如机器人关节角度需要另一套思路——策略梯度Policy Gradient。它不学Q值直接学策略参数用梯度上升最大化期望回报。策略梯度的核心公式是∇J(θ) E[∇log π_θ(a|s) * G_t]直觉是如果某个动作带来了高回报就增大它的概率如果回报低就减小它的概率。这个思路很优雅但方差大需要各种技巧基线、优势函数、GAE来降方差。5.3 Actor-Critic两条腿走路Actor-Critic结合了策略梯度和价值函数Actor是策略网络负责选动作Critic是价值网络负责评估动作好坏。Critic的评估结果作为基线帮Actor降低方差。现代主流算法如PPO、A3C、SAC都属于Actor-Critic家族。PPO通过限制策略更新幅度来保证稳定性是目前工业界最常用的算法之一。算法动作空间特点适用场景DQN离散off-policy经验回放游戏、离散控制PPO离散/连续稳定易调参通用工业首选SAC连续最大熵探索强机器人控制A3C离散/连续异步并行大规模训练6. 实操中的坑与排查技巧6.1 奖励设计最容易翻车的地方奖励函数设计是强化学习里最像“玄学”的部分。我踩过的坑包括奖励太稀疏智能体跑一万步才拿到一次奖励根本学不动。解决办法是设计塑形奖励Shaping Reward给中间过程一些引导信号。奖励被钻空子智能体找到某种方式刷奖励但完全不是你想要的。比如赛跑AI发现原地转圈也能拿分。解决办法是反复审视奖励函数做对抗性测试。奖励尺度失衡不同来源的奖励量级差太多导致某一项主导学习。解决办法是归一化。注意奖励塑形要小心理论上可能改变最优策略。如果塑形项设计不当智能体可能学会“刷塑形奖励”而不是完成任务。6.2 训练不收敛的常见原因现象可能原因排查方向回报震荡学习率太大降低α加梯度裁剪回报不涨探索不足增大ε或熵系数回报突然崩灾难性遗忘检查回放缓冲区降低更新频率学得极慢奖励稀疏加塑形奖励用HER过拟合环境太单一增加环境随机化6.3 超参数调优的实战经验强化学习的超参数比监督学习敏感得多。我的经验是学习率深度RL常用1e-4到3e-4表格RL常用0.01到0.1。折扣因子γ根据任务时间尺度定常用0.99。批量大小深度RL常用64到256。回放缓冲区大小通常1e5到1e6太小会遗忘太大占内存。目标网络更新频率常用每1000步硬更新或软更新系数0.005。调参顺序建议先调学习率和γ再调探索相关参数最后调网络结构和批量大小。6.4 评估与调试别只看训练曲线训练回报高不代表策略好。我见过太多“训练时表现完美部署时一塌糊涂”的案例。评估时要注意用固定随机种子跑多次看均值和方差别被单次结果骗了。区分训练环境和测试环境测试时关掉探索噪声。可视化策略行为有时候曲线好看但行为很蠢。做消融实验确认每个组件都有贡献。7. 强化学习的应用版图与学习路径7.1 典型应用场景强化学习已经在不少领域落地游戏AI围棋、星际争霸、Dota这些是RL的招牌战场。机器人控制抓取、行走、装配连续控制是RL的强项。推荐系统把用户交互看作序列决策优化长期留存。自动驾驶决策规划模块处理复杂交互场景。资源调度数据中心制冷、电网调度、物流路径优化。大模型对齐RLHF基于人类反馈的强化学习是当前最热的应用之一。7.2 入门学习路径建议如果你刚起步我建议这个顺序先搞懂MDP和贝尔曼方程这是所有算法的根。手写表格版Q-Learning和SARSA在FrozenLake或CliffWalking上跑通。理解DQN的两个关键技巧在CartPole上复现。学策略梯度和Actor-Critic跑通PPO。读经典论文配合开源实现对照。选一个自己感兴趣的任务从头调通。别一上来就啃PPO的代码没有前面的铺垫你会被各种trick淹没。7.3 常见误区提醒误区一RL能解决所有序列决策问题。实际上样本效率低、稳定性差很多问题用规划或监督学习更划算。误区二算法越新越好。很多场景下调好的DQN比没调好的SAC强。误区三仿真里跑通就能上真实环境。sim-to-real gap是真实存在的需要域随机化等技术。误区四奖励设计不重要。恰恰相反奖励设计往往比算法选择更决定成败。我个人在实际操作中的体会是强化学习最难的从来不是算法本身而是把问题正确地形式化成MDP以及设计出引导性强又不被钻空子的奖励函数。这两件事没有标准答案只能靠对具体任务的深入理解和反复实验。算法是工具问题建模才是核心。