资讯详情

强化学习入门指南:从MDP、价值函数到Q-learning与PPO实战

📅 2026/9/18 15:20:19 | 华诺云谱 👁 阅读
强化学习入门指南:从MDP、价值函数到Q-learning与PPO实战
简介这是一份面向机器学习初学者、高校学生及教师的强化学习入门PPT课件聚焦机器学习三大分类中的强化学习分支。内容先以监督学习、无监督学习作对比说明强化学习没有监督者、奖励信号延迟、时序依赖、智能体行为影响后续输入等特点接着系统梳理Agent、奖励信号、策略、回报函数、值函数、环境模型等基本要素并过渡到马尔科夫性、马尔科夫过程与马尔科夫决策过程帮助读者搭建从概念到模型的理论框架。课件还穿插机器人寻路、五子棋等例子便于理解试错与评价反馈的学习机制。压缩包内共1个文件为PPTX格式课件大小1.6MB全篇48页结构清晰既适合课堂讲授也适合自学。目前已有420人学习浏览对希望快速入门强化学习并建立系统认知的读者有较高参考价值。1. 先把“强化学习”放回它该在的位置很多人第一次接触强化学习是从“AI 下围棋”“AI 打游戏”这类新闻开始的于是默认它是一个离业务很远的炫技方向。这个印象需要修正一下强化学习不是监督学习的变种它解决的是另一类问题——当你不确定最优答案、但能定义一个“好与坏”的反馈时如何让程序自己试出策略。广告竞价、推荐排序、金融择时、机器人控制甚至大模型的对齐训练底层都在用同一套框架。如果你手里正好有一份讲解强化学习的 PPT 或教案你会发现它的内容结构其实非常固定先讲交互式学习范式再拆解马尔可夫决策过程然后按 Q-learning、策略梯度、Actor-Critic 的路线展开。这篇博文就按这个常见教案的组织思路把每个章节背后的原理、数学直觉和可落地的代码补完整。适合两类人一类是被“强化学习”热搜吸引、想快速建立起体系认知的工程师另一类是要给别人讲这门课、需要把概念讲透的开发者。2. 强化学习的核心抽象从 MDP 到价值函数2.1 强化学习的五个要素缺一个都跑不起来讲课的人喜欢用“试错学习”来解释强化学习但严格说强化学习的数学基础是马尔可夫决策过程MDP。它由五个要素组成状态集合 S、动作集合 A、状态转移概率 P(s|s,a)、奖励函数 R(s,a,s) 和折扣因子 γ。这个五元组是所有强化学习算法的共同底座区别只在于算法怎么处理这五个要素。比如基于模型的强化学习直接去学 P 和 R而无模型方法则跳过它们靠采样交互来估计策略价值。理解 MDP 的关键在于“马尔可夫性”——当前状态已经包含了历史的所有相关信息决策只看现在不看过去。这个假设在实际系统中不一定成立比如自动驾驶里单帧图像无法反映前车加速度但你依然可以调整状态定义拼上连续几帧来让近似成立。这是工程上处理复杂问题最常用的手法不改变算法改状态表示。在教案里这部分通常会画一张“智能体-环境”的循环图智能体观察状态、选择动作、环境反馈新状态和奖励、循环往复。这个图并不是示意它是所有代码实现的骨架。后面写回合制训练循环时你会反复看到这段逻辑。2.2 状态价值函数到底在算什么“状态价值函数的作用是什么”是搜索热词也是理解算法时最容易卡住的地方。先直接回答状态价值函数 V(s) 表示“从状态 s 出发按照当前策略 π 继续行动未来能拿到的期望折扣回报总和”。它不是一个瞬时奖励而是一个对“位置好坏”的长期估值。公式写出来长这样$$V^\pi(s) \mathbb{E}\pi \left[ r_t \gamma r{t1} \gamma^2 r_{t2} \dots \mid s_t s \right]$$注意打折因子 γ 的作用。γ 越接近 1智能体越“远视”γ 越小越在意眼前收益。工程里这个参数直接影响收敛行为后续讲代码时你还会撞到它。动作价值函数 Q(s,a) 则描述“在状态 s 下先执行动作 a之后按策略 π 行动”的期望回报。两者只有一个区别Q 在第一步强制指定了动作V 没有。由此可以推导出一个重要关系V(s) 等于 Q(s,a) 对动作取加权的平均按策略概率。教案里通常在讲完这些定义后会顺势介绍贝尔曼方程。贝尔曼方程的核心是一个递归关系当前状态的价值等于即时奖励加上下一个状态的折扣价值期望。这个看似平凡的等式是整个值函数方法的迭代基石——无论是表格型 Q-learning 还是深度网络 DQN本质上都在解同一个贝尔曼方程。import numpy as np # 小规模的 MDP3 个状态2 个动作手动构造转移和奖励 # 状态转移矩阵trans[s][a][s_next] 概率 trans np.array([ [[0.8, 0.2, 0.0], [0.1, 0.9, 0.0]], [[0.0, 0.7, 0.3], [0.2, 0.6, 0.2]], [[0.0, 0.0, 1.0], [0.0, 0.0, 1.0]], # 状态 2 是终止态 ]) rewards np.array([ [1.0, 0.0], [0.0, 0.5], [0.0, 0.0], ]) gamma 0.9 policy np.array([[0.5, 0.5], [0.5, 0.5], [0.0, 1.0]]) def evaluate_policy(v): 策略评估给定 v用贝尔曼期望方程做一次迭代更新 v_new np.zeros(v.shape) for s in range(3): for a in range(2): v_new[s] policy[s, a] * sum( trans[s, a, s_next] * (rewards[s, a] gamma * v[s_next]) for s_next in range(3) ) return v_new v np.zeros(3) for i in range(50): v evaluate_policy(v) print(f策略评估收敛后的 V: {np.round(v, 4)})这段代码展示了策略评估的核心逻辑每次迭代都利用上一轮价值估值来“自举”新一轮估值。值得注意的一点是这个例子中的状态转移是已知的因此可以直接用全概率展开。真实环境中状态转移未知时需要用采样替代全概率这就是后文 Q-learning 的由来。2.3 策略迭代与价值迭代教案里最容易混的两条路有了价值函数接下来的问题是如何找到最优策略。教案通常提供两条路线策略迭代和价值迭代。策略迭代的做法是“评估当前策略的价值再按价值贪心改进策略”反复往返直到收敛。价值迭代则更直接不断更新每个状态的价值让它逼近贝尔曼最优方程的不动点最终从价值中导出最优策略。两条路线收敛到同一套最优值但工程特性不同。策略迭代外循环次数少但每轮策略评估需要内层迭代价值迭代实现简单在状态数可控时直来直去。如今的主流深度强化学习算法则采用第三条路线不显式构造完整转移矩阵而是通过与环境交互收集样本用网络逼近价值函数或策略分布。这一点后面展开。对于只做入门讲解的 PPT 来说把表格型 MDP 落实到代码演示这一步就足够了。很多教案停留在公式推导上学习者看完仍写不出程序。反向做法先在 5×5 网格世界里跑通 Q-learning再回头看理论往往会清晰得多。3. 三大算法族值函数、策略梯度、Actor-Critic3.1 基于模型还是无模型决定你第一个选择什么算法“基于模型强化学习”和“无模型强化学习”的区分是入门阶段第一个选型判断。基于模型的方法先学一个环境模拟器近似转移概率和奖励再在模拟器里规划策略。好处是样本效率高——真实环境里试 100 步模拟器里可以试 1 万步坏处是学到的模型有误差误差会随规划深度被放大。无模型方法不显式建模环境直接从交互数据中学习。样本效率低但实现简单受模型误差影响小。绝大多数入门项目和工业落地框架比如机械臂抓取、游戏 AI优先选无模型路线因为环境模拟器在真实系统中很难做准。图强化学习、联邦深度强化学习这些进阶方向也大多建立在无模型的框架之上。实际选型时我还遵循一个经验法则如果场景的奖励信号稀疏、环境动力学复杂优先考虑基于模型的思路来提升样本效率如果问题里状态采样相对廉价、仿真器计算快直接上无模型方法省心得多。3.2 Q-learning 与 DQN从表格到神经网络的关键一跳Q-learning 是无模型方法里最知名的一个它做的事情用一句话说清楚在一个状态 s 执行了动作 a拿到奖励 r进入新状态 s然后用“s 下最优动作的 Q 值”来更新原来的 Q(s,a)。更新公式为$$Q(s,a) \leftarrow Q(s,a) \alpha \left[ r \gamma \max_{a} Q(s,a) - Q(s,a) \right]$$公式里的超参数有三个学习率 α、折扣因子 γ、探索率 ε用于 ε-greedy 策略。SRC 里约定俗成的设置是 α 取 0.1、γ 取 0.90.99、ε 从 1.0 线性衰减到 0.1。注意 max 关键字Q-learning 是 off-policy 算法更新时用的是“目标策略最优动作”的估值而不是“行为策略实际所选动作”的估值。这是它区别于 SARSA 的根本。Q-learning 的局限在于状态空间稍大就难以用表格存储。DQN 的关键改动只有两点一是用神经网络做函数逼近器替代查表二是引入经验回放机制打破样本间相关性让网络训练更稳。很多教案会在这一页强调 DQN 的两大贡献但真正干活的人会告诉你DQN 实际调参比想象中敏感得多——回报归一化、目标网络更新频率、回放池大小任何一个设置不当都会导致训练发散。3.3 策略梯度与 Actor-Critic处理连续动作的标配Q-learning 系算法对连续动作空间天然乏力——max 操作需要在连续空间里寻优代价高昂。策略梯度Policy Gradient换了一个角度直接参数化策略 π(a|s;θ)用梯度上升让期望回报最大化。它的核心公式是 REINFORCE 推导出的“运气归一化”更新式轨迹的累计回报乘以策略对数概率的梯度。这个思路虽然直接但有一个显著问题单条轨迹的回报方差大。解决方差的主要手段是引入基线baseline最常用的基线就是状态价值函数 V(s)由此得到优势函数 A(s,a) Q(s,a) - V(s)。Actor-Critic 架构由此诞生Actor 网络负责更新策略Critic 网络负责估计价值函数提供优势估计。PPO 是这套架构中最通用的实现通过裁剪目标函数限制单次更新幅度避免策略跳变导致训练崩溃。以下是 PPO 更新核心步骤的伪代码框架TensorFlow/PyTorch 实现类似# 伪代码PPO 单步更新逻辑 # actor: 策略网络输入 state 输出动作分布参数 # critic: 价值网络输入 state 输出标量估值 for _ in range(update_epochs): # 1. 用当前策略采样一批轨迹存储 (s, a, old_log_prob, return, advantage) states, actions, old_log_probs, returns, advantages buffer.sample() # 2. 计算新策略下动作的对数概率 log_probs actor.log_prob(states, actions) ratio torch.exp(log_probs - old_log_probs) # 3. PPO 裁剪目标 clipped_ratio torch.clamp(ratio, 1.0 - clip_eps, 1.0 clip_eps) actor_loss -torch.min(ratio * advantages, clipped_ratio * advantages).mean() # 4. Critic 用均方误差拟合回报 critic_loss torch.mean((critic(states) - returns) ** 2) # 5. 更新网络 actor_optimizer.zero_grad() actor_loss.backward() actor_optimizer.step() critic_optimizer.zero_grad() critic_loss.backward() critic_optimizer.step()PPO 的参数设置里以下几个需要格外留意clip_eps通常取 0.2太大更新不稳太小收敛过慢update_epochs取 3 到 10 之间最常用 34advantage的 GAE 系数 λ 取 0.95它控制偏差和方差的折中。训练过程中如果你看到 loss 出现“厮杀式”震荡多半是学习率偏大或 batch size 偏小。下表汇总三大算法族的使用场景方便在讲课时类比参考算法族代表算法动作空间样本效率实现复杂度典型场景值函数方法Q-learningDQN离散中低棋牌、网格世界、推荐排序策略梯度REINFORCE连续/离散低中连续控制、组合优化Actor-CriticA2C, PPO连续/离散中中高机器人控制、游戏 AI、LLM 对齐4. 用 Python 从零实现 Q-learning 并可视化收敛过程4.1 环境安装与最小代码结构入门强化学习最经典的实验环境是 FrozenLake-v1或新版 FrozenLake-v1 的 gymnasium 实现。这个环境的核心设定是智能体在一个网格上移动地面有冰和洞走到洞里失败走到目标成功。网格 4×4动作有上下左右四种冰面会滑动导致动作有随机性。它是故意设计成难以收敛的——随机策略的成功率只有 1.5% 左右刚好能验证算法是否真的学进去了。环境准备只需要一行命令推荐用gymnasiumGym 的维护分支接口更干净pip install gymnasium这里强调使用 gymnasium 的原因老版本 gym 的 API 已停止维护新版环境返回类型做了统一上面的代码在 gymnasium 里不需要额外适配。如果环境加载时报registry not found升级 gymnasium 到 0.28 以上即可。4.2 完整 Q-learning 训练代码以下代码直接复现了一个完整的 Q-learning 训练流程包含探索率衰减和测试逻辑import gymnasium as gym import numpy as np import matplotlib.pyplot as plt env gym.make(FrozenLake-v1, is_slipperyTrue) n_states env.observation_space.n # 16 n_actions env.action_space.n # 4 # 初始化 Q 表略偏乐观的初值有助于早期探索 Q np.ones((n_states, n_actions)) * 0.5 alpha 0.1 # 学习率控制单步更新的步幅 gamma 0.99 # 折扣因子越大越看重长期收益 epsilon 1.0 # 初始探索率 epsilon_min 0.1 epsilon_decay 0.995 episodes 8000 success_rates [] for episode in range(episodes): state, _ env.reset() done False total_reward 0 while not done: # ε-greedy 策略以 ε 概率随机探索否则贪心 if np.random.random() epsilon: action env.action_space.sample() else: action np.argmax(Q[state, :]) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated # Q-learning 更新off-policy用目标策略的最大 Q 值 best_next np.max(Q[next_state, :]) td_target reward gamma * best_next * (not done) Q[state, action] alpha * (td_target - Q[state, action]) state next_state total_reward reward # 探索率衰减但不能低于最小值 epsilon max(epsilon_min, epsilon * epsilon_decay) # 每隔 200 回合评估一次当前策略的成功率 if episode % 200 0: test_episodes 500 wins 0 for _ in range(test_episodes): s, _ env.reset() done False while not done: s, r, term, trunc, _ env.step(np.argmax(Q[s, :])) done term or trunc if r 0: wins 1 success_rates.append(wins / test_episodes) print(fEpisode {episode}: success rate {wins / test_episodes:.3f}) plt.plot(range(0, episodes, 200), success_rates) plt.title(FrozenLake Q-learning 收敛曲线) plt.xlabel(Episode) plt.ylabel(Success Rate) plt.show()这段代码里有三个值得展开的设计决策。第一是 Q 表初始化为 0.5 而非 0这叫“乐观初始值”能鼓励智能体先尝试那些未访问过的状态——在奖励稀疏的环境里这种方法比随机探索更高效。第二是td_target计算时乘了(not done)终止态的下一步价值应该是 0如果漏掉这个细节终止状态会被错误地赋予未来价值导致状态卡在目标附近反复绕圈。第三是评估和训练解耦训练时用 ε-greedy 采样数据带有探索噪声评估时纯贪心只看学到的策略本身这样测出来的成功率才反映真实水平。跑完这段代码你通常会看到成功率达到 0.6 到 0.8 左右而不是 1.0。别急着加训练量——FrozenLake 的滑冰机制决定了最优策略本身就有约 20% 的失败率这是环境随机性决定的不是算法缺陷。4.3 Q-learning 的常见翻车点与确认收敛的方法Q-learning 入门最常见的失败现象是成功率为 0 且曲线毫无上升趋势。排查方向按概率排序第一检查is_slippery参数。FrozenLake 的默认版本is_slipperyTrue有 1/3 概率滑到非目标格这符合真实学习场景但不是新手调参的好起点。如果只是想验证算法正确性先用is_slipperyFalse跑通再加随机性。第二检查探索率衰减速度。epsilon_decay0.995意味着到第 8000 回合时探索率还在 0.1 以上这个衰减曲线相对保守适合从零开始。如果你把 decay 调成 0.9300 回合后几乎纯贪心策略会锁死在局部最优里成功率可能只有 0.2 左右。第三判断是否真的在学。把训练中每个回合的单次回报打印出来你会发现大量回合回报为 0——这是正常现象稀疏奖励环境就是这样。所以要按 200 回合做滑动平均再判断趋势。只看单回合曲线只会看到一条贴近 0 的直线容易被误判为没在学。更系统的做法是记录每个回合的 TD 误差均值。如果误差稳定下降后保持在一个低水平说明 Q 值已经接近收敛如果误差持续震荡且不衰减说明学习率过大或环境随机性太大。这个技巧在调试任何 Q-learning 变体时都适用。5. 从入门到进阶IQL 离线强化学习与 MDP 预估的现实差距5.1 为什么离线强化学习值得你提前了解很多项目的瓶颈不是算法强度而是“没法在线试错”。推荐系统想在线上试验新策略试错成本是真实用户流失机械臂控制想在产线上尝试新动作碰坏的成本是设备维修。这就是离线强化学习offline RL的用武之地只用历史数据训练不与环境在线交互。它不像在线强化学习那样绕开“探索-利用困境”而是直接面对一个更棘手的问题——数据分布外的动作无法被评估导致价值函数被严重高估。IQLImplicit Q-Learning隐式 Q 学习是离线强化学习里值得细看的一个代表。它的核心思路是不估计完整 Q 分布只估计 Q 在数据支持范围内的分位数从而避免外推失误。IQL 用 expectile 回归替代均方误差让 Critic 在吸收策略状态价值时只参考高分段价值达到一种“乐观但不过头”的效果。我没有把所有离线方法都调通过但可以分享一个实践结论当你用的离线数据和目标策略的动作分布差距较大时IQL 的稳定性通常是几个主流离线算法里最好的一个。CQL 更保守但需要手动调正则强度TD3BC 简单但上限有限。IQL 在中高维连续控制任务中的表现最接近“开箱即用”。5.2 MDP 假设与工程现实的三个关键差异理论概念的最后一个台阶是搞清楚 MDP 的假设在真实系统里哪些成立、哪些不成立。第一个差异MDP 假设奖励是标量但工程系统里的目标通常有多个维度。推荐系统要同时优化点击率、停留时长、多样性机械臂抓取要在速度、成功率、功耗之间权衡。常见处理有两种把多个指标线性加权合成一个奖励或者用多目标强化学习拆成多价值头。前者简单但需要调权重后者实现复杂。第二个差异MDP 假设状态完全可观测真实系统里大部分状态是部分可观的。对机械臂来说你只能通过摄像头和传感器推断关节位置对推荐系统来说你只能看到用户几次点击猜不到真实兴趣。这类问题严格说是 POMDP但工程上通常用“堆叠历史观测”来近似比如把最近 4 帧图像拼起来当作状态输入或者在状态向量里拼接最近 5 个交互记录。“状态价值的定义决定了你解决问题的边界”这一句在实操中远比它在理论课上看起来重要。第三个差异MDP 假设环境是平稳的而真实系统的用户行为和物理特性都在变。训练一个推荐策略上线后用户对推荐的反应会改变后面的数据分布导致策略逐步失效。这是强化学习落地时最隐蔽的坑——很多 POC 表现不错生产环境却越跑越差不是算法坏了是分布偏移。5.3 学习顺序上的最后一块拼图回到那份 PPT 学习教案的标题——如果你是在准备讲稿或搭建自己的学习路径一个比“按章节顺序读”更高效的做法是“先跑通代码再回头修正概念”。具体路径可以这样定第一周跑通 FrozenLake 和 CartPole一个表格型、一个连续控制第二周读 PPO 的 PyTorch 官方示例把网络结构、GAE、裁剪逻辑对照论文逐个找出来第三周尝试把一个 Gym 环境替换成自己的问题比如把状态换成结构化数据、把动作换成离散决策再针对性优化。“强化学习实战”的价值不在于用了多新颖的算法而在于你有没有遇到过训练发散的场景。强烈建议在调通基础实验后人为制造一次训练发散并复盘——比如把学习率调大 10 倍或者把梯度裁剪关掉观察现象。这会比多看十篇论文更直观地建立“这是怎么回事”的感觉。后续当你真正做机械臂强化学习实战、MILP 与强化学习的组合优化这类应用时那些调试经验会自动起作用。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。