从搭建数理地基的角度把强化学习里最容易劝退人的数学符号拆开揉碎。这篇笔记只聚焦 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_{t1} → S_{t1}再比如一个状态有多好口语化地说这个状态能带来的未来收益期望有多大数学上直接用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(ss,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_{t1} γR_{t2} γ^2R_{t3} ... Σ_{k0}^∞ γ^k R_{tk1}举个例子假设某条轨迹上后续奖励依次是 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_ts]翻译成人话在策略 π 下从状态 s 出发后续所有可能轨迹的回报期望。这个值越大说明这个状态越有前途。动作价值函数是Q_π(s,a) E_π[G_t | S_ts, A_ta]区别在哪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_{t1} γG_{t1}两边同时取条件期望在状态 s 下遵循策略 πV_π(s) E_π[R_{t1} γV_π(S_{t1}) | S_ts]展开后就是贝尔曼方程的常见写法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_{k1}(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结果运行报错或效果不好时完全无从下手根本原因就是没搞懂模型输入输出的含义。反过来把基础概念吃透之后调试强化学习代码会变成一个非常理性的过程你知道每一步在优化什么更新信号从哪里来为什么某个超参数会导致发散。这种掌控感才是学习数学原理能带给你的最大回报。