强化学习入门:从MDP、策略到Q-learning的完整概念梳理
1. 从“试错”说起强化学习到底在解决什么问题第一次接触强化学习的人脑子里冒出来的画面往往是AlphaGo下围棋、机器人后空翻或者某个智能体在游戏里刷分刷到飞起。这些画面没错但它们只是冰山露出水面的那一角。真正把强化学习Reinforcement Learning简称RL拆开来看它要解决的核心问题其实非常朴素一个决策者在某个环境里通过不断尝试学会一套能让自己长期收益最大化的行为策略。这句话里有三个关键词——决策者、环境、长期收益。把它们换成更生活化的场景你第一次去一个陌生的城市找餐厅你不知道哪家好吃于是你凭感觉进了一家店吃完之后你得到一个反馈——好吃或者难吃。下次你还会不会去如果好吃你大概率会再去如果难吃你大概率会换一家。这个“进店—吃—评价—调整下次选择”的过程就是强化学习最原始的形态。和 supervised learning监督学习最大的区别在于监督学习是有人告诉你“这张图是猫那张图是狗”你照着标准答案去拟合而强化学习没有人给你标准答案你只知道最终结果好不好但不知道每一步具体错在哪里。这就引出了一个非常棘手的信用分配问题——赢了这盘棋到底是哪一步走得好输了这盘棋又是哪一步埋了雷强化学习的整套理论体系几乎都是围绕这个问题在打转。这篇文章是我自己对强化学习基本概念的一次系统梳理。我会从最基础的框架讲起把状态、动作、奖励、策略、价值函数这些概念一个一个拆开讲清楚它们为什么存在、彼此之间怎么咬合、实际写代码时容易在哪儿踩坑。适合刚入门RL、被各种公式和术语绕晕的朋友也适合已经跑过几个demo但感觉概念还是模糊的同学。我不会堆砌数学推导而是尽量用“人话”把每个概念背后的直觉讲透。2. 核心框架拆解智能体与环境的交互循环2.1 五元组把问题装进一个标准模具强化学习的问题描述标准做法是把它建模成一个马尔可夫决策过程Markov Decision ProcessMDP。一个MDP通常用五元组来表示符号名称含义生活化类比S状态空间环境所有可能状态的集合棋盘上所有可能的局面A动作空间智能体所有可执行动作的集合棋子可以落子的所有位置P状态转移概率在某个状态执行某个动作后转移到各状态的概率落子后对手可能怎么应R奖励函数在某个状态执行某个动作后获得的即时奖励这步棋走完是占优还是吃亏γ折扣因子未来奖励的衰减系数0到1之间你有多看重长远利益这五个元素一旦确定一个强化学习问题就被“框”住了。我刚开始学的时候觉得这套形式化定义很啰嗦后来才明白它的价值只有把问题形式化成MDP才能判断哪些算法适用、哪些假设成立。比如如果状态转移是确定性的那问题会简单很多如果奖励极其稀疏那就要考虑探索策略的设计。这里有一个容易被忽略的点马尔可夫性。它说的是“下一个状态只取决于当前状态和当前动作与更早的历史无关”。这个假设在实际问题里经常不成立比如打牌时你需要记住出过哪些牌。这时候要么把历史信息编码进状态要么就得用部分可观测马尔可夫决策过程POMDP来建模。很多初学者跑出来的模型效果差根源就在于状态设计没有满足马尔可夫性智能体“记不住”关键信息。2.2 交互循环一步一脚印的决策过程智能体和环境的交互是一个循环标准流程是这样的在时刻 t智能体观察到当前状态 S_t智能体根据策略选择一个动作 A_t环境接收到动作后转移到新状态 S_{t1}并给出奖励 R_{t1}智能体根据新状态和奖励更新自己的策略重复以上过程直到达到终止条件这个循环看起来简单但每一步都有讲究。我拿一个经典例子来说明——网格寻宝。假设有一个5x5的网格智能体从左上角出发目标是走到右下角的宝藏位置每走一步扣1分走到宝藏得100分。这里状态就是智能体所在的格子坐标共25个状态动作是上下左右四个方向奖励是每步-1到达宝藏100转移是确定性的撞墙就停在原地这个例子足够简单但已经包含了强化学习的全部核心要素。你可以用价值迭代、策略迭代、Q-learning、SARSA等各种算法去解它然后对比不同算法的收敛速度和最终策略。我的建议是每个初学者都应该亲手把这个网格世界写一遍不要调库就从零实现。写完之后你对状态、动作、奖励、策略的理解会完全不一样。2.3 回合制与连续任务两种时间尺度强化学习任务按时间结构可以分为两类回合制任务Episodic Task有明确的起点和终点比如一盘棋、一局游戏。一个回合结束后环境重置重新开始。连续任务Continuing Task没有终止状态一直运行下去比如温度控制系统、股票交易策略。这个区分直接影响折扣因子γ的选择。回合制任务里γ可以取接近1的值因为回合总会结束未来奖励不会无限累积连续任务里γ必须小于1否则总回报可能发散到无穷大。我见过有人在连续控制任务里把γ设成0.999结果价值函数爆炸排查了半天才发现是折扣因子的问题。3. 策略与价值函数智能体的两套“大脑”3.1 策略从状态到动作的映射策略Policy是强化学习里最核心的概念通常用π表示。它定义了智能体在每个状态下应该做什么。策略分两种确定性策略π(s) a给定状态s直接输出一个确定的动作随机性策略π(a|s) P(A_ta | S_ts)给定状态s输出每个动作的概率分布为什么需要随机性策略两个原因。第一探索的需要——如果策略永远是确定性的智能体可能永远困在某个次优动作上无法发现更好的选择。第二在某些博弈场景里确定性策略容易被对手针对随机化反而能提高胜率。经典的“石头剪刀布”就是最好的例子如果你的策略是确定性的对手摸清规律后就能稳赢你。策略的表示方式也分两种表格型和函数近似型。表格型就是用一个查找表每个状态对应一个动作或一组概率。状态少的时候没问题状态一多就内存爆炸。函数近似型则是用一个参数化函数比如神经网络来拟合策略输入状态输出动作或概率。深度强化学习里的“深度”指的就是用深度神经网络来做函数近似。3.2 价值函数给每个状态“估价”价值函数回答的是这样一个问题处在某个状态或执行某个动作到底有多好这个“好”不是即时奖励而是从长远来看的累积回报期望。状态价值函数 V(s)从状态s出发按照策略π行动能获得的期望累积回报动作价值函数 Q(s,a)从状态s出发先执行动作a然后按照策略π行动能获得的期望累积回报两者之间的关系很直观V(s) 等于在状态s下对所有可能动作的Q(s,a)按策略概率加权求和。而Q(s,a)又等于即时奖励加上折扣后的下一状态价值期望。这里有一个非常重要的概念叫贝尔曼方程它是整个强化学习算法体系的基石。贝尔曼方程的核心思想是递归一个状态的价值等于即时奖励加上折扣后的后继状态价值。用大白话说就是“走一步看一步但每一步都往后看”。这个递归结构使得我们可以用动态规划的方法来求解价值函数。我刚开始学的时候对V和Q的区别总是记混。后来我用了一个记忆方法V是“站在某个地方值多少钱”Q是“在某个地方做某个动作值多少钱”。站在十字路口值多少钱取决于你接下来往哪走而往左走值多少钱、往右走值多少钱就是Q值。这个类比帮我理清了很多后续算法的推导。3.3 最优策略与最优价值函数强化学习的终极目标是找到最优策略π*使得在所有状态下按照这个策略行动获得的期望累积回报都最大。与最优策略对应的就是最优状态价值函数V*(s)和最优动作价值函数Q*(s,a)。有一个关键结论对于任何MDP至少存在一个确定性最优策略。这意味着我们不需要在最优策略里保留随机性虽然训练过程中需要随机性来探索但最终收敛的最优策略可以是确定性的。最优价值函数满足贝尔曼最优方程它和普通贝尔曼方程的区别在于普通贝尔曼方程是对策略的概率求期望而最优贝尔曼方程是对动作取最大值。这个“max”操作是非线性来源也是强化学习比监督学习难优化的重要原因之一。4. 探索与利用强化学习最根本的权衡4.1 为什么必须探索探索与利用Exploration vs Exploitation的权衡是强化学习区别于其他机器学习范式的标志性难题。利用是指选择当前已知的最优动作探索是指尝试那些还没试过或试得不够多的动作。为什么不能只利用因为你当前认为的最优可能只是局部最优。就像一个刚到大城市的人如果只去已经吃过的餐厅可能永远发现不了巷子里那家更好吃的店。但探索也不能盲目因为每次探索都可能付出代价——在股票交易里一次错误的探索可能意味着真金白银的亏损。这个权衡在数学上有非常漂亮的分析。多臂老虎机Multi-Armed Bandit是最简化的探索-利用问题有K个老虎机每个的收益分布未知你每次只能拉一个目标是最大化总收益。这个问题没有状态转移只有动作和奖励但已经足够揭示探索策略的核心思想。4.2 常见的探索策略实际中最常用的几种探索方法ε-贪婪策略以ε的概率随机选择一个动作以1-ε的概率选择当前最优动作。ε通常从大到小衰减前期多探索后期多利用。玻尔兹曼探索根据动作价值的softmax概率来选择动作价值高的动作被选中的概率大但价值低的也有机会。上置信界UCB给每个动作的价值估计加上一个不确定性奖励不确定性越大越倾向于选择它。这个方法的理论保证很漂亮。汤普森采样从动作价值的后验分布中采样选采样值最大的动作。贝叶斯方法实际效果往往很好。我个人的经验是ε-贪婪虽然简单但在大多数问题上已经够用。关键是要把ε的衰减策略设计好。衰减太快探索不充分衰减太慢收敛速度慢。一个常用的做法是ε从1.0线性衰减到0.01衰减步数设为总训练步数的10%到30%。注意探索策略的选择和问题的奖励结构密切相关。如果奖励非常稀疏比如只有到达终点才有奖励那需要更强的探索策略甚至要用到内在奖励、好奇心驱动等方法。如果奖励密集简单的ε-贪婪就够了。4.3 探索的代价与收益探索不是免费的。在真实系统里探索意味着试错成本。比如推荐系统里给用户推荐一个没试过的商品如果用户不喜欢可能就流失了。所以在实际应用中探索策略的设计必须考虑业务约束。一个折中方案是离线强化学习先用历史数据训练一个策略然后在线只做很小的探索。或者用安全强化学习的方法给探索加上约束保证不会进入危险状态。这些进阶话题我们后面再展开但基本概念阶段就要建立这个意识探索是有代价的不是越多越好。5. 从基本概念到算法分类一张地图看清全貌5.1 基于价值 vs 基于策略强化学习算法大致可以分为三大类类别核心思想代表算法优点缺点基于价值先学价值函数再由价值导出策略Q-learning、SARSA、DQN样本效率较高训练稳定难以处理连续动作空间基于策略直接参数化策略用梯度上升优化REINFORCE、PPO、A3C天然支持连续动作策略随机性好方差大样本效率低Actor-Critic两者结合Actor学策略Critic学价值A2C、SAC、TD3兼顾两者优点实现复杂超参数敏感这个分类不是绝对的很多现代算法是混合的。但理解这个分类框架能帮你在面对一个新问题时快速定位应该从哪个方向入手。5.2 同策略 vs 异策略另一个重要分类维度是同策略On-Policy和异策略Off-Policy同策略行为策略和目标策略是同一个。比如SARSA它用当前策略产生的数据来更新当前策略。异策略行为策略和目标策略可以不同。比如Q-learning它可以用ε-贪婪策略产生的数据来更新贪婪策略。异策略的好处是可以复用历史数据样本效率高坏处是重要性采样会引入方差训练不稳定。同策略的好处是稳定坏处是数据用完就得重新采集样本效率低。我刚开始学的时候总是分不清Q-learning和SARSA的区别。后来记住一句话Q-learning是“说到做到”SARSA是“说到做到但下次不一定”。Q-learning更新时用的是下一状态的最大Q值不管实际下一步走哪个动作SARSA更新时用的是实际下一步动作的Q值。这个区别在悬崖行走问题里表现得特别明显Q-learning会学到最优路径但训练过程中经常掉下悬崖SARSA会学到更安全的路径。5.3 基于模型 vs 无模型最后一组分类是基于模型Model-Based和无模型Model-Free基于模型先学习环境的动态模型状态转移和奖励函数然后用这个模型来做规划。代表算法有Dyna-Q、MuZero。无模型不学模型直接学策略或价值函数。Q-learning、PPO都是无模型。基于模型的方法样本效率通常更高因为学到的模型可以反复用来生成虚拟经验。但模型误差会累积导致策略在真实环境里表现差。无模型方法更直接但需要大量交互数据。实际应用中无模型方法目前更主流因为深度学习的函数近似能力让无模型方法也能处理高维状态。6. 实操中容易踩的坑与排查技巧6.1 奖励设计最容易翻车的地方奖励函数设计是强化学习里最像“玄学”的部分。我踩过的坑包括奖励尺度问题如果奖励值太大梯度爆炸太小学习信号被淹没。通常建议把奖励归一化到[-1, 1]或[0, 1]区间。稀疏奖励只有最终目标有奖励中间过程没有。智能体很难学到有效策略。解决方法包括奖励塑形、内在奖励、课程学习等。奖励黑客智能体找到了奖励函数的漏洞做出了违背设计意图的行为。比如一个清洁机器人发现把垃圾藏起来比捡起来更省事。实操心得设计奖励函数时先问自己三个问题——这个奖励是否鼓励了正确的行为是否存在被“钻空子”的可能奖励的尺度是否合适最好在训练前用随机策略跑一遍看看奖励分布是否合理。6.2 状态设计马尔可夫性检验状态设计的一个核心原则是满足马尔可夫性。检验方法很简单如果你作为人类只看当前状态能不能做出最优决策如果不能说明状态信息不完整。比如在股票交易里如果状态只包含当前价格那肯定不满足马尔可夫性因为价格的历史走势包含了趋势信息。这时候要么把历史价格窗口作为状态要么用LSTM等循环网络来编码历史。状态设计还要注意维度灾难。状态维度越高需要的样本越多。通常的做法是先做特征工程把原始观测压缩成低维特征再喂给强化学习算法。6.3 超参数调优折扣因子与学习率折扣因子γ和学习率α是两个最关键的超参数参数作用常用范围调参建议γ控制对未来奖励的重视程度0.9 ~ 0.99回合制任务取大值连续任务取小值α控制价值更新的步长0.001 ~ 0.1从0.01开始根据收敛情况调整γ的选择有一个经验法则如果回合平均长度是Tγ取1 - 1/T左右。比如平均100步一个回合γ取0.99。这样未来100步的奖励还能对当前决策产生足够影响。学习率α太大价值估计震荡不收敛太小收敛速度慢。深度强化学习里通常用Adam优化器学习率从3e-4开始试。6.4 常见问题速查表现象可能原因排查方向奖励不上升学习率太小、探索不足、奖励设计有问题检查奖励分布增大探索调学习率奖励震荡剧烈学习率太大、批次大小太小、方差大减小学习率增大批次用基线减方差训练后期性能下降过拟合、灾难性遗忘、探索过多减小探索加正则化用经验回放智能体行为怪异奖励黑客、状态设计缺陷可视化智能体轨迹检查奖励函数收敛到次优策略探索不足、陷入局部最优增大探索用随机策略初始化多跑几次7. 一个完整的极简实现从零写Q-learning7.1 环境搭建与状态编码我用前面说的网格寻宝例子从零实现一个Q-learning。环境设定5x5网格起点(0,0)终点(4,4)每步奖励-1到达终点奖励10撞墙不动。import numpy as np class GridWorld: def __init__(self, size5): self.size size self.state (0, 0) self.goal (size-1, size-1) self.actions [(-1,0), (1,0), (0,-1), (0,1)] # 上下左右 def reset(self): self.state (0, 0) return self.state def step(self, action): dx, dy self.actions[action] nx max(0, min(self.size-1, self.state[0] dx)) ny max(0, min(self.size-1, self.state[1] dy)) self.state (nx, ny) if self.state self.goal: return self.state, 10.0, True return self.state, -1.0, False状态编码很简单直接用坐标的元组。动作空间是4个离散动作。这个环境足够简单但包含了强化学习的全部要素。7.2 Q表初始化与更新逻辑Q表是一个字典或二维数组记录每个状态-动作对的Q值。初始化全零。class QLearning: def __init__(self, n_states, n_actions, lr0.1, gamma0.99, epsilon1.0): self.Q np.zeros((n_states, n_actions)) self.lr lr self.gamma gamma self.epsilon epsilon self.n_actions n_actions def choose_action(self, state): if np.random.random() self.epsilon: return np.random.randint(self.n_actions) return np.argmax(self.Q[state]) def update(self, state, action, reward, next_state, done): target reward if not done: target self.gamma * np.max(self.Q[next_state]) self.Q[state][action] self.lr * (target - self.Q[state][action])更新公式就是Q-learning的核心新Q值 旧Q值 学习率 × (目标值 - 旧Q值)。目标值是即时奖励加上折扣后的下一状态最大Q值。这个“max”就是Q-learning异策略特性的来源。7.3 训练循环与收敛判断训练循环就是不断重置环境、选择动作、执行动作、更新Q表的过程。env GridWorld() agent QLearning(n_states25, n_actions4) for episode in range(1000): state env.reset() state_idx state[0] * 5 state[1] done False while not done: action agent.choose_action(state_idx) next_state, reward, done env.step(action) next_state_idx next_state[0] * 5 next_state[1] agent.update(state_idx, action, reward, next_state_idx, done) state_idx next_state_idx agent.epsilon max(0.01, agent.epsilon * 0.995)收敛判断可以看每100个回合的平均累积奖励。当这个值稳定在最优值附近时就认为收敛了。这个例子的最优策略是走最短路径累积奖励是-8102走8步每步-1终点10。我实测下来大概300到500个回合就能收敛到最优策略。ε的衰减速度很关键衰减太快会陷入次优太慢收敛慢。0.995的衰减率在这个问题上表现不错。7.4 结果可视化与策略解读训练完成后可以把Q表对应的贪婪策略打印出来看看智能体在每个状态选择哪个动作。你会发现它学到的是一条从起点到终点的最短路径。如果某些状态的动作看起来“绕路”那通常是因为这些状态很少被访问到Q值还没学好。这个极简实现虽然简单但把强化学习的核心流程都走了一遍。你可以基于它做各种实验改奖励函数、改探索策略、改学习率观察对收敛速度和最终策略的影响。这种“控制变量”的实验是理解强化学习最有效的方式。8. 概念之间的咬合关系一张图在脑子里最后我想把前面讲的概念串起来形成一个整体的认知框架。强化学习的核心概念不是孤立的它们之间有清晰的逻辑链条MDP定义了问题的边界状态、动作、转移、奖励、折扣策略是智能体的行为方式从状态到动作的映射价值函数是对策略的评估这个策略到底好不好贝尔曼方程是价值函数的递归结构当前价值等于即时奖励加未来价值最优性定义了学习目标找到让所有状态价值都最大的策略探索与利用是学习过程中的核心矛盾怎么在试错和利用之间平衡算法分类是解决不同问题结构的工具箱基于价值、基于策略、Actor-Critic这七个概念层层递进每一个都建立在前一个的基础上。如果你能把它们之间的逻辑关系讲清楚那强化学习的基本概念就算真正过关了。我在实际项目中最大的体会是概念不清调参白费。很多人遇到模型不收敛第一反应是调学习率、换优化器但真正的问题往往出在状态设计不满足马尔可夫性、奖励函数有漏洞、或者探索策略不合适。把基本概念吃透排查问题时才能有的放矢而不是盲目试错。后续如果要做更深入的学习建议从DQN入手把深度神经网络和Q-learning结合起来然后逐步过渡到策略梯度方法和Actor-Critic架构。每一步都要亲手实现不要只调库。自己写一遍和看别人写一遍理解深度完全不一样。