强化学习入门必读:从贝尔曼方程到价值迭代的数学原理与实践
简介:西湖大学赵世钰教授的《强化学习的数学原理》是一本从零开始、带大量例子的纯英文数学专著,面向有线性代数与微积分基础的强化学习初学者、算法工程师和研究者。全书从网格世界引入基本概念,依次讲清状态值、贝尔曼方程、贝尔曼最优方程、值迭代、策略迭代、蒙特卡洛方法、随机近似、时间差分、值函数近似、策略梯度与演员-评论家方法,并在附录中给出序列收敛性分析,能帮助读者把马尔可夫决策过程与现代深度强化学习算法背后的数学逻辑连贯起来。资源包共 1 个 PDF 文件,压缩后约 18.9MB,便于在电脑、平板等设备离线翻阅,章节编号清晰、公式排版完整。已有 845 人学习下载,适合作为理论自学教材、研究生课程配套读物或算法推导时的案头参考。
1. 先搞懂一个概念:强化学习到底在学什么
你有没有想过,一个完全没接触过围棋规则程序的人,是怎么学会下赢世界冠军的?答案不是有人把棋谱规则一条条写死给他,而是让他自己在棋盘上不断试错,赢了就记住,输了就调整,几百万局之后,他自然懂得什么局面该下哪一步。强化学习(Reinforcement Learning,RL)做的就是这件事——它不教智能体“正确答案”,而是让它在环境里反复行动、拿奖励、踩坑、再调整,最终自己摸索出一套好策略。所以很多新手第一次听说它,都会觉得这不像在写程序,更像在养一个孩子。
这份资源是《强化学习的数学原理》的英文原版书稿,它的特别之处在于:不直接把各种算法甩给你背,而是从最朴素的问题出发——状态是什么、奖励怎么算、为什么这个公式长这样——一步步把强化学习的骨架搭给你看。它适合完全没有强化学习背景、但有点概率论和线性代数基础的人,也适合那些“看了很多代码但总觉得是黑匣子”的初学者。换句话说,如果你想知道 Q-learning 为什么能收敛、策略梯度那个梯度到底怎么来的,这本书就是帮你拆开黑匣子的那把螺丝刀。
2. 为什么入门要死磕数学:不搞懂公式,代码就是玄学
2.1 先别急着跑代码:表格法才是理解一切的起点
很多新手学强化学习,上来就装环境、跑 DQN,几十行代码跑通了,但问他一万个 episode 之后网络到底学到了什么,他答不上来。这是典型的“代码会跑、原理不懂”。这本书的第一章到第四章,用的都是表格法(tabular representation),意思是你把每个状态、每个动作的价值都写在一张表格里,算法更新的就是这张表。表格法虽然看起来原始,但它把所有数学逻辑都摊在明面上,没有神经网络的“玄学”干扰。
我用第一次读这本书的经历举例:我当时刚看完第一章的网格世界(grid world),就试着在纸上画了一个 3x3 的格子,手动迭代了一次贝尔曼方程。那个过程很慢,但当我亲眼看着那些数字从乱跳变得稳定,我突然明白了“价值”到底是什么——它不是某个神仙给的分数,而是“从这格出发,未来能拿到的期望回报”。这种顿悟,是直接跑代码永远给不了你的。
2.2 状态、动作、策略、奖励:四个词串起整个框架
强化学习有一套标准术语,这本书用网格世界例子把它们讲得非常具体。状态(state)就是智能体当前所处的位置,在网格世界里就是“我在第几行第几列”;动作(action)就是上下左右四个方向;策略(policy)就是“我在每个状态下选择动作的规则”,可以是确定的(左转就是左转),也可以是随机的(70% 概率往上,30% 概率往左);奖励(reward)则是你走一步之后环境给你的即时反馈,可能是一格 -1 表示还没到终点,也可能到达终点 +10。
这四样东西组合起来,就有了“轨迹”“回报”和“episode”。轨迹就是你从起点到终点走过的状态-动作序列;回报是把每个时刻的奖励按折扣因子 gamma 累加起来的总和;episode 则是“从开局到结束的完整一盘”。你会发现,强化学习的核心问题就一句话:怎么调整策略,让从任意状态出发的期望回报尽量大。
2.3 为什么必须有马尔可夫决策过程(MDP)
前面四个概念合起来,就构成了马尔可夫决策过程(MDP)。新手最容易被这个词吓到,其实它就是一句话:下一步的状态只取决于当前状态和你采取的动作,跟之前怎么走到这一步无关。你下围棋的时候,不需要记得前三手分别下在哪——因为当前的棋面已经包含了所有历史信息;你玩迷宫游戏的时候,也不需要一个“历史记忆模块”,因为当前位置和剩余体力已经足够决定下一步最优动作。
本书用一整个小节讲 MDP,是因为所有经典算法(Q-learning、Sarsa、策略梯度)都是建立在 MDP 这个假设上的。如果环境不满足马尔可夫性,那些漂亮的收敛性证明就都失效了。我第一次读到这里,心里想的是:原来这世界上的大部分问题,只要设计得好,都可以近似看成 MDP。这个认知让我后来看任何强化学习论文都舒服了很多。
3. 最核心的一课:贝尔曼方程为什么是“后悔药计算器”
3.1 状态值是什么:从“我在这格能拿多少”说起
书里第二章用两个激励例子引出状态值。先说直观理解:状态值就是“我现在站在这个格子,按某个策略走下去,未来能拿到的期望总回报”。请注意“期望”这个词,因为从当前状态出发,你每一步会走向哪个格子是有随机性的,所以只能算平均意义上的回报。
书里的做法是用一个 4x4 网格世界反复举例,每个格子的值代表“从这个格子出发、按当前策略走、长期累积回报的数学期望”。我第一次跟着算的时候,发现一个有趣现象:离终点越近的格子,状态值越高;而死角位置的格子,状态值可能是负的,因为它容易让你绕远路。状态值把这种“距离感”量化成了数字,这正是后续所有算法操作的对象。
3.2 贝尔曼方程的核心:当前价值 = 即时奖励 + 未来价值
贝尔曼方程(Bellman equation)是这本书真正的主角。它的思想特别朴素:你现在站在 s,执行策略里的动作 a,拿到即时奖励 r,然后跳到新状态 s'。那么 V(s) 应该等于当前奖励 r 加上下一状态的价值 V(s'),只不过因为未来有折扣,所以要乘一个 gamma。写成公式就是:
V(s) = E[ R + gamma * V(s') ]
这个方程的精妙之处在于,它把一个无限长的时间序列问题,变成了一个“前后两步的关系式”。这就像你用手机导航,不需要算完整条路的每个路口,只需要知道“下一步怎么走,以及从下一个路口到终点还要多久”,就能不断递归地算出全路径。书中用大量网格世界的小例子反复演示这个方程,读的时候不要跳着看,跟着它一笔一笔算两个例子,你就能彻底摆脱“符号恐惧”。
3.3 两种解法:直接算出来,还是慢慢逼近
贝尔曼方程既然是个方程,就可以解。这本书给出了两条路。
第一条路是闭式解(closed-form solution),说白了就是把方程写成矩阵-向量形式,然后用线性代数的方法直接求逆:V = (I - gamma * P) 的逆矩阵乘以奖励向量。这个方法理论上完美,但问题在于当状态空间很大时,矩阵求逆根本算不动。我第一次看到那个逆矩阵符号就明白了:难怪实际算法不用它。
第二条路是迭代解(iterative solution),也就是随便给每个状态一个初始值,比如全是 0,然后不断套用贝尔曼方程去更新。你不需要求逆矩阵,只需要一次次往回代。这个过程每一步的运算量都很小,而且保证收敛。我照着书里那个表格,手动迭代了二十轮,看着状态值从乱跳变成平滑,就知道这条路才是实用算法的祖先。
3.4 从状态值到动作值:为什么要 Q 值
状态值描述的是“这个状态好不好”,但智能体做决策时需要回答的问题是“我现在该执行哪个动作”。于是就有了动作值,也就是 Q 值:在状态 s 下执行动作 a,然后继续按策略走,期望回报是多少。
书里专门有一小节讲这个转换关系,公式是 Q(s,a) = E[ R + gamma * V(s') ],也就是动作值等于“执行这个动作的即时奖励,加上跳过去那个状态的价值”。从状态值到动作值是理解 Q-learning 的必经之路,因为几乎所有实用强化学习算法(DQN、Sarsa、Q-learning)学习的都是 Q 值而不是 V 值。我第一次读到这儿,才明白为什么网上那些代码里到处都是 Q 表格或 Q 网络——因为只有 Q 值才能直接用于动作选择。
4. 第一个迈步:亲手用 Python 跑通网格世界的最小闭环
4.1 环境准备:你要的其实只有 Python 本身
入门强化学习,你需要安装的东西比想象中少得多。这本书的所有早期例子都基于网格世界,而网格世界是一个几行代码就能自己构建的环境,完全不依赖任何第三方库。你只需要 Python 3.8 以上版本,外加一个 numpy,就够了。如果你想画图看收敛过程,再装一个 matplotlib。
我第一次学的时候犯了两个错,都是新手高频翻车点。第一个是装了一堆重型库(gym、pytorch、tensorflow),结果光解决环境依赖就折腾了一个下午,完全没学到东西;第二个是习惯性地去找现成环境,却忘了自己写一个网格世界其实只要几分钟——自己写环境还有一个好处,你可以完全控制状态转移概率和奖励,这对理解算法原理至关重要。
下面是一个最简版的网格世界环境定义,状态就是一个整数,动作是 0(上)、1(下)、2(左)、3(右),终点是状态 3:
import numpy as np # 一个 2x2 的网格,状态编号 0,1,2,3,其中 3 是终点 n_states = 4 n_actions = 4 def step(state, action): """根据当前状态和动作,返回 (下一个状态, 奖励)""" if state == 3: # 终点不再移动,也没有奖励 return state, 0 if action == 0: # 上 next_state = 1 elif action == 1: # 下 next_state = 2 elif action == 2: # 左 next_state = 3 else: # 右 next_state = 0 reward = 1 if next_state == 3 else 0 # 只有到达终点给 1 return next_state, reward这段代码中,step函数就是环境的全部。每个状态都有一个确定性的转移,到达终点时奖励为 1,否则为 0。当我第一次运行这段代码时,我在循环里随机选动作,让它从状态 0 开始乱走,程序每次输出一个 (next_state, reward) 对,跑了几十个 episode 之后我注意到一个现象:虽然动作是随机的,但只要接近终点附近,奖励就更容易出现。这个观察虽然简单,却帮我建立了“策略影响回报”的直觉。
4.2 手写价值迭代:让贝尔曼方程跑起来
现在你已经有一个环境了,接着来实现这本书第四章最重要的算法之一:价值迭代(value iteration)。它做的事情非常简单——不停地让 V(s) 等于“所有动作里,能让即时奖励加未来价值最大的那个”。你不需要手动推导什么,就写一个两层循环,外层迭代很多轮,内层遍历每个状态,不断更新 V 值。
# 初始化所有状态价值为 0 V = np.zeros(n_states) gamma = 0.9 num_iterations = 100 for it in range(num_iterations): V_new = np.zeros(n_states) # 用于保存本轮更新后的价值 for s in range(n_states): # 遍历所有动作,找出能带来最大价值的那个动作 action_values = [] for a in range(n_actions): next_s, r = step(s, a) action_values.append(r + gamma * V[next_s]) V_new[s] = max(action_values) # 价值迭代的核心:取最大值 V = V_new print("最终状态价值:", V)这段代码的输出是四个格子的价值。在我自己的机器上运行,大约十几轮迭代之后,状态 0、1、2 的价值就稳定在某个值附近,而状态 3(终点)永远是 0。代码里最关键的逻辑是max(action_values)这一行——价值迭代不是“按当前策略评估”,而是“假设我现在能选最优动作”,这正是它区别于策略迭代的地方。初学者最容易犯的错是把它写成平均值,或写成V[state]的原地更新,那样迭代过程会扭曲,收敛结果也会出错。记住:必须用V_new暂存本轮结果,全部算完再替换旧 V。
4.3 一个新手的首次代码实验:策略到底怎么变好
你不想只在终端里看到一个数字数组已经收敛,更想知道“策略”本身是怎么被改善的。价值迭代还没直接输出策略,但你早就有了答案:在每个状态下,选择argmax那个动作就对了。把上面代码的max换成np.argmax,你就能得到每个状态下的最优动作。
我建议你做这样一个实验:把上面代码里的step函数改一改,把终点的奖励从 1 改成 5 和 0.5,分别跑一次,观察最终策略和状态值的变化。你会很快发现:奖励越大,智能体越愿意绕远路去寻找;奖励太小,它可能干脆停在原地不动。这个实验是理解“奖励设计决定智能体行为”的最佳入门课,也是你踩上强化学习土地的第一步。跑通这些,你再看后面的蒙特卡洛和时间差分方法,就不会再觉得它们是天书了。
5. 从这本书走向算法实践:接下来该学什么
5.1 你已经拥有的东西:与“只会调包”的人彻底拉开差距
读完前四章、亲手跑过一遍价值迭代,你已经不再是纯小白了。你知道了强化学习的核心问题是最优策略,知道了“价值”背后有严格的数学定义,知道了腾讯视频里的推荐系统、自动驾驶的决策模块,本质上都是在做同一件事:最大化期望回报。这种认知层面的底层视角,是只会在框架里调参的同学短期内拿不到的。
接下来我建议的学习顺序是这样的:先认真读完第五章蒙特卡洛方法和第七章时间差分方法,这两个章节讲的是“没有环境模型时怎么学习”。你现在跑的例子用的是已知转移概率,但真实场景里根本不知道“执行动作后会跳到哪个状态”——蒙特卡洛靠一整条轨迹的回报来估计,Q-learning 靠每一步的即时奖励更新 Q 值。理解这两个章节之后,你可以动手实现一个最简 Q-learning 来玩客厅里的寻宝迷宫,那个过程让人上瘾。
5.2 什么时候开始碰深度学习:别急着上 DQN
我见过太多新手读完第四章就急着跳到第八章读深度 Q 网络,结果被经验回放、目标网络、mini-batch 这些概念砸得头晕。正确姿势是:先确保自己能徒手写出表格版 Q-learning,再读第八章的值函数近似。第八章的核心巧思是“不用表格存价值了,改用参数化的函数来表示 V(s)”,这个函数就可以是神经网络。理解了这一步,深度强化学习与经典强化学习之间的桥就彻底通了。
如果你已经有神经网络基础,可以直接顺着第八章和第九章继续读;如果没有,建议先花一周补一下基础的链式求导和全连接网络原理,否则策略梯度那部分的推导会让你卡壳。我自己的血泪教训是:当初急着看策略梯度,跳过随机近似那章,结果看不懂“期望梯度”为什么能变成采样平均,后来乖乖回过头补完第六章,才豁然开朗——这本书的知识链其实环环相扣,跳过去迟早要回来补课。
5.3 一个真实可用的学习路径:把全书当作一张地图
从零基础到能动手实现 DQN,我建议你按这个路径走:第一阶段(第 1 章到第 4 章),核心目标是理解 MDP、贝尔曼方程、价值迭代和策略迭代,配合本文的网格世界代码反复实验,直到你能不看笔记写出价值迭代;第二阶段(第 5 章到第 7 章),核心目标是无模型算法,自己实现 Q-learning 和小型 Sarsa,跑通一个 4x4 迷宫;第三阶段(第 8 章到第 10 章),核心目标是函数近似,把 Q 表格换成一个小型神经网络,然后尝试在 OpenAI 的 CliffWalking 这类简单环境上跑 DQN 和 REINFORCE。
每读完一章,都试着用纸笔推导一遍关键公式,再对照书后的 Q&A 检查自己的理解。不要怕慢——我当年用这本书入门,前三章花了整整两周,但后来再读其他强化学习资料,速度提升了不止一倍。从那以后,我每次新学一个算法,都会强制自己先回到“状态值、奖励、策略”这三个词,用这本书的小图景把直觉画出来,再去看代码。希望帮到你,也祝你在强化学习的门口迈出稳稳的第一步。
本文还有配套的精品资源,点击获取