从搭建数理地基的角度,把强化学习里最容易劝退人的数学符号拆开揉碎。这篇笔记只聚焦 RL 最核心的基础概念:MDP 框架、回报与折扣因子、两条价值函数、贝尔曼方程、最优策略,以及新手很容易混淆的几组概念。适合已经看过一点 RL 科普、但被公式劝退的读者,也适合准备刷书刷课之前先搭一遍"数学坐标系"的朋友。我自己当年啃这些内容时踩了不少坑,这篇就直接把弯路和正路一起写清楚。
1. 为什么学 RL 必须先啃数学语言
1.1 从一段血泪经历说起
最早接触强化学习时,我看的是各种"十分钟带你入门 RL"的科普。看完感觉热血沸腾,智能体打游戏、机器人走路、自动驾驶决策,好像啥都能干。可一旦自己动手去读论文、复现代码,扑面而来的全是数学符号——s、a、r、π、γ、V(s)、Q(s,a),还有一堆带下标、带上标、带期望符号的公式,瞬间懵掉。
后来我才想明白一个道理:强化学习本身不是一个"靠直觉就能驾驭"的领域。它跟监督学习最大的区别在于——监督学习的样本是现成的(x, y)对,模型只管拟合;强化学习的样本是智能体跟环境交互产生的轨迹,模型要从这些轨迹里学出"该怎么做决策"。这个过程如果不借助数学语言去描述,根本没法精确讨论。所以想真正进入 RL 的世界,数学符号不是拦路虎,反而是地图和坐标系。
1.2 数学符号其实是"压缩信息"的工具
很多人一看到公式就头大,但其实公式的本质是"把一堆啰嗦话压缩成符号"。比如你想表达"智能体看到一个状态,然后做一个动作,环境给它一个奖励,然后跳到下一个状态",用文字写十行,用符号写就是一行:
S_t → A_t → R_{t+1} → S_{t+1}再比如"一个状态有多好",口语化地说"这个状态能带来的未来收益期望有多大",数学上直接用V(s)一个符号就代替了。符号不是故意劝退谁,而是为了让推理变得简洁可操作。
这也是这篇学习笔记的核心思路:不是背公式,而是把每个符号翻译回"人话",看它到底在描述什么问题。一旦你建立起这种翻译能力,后面看任何算法论文都会轻松很多。
1.3 这篇笔记覆盖的范围是什么
本笔记围绕强化学习最底层的数学原理展开,重点包括:
- 马尔可夫决策过程(MDP)——RL 的问题建模框架
- 回报与折扣因子——目标函数的定义依据
- 状态价值函数与动作价值函数——衡量策略好坏的两把尺子
- 贝尔曼方程——联系"当前价值"与"未来价值"的桥梁
- 贝尔曼最优方程与策略迭代、价值迭代——从方程到算法
这些内容属于所有强化学习算法(无论是 DQN、PPO、SAC 还是离线强化学习、多智能体强化学习)的共同底座。就算你最终想搞的是机械臂实战、图强化学习或者 MILP 与强化学习的结合,也逃不开这套基础。
2. 把强化学习"翻译"成数学:MDP 框架
2.1 五元组 (S, A, P, R, γ) 逐项拆解
强化学习的问题,几乎所有教材都会先给你一个马尔可夫决策过程(Markov Decision Process, MDP)。MDP 用五个要素描述一个决策问题:
| 符号 | 名称 | 含义 | 生活化类比 |
|---|---|---|---|
| S | 状态集合 | 智能体可能处于的所有局面 | 你在地图上的所有位置 |
| A | 动作集合 | 智能体在每个状态下可选的行动 | 你每一步能走的上下左右 |
| P | 状态转移概率 | P(s' | s,a),在状态 s 做动作 a 后跳到 s' 的概率 |
| R | 奖励函数 | R(s,a,s') 或 R(s,a),反馈信号 | 每走一步得到的分数 |
| γ | 折扣因子 | 0~1 之间的数,决定未来收益的权重 | 对未来收益"打折扣"的偏好程度 |
其中最难理解的是 P 和 R。P 描述的是"环境会怎么回应你的动作",R 描述的是"你的动作带来的即时反馈"。两者合在一起,就构成了智能体跟环境交互的完整规则。
2.2 策略 π 到底是什么
MDP 是环境模型,但真正的"智能体"部分是一个叫策略(Policy)的东西。策略用π(a|s)表示,意思是"在状态 s 下选择动作 a 的概率"。
如果某状态下你总是选同一个动作,那是确定性策略:
π(s) = a如果动作是随机的,比如 80% 概率向左、20% 概率向右,那是随机策略:
π(a|s) = 0.8 → 选 a π(b|s) = 0.2 → 选 b为什么要区分这两种?因为随机策略在很多场景下是必要的。比如博弈类任务,如果你总是走同一步棋,对手很容易预测并克制你。又比如探索,学习前期需要随机试错,这本身就是随机策略的一部分。所以策略不是一个"死板的行为表",而是"状态到动作概率的映射函数"。
2.3 一个完整例子:出租司机调度问题
为了让你真正把符号跟实际场景对应上,这里用一个经典的出租司机调度问题串一遍。
假设你是出租车司机,状态就是"位置 + 时间 + 是否载客",动作就是"空驶去某处 / 原地等待 / 载客去某地"。你做出一个决策后,会得到一笔收入(奖励 R),同时你所在的位置发生变化(转移到新的状态 S')。由于路上堵车、乘客取消等原因,你从状态 s 做动作 a 之后具体跳到哪个状态 S',是有概率的——这就是 P。
你的目标不是赚"这一单的钱",而是让"长期累计收入"最大化。这个长期累计收入需要考虑时间价值——今天赚 100 块比十年后赚 100 块更值钱,所以需要用折扣因子 γ 来折算。
到这里你就发现:出租司机调度问题,完全可以用五元组(S, A, P, R, γ)描述清楚。这也是为什么 MDP 贯穿所有 RL 问题的原因——它足够通用,又能精确建模。
提示:在具体代码实现里,S、A 通常是数组或矩阵,P 通常是一个三维张量
P[s][a][s'],R 通常是一个数组。搞懂数学符号之后,你去看 OpenAI Gym、自定义环境的接口代码时,会发现结构完全对得上。
3. 回报、折扣因子和两条价值函数
3.1 回报 G_t 是怎么算的
强化学习的目标不是最大化"一步的奖励",而是最大化"未来的累计折扣奖励"。这个量叫回报(Return),标准定义是:
G_t = R_{t+1} + γR_{t+2} + γ^2R_{t+3} + ... = Σ_{k=0}^∞ γ^k R_{t+k+1}举个例子:假设某条轨迹上后续奖励依次是 1、1、1,γ=0.9,那么回报是:
G = 1 + 0.9×1 + 0.81×1 + ... = 1/(1-0.9) = 10如果 γ=0,回报就等于当前奖励,表示你完全不关心未来;如果 γ=1,未来收益全部等价于当前收益,适合有限的固定步数任务。γ 的取值直接决定了智能体是"目光短浅"还是"高瞻远瞩",这一点后面会专门展开。
3.2 为什么需要折扣因子 γ
折扣因子 γ 看着只是一个乘数,实际上承担了四个非常重要的功能:
第一个是数学上的收敛性。无限步任务里,如果不打折,奖励序列可能无限累加不会收敛,导致回报没法定义。加上 γ 之后,只要奖励有界,回报就一定有界。
第二个是解决时间不一致性问题。今天的 100 块比明天的 100 块更值得拥有,这个直觉在金融、经济、日常生活里都成立。把这种偏好用 γ 表示,模型就更贴近真实决策场景。
第三个是处理模型不确定性。未来越远,我们对环境变化的把握越低,给远期奖励打折扣,本质上是给"不确定性"留出空间。
第四个是调参手感。实践中,γ 是最重要的超参数之一。太大会让智能体过于重视远期目标,导致训练难以稳定;太小会让智能体只看眼前,学不到长远的策略。工程上常见的取值是 0.9~0.99,具体多少需要根据任务时长来试。
3.3 状态价值函数 V_π(s) 和动作价值函数 Q_π(s,a) 的区别
定义了回报,就可以定义"价值"了。状态价值函数是:
V_π(s) = E_π[G_t | S_t=s]翻译成人话:在策略 π 下,从状态 s 出发,后续所有可能轨迹的回报期望。这个值越大,说明这个状态越"有前途"。
动作价值函数是:
Q_π(s,a) = E_π[G_t | S_t=s, A_t=a]区别在哪?V 函数评估的是"状态的好坏",不管具体做哪个动作;Q 函数评估的是"在某个状态下做某个动作的好坏"。用找工作来类比:V 函数相当于问"在这家公司工作整体前景如何",Q 函数相当于问"在这家公司选择做销售岗的前景如何"。
二者的关系是:V 是 Q 在策略 π 下的加权平均。
V_π(s) = Σ_a π(a|s) Q_π(s,a)意思是:一个状态的价值,等于该状态下所有可用动作的价值,按策略选动作的概率做加权平均。这个关系在策略评估里非常重要。
3.4 价值函数之间的互相转换
除了上面的 V 和 Q 关系,还有另一个常见转换:从 Q 函数恢复出当前最优动作。给定 Q 函数,最优动作就是让 Q 值最大的那个动作:
a* = argmax_a Q(s,a)这就是贪心策略。在策略改进环节,我们正是利用这个公式把旧策略升级为新策略。
理解 V 和 Q 的区别还有一层实用价值:写代码时,很多算法天然适合用 Q 函数表示(如 Q-learning、DQN),因为它们的训练信号直接来自"状态-动作对"。而基于策略梯度的算法则更多依赖 V 函数作为基线来降低方差。如果你在两种表示之间切换时容易混乱,建议在草稿纸上画一张"V 和 Q 的关系图",多转换几次就会形成条件反射。
4. 贝尔曼方程:RL 的"灵魂公式"
4.1 从价值定义推出贝尔曼方程
贝尔曼方程是整个强化学习的核心,没有之一。它的思想特别朴素:当前状态的价值,等于"即时奖励 + 下一状态的折扣价值"。
从定义出发推导很简单。我们把 G_t 拆成两部分:
G_t = R_{t+1} + γG_{t+1}两边同时取条件期望(在状态 s 下,遵循策略 π):
V_π(s) = E_π[R_{t+1} + γV_π(S_{t+1}) | S_t=s]展开后就是贝尔曼方程的常见写法:
V_π(s) = Σ_a π(a|s) Σ_{s'} P(s'|s,a) [R(s,a,s') + γV_π(s')]看着复杂,其实逻辑只有三步:先按策略概率选动作,再按环境转移概率看可能跳到哪里,最后把"即时奖励 + 下一状态价值"加起来算期望。整个方程就像一个"价值递归公式"。
4.2 用"面试博弈"的比喻理解方程
想象你是一名应届生,要决定接哪家公司的 offer。你评估一家公司"值不值得去",不是只看眼前的月薪,而是看:月薪(即时奖励)+ 未来几年在这家公司的发展空间(下一状态价值)。
你可能会说,那这个评估是不是就卡住了?我要知道未来的发展空间,就得先知道未来的状态,但未来的状态我又怎么知道?这就是贝尔曼方程的精妙之处——它不要求你真的去"预知未来",只要求"未来状态的价值"通过同样的规则递推定义。只要你最终能解出这个方程,所有状态的价值就完全确定了。
类比过来:一家公司的价值 = 当下的钱 + 折扣后的"另一家公司的价值",如此递推,最后你其实是把整条职业路径的价值都考虑进去了。
4.3 贝尔曼方程的两种写法及含义
Q 函数也有自己的贝尔曼方程:
Q_π(s,a) = Σ_{s'} P(s'|s,a) [R(s,a,s') + γ Σ_{a'} π(a'|s') Q_π(s',a')]对比两个方程会发现:V 方程里,下一个状态后面跟的是V(s');Q 方程里,下一个状态后面跟的是"下一个状态下所有动作 Q 值的加权平均"。原因就在于 V 和 Q 的定义差别——V 已经把动作选择"平均"掉了,而 Q 进入下一步时还需要再选一次动作。
实际用的时候,记住一条判断准则:如果你的算法更新信号是基于"状态"的,用 V 方程;如果更新信号基于"状态-动作对",用 Q 方程。DQN、Double DQN 这类算法的公式推导,本质上都是从这个 Q 贝尔曼方程演化出来的。
注意:贝尔曼方程成立的前提是"马尔可夫性质"——当前状态已经包含了决策所需的全部历史信息。如果状态设计丢掉了关键信息(比如走迷宫时不告诉机器人当前位置),贝尔曼方程就会失真,算法效果也会崩。这也是很多工程失败案例的根源:不是算法不行,是状态表示没做好。
5. 最优策略与贝尔曼最优方程
5.1 最优价值函数 V* 和 Q*
有了价值函数,我们就能定义"最优"。最优状态价值函数是:
V*(s) = max_π V_π(s)意思是:在所有可能的策略里,能让状态 s 价值最大的那个策略对应的价值。注意这里的 max 是发生在"策略空间"上的,也就是我们想让"状态价值"最大,要在所有策略里挑最优的。
同理,最优动作价值函数是:
Q*(s,a) = max_π Q_π(s,a)对 Q* 来说,有一个非常漂亮的结论:只要知道了 Q*,最优策略可以直接算出来——每个状态选 Q* 值最大的动作即可。也就是说,最优策略不一定要显式建模,只要我们知道最优 Q 值,策略就是现成的。
5.2 贝尔曼最优方程
对 V 和 Q 取最大,就得到贝尔曼最优方程:
V*(s) = max_a Σ_{s'} P(s'|s,a) [R(s,a,s') + γV*(s')]Q*(s,a) = Σ_{s'} P(s'|s,a) [R(s,a,s') + γ max_{a'} Q*(s',a')]你可能会想:这不就是贝尔曼方程里,把策略概率那一步换成了 max 吗?没错,这就是"贝尔曼最优方程"和"贝尔曼方程"的差别——在决策点上,我们不再按策略概率去平均各种动作,而是只取价值最大的那个动作。
这个"取 max"看似简单,实际上将问题从"给定策略求价值"变成了"直接求最优策略"。它不再需要显式指定策略 π,而是把策略隐藏在 max 操作里,因此更适合直接用来做价值迭代算法。
5.3 从方程到算法:策略迭代与价值迭代
方程是死的,算法是活的。基于贝尔曼方程,衍生出两个最基础的规划算法:策略迭代和价值迭代。
策略迭代分两步循环:
- 策略评估:给定当前策略 π,不断迭代贝尔曼方程,求出 V_π。
- 策略改进:根据求出来的 V_π,用贪心策略更新 π。
π_new(s) = argmax_a Σ_{s'} P(s'|s,a) [R(s,a,s') + γV_π(s')]价值迭代则是把两步合一,直接迭代贝尔曼最优方程:
V_{k+1}(s) = max_a Σ_{s'} P(s'|s,a) [R(s,a,s') + γV_k(s')]两者的区别,我用一个生活例子说明:策略迭代像"先想清楚再行动"——先完整评估当前方案的价值,再改进方案;价值迭代像"边想边改"——每轮直接取最优价值来更新。
从收敛速度看,策略迭代通常需要较少的迭代轮数,但每一轮计算量更大;价值迭代相反,轮数多,但每轮计算简单。实际工程里,如果状态空间小且模型已知,策略迭代更常用;如果状态空间大,一般会结合函数近似去走价值迭代的路线。
6. 新人最容易踩的 5 个概念坑
6.1 V 函数和 Q 函数傻傻分不清
这是我在学习时踩过最深的坑。刚开始写 DQN 代码,我看到网络输出是一组Q(s,a)值,又看到各种公式里出现V(s),一开始以为它们只是写法的区别。直到实现策略梯度算法时才发现,V 函数被用作"基线"来降低方差,Q 函数被用作"动作的评价器",两者的作用完全不同。
避坑建议:每次看到 V 函数,心里默念"这是状态的平均价值";看到 Q 函数,默念"这是具体动作的价值"。做算法对比时,特别注意公式里更新用的是 V 还是 Q,这决定了你的 target 怎么算。
6.2 折扣因子越大越好?错
我刚开始调参时,总觉得 γ 越接近 1 越"高明",因为这样智能体会考虑长远利益。真到训练环境里才发现,γ 太大时价值和梯度都容易震荡,尤其是在奖励稀疏的长任务里,后期估计误差会被不断放大。γ 太小又会让智能体短视,学出来的策略缺乏规划能力。
避坑建议:先按任务平均长度粗估一个值。如果任务平均时长是 T 步,可以取γ = 1 - 1/T左右,再小范围微调。比如一个任务平均需要 20 步完成,那么 γ 在 0.95 附近比较合理;如果是 100 步的长期任务,γ 可以放到 0.99 上下。
6.3 策略迭代和价值迭代分不清
另一个常见混乱是把两个迭代算法看成"一个算法的两种版本",其实它们的迭代对象完全不同。策略迭代的核心是在"策略空间"里搜索——先完整评估策略,再改进策略;价值迭代的核心是在"价值空间"里搜索——用 max 直接更新每个状态的价值,直到收敛后再从 V 提取策略。
避坑建议:看伪代码时,重点看循环体里有没有"策略评估"这一步。有策略评估的是策略迭代;没有、直接用贝尔曼最优方程更新的是价值迭代。
6.4 把"奖励"当成了"回报"
新手很容易习惯性地把reward和return混为一谈。奖励是环境的即时反馈信号,回报是"折扣累积奖励的总和"。一个状态的价值不是看它当下奖励,而是看它从当前开始能带来的累积回报期望。
避坑建议:调试代码时,如果发现 agent 在一个奖励很低的初始状态下依然"表现得很有远见",这说明价值函数可能已经把未来回报算进去了。这是正常现象。反过来,如果某个状态即时奖励很高但价值很低,往往是因为高奖励之后会进入很差的局面——比如游戏里吃到一个道具,结果冲进陷阱。
6.5 忽略了模型无关 vs 模型相关的区别
模型相关(Model-based)方法假设已知 P 和 R,直接通过贝尔曼方程做规划;模型无关(Model-free)方法不知道环境的 P 和 R,只能通过采样轨迹估计价值并改进策略。两者的区别直接决定了你能不能用上面的贝尔曼方程直接迭代。
避坑建议:如果你的问题有精确仿真器或环境模型,可以优先考虑模型相关方法;如果环境是黑盒(例如真实机械臂、真实交易系统),就得走模型无关路线,这时候要特别重视探索策略和回放缓冲区。很多人一开始学 DQN 时默认自己有环境模型,直接把贝尔曼最优方程套上去算,结果发现环境转移概率根本不可得,这才意识到问题不对。
7. 一点学习顺序的实操建议
如果你正准备系统学习强化学习的数学原理,我个人的建议是:不要一上来就追求全部数学证明,先把 MDP、回报、价值函数、贝尔曼方程这四个核心概念练出"翻译能力"。
具体操作是:拿任何一篇 RL 算法论文,看到公式第一件事不是推推导,而是先把每个符号翻译成人话。比如看到V(s) ← max_a[ R(s,a) + γV(s') ],嘴里念出来"这个状态的价值,等于我选最好的动作拿到的奖励,再加上未来状态的折扣价值"。坚持一段时间,你会发现所有算法的内核都是同一套思维。
另外,强烈建议自己手动写一遍小规模网格世界问题的价值迭代,用代码验证公式。不需要深度学习框架,纯 Python 和 numpy 就够。把 V 表跑出来跟手算结果对比,这一关过了,后面再看任何强化学习算法都不会再觉得"数学劝退"。
RL 这套数学框架之所以重要,是因为它把所有决策问题统一成了一门语言。我见过不少朋友上来就调库跑 PPO、SAC,结果运行报错或效果不好时完全无从下手,根本原因就是没搞懂模型输入输出的含义。反过来,把基础概念吃透之后,调试强化学习代码会变成一个非常理性的过程:你知道每一步在优化什么,更新信号从哪里来,为什么某个超参数会导致发散。这种掌控感,才是学习数学原理能带给你的最大回报。