4. 动态规划:策略评估、策略迭代、价值迭代、在关节控制中的局限性
动态规划,说白了就是强化学习的“数学原型”。
我刚开始接触RL时,觉得这东西太理论了,跟实际机器人控制八竿子打不着。后来做项目时才发现,不理解DP,后面那些高级算法你根本吃不透。今天我们就把它掰开揉碎了讲清楚。
4.1 策略评估:算清楚你当前有多“菜”
策略评估,也叫预测问题。给定一个策略π,算出每个状态的价值V(s)。
公式其实不复杂:
V_{k+1}(s) = Σ_a π(a|s) Σ_{s',r} p(s',r|s,a)[r + γV_k(s')]
嗯,看着有点吓人。我换个说法:
- 你站在状态s,按策略π选动作a
- 环境给你反馈r,跳到s'
- 把当前奖励r加上未来价值γV(s')
- 对所有可能的动作和转移求平均
反复迭代,直到V收敛。
我的经验:收敛判据别设太严。我一般设ε=1e-4,迭代50-100次就够了。设太细,算到天荒地老。
4.2 策略迭代:边评估边改进
策略迭代分两步:
- 策略评估:算当前策略的价值函数
- 策略改进:根据价值函数,贪心地选更好的动作
伪代码长这样:
初始化策略π(s)为随机动作
循环直到策略稳定:
1. 策略评估:迭代计算V(s)直到收敛
2. 策略改进:π'(s) = argmax_a Σ p(s',r|s,a)[r + γV(s')]
3. 如果π' == π,结束;否则π = π',继续
为什么有效?因为每次改进都保证价值不降。数学上叫“单调提升”。
核心洞察:策略迭代收敛快,但每次评估都要算到收敛。状态空间一大,计算量爆炸。
4.3 价值迭代:一步到位
价值迭代更激进。它不显式做策略评估,而是直接更新价值函数:
V_{k+1}(s) = max_a Σ_{s',r} p(s',r|s,a)[r + γV_k(s')]
看到了吗?把策略评估里的求和改成max,一步到位。
我个人习惯用价值迭代,因为代码更短,调参更少。但要注意:
踩坑提醒:价值迭代收敛的是价值函数,不是策略。有时候V已经稳定了,但策略还在变。我建议同时监控策略变化率。
4.4 三种方法的对比
| 方法 | 收敛速度 | 每步计算量 | 适用场景 |
|---|---|---|---|
| 策略评估 | 慢 | 低 | 分析给定策略 |
| 策略迭代 | 快(迭代次数少) | 高(每次评估要算到收敛) | 中小规模问题 |
| 价值迭代 | 中等 | 中等 | 状态空间不太大时 |
你想想看,如果状态空间是连续的,比如关节角度0-360度,每个维度分100份,6个关节就是100^6 = 10^12个状态。DP直接歇菜。
4.5 在关节控制中的局限性
这里我要泼一盆冷水。DP在关节控制里,基本用不了。原因有三:
- 维度灾难:关节空间是连续的,离散化后状态数指数增长。我试过把7自由度机械臂离散成每关节10份,结果状态数1000万,内存直接爆了。
- 模型未知:DP需要知道转移概率p(s',r|s,a)。但真实机器人,你根本拿不到精确的动力学模型。摩擦、形变、延迟,这些都没法建模。
- 计算实时性:DP要扫遍所有状态。机器人控制要求毫秒级响应,DP算完黄花菜都凉了。
一句话总结:DP是理论基础,但不是工程方案。它告诉我们“最优解长什么样”,但实际中我们只能用近似方法去逼近。
4.6 知识体系图
下面这张图,把DP的核心逻辑串起来了:
4.7 我的建议
学DP,重点不是“怎么用”,而是“为什么”。
它教会我们两件事:
- 最优策略可以通过迭代得到
- 价值函数是策略改进的“导航仪”
这些思想,后面讲DQN、PPO时都会用到。所以别跳过,哪怕觉得理论枯燥,也硬着头皮啃下来。
一个小练习:写一个2x2网格世界的策略迭代代码。状态4个,动作4个(上下左右)。跑通之后,你就算入门了。
我曾经带过一个实习生,上来就想调PPO,结果连策略评估都写不对。后来老老实实从DP开始补,两周后反而成了组里最懂理论基础的人。嗯,基础这东西,绕不过去的。