强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

1、时序差分(TD)与贝尔曼方程的关系

时序差分(Temporal Difference, TD)方法与贝尔曼方程是强化学习中理论与算法的核心结合。贝尔曼方程提供了值函数的递归数学定义,而 TD 方法则是通过采样数据来逼近这一方程的解。两者的关系可以从以下四个层面理解:


(1) 贝尔曼方程:理论基石

贝尔曼方程是强化学习中最基础的数学工具,它定义了状态值函数 V(s)或动作值函数 Q(s,a) 的递归关系:

强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

  • 核心思想:当前状态的值等于即时奖励加上后续状态的折扣值的期望。
  • 作用:为值函数提供了严格的数学定义,是动态规划(DP)和时序差分(TD)的共同理论基础。

(2)TD 方法:贝尔曼方程的采样实现

TD 方法通过实际交互的样本数据,用单步或几步经验近似贝尔曼方程中的期望值,从而避免了对环境模型(状态转移概率 p(s′∣s,a)的依赖。

  • TD 更新公式(以 TD(0) 为例):

强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析


(3)TD 是贝尔曼方程的随机近似算法

贝尔曼方程的解是值函数的理想值,而 TD 方法通过以下步骤逼近这一解:

  1. 采样替代期望:用实际交互的单步样本 (St,At,Rt+1,St+1)取代贝尔曼方程中的期望计算。
  2. 迭代更新:逐步调整值函数估计,使 TD 误差最小化。
  3. 收敛性:在 Robbins-Monro 条件下(如适当衰减的学习率 α),TD 方法能收敛到贝尔曼方程的解。

(4)总结

  • 贝尔曼方程:定义了值函数的递归数学关系,是强化学习的理论核心。
  • TD 方法:通过采样和迭代更新,将贝尔曼方程中的期望计算转化为实际可行的无模型学习算法。
  • 核心关系
    • TD 方法是贝尔曼方程的随机近似实现。
    • TD 的更新目标直接对应贝尔曼方程的右侧期望项。
    • TD 的收敛性依赖于贝尔曼方程的理论保证。

通过这种关系,TD 方法在无模型、高维状态空间中实现了高效学习,成为强化学习中最广泛应用的算法家族之一。


2、时序差分(TD)、贝尔曼方程与马尔可夫性质的关系

在强化学习中,马尔可夫性质是时序差分(TD)方法、贝尔曼方程以及大多数经典强化学习算法的核心基础。三者的关系可以总结为:

马尔可夫性质是理论前提 → 贝尔曼方程是数学工具 → TD方法是实践算法


(1)马尔可夫性质:一切的基础

  • 定义

马尔可夫性质(Markov Property)表明:未来状态仅依赖于当前状态和动作,与历史无关。数学表述为:

强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

  • 作用

简化问题:将复杂的历史依赖简化为仅当前状态的依赖。

支撑MDP框架:马尔可夫决策过程(MDP)假设环境满足马尔可夫性质,是强化学习的标准建模工具。

(2)贝尔曼方程:马尔可夫性的数学体现

贝尔曼方程的成立直接依赖马尔可夫性质。以状态值函数为例:

强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

马尔可夫性的体现

  1. 状态转移独立性:下一状态 s′仅依赖当前状态 s和动作 a,而非历史。
  2. 递归分解:长期回报 Vπ(s)被分解为即时奖励 r和后续状态的折扣值 γVπ(s′)。
  3. 动态规划可行性:若无马尔可夫性,无法将全局问题递归分解为局部子问题。

(3)TD方法:马尔可夫性下的无模型学习

TD方法(如Q-Learning、SARSA)是贝尔曼方程的无模型实现,其有效性同样依赖马尔可夫性。

TD更新的马尔可夫性依赖

  • 单步更新:TD利用当前状态 st、动作 at、奖励 rt+1 和下一状态 st+1 进行更新。

强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

  • 隐含假设
      • 下一状态 st+1 仅由 stat 决定(马尔可夫性)。
      • 若环境不满足马尔可夫性(如部分可观测问题),TD的更新目标将包含隐藏的历史信息误差。

    (4)总结

    • 马尔可夫性质是强化学习的基石,确保状态转移和值函数递归分解的合理性。
    • 贝尔曼方程是马尔可夫性下的数学工具,定义值函数的动态关系。
    • TD方法是贝尔曼方程的无模型实现,依赖马尔可夫性通过采样高效学习。

    三者关系链
    马尔可夫性 → 贝尔曼方程 → TD方法
    若环境不满足马尔可夫性,这一链条将断裂,需调整状态表明或算法设计(如使用RNN、POMDP)。

    3、满足与不满足马尔可夫性质的环境对比

    (1)满足马尔可夫性质的环境

    定义:未来状态仅依赖当前状态和动作,与历史无关。
    特点

    • 状态完整性:当前状态包含所有影响未来状态的信息。
    • 明确状态转移概率:下一状态仅由当前状态和动作决定,可用 p(s′∣s,a)p(s′∣s,a) 描述。

    示例

    1. 棋盘游戏(如国际象棋)
    2. 当前棋盘布局(状态)完全决定下一步所有可能走法。
    3. 无需思考之前的落子顺序,只需当前布局即可决策。
    4. 机器人导航(确定性环境)
    5. 机器人当前位置和动作(如“向左”)明确决定下一位置。
    6. 例如:网格世界中,移动指令直接对应坐标变化。
    7. 简单赌博机(Bandit)
    8. 每次拉臂的奖励仅由当前选择的臂决定,与之前的选择无关。

    (2)不满足马尔可夫性质的环境

    定义:未来状态依赖历史信息,而非仅当前状态和动作。
    特点

    • 状态信息缺失:当前状态未捕获所有影响未来的关键因素。
    • 历史依赖性强:需通过历史状态或动作预测未来。

    示例

    1. 部分可观测环境(POMDP)
    2. 真实状态:满足马尔可夫性,但智能体无法完全观测。
    3. 观测状态:因信息缺失导致非马尔可夫性。
    4. 例子
    5. 机器人通过噪声传感器获取环境信息(如模糊的摄像头画面)。
    6. 扑克游戏中,玩家无法看到对手的手牌(隐藏信息)。
    7. 时间序列依赖任务
    8. 股票价格预测:未来价格依赖长期趋势(如过去30天的均线)。
    9. 自然语言处理:句子的语义依赖上文所有词语(需LSTM/Transformer建模长程依赖)。
    10. 资源消耗型任务
    11. 电池供电机器人:移动成功率受剩余电量影响,但电量未纳入状态。
    12. 库存管理:未来需求依赖季节性历史销售数据,但状态仅包含当前库存。

    (3)判断标准

    标准

    满足马尔可夫性

    不满足马尔可夫性

    状态完整性

    当前状态包含所有关键信息

    状态缺失关键历史或隐藏信息

    转移概率依赖

    仅依赖 (s,a)(s,a)

    依赖历史轨迹 (s0,a0,…,st)(s0,a0,…,st)

    值函数更新

    可用贝尔曼方程递归分解

    需扩展状态或使用记忆机制

    典型算法适用性

    TD、Q-Learning、DP

    RNN、POMDP、DRQN

    (4)总结

    • 满足马尔可夫性:环境动态完全由当前状态和动作决定,适合经典强化学习算法(如TD、Q-Learning)。
    • 不满足马尔可夫性:需扩展状态表明或引入记忆机制,常见于部分可观测、时间序列依赖或资源消耗型任务。
    • 核心区别:状态的完整性和历史依赖性决定了马尔可夫性质是否成立。

    以下是一个结合 马尔可夫性质贝尔曼方程时序差分(TD) 的 Python 程序示例,通过一个简单的网格世界环境,展示它们的核心关系:


    程序目标

    1. 马尔可夫性质:环境状态转移仅依赖当前状态和动作。
    2. 贝尔曼方程:通过动态规划(DP)迭代计算状态值函数。
    3. TD方法:通过采样轨迹在线更新值函数。
    4. 对比DP与TD:验证两者在马尔可夫环境下的收敛一致性。
    import numpy as np
    import matplotlib.pyplot as plt
    
    # ====================== 环境定义(马尔可夫性质) ======================
    class GridWorld:
        """4x4网格世界,终点在右下角,移动奖励-0.1,到达终点奖励+1"""
        def __init__(self):
            self.size = 4
            self.terminal = (3, 3)
            self.actions = ['up', 'down', 'left', 'right']
        
        def step(self, state, action):
            """马尔可夫性质:下一状态仅依赖当前状态和动作"""
            i, j = state
            if action == 'up':
                next_i = max(i - 1, 0)
                next_j = j
            elif action == 'down':
                next_i = min(i + 1, self.size - 1)
                next_j = j
            elif action == 'left':
                next_i = i
                next_j = max(j - 1, 0)
            elif action == 'right':
                next_i = i
                next_j = min(j + 1, self.size - 1)
            next_state = (next_i, next_j)
            # 奖励函数
            reward = 1.0 if next_state == self.terminal else -0.1
            return next_state, reward
    
    # ====================== 动态规划(贝尔曼方程求解) ======================
    def bellman_dp(env, gamma=0.9, theta=1e-4):
        """贝尔曼方程迭代求解状态值函数"""
        V = np.zeros((env.size, env.size))
        policy = np.ones((env.size, env.size, len(env.actions))) / len(env.actions)  # 均匀随机策略
        while True:
            delta = 0
            for i in range(env.size):
                for j in range(env.size):
                    if (i, j) == env.terminal:
                        continue
                    v_old = V[i, j]
                    v_new = 0
                    for a_idx, action in enumerate(env.actions):
                        next_state, reward = env.step((i, j), action)
                        next_i, next_j = next_state
                        # 贝尔曼方程求和:Σπ(a|s)Σp(s'|s,a)[r + γV(s')]
                        v_new += policy[i, j, a_idx] * (reward + gamma * V[next_i, next_j])
                    V[i, j] = v_new
                    delta = max(delta, abs(v_old - V[i, j]))
            if delta < theta:
                break
        return V
    
    # ====================== 时序差分(TD(0)学习) ======================
    def td_learning(env, gamma=0.9, alpha=0.1, episodes=100):
        """TD(0)在线更新值函数"""
        V = np.zeros((env.size, env.size))
        for _ in range(episodes):
            state = (0, 0)  # 起点
            while state != env.terminal:
                # 随机选择动作(均匀策略)
                action = np.random.choice(env.actions)
                next_state, reward = env.step(state, action)
                i, j = state
                next_i, next_j = next_state
                # TD更新:V(s) ← V(s) + α[r + γV(s') - V(s)]
                V[i, j] += alpha * (reward + gamma * V[next_i, next_j] - V[i, j])
                state = next_state
        return V
    
    # ====================== 运行与可视化 ======================
    if __name__ == "__main__":
        env = GridWorld()
        
        # 动态规划求解
        V_dp = bellman_dp(env)
        print("贝尔曼方程(DP)结果:
    ", np.round(V_dp, 2))
        
        # TD学习
        V_td = td_learning(env, episodes=1000)
        print("TD(0)学习结果:
    ", np.round(V_td, 2))
        
        # 可视化对比
        plt.figure(figsize=(10, 4))
        plt.subplot(1, 2, 1)
        plt.imshow(V_dp, cmap='hot')
        plt.title("Dynamic Programming (Bellman)")
        plt.colorbar()
        
        plt.subplot(1, 2, 2)
        plt.imshow(V_td, cmap='hot')
        plt.title("TD(0) Learning")
        plt.colorbar()
        plt.show()

    代码解析

    1. 马尔可夫性质

    • 环境类 GridWorld
      • step 方法实现状态转移,下一状态仅依赖当前状态和动作(无历史依赖)。
      • 例如:在状态 (1,1) 执行动作 “right” 后,必然转移到 (1,2)。

    2. 贝尔曼方程(动态规划)

    • 函数 bellman_dp
      • 遍历所有状态,通过贝尔曼方程迭代更新值函数:

    强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

      • 收敛条件:值函数变化小于阈值 theta

    3. 时序差分(TD(0))

    • 函数 td_learning
      • 通过采样轨迹在线更新值函数:

    强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

      • 体现马尔可夫性:仅用当前状态和动作生成下一状态。

    4. 可视化对比

    • 热力图显示 DP 和 TD 学习到的值函数:
      • DP 直接求解贝尔曼方程(准确解)。
      • TD 通过采样逼近贝尔曼方程(近似解)。

    强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

    强化学习的三大支柱:时序差分、贝尔曼方程与马尔可夫性质的剖析

    © 版权声明

    相关文章

    暂无评论

    您必须登录才能参与评论!
    立即登录
    none
    暂无评论...