二、智能体强化学习——深度强化学习核心算法

2.1 DQN 系列及其改进

2.1.1 背景与动机

在经典强化学习中(如 Q-Learning),如果状态空间动作空间 非常大乃至连续,那么用一个表格来存储 Q ( s , a ) Q(s,a) Q(s,a) 不再可行。为了解决该问题,可以使用神经网络 来逼近 Q Q Q 函数,这就是 深度 Q 网络(Deep Q-Network,DQN) 的核心思想。

  • 论文起源:DQN 由 DeepMind 团队提出(Mnih et al., 2013 & 2015),利用卷积神经网络来从原始像素(如 Atari 游戏画面)中学习特征,并输出各动作的 Q 值,大幅度提升了在 Atari 游戏上的表现。
  • 核心要点
    • 用一个神经网络 Q ( s , a ; θ ) Q(s,a;\theta) Q(s,a;θ) 近似 Q 值;
    • 通过最小化时序差分 (TD) 误差来更新 θ \theta θ。

Q 函数的神经网络逼近

对于离散动作环境,网络的输出层通常有 ∣ A ∣ |\mathcal{A}| ∣A∣ 个神经元,每个输出对应一个动作的 Q 值 Q ( s , a ) Q(s,a) Q(s,a)。输入为状态 s s s(可能是图像或其他向量),通过多层感知机 (MLP) 或卷积神经网络 (CNN) 获取特征后输出 Q 值。


2.1.2 DQN 原理与伪代码

(1) 关键改进:Experience Replay 与 Target Network

  1. Experience Replay(经验回放)

    • 将 Agent 与环境交互得到的经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s′) 存储在一个 Replay Buffer 中;
    • 每次训练时,从该 Buffer 中随机采样一个批量(mini-batch)数据进行梯度更新;
    • 好处
      • 让样本分布更加独立同分布 (i.i.d.),打破连续时间步样本的相关性;
      • 提高数据效率,能够反复使用历史数据进行训练。
  2. Target Network(目标网络)

    • DQN 中存在"自举 (bootstrapping)":在更新 Q 值时,需要用到下一时刻的 Q 值;
    • 如果使用同一个网络同时执行动作选择和目标计算,可能导致训练不稳定;
    • 解决方案:维持一个"目标网络" Q ^ ( s , a ; θ − ) \hat{Q}(s,a;\theta^-) Q^(s,a;θ−),周期性(或软更新)将在线网络的参数 θ \theta θ 复制到 θ − \theta^- θ−;
    • 当计算 TD 目标时,用的是目标网络的 Q 值,不随在线网络每次更新而变化过快。

(2) DQN 的核心更新公式

