3、强化学习基础(二):贝尔曼方程、动态规划、策略迭代与值迭代
好,咱们接着往下聊。上一章我们把马尔可夫决策过程(MDP)的骨架搭起来了,状态、动作、奖励、转移概率,这些概念你应该已经熟悉了。但光有骨架不行,我们得让这个智能体真正学会做决策。怎么学?核心就是今天要讲的这几个东西:贝尔曼方程、动态规划、策略迭代和值迭代。
说实话,我刚入行那会儿,看到这些名字就觉得头大。什么「贝尔曼」啊,「动态规划」啊,听着像数学系博士才该干的事。但后来我发现,其实它们的思路特别朴素——就是「站在未来看现在」。你想想看,你现在做的这个动作好不好,不是看它当下给你多少奖励,而是看它之后能带来多少累计收益。这个思想,贯穿了整个强化学习。
3.1 贝尔曼方程:价值函数的自洽性
我们先从价值函数说起。上一章我提过,状态价值函数 V(s) 表示从状态 s 出发,按照某个策略 π 行动,能获得的期望累计奖励。那这个 V(s) 怎么算?
贝尔曼方程给出了一个递归关系:
V(s) = Σ_a π(a|s) * [ R(s,a) + γ * Σ_{s'} P(s'|s,a) * V(s') ]
别被这个公式吓到。我拆开给你看:
- π(a|s):在状态 s 下,策略告诉你选动作 a 的概率。
- R(s,a):执行这个动作后,立即拿到的奖励。
- γ * Σ_{s'} P(s'|s,a) * V(s'):未来所有可能状态的折扣价值之和。
说白了,当前状态的价值 = 立即奖励 + 未来价值的折扣和。这个公式是自洽的——V(s) 的定义依赖于 V(s'),而 V(s') 又依赖于更远的 V(s'')。这就形成了一个递归链条。
核心理解:贝尔曼方程不是用来「算」的,而是用来「约束」的。它告诉我们,一个合理的价值函数必须满足这个自洽关系。我们后面所有的算法,本质上都是在找那个「满足贝尔曼方程」的解。
我个人习惯把贝尔曼方程看作一面镜子。你对着它照,如果 V(s) 和 V(s') 之间的关系对不上,那说明你的价值函数算错了,或者你的策略有问题。
3.2 动态规划:已知模型下的求解方法
好,现在我们有贝尔曼方程了。那怎么用它来求解最优策略呢?
这里有一个前提:动态规划要求我们知道环境的完整模型——也就是转移概率 P(s'|s,a) 和奖励函数 R(s,a) 都是已知的。这在很多实际问题中不现实,但作为理论基础,它非常重要。
动态规划的核心思想就四个字:分而治之。把一个大问题拆成一个个子问题,先解决子问题,再组合起来。在强化学习里,这个「子问题」就是每个状态的价值。
我记得有一次做机器人抓取仿真,环境模型是已知的(因为仿真器是我自己搭的),我就直接用动态规划来算最优策略。结果发现,状态空间稍微大一点(比如超过 10^6 个状态),计算就变得非常慢。嗯,这里要注意:动态规划只适合状态空间较小的场景。
3.3 策略迭代:先评估,再改进
策略迭代的思路很直观,就两步:
- 策略评估:给定当前策略 π,计算它的价值函数 V^π(s)。
- 策略改进:根据 V^π(s),贪心地选择更好的动作,得到新策略 π'。
然后重复这两步,直到策略不再变化。
你可能会问:策略评估怎么算?就是用贝尔曼方程反复迭代,直到 V(s) 收敛。这个过程叫「迭代法求解贝尔曼方程」。
伪代码长这样:
初始化 V(s) = 0, π(s) = 随机动作
重复直到收敛:
# 策略评估
重复直到 V 收敛:
V(s) = Σ_a π(a|s) * [ R(s,a) + γ * Σ_{s'} P(s'|s,a) * V(s') ]
# 策略改进
π'(s) = argmax_a [ R(s,a) + γ * Σ_{s'} P(s'|s,a) * V(s') ]
如果 π' == π,停止
否则 π = π'
我的经验:策略迭代通常收敛得很快,尤其是当初始策略不太差的时候。我曾经在一个网格世界任务中,策略迭代只用了 5 轮就找到了最优策略。但要注意,每一轮策略评估本身可能很耗时,因为你需要迭代很多次才能让 V(s) 收敛。
3.4 值迭代:一步到位
策略迭代有个变种,叫值迭代。它把策略评估和策略改进合并成了一步:
初始化 V(s) = 0
重复直到 V 收敛:
V(s) = max_a [ R(s,a) + γ * Σ_{s'} P(s'|s,a) * V(s') ]
看到了吗?这里没有显式的策略评估步骤,而是直接更新价值函数。每次更新时,我们取所有动作中「价值最大」的那个。等 V(s) 收敛后,最优策略自然就出来了:
π*(s) = argmax_a [ R(s,a) + γ * Σ_{s'} P(s'|s,a) * V*(s') ]
值迭代的好处是简单,代码好写。坏处是它需要更多轮迭代才能收敛,因为每一步都在「猜」最优价值,而不是先评估再改进。
避坑指南:我曾经在一个连续控制任务里用值迭代,结果跑了半天都不收敛。后来发现是折扣因子 γ 设得太接近 1(比如 0.99),导致未来价值的权重太大,收敛速度极慢。建议先从 γ=0.9 开始试,收敛后再调大。
3.5 策略迭代 vs 值迭代:怎么选?
我整理了一个对比表,方便你参考:
| 维度 | 策略迭代 | 值迭代 |
|---|---|---|
| 收敛速度 | 通常更快(轮数少) | 较慢(轮数多) |
| 每轮计算量 | 大(需要完整策略评估) | 小(一次更新即可) |
| 适用场景 | 状态空间小,策略评估快 | 状态空间大,但单步更新快 |
| 实现难度 | 中等 | 简单 |
我个人习惯是:如果状态空间小于 10^4,用策略迭代;如果更大,用值迭代。当然,这只是经验之谈,具体还得看你的任务。
3.6 知识体系总览
为了让你更直观地理解这一章的知识结构,我画了一张流程图:
这张图把这一章的核心逻辑串起来了。从贝尔曼方程出发,到动态规划,再到策略迭代和值迭代这两个具体算法。你顺着箭头看,就能明白它们之间的关系。
3.7 小结
这一章我们讲了三个核心概念:
- 贝尔曼方程:价值函数的自洽性约束,是所有算法的理论基础。
- 策略迭代:先评估当前策略,再贪心改进,循环直到最优。
- 值迭代:直接更新价值函数,收敛后提取最优策略。
说实话,这两个算法在实际工程中很少直接使用,因为大多数问题我们不知道环境模型。但它们是理解后续所有强化学习算法(Q-learning、SARSA、DQN 等)的基石。你把这个基础打牢了,后面学什么都会轻松很多。
好,这一章就到这儿。记住:贝尔曼方程是灵魂,动态规划是工具,策略迭代和值迭代是具体招式。下次遇到一个决策问题,先想想能不能用这些方法解决。
一句话总结:强化学习的本质,就是通过贝尔曼方程这个「镜子」,不断修正价值函数,最终找到那个能让你在每一个状态都做出最优选择的策略。
可可精品资料库