4. 强化学习基础:马尔可夫决策过程(MDP)
好,咱们进入正题。这一章要聊的是强化学习的“地基”——马尔可夫决策过程,简称 MDP。你想想看,不管是做运动控制还是搞机器人,本质上都是在做“决策”。而 MDP 就是描述这种“决策问题”最标准的数学框架。
我个人习惯把 MDP 理解成一个“游戏规则说明书”。它告诉你:你现在在什么状态、你能做什么动作、做完动作后环境会怎么变、以及你会得到多少奖励。说白了,这就是一个闭环的交互过程。
核心要点:MDP 是强化学习的数学基础。没有它,后面所有的算法都无从谈起。
4.1 马尔可夫决策过程(MDP)
先说说“马尔可夫”这个名字。它来自俄国数学家马尔可夫。他提出一个性质:未来的状态只取决于当前状态,跟过去无关。这叫“马尔可夫性”。
举个例子:你控制一个电机,当前转速是 1000 rpm。你给一个电压信号,下一时刻转速变成 1200 rpm。这个变化只跟当前转速和你的动作有关,跟 5 秒前转速是多少没关系。这就是马尔可夫性。
MDP 就是在这个性质上加了“动作”和“奖励”。它由五个元素组成:
- S:状态空间(所有可能的状态)
- A:动作空间(所有可能的动作)
- P:状态转移概率(从一个状态到另一个状态的概率)
- R:奖励函数(每个状态-动作对能拿多少奖励)
- γ:折扣因子(未来的奖励值多少钱)
嗯,这里要注意:状态转移概率 P 是 MDP 的核心。它描述了环境的“动力学”。比如你给电机加 5V 电压,它有 90% 概率转速升到 1200,10% 概率升到 1100。这个概率分布就是 P。
我的经验:我在做伺服电机控制时,一开始总想精确建模 P。后来发现,对于复杂系统,精确建模太难了。所以后来我改用 model-free 的方法,直接跟环境交互学习。省心不少。
4.2 状态、动作、奖励的定义
这三个东西是 MDP 的“三驾马车”。定义得好不好,直接决定你后面能不能学出来。
状态(State)
状态就是环境在某个时刻的“快照”。在运动控制里,状态通常包括:
- 位置(角度、位移)
- 速度(角速度、线速度)
- 加速度
- 电流、力矩
- 误差、误差积分
我建议:状态要包含足够的信息,但不要冗余。比如做 PID 调参,状态可以取 [误差, 误差积分, 误差微分]。这三个就够了,再加别的反而会干扰学习。
动作(Action)
动作就是智能体可以做的“操作”。在运动控制里,动作通常是:
- 电压/电流指令
- PID 参数(Kp, Ki, Kd)
- 目标位置/速度
- 力矩限制
动作空间可以是离散的,也可以是连续的。离散动作比如“增大 Kp”、“减小 Kp”、“保持 Kp”。连续动作比如直接输出一个浮点数作为 Kp 值。
避坑指南:我曾经在调一个机械臂时,把动作空间设得太大(连续空间,范围 -100 到 100)。结果算法探索了 10 万步还没收敛。后来改成离散动作,只取 [-10, 0, 10] 三个值,收敛速度快了 10 倍。所以,动作空间越小越好。
奖励(Reward)
奖励是“指挥棒”。你希望智能体做什么,就给它相应的奖励。在运动控制里,常见的奖励设计:
- 跟踪误差小 → 正奖励
- 超调大 → 负奖励
- 到达目标位置 → 大正奖励
- 超出安全范围 → 大负奖励(甚至终止)
举个例子:
# 一个简单的奖励函数
def compute_reward(error, velocity, is_safe):
reward = 0
# 误差越小越好
reward -= 0.1 * abs(error)
# 速度不要太快(防止冲击)
reward -= 0.01 * abs(velocity)
# 到达目标给大奖励
if abs(error) < 0.01:
reward += 100
# 超出安全范围惩罚
if not is_safe:
reward -= 1000
return reward
你看,这个奖励函数把“误差小”、“速度适中”、“安全”都考虑进去了。设计奖励时,一定要想清楚:你到底想要什么行为?
4.3 策略与价值函数
有了 MDP 的框架,接下来就是“怎么决策”的问题。这就引出了策略和价值函数。
策略(Policy)
策略就是“在某个状态下,应该做什么动作”。用数学表示就是:
- 确定性策略:π(s) = a,给定状态 s,输出唯一动作 a
- 随机性策略:π(a|s) = P(a|s),给定状态 s,输出动作的概率分布
在运动控制里,我常用确定性策略。比如:
# 一个简单的策略:误差大就加大 Kp
def policy(state):
error = state[0]
if abs(error) > 10:
return 5.0 # 加大 Kp
elif abs(error) > 1:
return 2.0 # 中等 Kp
else:
return 0.5 # 小 Kp
当然,这是手工设计的策略。强化学习的目标就是自动学出最优策略。
价值函数(Value Function)
价值函数用来评估“某个状态(或状态-动作对)有多好”。它有两种:
- 状态价值函数 V(s):从状态 s 开始,按照策略 π 行动,能获得的累计奖励期望
- 动作价值函数 Q(s, a):在状态 s 执行动作 a,之后按照策略 π 行动,能获得的累计奖励期望
说白了,V(s) 告诉你“这个状态值不值得待”,Q(s, a) 告诉你“这个动作值不值得做”。
数学上,它们满足贝尔曼方程:
V(s) = Σ_a π(a|s) * [R(s, a) + γ * Σ_s' P(s'|s, a) * V(s')]
Q(s, a) = R(s, a) + γ * Σ_s' P(s'|s, a) * V(s')
看着复杂?其实核心就一句话:当前的价值 = 立即奖励 + 未来奖励的折扣和。
我的理解:价值函数就像“天气预报”。V(s) 告诉你这个状态未来会不会“下雨”(拿到奖励),Q(s, a) 告诉你做这个动作会不会“淋湿”。有了它们,你就能做出更好的决策。
4.4 MDP 在运动控制中的应用框架
说了这么多理论,咱们看看 MDP 在运动控制里到底怎么用。下面这张图是我自己画的框架:
这张图把整个流程串起来了。智能体观察环境的状态 s,做出动作 a,环境反馈新的状态 s' 和奖励 r。如此循环往复。强化学习要做的就是:在这个循环中,不断优化策略,让累计奖励最大。
4.5 一个简单的例子:PID 参数整定
最后,咱们用一个具体例子收尾。假设你要用强化学习来整定 PID 参数:
- 状态 s:[当前误差 e, 误差积分 ∫e, 误差微分 ė]
- 动作 a:[ΔKp, ΔKi, ΔKd](参数增量)
- 奖励 r:-|e| - 0.1|ė| - 0.01|∫e|(越小越好)
- 策略 π:一个神经网络,输入状态,输出动作
- 价值函数 Q:评估当前状态-动作对的好坏
训练过程就是:智能体不断尝试不同的参数调整,看哪个组合能让跟踪误差最小。经过几千步的探索,它就能学会一套“调参策略”。
总结一下:MDP 给了我们一个描述决策问题的标准框架。状态、动作、奖励是“三要素”,策略和价值函数是“两工具”。搞懂了这些,你就拿到了强化学习的“入场券”。
最后说一句:我刚开始学 MDP 时,也觉得公式很吓人。但后来发现,只要抓住“状态-动作-奖励”这个循环,其他都是锦上添花。你想想看,是不是这个理?