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 在运动控制里到底怎么用。下面这张图是我自己画的框架:

MDP 在运动控制中的应用框架 智能体 (Agent) 策略 π(a|s) 价值函数 V(s), Q(s,a) 学习算法 环境 (Environment) 电机/机械臂/车辆 状态转移 P(s'|s,a) 奖励函数 R(s,a) 动作 a (电压/电流/PID参数) 状态 s' + 奖励 r (位置/速度/误差) 循环交互:s → a → s' → r → ... MDP 核心公式 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') 目标:找到最优策略 π* 使得累计奖励最大

这张图把整个流程串起来了。智能体观察环境的状态 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 时,也觉得公式很吓人。但后来发现,只要抓住“状态-动作-奖励”这个循环,其他都是锦上添花。你想想看,是不是这个理?

专注资料整理