对于某条经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s′),DQN 的 TD 目标 (Target) 为
y = r + γ max ⁡ a ′ Q ^ ( s ′ , a ′ ; θ − ) \LARGE y = r + \gamma \max_{a'} \hat{Q}(s', a'; \theta^-) y=r+γa′maxQ^(s′,a′;θ−)

其中 Q ^ \hat{Q} Q^ 是目标网络。DQN 的损失函数为
L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( y − Q ( s , a ; θ ) ) 2 ] \LARGE L(\theta) = \mathbb{E}_{(s,a,r,s')\sim \mathcal{D}} \Big[ \big( y - Q(s,a;\theta) \big)^2 \Big] L(θ)=E(s,a,r,s′)∼D[(y−Q(s,a;θ))2]

通过反向传播对 θ \theta θ 做梯度下降,最小化此均方误差。

(3) DQN 伪代码示例

以下是一段简化的伪代码流程:

python 复制代码
Initialize Q network with random weights θ
Initialize target network with the same weights θ^- ← θ
Initialize replay buffer D

for episode in 1 to max_episodes:
    s = env.reset()
    done = False
    while not done:
        # 1. epsilon-greedy 策略
        if random() < epsilon:
            a = random action
        else:
            a = argmax(Q(s, ·; θ))
        
        # 2. 与环境交互
        s_next, r, done, info = env.step(a)
        
        # 3. 存储经验
        D.append((s, a, r, s_next, done))
        
        # 4. 训练
        if len(D) > batch_size:
            # 4.1 从 D 中随机采样
            batch = sample(D, batch_size)
            (s_batch, a_batch, r_batch, s_next_batch, done_batch) = transform(batch)
            
            # 4.2 计算目标 y
            y = r_batch + γ * max(Q(s_next_batch, a'; θ^-), axis=1) * (1 - done_batch)
            
            # 4.3 计算当前 Q(s,a;θ),并最小化均方误差
            loss = MSE(Q(s_batch, a_batch; θ), y)
            do gradient descent on θ
            
        # 5. 每隔 C 步更新目标网络
        if step % C == 0:
            θ^- ← θ
        
        # 状态前移
        s = s_next
    
    # 6. 衰减 epsilon
    epsilon = max(epsilon_min, epsilon * epsilon_decay)

2.1.3 DQN 的改进算法

  1. Double DQN

    • 在计算 max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s',a') maxa′Q(s′,a′) 时会产生过估计问题;
    • Double Q-Learning 思想:将动作选择动作评估 分别在两个网络中完成:
      a ∗ = arg ⁡ max ⁡ a ′ Q ( s ′ , a ′ ; θ ) , y = r + γ Q ^ ( s ′ , a ∗ ; θ − ) \LARGE \begin{array}{l} a^* = \arg\max_{a'}Q(s',a';\theta), \\ y = r + \gamma \hat{Q}\big(s', a^*; \theta^-\big) \end{array} a∗=argmaxa′Q(s′,a′;θ),y=r+γQ^(s′,a∗;θ−)
    • 这样能够有效减小 Q 值的过估计偏差。
  2. Dueling DQN

    • 将网络拆分为状态价值函数 V ( s ) V(s) V(s)优势函数 A ( s , a ) A(s,a) A(s,a) 两个分支:
      Q ( s , a ) = V ( s ) + A ( s , a ) − 1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) \LARGE Q(s,a) = V(s) + A(s,a) - \frac{1}{|\mathcal{A}|}\sum_{a'}A(s,a') Q(s,a)=V(s)+A(s,a)−∣A∣1a′∑A(s,a′)
    • 能让网络更好地学习状态本身的价值,在某些情况下提升训练效率。
  3. 优先级回放(Prioritized Replay)

    • 经验回放中,TD 误差较大的样本往往更有学习价值;
    • 给每条经验分配一个"优先级" p i = ∣ δ i ∣ + ϵ p_i = | \delta_i | + \epsilon pi=∣δi∣+ϵ( δ i \delta_i δi 为 TD 误差);
    • 采样时,根据 p i p_i pi 的大小进行加权随机采样,让高 TD 误差样本被更多关注;
    • 注意需对更新进行重要性采样修正 (IS weights),以保证无偏性。
  4. Rainbow DQN

    • Double DQNDueling DQN优先级回放NoisyNetCategorical DQN 等多种改进技术结合在一起,进一步增强效果。

2.2 Policy Gradient 系列

在 Q-Learning 类方法中,我们先估计 Q 值,然后通过贪心或近贪心选择动作;而策略梯度 方法则直接对策略函数 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 参数化并通过梯度上升 来最大化期望回报。这类方法对连续动作空间尤其有效。

2.2.1 基本策略梯度(REINFORCE)

(1) 思想概述

  • 策略 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 是一个可微分的函数(如神经网络),输出在状态 s s s 时选择动作 a a a 的概率;
  • 目标 :最大化期望回报
    J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T r t ] \LARGE J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} r_t \right] J(θ)=Eτ∼πθ t=0∑Trt
    其中 τ \tau τ 表示整个轨迹 e p i s o d e episode episode;
  • 核心 :利用梯度上升 , θ ← θ + α ∇ θ J ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) θ←θ+α∇θJ(θ)。

(2) REINFORCE 算法公式

