当前位置:首页 > 技术 > 正文内容

强化学习核心数学原理详解:MDP建模、价值函数与动态规划算法

访客 技术 2026年7月15日 1

引言:强化学习的理论根基

强化学习(Reinforcement Learning, RL)是一种通过试错机制实现最优决策的机器学习范式。其本质在于智能体如何在复杂环境中学习一个策略,以最大化长期累积奖励。这一过程依赖于坚实的数学基础,其中马尔可夫决策过程(Markov Decision Process, MDP)、贝尔曼方程和动态规划构成了早期理论的核心。

不同于监督学习依赖标注数据或无监督学习发现潜在结构,强化学习强调**交互式学习**——智能体通过执行动作、观察状态变化和接收奖励信号来不断调整行为策略。这种设定使得RL特别适用于机器人控制、游戏AI、资源调度等序列决策任务。

本文将系统阐述强化学习的三大支柱:MDP作为问题建模工具,贝尔曼方程揭示价值递归关系,以及动态规划提供基于模型的求解方法。我们将结合数学推导与代码实现,帮助读者深入理解这些概念的本质及其相互联系。

马尔可夫决策过程:序贯决策的形式化框架

MDP是描述强化学习环境的标准数学模型,它为智能体与环境之间的交互提供了清晰的抽象。一个完整的MDP由五元组 (S, A, T, R, γ) 定义:

  • 状态空间 S:所有可能环境状态的集合。每个状态 s ∈ S 应具备"完整性",即包含做出下一步决策所需的全部信息。
  • 动作空间 A:智能体可采取的所有操作的集合。动作 a ∈ A 是对环境施加的影响。
  • 状态转移函数 T(s'|s,a):表示在状态 s 下执行动作 a 后转移到状态 s' 的概率,满足 ∑s'T(s'|s,a) = 1。
  • 即时奖励函数 R(s,a,s'):定义了从状态 s 执行动作 a 到达 s' 所获得的标量反馈值,用于引导学习方向。
  • 折扣系数 γ ∈ [0,1]:调节当前奖励与未来收益之间的重要性权衡。γ 接近 0 表示短视,接近 1 表示远见。

马尔可夫性假设

MDP的关键前提是马尔可夫性质:下一状态的概率分布仅取决于当前状态和动作,而与历史路径无关。形式化表达为:

\[ P(s_{t+1} | s_t, a_t, s_{t-1}, a_{t-1}, \dots) = P(s_{t+1} | s_t, a_t) \]

该假设极大简化了建模复杂度,使我们无需追踪完整的历史轨迹即可进行有效决策。

策略的定义与类型

策略 π 是智能体的行为准则,决定了在给定状态下应选择哪个动作:

  • 确定性策略:π: S → A,直接输出具体动作。
  • 随机性策略:π(a|s),表示在状态 s 下选择动作 a 的概率分布,满足 ∑a∈Aπ(a|s)=1。

目标是找到最优策略 π*,使得从任意初始状态出发都能获得最大期望累积回报。

MDP结构示意图

价值函数与贝尔曼方程

为了评估不同策略的好坏,我们需要量化"好"的标准。这引入了两个核心函数:状态价值函数和动作价值函数。

状态价值函数 Vπ(s)

表示从状态 s 开始并遵循策略 π 所能获得的期望折现总奖励:

\[ V^\pi(s) = \mathbb{E}_\pi \left[ \sum_{k=0}^{\infty} \gamma^k r_{t+k} \,\middle|\, s_t = s \right] \]

动作价值函数 Qπ(s,a)

表示在状态 s 下先执行动作 a,之后始终遵循策略 π 的期望回报:

\[ Q^\pi(s,a) = \mathbb{E}_\pi \left[ \sum_{k=0}^{\infty} \gamma^k r_{t+k} \,\middle|\, s_t = s, a_t = a \right] \]

贝尔曼期望方程

上述价值函数具有天然的递归结构,称为贝尔曼期望方程:

\[ V^\pi(s) = \sum_a \pi(a|s) \sum_{s'} T(s'|s,a) \left[ R(s,a,s') + \gamma V^\pi(s') \right] \] \[ Q^\pi(s,a) = \sum_{s'} T(s'|s,a) \left[ R(s,a,s') + \gamma \sum_{a'} \pi(a'|s') Q^\pi(s',a') \right] \]

这两个公式体现了"当前价值 = 即时奖励 + 折扣后继价值"的思想。

贝尔曼最优方程

当策略达到最优时,对应的价值函数满足以下最优方程:

\[ V^*(s) = \max_a \sum_{s'} T(s'|s,a) \left[ R(s,a,s') + \gamma V^*(s') \right] \] \[ Q^*(s,a) = \sum_{s'} T(s'|s,a) \left[ R(s,a,s') + \gamma \max_{a'} Q^*(s',a') \right] \]

求解该方程即可得到全局最优策略 π*(s) = argmaxa Q*(s,a)。

矩阵形式表达

对于有限状态空间,可将贝尔曼方程写成紧凑的线性系统。令 Vπ 为状态价值向量,Rπ 为期望奖励向量,Pπ 为策略诱导的状态转移矩阵,则有:

\[ \mathbf{V}^\pi = \mathbf{R}^\pi + \gamma \mathbf{P}^\pi \mathbf{V}^\pi \quad \Rightarrow \quad (\mathbf{I} - \gamma \mathbf{P}^\pi)\mathbf{V}^\pi = \mathbf{R}^\pi \]

理论上可通过矩阵求逆得到闭式解:Vπ = (I − γPπ)⁻¹Rπ,但实际中因计算成本高多采用迭代法求解。

贝尔曼方程图解

动态规划算法详解

动态规划(Dynamic Programming, DP)是一类利用贝尔曼方程求解MDP的精确方法,适用于已知环境模型 T 和 R 的场景。主要分为两种经典算法。

值迭代(Value Iteration)

值迭代直接逼近最优状态价值函数 V*,每轮更新使用贝尔曼最优算子:

\[ V_{k+1}(s) \leftarrow \max_a \sum_{s'} T(s'|s,a) \left[ R(s,a,s') + \gamma V_k(s') \right] \]

算法持续迭代直至收敛,即 maxs|Vk+1(s) − Vk(s)| < ε。

其收敛性源于贝尔曼最优算子是一个压缩映射:设 为该算子,则对任意两个价值函数 V₁, V₂,有 ||V₁ − V₂||∞ ≤ γ||V₁ − V₂||∞。由于 γ < 1,根据Banach不动点定理,迭代必收敛至唯一不动点 V*。

策略迭代(Policy Iteration)

策略迭代交替执行两个步骤:

  1. 策略评估:固定当前策略 π,通过迭代或求解线性方程组计算 Vπ
  2. 策略改进:基于当前价值函数贪婪地更新策略: \[ \pi'(s) = \arg\max_a \sum_{s'} T(s'|s,a)[R(s,a,s') + \gamma V^\pi(s')] \]

一旦策略不再改变,说明已收敛到最优策略。相比值迭代,策略迭代通常收敛更快,但每次策略评估开销更大。

策略迭代流程图

动态规划的局限性

  • 维度灾难:状态数随变量维度指数增长,导致内存和计算不可行。
  • 模型依赖:必须预先知道准确的 T 和 R 函数,在真实世界中往往难以获取。

这些问题推动了无模型方法的发展,如Q-learning、SARSA和深度Q网络(DQN),它们通过采样经验进行学习,摆脱了对环境模型的依赖。

Python实现:值迭代与策略迭代

值迭代算法

def value_iteration(states, actions, transitions, rewards, gamma=0.9, tol=1e-6):
    """
    实现值迭代算法
    
    参数:
        states: 状态列表
        actions: 动作列表
        transitions: 转移字典 transitions[s][a][s_next] -> prob
        rewards: 奖励字典 rewards[s][a][s_next] -> reward
        gamma: 折扣因子
        tol: 收敛容差
        
    返回:
        V: 最优状态价值字典
        policy: 提取的最优策略
    """
    V = {s: 0.0 for s in states}
    
    while True:
        delta = 0.0
        for s in states:
            old_v = V[s]
            # 计算所有动作下的Q值并取最大
            q_values = []
            for a in actions:
                q_val = 0.0
                for s_next in states:
                    prob = transitions[s][a].get(s_next, 0.0)
                    reward = rewards[s][a].get(s_next, 0.0)
                    q_val += prob * (reward + gamma * V[s_next])
                q_values.append(q_val)
            V[s] = max(q_values) if q_values else 0.0
            delta = max(delta, abs(old_v - V[s]))
        
        if delta < tol:
            break
    
    # 提取最优策略
    policy = {}
    for s in states:
        best_action = None
        best_value = float('-inf')
        for a in actions:
            q_val = 0.0
            for s_next in states:
                prob = transitions[s][a].get(s_next, 0.0)
                reward = rewards[s][a].get(s_next, 0.0)
                q_val += prob * (reward + gamma * V[s_next])
            if q_val > best_value:
                best_value = q_val
                best_action = a
        policy[s] = best_action
    
    return V, policy

策略迭代算法

def policy_iteration(states, actions, transitions, rewards, gamma=0.9, max_eval_iter=100):
    """
    策略迭代主循环
    """
    # 初始化均匀或随机策略
    policy = {s: actions[0] for s in states}
    
    while True:
        # --- 策略评估 ---
        V = {s: 0.0 for s in states}
        for _ in range(max_eval_iter):
            new_V = {}
            for s in states:
                a = policy[s]
                total = 0.0
                for s_next in states:
                    prob = transitions[s][a].get(s_next, 0.0)
                    reward = rewards[s][a].get(s_next, 0.0)
                    total += prob * (reward + gamma * V[s_next])
                new_V[s] = total
            if max(abs(new_V[s] - V[s]) for s in states) < 1e-6:
                break
            V = new_V
        
        # --- 策略改进 ---
        policy_stable = True
        for s in states:
            old_action = policy[s]
            action_values = {}
            for a in actions:
                val = 0.0
                for s_next in states:
                    prob = transitions[s][a].get(s_next, 0.0)
                    reward = rewards[s][a].get(s_next, 0.0)
                    val += prob * (reward + gamma * V[s_next])
                action_values[a] = val
            best_a = max(action_values, key=action_values.get)
            policy[s] = best_a
            if old_action != best_a:
                policy_stable = False
        
        if policy_stable:
            break
    
    return policy, V

实战案例:网格世界中的路径规划

考虑一个 4×4 的网格世界,目标位于右下角 (3,3),起始于左上角 (0,0)。动作包括上下左右移动,边界处无效动作保持原位。到达目标奖励为 +1,其余为 0,γ=0.9。

应用值迭代后,价值函数呈现从起点到终点的平滑梯度,最优策略形成最短路径。可视化时可用热力图展示各格子的价值,并用箭头指示最佳动作方向。

优化技巧

  • 异步更新:不强制同步更新所有状态,允许按需或优先级顺序更新,提升效率。
  • 优先扫描:根据贝尔曼残差大小决定更新顺序,误差大的状态优先处理。
  • 函数逼近:对于连续状态空间,使用神经网络等模型近似 V(s) 或 Q(s,a),突破离散限制。

面试常见问题解析

  • 为何需要折扣因子?
    避免无限时间域下累积奖励发散;即使 γ=1,也需保证终态存在或使用平均奖励准则。
  • 值迭代 vs 策略迭代?
    值迭代单步快但收敛慢;策略迭代每轮耗时长但总体迭代次数少,更适合小规模问题。
  • 贝尔曼方程中的期望含义?
    是对策略 π 下的动作分布和环境随机转移的双重期望,反映不确定性下的平均性能。
  • 动态规划为何属于有模型方法?
    因其需显式访问 T 和 R 进行全宽度回溯,而无模型方法仅依赖样本轨迹估计。

总结与发展方向

掌握MDP、贝尔曼方程和动态规划是深入理解强化学习的前提。尽管传统DP受限于模型依赖和维度灾难,但它为后续发展奠定了理论基石。

当前研究趋势正朝以下方向演进:

  • 深度强化学习:结合深度神经网络实现端到端训练,在Atari、围棋等领域取得突破。
  • 无模型算法:如DQN、PPO、SAC等,无需环境模型即可从经验中学习。
  • 多智能体强化学习:研究多个主体间的博弈与协作机制。
  • 安全与可解释性:确保学习结果符合伦理规范,增强人类信任。

夯实数学基础不仅能应对技术考察,更为探索前沿领域提供坚实支撑。

标签: 强化学习

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。