强化学习入门-7(DDPG)
强化学习项目-7-LunarLanderContinuous-v3(DDPG)
环境
本项目使用的是OpenAI Gym提供的经典控制环境的连续动作版本。与PPO笔记中的离散版本不同,这里的动作空间是连续的数值。
官网链接:https://gymnasium.farama.org/environments/box2d/lunar_lander/
动作空间 (Continuous)
动作是一个维度为2的向量 $a \in [-1, 1]^2$:
- 主引擎 (Main Engine):
- $-1 \sim 0$: 引擎关闭
- $0 \sim +1$: 引擎开启,数值越大推力越大(从50%到100%功率)
- 侧向推进器 (Side Engines):
- $-1 \sim -0.5$: 右侧推进器开启(推向左)
- $-0.5 \sim 0.5$: 关闭
- $0.5 \sim 1$: 左侧推进器开启(推向右)
状态向量
与离散版一致,维度为8:
$$
s = [x, y, \dot{x}, \dot{y}, \theta, \dot{\theta}, l, r]^T
$$
奖励函数
- 逻辑与离散版基本一致(靠近平台加分、坠毁扣分等)。
- 区别:连续动作版本中,喷射燃料的扣分是根据动作的连续数值计算的,因此更鼓励“精准控制”油门,而非频繁的开关。
引入环境
注意需要指定 continuous=True。
1 | |
DDPG 算法
DDPG (Deep Deterministic Policy Gradient) 是一种基于 Actor-Critic 架构的算法,专门用于解决 连续动作空间 的问题。它结合了 DQN 的思想(经验回放、目标网络)和确定性策略梯度。
核心组件
- Actor 网络 ($\mu$): 输入状态 $s$,直接输出确定的动作值 $a$。
- Critic 网络 ($Q$): 输入状态 $s$ 和动作 $a$,输出该动作的价值 $Q(s, a)$。
- 目标网络 (Target Networks): $\mu’$ 和 $Q’$,用于计算TD目标,保持训练稳定。
- 经验回放池 (Replay Buffer): 存储 $(s, a, r, s’, done)$,打破数据相关性。
损失函数
1. Critic 损失 (Value Loss)
Critic 的目标是最小化预测的 Q 值与 TD Target 之间的均方误差:
$$ L = \frac{1}{N} \sum (y_i - Q(s_i, a_i|\theta^Q))^2 $$
其中目标值 $y_i$ 由目标网络计算:
$$ y_i = r_i + \gamma Q’(s_{i+1}, \mu’(s_{i+1}|\theta^{\mu’})|\theta^{Q’}) \cdot (1 - d_i) $$
2. Actor 损失 (Policy Loss)
Actor 的目标是最大化 Critic 对其输出动作的评分。在梯度下降中,我们通过最小化 Q 值的负数来实现:
$$ J(\theta^\mu) = - \frac{1}{N} \sum Q(s_i, \mu(s_i|\theta^\mu)|\theta^Q) $$
探索策略 (Exploration)
由于 DDPG 是确定性策略,为了让智能体探索环境,我们在训练时给动作添加噪声:
$$ a_{exec} = \text{clip}(\mu(s) + \mathcal{N}, -a_{max}, a_{max}) $$
本项目中使用 高斯噪声 (Gaussian Noise) ,并随训练进行衰减。
高斯噪声代码(gemini3生成):
1 | |
软更新 (Soft Update)
不同于 DQN 的硬更新,DDPG 采用软更新来缓慢更新目标网络参数:
$$ \theta’ \leftarrow \tau \theta + (1 - \tau) \theta’ $$
其中 $\tau$ 通常取极小值 (如 0.005)。
代码实现
模型定义 (Actor & Critic)
注意这里Critic网络输出的是$Q(s, a)$,因此输入层节点个数为状态与动作维度之和
1 | |
DDPG 类完整代码
1 | |
训练流程
训练中加入了高斯噪声衰减机制和 预热(Warmup 阶段,以平衡探索与利用。
预热:设置在前5000步内使用系统的随机动作,并且不进行模型训练。
1 | |
训练结果
经过参数调整(增大 Batch Size 至 512,增大 Buffer 至 100000),模型成功收敛。
可以看到,模型在前期(约前800轮)处于探索阶段,分数较低;在预热结束且 Buffer 充足后,分数迅速上升,最终稳定在 200 分以上,实现了平稳着陆。