对策略梯度的一个常见推导是:
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t ] \LARGE \nabla_\theta J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t \right] ∇θJ(θ)=Eτ∼πθ t=0∑T∇θlogπθ(at∣st)⋅Gt

其中 G t G_t Gt 是从时刻 t t t 开始的折扣回报(Return)。在实现中,常见做法是采样多个完整的episode ,计算每个时间步的 log ⁡ π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) logπθ(at∣st) 累积,再加权更新。

(3) REINFORCE 的特点

  • 优点 :实现简单;可以处理连续或离散动作空间;适用于高维输出;
  • 缺点:方差大,收敛速度慢;需要对整条轨迹进行采样。

2.2.2 Actor-Critic 框架

为了降低纯策略梯度方法的高方差 ,在更新策略时引入价值函数的基线 (Baseline)。这就带来了Actor-Critic框架。

  1. Actor :表示策略网络 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s),输出动作概率(或连续动作的均值、方差等);
  2. Critic :表示价值网络 V ω ( s ) V^\omega(s) Vω(s) 或 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),用来评价当前策略的好坏。

(1) 基本思想

  • 策略梯度中,如果我们用 G t − b t G_t - b_t Gt−bt 来取代 G t G_t Gt,只要 b t b_t bt 与动作无关,就不改变无偏性,可降低方差;
  • 常见做法: b t b_t bt 用价值函数 V ω ( s t ) V^\omega(s_t) Vω(st) 近似;
  • 这样,Critic 网络去学习一个状态价值函数或动作价值函数;Actor 在更新时参考 Critic 给出的基线或优势函数,减小更新的方差。

(2) A2C / A3C

  • A2C(Advantage Actor-Critic) :使用"优势函数" A ( s t , a t ) = Q ( s t , a t ) − V ( s t ) A(s_t,a_t) = Q(s_t,a_t) - V(s_t) A(st,at)=Q(st,at)−V(st) 来衡量某个动作相对平均水平的好坏;
  • A3C(Asynchronous Advantage Actor-Critic):多线程/多进程异步采样,每个线程都有自己的 Actor 和 Critic,与环境交互并计算梯度,再将梯度同步到全局参数中;
  • 优点:并行采样,效率更高;在当年的硬件条件下显著加速了训练。

(3) Actor-Critic 伪代码示例(单线程简化)

python 复制代码
Initialize Actor πθ, Critic Vω
for episode in 1 to max_episodes:
    s = env.reset()
    done = False
    while not done:
        # 1. 从策略网络中采样动作
        a = sample from πθ(a|s)
        s_next, r, done, info = env.step(a)
        
        # 2. Critic 计算 TD 误差 δ
        V_s = Vω(s)
        V_s_next = Vω(s_next) if not done else 0
        δ = r + γ * V_s_next - V_s
        
        # 3. 更新 Critic
        L_critic = δ^2
        ω ← ω - α_critic ∇ω L_critic
        
        # 4. 更新 Actor
        L_actor = - δ * log πθ(a|s)   # 这是一种简化形式
        θ ← θ - α_actor ∇θ L_actor
        
        s = s_next

2.3 高级算法

对于更复杂的场景,如连续动作高维动作的控制,我们需要更先进的算法来保证训练的稳定性和效率。下面介绍几种主流算法:DDPG、TD3、PPO、SAC。

2.3.1 DDPG(Deep Deterministic Policy Gradient)

(1) 适用场景与思路

  • 场景:连续动作空间(如机器人关节控制)。
  • 核心思想 :结合 Actor-Critic 思路,Actor 输出确定性动作 (而非动作分布),Critic 学习 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a)。
  • 学习目标:最小化 Critic 给出的负 Q 值,让 Actor 朝着"使 Q 值更高的方向"更新。

