首页 / 资讯中心 / 文章详情

强化学习精读:有限马尔可夫决策过程与贝尔曼方程深度解析

强化学习精读:有限马尔可夫决策过程与贝尔曼方程深度解析 ★ FEATURED ARTICLE
强化学习方向的书单里排在“必读”第一位的基本都是同一本《Reinforcement Learning: An Introduction》第二版。第3章叫有限马尔可夫决策过程Finite Markov Decision Processes是整个强化学习理论体系的地基。智能体与环境的交互在这一章定义回报、折扣、策略、价值函数、贝尔曼方程这些概念全部在这一章成形。如果你后面要刷DQN、PPO这类算法所有代码逻辑几乎都能回溯到这一章的定义。这篇笔记就当是我自己几轮精读后的沉淀把读懂本章需要跨过的门槛挨个拆开讲一遍。整章公式密度很高但如果把目标从“逐行看懂公式”换成“建立一套建模语言”你会发现第3章其实是在教你如何把一个决策问题翻译成数学对象。适合正在啃原著但卡在第三章的朋友也适合那些已经会调库跑实验、但回头补理论时发现自己地基不稳的人。1. 第3章在整本书里的角色为什么所有算法都绕不开MDP1.1 从多臂老虎机到完整交互第2章讲的是多臂老虎机问题那是强化学习最简单的一个切片只有一组拉杆智能体每次选择一个动作得到一个奖励状态不存在历史也不存在每个时间步都是独立重复。第3章往前走了一大步把“状态”这个概念引了进来。智能体在某个状态下选择动作环境根据状态转移概率把智能体送到下一个状态同时给出奖励然后循环往复。这一章第一次给出了强化学习问题的完整闭环状态、动作、奖励、转移概率四个元素共同构成一个有限马尔可夫决策过程。为什么强调“有限”因为状态集合、动作集合、奖励集合都是有限集合。这个有限性非常关键它保证了后面要讲的最优策略一定存在贝尔曼方程有良好性质价值函数可以收敛。很多真实问题并不天然满足有限性但在学习阶段几乎所有现代算法都是先把问题当作有限离散问题来建模再在这个基础上去扩展近似方法。所以我一直觉得第三章不是“一些概念”而是一套后续所有章节共用的操作系统。第4章动态规划、第5章蒙特卡洛、第6章时间差分全都是在第3章这个框架里讨论“怎么求解或逼近价值函数”。1.2 智能体与环境的分界书里花了篇幅讨论一个看似哲学、实则极其重要的问题什么算智能体什么算环境我自己的理解是智能体是能学习并且能做出决策的那一部分环境是智能体无法直接修改内部状态的所有其他东西。这个分界线可以灵活画但一旦画定了后续所有符号都得严格遵守。举个例子在机器人控制里机器人的物理硬件、底层驱动、传感器噪声这些都可以归入环境上层做决策的算法部分归入智能体玩雅达利游戏时游戏引擎和画面就是环境神经网络策略就是智能体。边界画好之后整个交互过程才能用统一的语言描述智能体在时刻 t 感知到状态 S_t选择一个动作 A_t环境随即给出奖励 R_{t1} 和新状态 S_{t1}。这个“感知—决策—反馈—转移”的循环就是第3章的核心场面。理解这个分界的另一个好处是它能帮你识别代码里哪些变量应该被当作“环境返回”而不是“智能体内部计算”很多实现层面的bug其实都是边界画乱了导致的。1.3 马尔可夫性质为什么状态能替代历史第3章定义状态时强调了一个关键性质马尔可夫性。形式化地说给定当前状态和当前动作下一个状态和奖励的分布与更早的历史无关。这意味着状态已经包含了做决策所需的全部相关信息。这个假设在实际问题里未必严格成立比如视频游戏里只给一帧画面那这帧未必包含小球完整的速度信息状态就不是完全可观测的。但本书后面的理论推导建立在马尔可夫性之上所以读这一章一定要接受这个设定。读到这里我会想起一个生活类比下棋时你只要知道当前棋盘上所有棋子的位置不需要知道之前每一步是怎么走的就能判断当前局面。棋盘状态就是那个具备了马尔可夫性质的“状态”。这一节虽然概念简单但是直接影响后面第17章左右的POMDP部分可观测马尔可夫决策过程内容所以在第三章就把它吃透后面会省力很多。2. 精读笔记一回报、折扣因子和幕价值函数的底料2.1 回报G_t的定义三种形式一种逻辑价值函数的核心是“回报”return用符号 G_t 表示。回报的含义很朴素从 t 时刻之后累计得到的奖励总和。书里给出了一个统一的形式G_t R_{t1} γ R_{t2} γ² R_{t3} ... Σ_{k0}^{∞} γ^k R_{tk1}这个公式看着简单但第一次读的人很容易忽略三种特殊情况之间的区别。第一种是幕任务episodic tasks比如玩一局游戏一定会在某个时刻 T 结束那么回报就是 R_{t1} 加到 R_T。第二种是持续任务continuing tasks比如温度控制理论上永远不会自然终止那么回报就必须带折扣即 γ 小于1否则无穷多项相加直接发散。第三种是统一符号为了把两种任务写成一套记号书中约定在幕任务里终止状态之后的奖励都定义为0于是可以把 T 和 ∞ 统一处理。我第一次读这一节时没太在意这个统一约定觉得不过是记号游戏。后来写代码处理终止状态时才发现问题到底什么时候给终止状态的V值归零什么时候该按公式继续叠加如果没搞明白幕任务和持续任务的差异回报计算在边界条件下就很容易出错。建议大家在这一节慢下来把书里的两个例子都手动算一遍。2.2 折扣因子γ不同取值意味着什么折扣因子 γ 的取值区间是 [0, 1]它决定了智能体有多看重未来奖励。γ0 意味着只关心即时奖励γ1 意味着未来所有奖励都一视同仁地累加。书里给出了数学定义但实操中更常用的是一个经验公式有效决策视界约等于 1 / (1 − γ)。这个式子怎么来的因为当 γ1 时权重的和 Σγ^k 1/(1−γ)这个值衡量了“未来折合到现在相当于多少个单位的奖励”。γ0.9 时视界约10步γ0.95 时约20步γ0.99 时约100步。这个换算特别有用。比如你要控制一个自动驾驶车辆在高速上变道决策需要提前几秒考虑那么你要根据控制周期和视界长度来反推γ。如果控制周期是100毫秒提前5秒约50步γ至少要到0.98才能让第50步左右的奖励还有明显权重。我自己的经验是γ不要拍脑袋定先算任务的有效决策长度再反推。很多初学者把γ从0.99调到0.95发现智能体变“近视”了往往不是因为算法坏了而是有效视界不够用。还有一个小细节在幕任务里γ1是可以的因为幕总会结束级数不会发散但在持续任务里γ1就会导致回报无界公式系统会崩这会在后续理论推导中带来无穷多个价值不可比的问题。2.3 统一记号带来的便利第3.4节给出了统一符号约定用 T 表示幕任务终止时间用 ∞ 表示持续任务用 γ 是否取1来区分是否折扣。这套记号看起来繁琐但它使得后文几乎不用区分两类任务所有方程都能写成同一形式。我个人建议读这一节时做一个小表格把“幕任务”“持续任务”“统一记号”三行的状态集合、终止方式、回报定义、γ取值都列出来对照。做表的过程会把模糊带的认识变得精确后面读第4章到第6章时你会发现自己能更快地判断某个算法是面向哪类任务设计的。3. 精读笔记二策略与价值函数v(s)和q(s,a)到底在算什么3.1 策略行为规则与探索需要策略 π(a|s) 定义了智能体在状态 s 下选择动作 a 的行为规则。它可以是一个确定性的映射也可以是一个随机分布。书里反复暗示随机策略的必要性如果策略在某个状态只选一个动作那么其他动作的后果可能永远探索不到。探索与利用的平衡是强化学习的主线之一这里的随机策略就是为后续探索机制埋下的伏笔。理解策略的时候我建议把它当成“行为的概率分布”而不是“规定”。π(a|s) 读作“在状态s下选择动作a的概率”这一念后面的价值函数定义自然就通了。很多初学者把策略想象成一个决策函数其实在表格型方法里策略就是一个巨大的条件概率表这个表随着学习不断被更新。3.2 状态价值函数v_π(s)对策略的长期评估状态价值函数 v_π(s) 的定义是从状态 s 出发之后一直按照策略 π 行动所能获得的期望回报。公式是v_π(s) E_π[G_t | S_ts]这个定义里有两个重点。第一个“按照策略π行动”说明价值函数是相对于某个策略而言的不同策略在同一个状态下的价值不同所以v的下标带一个π。第二个是“期望回报”意味着价值函数不是某一次试验的结果而是多次试验的平均。这就好比我们说某个位置的棋局“胜率80%”不是指某一局必胜而是大量对局统计出来的结果。3.3 动作价值函数q_π(s,a)对单个动作的评估动作价值函数 q_π(s,a) 的定义是从状态 s 出发先采取动作 a之后按照策略 π 行动所能获得的期望回报。它和 v_π(s) 的差别就在“先采取的动作”是固定给出的而不是由策略 π 采样出来的。这个细节极其重要因为策略改进的核心就是比较不同动作的价值再选择价值高的动作。我之前遇到过不止一个朋友在读代码时混淆这两个概念。比如看Q-learning更新时总觉得“Q不就是V嘛为什么要存一张更大的表”。答案在于v 是对状态的评价它隐含了策略的期望q 是对“状态动作”的评价它把动作的选择从策略里拆出来了。策略改进需要知道“如果换一个动作会怎样”这个信息只存在于 q 里。所以在学习阶段几乎所有基于价值的方法都在估计 q而不是 v。3.4 贝尔曼方程期望的递归结构贝尔曼方程是这一章的灵魂。它做的事极其简单把 v_π(s) 拆成“当前这一步的期望奖励 下一状态的期望价值”v_π(s) Σ_a π(a|s) Σ_{s,r} p(s,r|s,a) [r γ v_π(s)]推导逻辑也不复杂。从定义出发v_π(s) E_π[R_{t1} γG_{t1} | S_ts]。这里的 G_{t1} 从 S_{t1} 开始按照 π 行动的期望回报恰好就是 v_π(S_{t1})。于是整个式子变成了当前奖励的期望加上下一状态价值函数的期望。这个方程的价值在于它把“一个长期的、无限步骤的期望和”变成了一个单步递推关系使得我们可以通过迭代来逼近真实价值函数而不是真的去展开无穷多项级数。读这一节时书里的回溯图backup diagram值得多看两遍。回溯图从根节点状态 s 出发先按策略 π 分裂成动作分支再按环境转移概率 p 分裂成奖励和下一状态的组合。每一层对应公式里的一个求和。我把回溯图和公式并排看之后才真正理解了“期望就是沿着图的每条边加权平均”。看不懂回溯图的人往往卡在不知道求和符号在求什么看懂之后贝尔曼方程就是一幅图画而已。4. 精读笔记三最优策略是怎么来的贝尔曼最优方程为什么难解4.1 最优价值函数定义与存在性有限MDP中存在至少一个最优策略 π*使得对任意状态 s 和任意策略 π都有v_*(s) max_π v_π(s) ≥ v_π(s)同样可以定义最优动作价值函数q_*(s,a) max_π q_π(s,a)两个最优价值函数之间有一个很简洁的关系v_(s) max_a q_(s,a)这句话的意思是在状态 s 下最优状态价值等于所有动作里最优的那个动作价值。这个关系在推导很多算法时会反复出现。最优策略为什么一定存在这一点书上没有详细证明但背后的直觉值得知道因为贝尔曼最优算子是压缩映射反复作用会收敛到一个唯一的不动点这个不动点就是最优价值函数。再根据最优价值函数构造贪心策略就得到了最优策略。相当于在一个有限棋盘上所有可行策略构成一个空间价值函数在这个空间上有一个“最高点”而压缩映射的性质保证从任何初始估计出发都一定能逼近这个最高点。我在实际工作中很少需要手推这个证明但知道这个因果关系后面对“为什么Q-learning能收敛”这类问题时心里会踏实很多。4.2 贝尔曼最优方程max带来的复杂性把最优价值函数代入贝尔曼方程得到贝尔曼最优方程v_(s) max_a Σ_{s,r} p(s,r|s,a) [r γ v_(s)]和普通贝尔曼方程相比唯一的区别是把关于动作的求和变成了 max。这个变化看起来不大实际上性质完全不同。普通贝尔曼方程是线性方程可以直接解或者迭代解贝尔曼最优方程因为有了 max变成非线性方程无法直接线性求解。正是这个“非线性”决定了后面所有算法都不可能一步到位求出最优价值函数只能通过策略迭代、值迭代、Q-learning这类迭代方法逐步逼近。读到这里最常出现的误读是认为贝尔曼最优方程里有了 max所以每一步都做贪心选择就能达到最优。这个想法不对。max 只是站在“已经知道 v_”的视角做选择而学习过程中我们并不知道 v_所以每一轮贪心未必能带来全局最优。书中后续章节会花大力气处理“如何边探索边改进”这个问题但第3章已经把最重要的结构性差异摆出来了。4.3 给定 v_* 不一定能恢复策略为什么 q_* 更重要有一个很容易被忽略的细节即使你已经知道了 v_*要得到最优策略你仍然需要知道环境模型 p(s,r|s,a)因为π_(s) argmax_a Σ_{s,r} p(s,r|s,a) [r γ v_(s)]这一步需要枚举所有可能的下一状态和奖励计算期望。如果你不知道环境怎么转移v_* 再多信息也换不来策略。而 q_*(s,a) 不一样它直接把“在状态s下采取动作a的价值”计算好了恢复策略只需要π_(s) argmax_a q_(s,a)根本不需要知道转移概率。这就是为什么几乎所有无模型算法model-free都侧重于估计 q 而不是 v。这个区别在第三章读不觉得到了第五章蒙特卡洛方法和第六章时间差分学习时你会发现书里动不动就提 Q(s,a)原因就在这里。5. 读完这一章可以立刻上手的小实验网格世界里的策略评估5.1 为什么建议动手实现一个随机策略评估很多初学者读第三章会觉得公式都看懂了做题也会但代码里这些符号怎么落地我的建议是先写一个最简单的随机策略评估不要一上来就是DQN。你只需要实现贝尔曼方程的迭代形式v_{k1}(s) Σ_a π(a|s) Σ_{s} p(s|s,a) [r γ v_k(s)]这个迭代会收敛到 v_π。跑通它你就同时理解了“价值函数是相对于策略而言的”和“贝尔曼方程为什么能用来迭代计算”。以最经典的4×4网格世界为例。16个格子其中一个是目标格智能体在每个格子可以执行上下左右四个动作。随机策略就是每个动作概率都等于0.25。转移规则是执行动作后移动到相邻格子如果撞墙则原地不动。奖励设定为进入目标格奖励1其他情况奖励0γ取0.9。目标格是终止状态价值恒定为0。5.2 一个可直接复现的实现示例核心代码很短用Python加NumPy就能写完import numpy as np goal (3, 3) gamma 0.9 V np.zeros((4, 4)) actions [(0, 1), (0, -1), (1, 0), (-1, 0)] # 右、左、下、上 def step(state, action): 执行动作后返回下一状态和奖励 r, c state dr, dc action nr, nc r dr, c dc if not (0 nr 4 and 0 nc 4): # 撞边界就留在原地 nr, nc r, c reward 1.0 if (nr, nc) goal else 0.0 return (nr, nc), reward for _ in range(1000): V_new V.copy() for i in range(4): for j in range(4): if (i, j) goal: V_new[i, j] 0.0 continue total 0.0 for a in actions: # 随机策略四个动作等概率 (ni, nj), r step((i, j), a) total (r gamma * V[ni, nj]) / 4.0 V_new[i, j] total V V_new print(np.round(V, 2))迭代足够多轮之后你会看到每一格的价值逐渐稳定下来而且越靠近目标格的格子价值越高。这就是 v_π 的数值近似。把这段代码跑通再回头看贝尔曼方程的嵌套求和每一层对应关系都会非常直观。我至今记得自己第一次把输出打印出来时看着那些数字从随机初始值逐步收敛到合理分布那种“公式活了”的感觉比任何讲解都管用。5.3 进一步扩展从 v 到 q再往后读就不会懵跑通 v 的迭代之后你可以顺手加几行代码实现 q 的迭代更新q_{k1}(s,a) Σ_{s} p(s,r|s,a) [r γ v_k(s)]这两个函数之间的关系是v(s) Σ_a π(a|s) q(s,a)。也就是说状态价值是动作价值的加权平均。把这个式子也验证一遍你对策略、价值函数、贝尔曼方程的理解会瞬间立体起来。再往后读第4章策略改进你会发现策略改进其实就是比较 q 的大小然后调整 π就这么朴素。6. 这一章最容易踩的5个坑以及自检三连问6.1 五个高频坑位速查我把读这一章常见的坑整理成了一张表每个都是身边真实出现过的典型症状坑位典型表现对策v 和 q 混淆看算法伪代码时不知道当前更新的是哪个表每遇到价值函数先问自己这是在评估一个状态还是评估一个状态动作对幕任务和持续任务符号不分实现回报计算时终止状态处理错误先把 T 或者 ∞ 代进公式边界情况单独算一遍γ 随手定智能体表现“短视”或收敛极慢用 1/(1−γ) 估算有效视界再按任务决策步数反推贝尔曼方程和贝尔曼最优方程画等号以为Q-learning本质上是在解线性方程记住 max 是非线性算子它改变了方程的性质跳过3.7节近似讨论实战中过度纠结“最优解”现实问题表格常常装不下能求近似最优就已经很实用这里面第4个坑尤其隐蔽。Q-learning更新公式长得很像贝尔曼方程但里面的 max 意味着它其实是在做贝尔曼最优方程的随机近似。如果不清楚这一点后面读第6章的时候很难理解为什么Q-learning能够找到最优策略而不是停留在当前策略的评价。我见过不少学了很久的人依然把这两个东西混为一谈一开口就是“不就是贝尔曼方程嘛”但真让他讲区别又讲不清楚。6.2 读完第三章怎么检验自己是真懂了我给自己和学生各留了三个自检问题。第一个是不看书能不能独立推导出 v_π 的贝尔曼方程能推出来说明理解了期望和递归推不出来说明还在背公式。第二个是能不能解释为什么有限MDP中最优策略一定存在不需要背证明只要能说出“最优价值函数是压缩映射的不动点迭代会收敛”这个松弛但正确的方向就算是理解了结构性原因。第三个是能不能随手写出 v、q、v_、q_四个量之间的关系式四个式子分别是 v_π(s) Σ_a π(a|s) q_π(s,a)v_(s) max_a q_(s,a)q 的贝尔曼方程以及 v 的贝尔曼方程。能写全说明符号体系过关了。如果这三个问题都能答上再加上网格世界实验跑通这一章就算真正拿下了。顺便说后面读第4章动态规划时你会发现策略评估不过就是把我们第5节那个迭代多做几次策略改进不过就是在 q 上取 argmax。一步一个脚印走到那里全新知识忽然都变成了旧知识的组合那种感觉确实很上头。这就是基础章该有的分量。
阅读完成 · 觉得有帮助?
咨询建站