从贝尔曼方程到DQN:彻底理清V与Q的区别与推导
发布时间:2026/9/30 4:18:37来源:尧图网络
刚啃强化学习那阵子我在同一个地方卡了将近两周Sutton Barto 第三章的贝尔曼方程每一行都能看懂合上书却说不清楚 V 和 Q 为什么要同时存在。更具体的翻车经历是写表格型 Q-learning 的时候我把 V 表的更新写成了只有期望没有 maxQ 表里又混进了状态分布跑 CartPole 一百多轮 reward 一直在一百上下晃怎么调学习率都没用最后盯着更新式子看了半小时才发现是自己把对谁求期望这件事搞混了。这两个函数从来不是同一件事的两种写法它们回答的是两个边界完全不同的问题。状态价值函数 V^π(s) 问的是我已经站在状态 s 了接下来老老实实按策略 π 走平均能拿到多少回报动作价值函数 Q^π(s,a) 问的是我在状态 s 先强行做动作 a之后才交还给 π平均能拿到多少回报。全部差别就藏在先强行做这四个字里。把这点吃透后面 V 与 Q 的互相表达、贝尔曼最优方程里那个 max 从哪冒出来、DQN 的 TD 目标为什么长成那样全都是它的自然延伸不需要额外记忆任何东西。下面这篇内容适合两类人看一类是正在啃理论、想把公式链条从头到尾自己推一遍的另一类是已经在跑 DQN、PPO、SAC 这类算法但被价值函数的正负号、形状、嵌套期望搞糊涂的。我会从回报的定义出发把 V 与 Q 的四组恒等式、贝尔曼最优方程、贪心算子的压缩性按顺序推下来中间插一个能拿计算器复核的三状态算例最后把推导结果和几个主流算法的实现细节对齐。所有推导我都会写明每一步为什么这么拆而不是直接甩结论。1. 折扣回报的期望V 与 Q 究竟在平均什么1.1 从回报 G_t 的定义说起一切得从回报return开始。在标准马尔可夫决策过程里t 时刻之后拿到的奖励序列是 R_{t1}, R_{t2}, R_{t3}, ...折扣回报定义为$$G_t R_{t1} \gamma R_{t2} \gamma^2 R_{t3} \cdots \sum_{k0}^{\infty} \gamma^k R_{tk1}$$这个 γ 不是随便加的装饰。它有三层实际作用一是让无穷级数在奖励有界时收敛二是数学上把未来的不确定折算成当下的等价量三是工程上给了我们一个可调的超参控制智能体的近视程度。γ 取 0.99 时大约 70 步之后的奖励权重衰减到 0.5200 步之后基本可以忽略γ 取 0.9 时7 步就衰减一半。这个数字你在调参的时候是要心里有数的很多训练半天学不会的问题根源就是 γ 选得和任务的真实时间尺度不匹配。关键点在于G_t 是一个随机变量。哪怕策略确定、环境确定只要奖励里有噪声G_t 就有方差。价值函数的全部意义就是把这种随机性压缩成一个标量。1.2 随机性到底来自哪三个地方很多人一上来就卡在期望是对谁求这个问题上。把来源拆清楚就顺了。在给定策略 π 时从状态 s 出发的轨迹随机性来自三处动作的随机性π(a|s) 可能是随机的比如 ε-greedy、softmax 或者高斯策略。状态转移的随机性同一个 (s,a) 可能跳到不同 s服从 p(s|s,a)。奖励的随机性奖励可能服从 r(s,a,s) 的某个分布也可能是确定值。V^π(s) 的完整写法就是把这三层随机性全部期望掉$$V^{\pi}(s) \mathbb{E}_{\pi}\left[G_t \mid S_t s\right]$$那个下标 π 是个简写它同时包含了按 π 选动作和按 p 跳状态两重含义。我见过不少实现错误本质就是把 π 理解成了只有动作分布。你只要记住这句话就不会错价值函数里的期望是对策略给出的动作分布和环境给出的转移分布同时求的。1.3 只保留一个函数行不行理论上只保留 Q 就够了因为 V 是 Q 在策略分布下的加权平均。但工程上两个都不能少理由非常实际。V 是状态空间的函数维度只有 |S|Q 是状态-动作对上的函数维度是 |S|×|A|。在动作空间大的任务里比如连续控制里的机械臂关节力矩直接学 Q 函数参数量会爆炸而 V 网络的输出维度永远是 1训练稳定得多。反过来Q 的优势在于它自带选动作的能力——只要比较同一个状态下不同 a 的 Q 值就能排序不需要环境模型而要用 V 选动作你必须知道 p(s|s,a)也就是必须有一个前向模型。这个分工在后面会反复出现用 Q 做决策用 V 做基线。策略梯度里减掉的那个 baseline 是 V(s) 而不是 Q(s,a)就是为了在不改变梯度期望的前提下把方差压下来这个后面第 7 节会细说。2. 贝尔曼方程把无限求和拆成递归的两步2.1 V 的第一行推导把 G_t 掰开推导贝尔曼方程的核心只有一个动作把 G_t 拆成第一项加余下项。$$G_t R_{t1} \gamma\left(R_{t2} \gamma R_{t3} \cdots\right) R_{t1} \gamma G_{t1}$$这一步是纯代数没有任何假设。把它代回 V 的定义$$V^{\pi}(s) \mathbb{E}{\pi}\left[R{t1} \gamma G_{t1} \mid S_t s\right]$$期望的线性性让我们可以把它拆成两项$$V^{\pi}(s) \mathbb{E}{\pi}\left[R{t1} \mid S_t s\right] \gamma, \mathbb{E}{\pi}\left[G{t1} \mid S_t s\right]$$到这里一切正常。真正需要动脑的是第二项——G_{t1} 是在 t1 时刻之后的回报它依赖的随机性包括 S_{t1} 的取值和之后的所有随机性怎么把它变回一个 V 函数的形式2.2 塔式期望这一步不清不楚后面全错第二项的处理用的是全期望公式也叫塔式性质。直觉上就是把从 s 出发这件事拆成两段先看第一步跳到哪再从那个地方接着算。$$\mathbb{E}{\pi}\left[G{t1} \mid S_t s\right] \sum_{a} \pi(a|s) \sum_{s} p(s|s,a), \mathbb{E}{\pi}\left[G{t1} \mid S_{t1} s\right]$$注意最后那个期望虽然在数值上完全等于 V^π(s)但它成立的前提是马尔可夫性——未来只依赖当前状态不依赖更早的历史。如果环境不满足马尔可夫性比如观测是部分可观测的、或者状态表示里丢了关键信息这一步就不合法贝尔曼方程也就不再成立。这是很多理论上明明该收敛实际上就是不收敛问题的隐藏原因。第一项同样要展开$$\mathbb{E}{\pi}\left[R{t1} \mid S_t s\right] \sum_{a}\pi(a|s)\sum_{s}p(s|s,a),r(s,a,s)$$这里的 r(s,a,s) 是定义在转移上的期望即时奖励。如果你把奖励写成 r(s,a)那说明奖励只依赖状态和动作不少教材为了简化会这么写此时求和里的 r 就能提到 s 的求和外面。2.3 合起来就是 V 的贝尔曼方程把两项拼回去得到最常写的形式$$V^{\pi}(s) \sum_{a}\pi(a|s)\sum_{s}p(s|s,a)\Big[r(s,a,s) \gamma V^{\pi}(s)\Big]$$这个式子是整个强化学习的骨架。我建议你把它拆成三个层来记最外层是对动作求平均策略层中间层是对下一状态求平均环境层括号里是即时奖励 打折后的未来价值而那个未来价值 V^π(s) 恰好就是等号左边的同一个函数在不同的点上取值。这种自己定义自己的结构就是它叫方程而不是公式的原因它给出的是自洽条件。一个实操提醒在写代码时这个双层求和几乎不会真的用双重循环去算。表格型问题里它是矩阵求逆或者迭代连续问题里它是采样。但无论怎么实现这两个求和的顺序和嵌套关系不能变π 加权的动作一定在外面p 加权的状态一定在里面。顺序写反了在某些特殊环境里看不出问题等你换上随机策略和环境就立刻翻车。3. V 与 Q 的四组恒等式及其推导链3.1 用 Q 表示 V对动作分布求加权Q^π(s,a) 的定义是把第一步动作固定住$$Q^{\pi}(s,a) \mathbb{E}{\pi}\left[G_t \mid S_t s, A_t a\right] \sum{s}p(s|s,a)\Big[r(s,a,s) \gamma V^{\pi}(s)\Big]$$注意这个式子里已经没有对动作求期望了因为 a 被条件固定了。剩下的是环境层的求和加上未来价值。有了它V 和 Q 的第一个恒等式就显而易见了V 就是 Q 在策略 π 下的加权平均。$$V^{\pi}(s) \sum_{a}\pi(a|s),Q^{\pi}(s,a)$$这条式子在工程里的直接用途是如果你有 Q 网络想知道当前状态的价值把动作分布加权求和就行——这正是 actor-critic 里 critic 评估策略价值的做法也是 soft value iteration 里 V log-sum-exp(Q) 那个式子的来源策略换成玻尔兹曼分布。3.2 用 V 表示 Q一步转移之后的期望反过来Q 也可以用 V 表示就是上面那条定义式本身$$Q^{\pi}(s,a) r(s,a) \gamma\sum_{s}p(s|s,a)V^{\pi}(s)$$这里我顺手把 r 简化成只依赖 (s,a) 的写法方便阅读。这条式子的意义在于它建立了一个时间上的桥Q 是关于现在做决定的V 是关于未来被交给策略之后的。这组关系有个很实用的推论。把 3.1 和 3.2 代进去能得到 V 的一个前向一步形式$$V^{\pi}(s) \sum_a \pi(a|s)\left[r(s,a) \gamma \sum_{s} p(s|s,a) V^{\pi}(s)\right]$$和第 2 节推出来的完全一样验证了链条自洽。推导时反复用这两个方向互相代换可以当成检查错误的工具——如果你推出来的式子和这条路对不上八成中间某一步的期望下标漏了。3.3 四个恒等式汇总与记忆锚点把四条关系整理出来方便对照编号表达式直观含义典型用途恒等式 1$V^{\pi}(s)\sum_a \pi(a|s)Q^{\pi}(s,a)$V 是 Q 的策略加权平均actor-critic 中评估策略恒等式 2$Q^{\pi}(s,a)r(s,a)\gamma\sum_{s}p(s|s,a)V^{\pi}(s)$Q 等于即时奖励加打折的后续状态价值模型已知时做一步前瞻恒等式 3$V^{\pi}(s)\sum_a\pi(a|s)\big[r\gamma\sum_{s}pV^{\pi}(s)\big]$V 的贝尔曼方程策略评估的迭代式恒等式 4$Q^{\pi}(s,a)\sum_{s}p\big[r\gamma\sum_{a}\pi(a|s)Q^{\pi}(s,a)\big]$Q 的贝尔曼方程表格型 Q 迭代记忆锚点我总结成一句话V 看状态做加权Q 看动作做加权两者的桥是即时奖励加折扣未来。这四条式子里唯一带环境的只有转移概率 p剩下全是代数变形。等你把 p 也消掉用采样代替就得到了无模型的 TD 更新。3.4 一个容易忽视的细节状态分布的问题上面四条恒等式描述的是给定起点 s的条件期望所有工作都在单个状态展开。但如果你想知道策略 π 在整个任务上的表现有多好需要的是另一个量$$J(\pi) \mathbb{E}{s_0 \sim \mu_0}\left[V^{\pi}(s_0)\right] \quad \text{或者} \quad J(\pi) \mathbb{E}{s \sim d^{\pi}}\left[V^{\pi}(s)\right]$$其中 d^π 是策略 π 下的折扣状态访问分布。这两个写法在很多文献里被当作等价目标来优化但它们在数学上并不是一回事——前者的初始状态分布是环境给定的后者的状态分布随策略变化求导时会产生额外的项。实际后果是如果你的推导从 J(π) 出发求梯度最后得到一个对状态求平均的式子一定要检查这个平均用的是 μ_0 还是 d^π。策略梯度定理里那个带 d^π 的形式和某些实现里用当前 batch 状态平均的做法差别就藏在这里。做理论验证的时候这是高频出错点我后面第 6 节还会单独拎出来讲。4. 贝尔曼最优方程max 是怎么冒出来的4.1 V^* 的定义与偏序关系最优价值函数的定义是在所有策略上取上界$$V^{}(s) \max_{\pi} V^{\pi}(s), \qquad Q^{}(s,a) \max_{\pi} Q^{\pi}(s,a)$$这里有个值得说清楚的事实存在一个策略同时对所有状态达到最优也就是那个在所有状态上同时取到各自动最大值的策略。这不是显而易见的事情它的证明依赖于 MDP 的结构有限状态动作下的策略空间里存在确定性的最优策略。实际用的时候你可以直接接受这个结论但知道它不是白来的能帮你在遇到非标准设定比如带约束的 MDP、风险敏感目标时警觉这些情况下存在统一最优策略这个前提可能就没了。4.2 一步展开推出 max 的形式把最优价值函数展开。从状态 s 出发最优策略一定会选那个使即时奖励加打折后续最优价值最大的动作$$V^{}(s) \max_{a} \left[r(s,a) \gamma\sum_{s}p(s|s,a)V^{}(s)\right]$$对比一下第 3.2 节的恒等式 3结构完全一样唯一变化是对动作的求和换成了取最大。这就是那层窗户纸——策略加权变成贪心选择。同理Q 的最优形式是$$Q^{}(s,a) r(s,a) \gamma \sum_{s} p(s|s,a) \max_{a} Q^{}(s,a)$$这两条就是贝尔曼最优方程。它们和贝尔曼期望方程的关系可以概括成期望方程描述给定策略会得到多少最优方程描述我能拿到多少。前者是线性方程求解就是解线性系统后者带 max是非线性方程只能迭代求。4.3 贪心算子与不动点为了看清迭代求解为什么能收敛把贝尔曼最优方程写成一个算子作用的形式$$(TV)(s) \max_{a}\left[r(s,a) \gamma\sum_{s}p(s|s,a)V(s)\right]$$我们要求的就是 V TV 的不动点。这个算子 T 具有两个性质单调性V ≤ U 逐点成立则 TV ≤ TU和 γ-压缩性用无穷范数衡量‖TV - TU‖∞ ≤ γ‖V - U‖∞。压缩性保证了巴拿赫不动点定理的条件成立于是从任意初值出发反复应用 T都会以几何速率收敛到唯一的 V^*收敛率就是 γ。这解释了为什么价值迭代在实践中总是先快后慢误差每轮至少缩小到 γ 倍γ 0.99 时每轮只缩 1%具体任务里前期几乎瞬间到位是因为初值恰好接近后期则要靠着 1% 一点点磨。很多人抱怨训练后期 reward 涨得特别慢一部分原因就是这个不可避免的几何收敛尾巴。顺带说一句max 算子是压缩性成立的关键但也是麻烦的来源max 让 T 非线性所以我们才需要迭代同时也让它对函数逼近带来的估计误差特别敏感这一点在第 6 节会展开。4.4 从 Q^* 到最优策略有了 Q^*最优策略就是一步贪心$$\pi^{}(s) \arg\max_{a} Q^{}(s,a)$$这个式子在整个无模型强化学习里地位极高因为它是不需要环境模型的决策规则——你只需要能评估每个动作的价值就能选出最优动作完全不用知道 p(s|s,a)。DQN 的全部逻辑就建立在这上面用一个网络拟合 Q^*每步取 argmax 执行用 r γ max_{a} Q(s,a) 作为回归目标。不过要注意一个前提条件argmax 得到的是相对排序Q 值的绝对值有偏不影响策略的正确性。这在实践里是好事——意味着你不用担心 Q 值是否收敛到真实值只要排序对了就能拿到好策略。很多实验结果里 Q 值常年高估但策略表现很好原因就在这里。5. 三状态算例把数字代进去复核一遍5.1 环境设定光看公式容易产生虚假的理解感我设计一个手算能算完的三状态环境。状态为 S1、S2、S3其中 S3 是终止状态取 V(S3) 0折扣因子 γ 0.9。在 S1 有两个动作 a 和 b策略 π 以 0.5 的概率随机选。选 a即时奖励 1确定转移到 S2。选 b即时奖励 0确定转移到 S3终止。在 S2 只有一个动作即时奖励 2确定转移到终止状态。5.2 策略评估解线性方程组先把 S2 的值算出来因为它最简单$$V^{\pi}(S_2) 2 0.9 \times V(\text{终止}) 2$$再算 S1用恒等式 3$$V^{\pi}(S_1) 0.5 \times \left(1 0.9 V(S_2)\right) 0.5 \times \left(0 0.9 V(S_3)\right)$$代入 V(S2) 2、V(S3) 0$$V^{\pi}(S_1) 0.5 \times (1 1.8) 0.5 \times 0 1.4$$用迭代法验证收敛过程从 V(S1) V(S2) 0 开始同步更新迭代轮次V(S1)V(S2)说明000初值10.52.0S1 用旧的 V(S2) 0 计算21.42.0S1 用 V(S2) 2 计算已收敛31.42.0不变收敛完成第二轮就到位了因为只有一步深度。这个表很值得亲手算一遍它会让你对同步更新用的是上一轮的旧值这件事有肌肉记忆——如果你用了同一轮里刚更新的值就变成原地更新in-place在有些环境里收敛会快但和理论分析的版本对不上写论文复现时容易出偏差。5.3 动作价值的计算与交叉验证接着算 Q 值用恒等式 2$$Q^{\pi}(S_1, a) 1 0.9 \times V(S_2) 1 1.8 2.8$$$$Q^{\pi}(S_1, b) 0 0.9 \times V(S_3) 0$$然后用恒等式 1 反推 V$$V^{\pi}(S_1) 0.5 \times 2.8 0.5 \times 0 1.4$$和 5.2 的结果一致。这个交叉验证值得养成习惯——每次手推完 V都顺手用 Q 反推一次两次数值对上说明期望的层次没写错对不上几乎一定是某一层期望的加权系数丢了。再算一下 Q(S2, 唯一动作) 2 0.9 × 0 2和 V(S2) 相等这是理所当然的当状态只有一个动作且策略必选它时V 和 Q 必然相等。这个小结论在调试时很有用如果你在单动作状态上发现 V ≠ Q那么不是你的网络有问题就是实现对 Q 和 V 的关系理解反了。5.4 最优价值与最优策略现在换到最优情形用贝尔曼最优方程$$V^{}(S_2) 2, \qquad V^{}(S_1) \max\left(1 0.9 V^{}(S_2),\ 0 0.9 V^{}(S_3)\right) \max(2.8, 0) 2.8$$价值迭代的过程迭代轮次V*(S1)V*(S2)最优动作000—11.02.0a此时 max(1,0)22.82.0a32.82.0a从 Q^* 反推最优策略Q^(S1,a) 2.8 Q^(S1,b) 0所以 π^(S1) aV^(S1) 2.8。这里有个很有意思的对比随机策略 π 在 S1 的价值是 1.4最优策略是 2.8整整差一倍。差别的来源就是那 50% 概率选了 b 这个看起来没有惩罚、实际浪费了一步的动作。b 的即时奖励是 0 而不是负数很多人第一次看这个例子会觉得选 b 也没什么损失但它把一次拿到 2.8 的机会换成了 0。这就是为什么在回报设计里零奖励和小负奖励对智能体的实际影响可能完全不一样——零奖励在有些任务里等价于原地踏步不扣分会诱使智能体选择保守行为。这个洞见在我调 reward shaping 的时候救过我好几次。6. 推导里最容易翻车的六个地方6.1 折扣因子乘在哪一步γ 应该乘在下一步及之后的所有奖励上而不是乘在即时奖励上。写成 r γV(s) 是对的写成 γ(r V(s)) 就错了。差别在长期看是指数级的γ 0.99 时第 100 步的奖励在正确写法下权重是 0.366在错误写法下变成 0.99^99 × 0.99 ≈ 0.37看起来差别不大但第 1000 步就差了三个数量级。排查方法很简单令某个状态的即时奖励为 1其他全为 0看折扣回报的总和是不是 1/(1-γ)。这个收敛级数的和是个很好的自检工具γ 0.9 时应该是 10。我在写自己的小环境时会专门写一个 unit test 检查这一点因为它太容易被一个括号位置搞错了。6.2 期望是对谁求的这是最高频的错误没有之一。总结成一张排查表错误写法问题所在正确做法在 V 更新里对动作取 max混用了期望方程和最优方程策略评估用加权最优求解才用 maxQ 的更新里对下一步状态求 max把状态的不确定性和动作的选择混了状态用期望采样或求和动作才用 max用当前采样到的动作代替动作分布单样本估计方差大且在有 max 时不无偏明确采样还是精确求和把 d^π 当成 μ_0 用状态分布随策略变化梯度多了项明确目标函数形式我特别想强调第二行。Q 的最优更新式子是 r γ Σ_{s} p(s|s,a) max_{a} Q(s,a)那个 max 在内层、在 s 之后的动作上。写成 r γ max_{s} Q(s,a) 就完全错了因为 s 是环境给的你不能选。6.3 max 与期望不能随意交换$$\max_a \mathbb{E}[X_a] \neq \mathbb{E}[\max_a X_a]$$这个不等式在高估偏差overestimation bias问题里是核心。DQN 里的 max 操作是对估计值取的而估计值带有噪声取 max 会系统性地挑到正噪声大的那些估计导致 Q 值持续高估。Double DQN 的解决方案就是把选动作和评估动作拆给两个不同的网络本质上是切断噪声和 max 之间的相关性。这个偏差的数学根源就是上面这个不等式——期望下的最优和最优的期望不是一回事。在写理论推导时如果你在某一步把 max 提到期望外面一定要有充分理由比如这一步的期望是确定性的或者用的是确定等价形式。我审过几份推导出错的地方几乎都能定位到这一行。6.4 平均奖励设定下 V 的定义会失效上面所有推导都建立在折扣回报收敛的前提上。如果 γ 1 且任务是持续型continuing的G_t 会发散V^π(s) 根本不是有限值。这时候要换成平均奖励average reward设定$$\bar{r}^{\pi} \lim_{T\to\infty}\frac{1}{T}\mathbb{E}\left[\sum_{t0}^{T-1} R_{t1}\right]$$对应的价值函数要改成微分价值differential value贝尔曼方程的形式变成 h(s) r̄ Σ p h(s)这里的 h 是一个相对价值可以整体加常数而不影响策略。这类设定在排队系统、资源调度、持续运行的控制任务里很常见如果你在这些场景里用折扣回报会变成越往后越不在乎而持续任务恰恰要求长期稳定。6.5 off-policy 估计里那个比例因子当你用行为策略 b 采样的数据去估计目标策略 π 的价值时需要重要性采样修正$$\mathbb{E}{\pi}[G_t] \mathbb{E}{b}\left[\frac{\pi(A_t|S_t)}{b(A_t|S_t)}G_t\right]$$分子分母的位置千万不能反。一个经验性的检验方法是代入 b π此时比值为 1估计量退化成普通估计如果反了你就得到比值平方明显不对。另外要注意这个比例因子只出现在动作被采样到的那个时刻上而不是出现在状态转移上——因为状态转移概率 p 在 π 和 b 下是同一个不需要修正。这一点很多人第一次推导时都会多写一个因子。6.6 连续空间里求和变积分最后一个是尺度问题所有 Σ 在连续状态或动作空间里都要变成积分。V^π(s) ∫ π(a|s) Q^π(s,a) daQ 的式子里 Σ_{s} p(s|s,a) V(s) 变成 ∫ p(s|s,a) V(s) ds。数学上这是标准操作但工程上没法做——这就是为什么连续控制必须用采样估计或者函数逼近也是策略梯度方法在连续控制里成为主力的原因。顺带一个实操心得如果你的动作空间是连续的但在实现里做了离散化比如分成 20 个 bin那么你做的实际上是在一个近似 MDP上求最优求出来的 V^* 和真实连续问题的最优值有偏差。这个偏差的量级取决于离散化的粒度而且它对 max 操作很敏感——因为 max 会专门挑那个离散误差最大的动作。这个坑我在机械臂的控制任务里踩过把力矩离散成 10 档学出来的策略在精细定位上一直差一截改成连续的高斯策略之后立刻好转。7. 这些推导在真实算法里长什么样7.1 表格型价值迭代贝尔曼最优方程的直接落地价值迭代就是一行伪代码for k in range(max_iter): for s in states: V_new[s] max over a of [ r(s,a) gamma * sum(p(s|s,a) * V_old[s]) ] V_old V_new策略迭代则是把价值迭代拆成两步先用贝尔曼期望方程做若干轮策略评估再做一步策略改进在 Q 上取 argmax。两者的差别在于收敛速度和工作量的权衡。我实测下来有个经验状态数在几百量级以下时策略迭代通常比价值迭代快因为策略评估几步就能到位而策略改进一次就能跳很远状态数上千之后价值迭代更省事因为它不需要内循环。7.2 DQN 的 TD 目标从 Q^* 方程抠出来的DQN 的损失函数是$$L \mathbb{E}{(s,a,r,s)\sim D}\left[\left(r \gamma\max{a}Q_{\theta^{-}}(s,a) - Q_{\theta}(s,a)\right)^2\right]$$那个 r γ max Q 的部分就是 Q 的贝尔曼最优方程的采样版本p(s|s,a) 的期望被单样本替代了。理解这一点以后几个工程细节自然就清楚了为什么需要经验回放打破样本相关性让采样对 p 的估计更接近真实分布、为什么需要目标网络防止回归目标跟着参数一起动导致发散这是 T 的压缩性在函数逼近下失效时的补救。顺带说个我踩过的坑TD 目标里的 r 用的是环境返回的原始奖励如果你做了奖励缩放比如乘 0.1那么 γ 和学习率的有效尺度会一起变需要同步调整。这个在 Atari 的常见配置里是固定下来的reward clip 到 [-1,1]但换到自己的任务里要自己重新定标。7.3 策略梯度里的 baseline为什么是 V 而不是 Q策略梯度的基本形式是 ∇J E[∇log π(a|s) · G_t]。把 G_t 换成 Q^π(s,a) 不改变期望因为 E_{a~π}[Q(s,a)] V(s)换成 Q 减掉任意只依赖 s 的 b(s) 也不改变期望因为$$\mathbb{E}_{a\sim\pi}\left[\nabla\log\pi(a|s)\cdot b(s)\right] b(s)\cdot\nabla\sum_a \pi(a|s) b(s)\cdot\nabla 1 0$$这个等式是整个 baseline 技术的数学基础值得你自己推一遍。既然任意 b(s) 都行那为什么普遍选 V(s)因为它是最小化方差的近似最优选择——最优 baseline 大致是 E[G_t²]/E[G_t] 相关的量而 V(s) 是一个非常接近的、而且已经需要学的量。用 Q 做 baseline 就变成 A Q - Q 0什么信号都没了这就是为什么必须用 V。7.4 GAE把 V 和 Q 的差写成可递推的形式优势函数 A(s,a) Q(s,a) - V(s)。如果直接用一步 TD 误差 δ_t r_t γV(s_{t1}) - V(s_t)方差小但偏差大如果用完整的蒙特卡洛回报减 V偏差小但方差大。GAE 在两者之间做指数加权$$A^{GAE}t \sum{l0}^{\infty}(\gamma\lambda)^l\delta_{tl}$$λ 0 退化成一步 TDλ 1 退化成蒙特卡洛。这个式子在实现里用倒序递推一行就能写出来A_t δ_t γλ A_{t1}。我建议你把这个递推和前面 Q 与 V 的恒等式对照着看——它本质上是把用 V 做近似的误差在时间上做了平滑这样理解比死记公式有用得多。7.5 混合路线里的价值函数在实际工程项目里纯粹的端到端强化学习往往不是首选更常见的是求解器 学习的混合结构。一个典型的思路是把长期规划部分交给数学规划求解器处理比如把离散决策建模成混合整数线性规划而把规划模型里难以精确刻画的参数比如未来的成本预测、需求估计交给强化学习去学学出来的价值函数作为规划目标的终端项。这个结构的合理性就来自我们第 4 节推的东西极限情况下一个有限步规划 终端价值估计的决策质量取决于终端价值估计有多接近 V^*。终端项估得准规划步数可以很短估得不准就需要把规划步数拉长来补偿。我在做一个资源调度类问题时就用过这个套路实际配置是规划 12 步、终端用学到的 V 网络比纯规划 50 步的效果还好算得也快。这个经验反过来也说明价值函数的精度在混合架构里是直接决定性能上限的。8. 关于学习顺序的一点个人建议我自己的经历是第一遍看贝尔曼方程时觉得这不就是把求和展开了一下觉得没什么东西等到实际写算法遇到问题时才发现自己真正没搞明白的是期望的层次。所以我建议的顺序是先把恒等式 1 到 4 手推一遍然后找一个能画在纸上的小 MDP三五个状态把 V^π、Q^π、V^、Q^全部手算出来再写十行代码用迭代法算一遍看数字对不对得上。这个来回一次比看十遍推导都管用。另一个体会是关于记住什么的。公式本身不用背真正值得留下的是三个判断这个期望是对动作求还是对状态求、max 应该出现在哪一层、折扣因子应该管到哪一步为止。这三条在任何算法、任何新框架里都不会变换到 offline RL、多智能体、甚至 model-based 的规划方法里你都能靠这三条快速读懂人家的价值函数定义。如果你看到某个实现里的价值函数形式和本文推的不一样先别急着判定人家错了很可能只是目标函数设定不同——平均奖励、有限时域、还是带约束的形式。这时候回到定义从回报 G_t 重新推一遍一般五分钟就能对上。这套流程我用过很多次几乎没有失效的时候。
网站建设高端定制企业官网