(2) 算法要点

  1. Actor 网络 μ θ ( s ) \mu_\theta(s) μθ(s) ,输入状态输出一个确定性动作;
  2. Critic 网络 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),输入状态-动作,输出对应 Q 值;
  3. Replay Buffer + Target Network(类似 DQN)减少不稳定性;
  4. 更新
    • Critic 更新 :最小化 TD 误差
      L ( ω ) = ( r + γ Q ω ( s ′ , μ θ ( s ′ ) ) − Q ω ( s , a ) ) 2 \LARGE L(\omega) = \big(r + \gamma Q^\omega(s', \mu_\theta(s')) - Q^\omega(s,a)\big)^2 L(ω)=(r+γQω(s′,μθ(s′))−Qω(s,a))2
    • Actor 更新 :基于策略梯度
      ∇ θ J ≈ E [ ∇ a Q ω ( s , a ) ∣ a = μ θ ( s ) ∇ θ μ θ ( s ) ] \LARGE \nabla_\theta J \approx \mathbb{E}\left[\nabla_a Q^\omega(s,a)\big|{a=\mu\theta(s)} \nabla_\theta \mu_\theta(s)\right] ∇θJ≈E[∇aQω(s,a) a=μθ(s)∇θμθ(s)]
    • 同步目标网络的做法与 DQN 类似。

(3) 优势与局限

  • 优势:适合连续动作;在一些机器人控制场景有良好表现;
  • 局限:训练不稳定;对超参数和初始化较敏感;容易陷入局部最优或碰到多步预测误差累积。

2.3.2 TD3(Twin Delayed DDPG)

  • 目的 :解决 DDPG 中 Critic 的过估计问题训练不稳定
  • 双 Critic:类似 Double DQN 的思想,两个独立的 Critic 网络取最小 Q 值作为目标,降低过估计;
  • 延迟更新:Actor 网络的参数更新频率低于 Critic,先让 Critic 更充分地学习;
  • 目标平滑:在下一个状态动作上加噪声,以减少因函数不平滑引起的过高估计;
  • 综合这些改进,使 TD3 在连续控制任务上比 DDPG 更鲁棒。

2.3.3 PPO(Proximal Policy Optimization)

(1) 算法动机

  • 场景:On-policy 策略梯度算法,兼具易实现、稳定和高效的特性;
  • 问题:直接进行策略梯度更新,步长较大时会毁掉之前学到的策略,引发不稳定。
  • 解决:PPO 在更新时约束新旧策略的差异,不使策略迭代步太大。

(2) 算法核心

  • 使用**剪切(clipping)**的目标函数,限制更新幅度;
  • 定义概率比
    r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \LARGE r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} rt(θ)=πθold(at∣st)πθ(at∣st)
    然后在优化时将其裁剪在一定范围内(如 [1- ϵ \epsilon ϵ, 1+ ϵ \epsilon ϵ]);
  • 这样可以兼顾
    • 收益提升(策略改进)
    • 稳定性(不让新旧策略差别过大)

(3) 实践效果

  • PPO 是当前深度强化学习中最常用的 on-policy 算法之一;
  • 实现和调参相对友好,在 MuJoCo 或许多学术竞赛任务中表现出色。

2.3.4 SAC(Soft Actor-Critic)

(1) 核心理念:熵正则化

  • SAC 是一种 off-policy 的 Actor-Critic 算法;
  • 目标不仅是最大化回报,还要最大化策略的熵(entropy),鼓励策略尽量保持随机,以提升探索能力、提高鲁棒性;
  • 通过在目标中加入熵项 α H ( π ( ⋅ ∣ s ) ) \alpha \mathcal{H}(\pi(\cdot|s)) αH(π(⋅∣s)),来平衡"高回报"与"高熵"之间的关系。

(2) 算法结构

  1. Actor:输出动作分布参数(高斯分布的均值、方差);
  2. Critic:有两个 Q 网络(双 Critic),取较小值来抑制过估计;
  3. 温度系数 α \alpha α:控制熵奖励权重,可以固定或自适应调参;
  4. off-policy:从 Replay Buffer 采样。

(3) 优势

  • 稳定收敛:利用双 Critic + 目标平滑 + 熵正则;
  • 高探索:让策略在训练前期保持足够随机,减少早期陷入局部最优;
  • 在许多连续控制任务中性能优异,且收敛更稳定。

总结与对比

算法 特点 适用场景 优缺点
DQN 离散动作;用 NN 逼近 Q 值;Experience Replay & Target Network Atari、离散控制 易实现;对离散动作较好;对连续动作需改进;存在过估计等问题
Double DQN DQN 改进,解决过估计 与 DQN 相同 减小过估计,训练更稳定
Dueling DQN 拆分状态价值和优势函数 与 DQN 相同 对无关动作时能更好提取状态价值
Prioritized Replay 根据 TD 误差进行优先级采样 与 DQN 相同 数据利用率高,但需重要性采样修正
Policy Gradient (REINFORCE) 直接对策略参数化,梯度上升 可处理离散或连续动作 实现简单;方差大,收敛慢
Actor-Critic (A2C/A3C) 策略网络 + 价值网络,降低方差 常用在并行、多线程场景 训练速度快,易于扩展;可能仍有不稳定
DDPG 基于 Actor-Critic,用确定性策略处理连续动作 机器人控制、模拟仿真等连续任务 适合连续动作;易陷入不稳定,需 carefully 调参
TD3 双 Critic + 延迟更新 + 目标平滑,改进 DDPG 与 DDPG 同 更鲁棒,减少过估计;实现稍复杂
PPO On-policy,使用剪切损失保证策略改进稳定 机器人、游戏等多种场景 易实现、效果好;在学术及工业上均较常用
SAC Off-policy,熵正则化,鼓励探索 连续动作、高维控制 收敛稳定,探索充分;在许多基准任务中效果出色

通过上表,我们可以看到离散动作 环境通常用 DQN 系列 (或 Policy Gradient 的离散版),而连续动作 环境往往使用 DDPG/TD3/PPO/SAC 等。具体选择哪种算法,一般需要根据环境特征数据采集方式 (on-policy 或 off-policy)、以及对稳定性采样效率的要求做综合考量。


总结

  1. DQN 系列:适用于离散动作。DQN 引入 Experience Replay、Target Network,后续演化出 Double DQN、Dueling DQN、优先级回放、Rainbow 等。
  2. Policy Gradient 系列 :适用于离散或连续动作,直接对策略进行参数化:
    • 基本策略梯度(REINFORCE)概念最简单,但方差大;
    • Actor-Critic 引入价值函数基线,降低方差,衍生出 A2C/A3C 等多线程并行方式。
  3. 高级算法
    • DDPG、TD3:典型的 off-policy Actor-Critic,用于连续动作;
    • PPO:on-policy 策略梯度,带剪切损失,稳定性好;
    • SAC:off-policy,双 Critic + 熵正则,探索充分、表现稳定。

掌握了深度强化学习主流算法 的基本原理、核心公式和核心实现细节,并能够在常见基准环境(如 OpenAI Gym、Atari、MuJoCo 等)上独立训练和测试这些算法。这为后续在多智能体强化学习人机协作指挥决策等更复杂场景的扩展奠定了坚实基础。

相关推荐
Xiao Tong33325 分钟前
八大排序算法(Java,便于理解)
java·算法·排序算法
梵谷的忧伤1 小时前
两个栈实现队列(D)
java·开发语言·前端·算法
WeeJot嵌入式1 小时前
【数据结构】链表
数据结构·算法·链表
java 乐山1 小时前
备份 esp32c3 Supermini 作为ble client,esp32 作为ble server
算法
就叫飞六吧2 小时前
C语言中,`extern` 和 `#include`
c语言·c++·算法
冠位观测者2 小时前
【Leetcode 热题 100】394. 字符串解码
数据结构·算法·leetcode
涛ing3 小时前
12. C语言 数组与指针(深入理解)
linux·c语言·开发语言·数据结构·c++·算法·ubuntu
nwsuaf_huasir4 小时前
S变换matlab实现
人工智能·算法·matlab
伊一大数据&人工智能学习日志4 小时前
决策树中的相关概念
算法·决策树·机器学习