DDPG 2015 — 让神经网络直接学会连续动作控制
待复核DDPG(Deep Deterministic Policy Gradient)是一种让智能体在连续动作空间里直接输出动作数值的深度强化学习算法。日常类比:像教新手开车,不是让他从”左打满、直走、右打满”三个按钮里选,而是让他直接说方向盘转多少度、油门踩多深。
DQN 当年把深度网络带进强化学习,但它更适合”动作是几个按钮”的游戏。机械臂、赛车、双足机器人这类任务的动作是实数,比如关节扭矩 0.37、刹车力度 0.12,如果硬切成很多格,动作数量会爆炸。
DDPG 的核心做法是:用一个 actor 网络负责出动作,用一个 critic 网络负责评价这个动作值多少钱,再借用 DQN 的经验回放和目标网络让训练不至于立刻发散。
不理解 DDPG,下面这些事都很难解释:
- 为什么 DQN 玩 Atari 很强,但直接拿去控制机械臂会卡在”连续动作怎么取最大值”这一步
- 为什么现代连续控制算法 TD3、SAC 都在讨论 actor、critic、target network 和 replay buffer
- 为什么强化学习里”能跑起来”和”有收敛证明”经常不是一回事,DDPG 就是工程稳定性优先的代表
- 为什么从像素直接学控制曾经很震撼:它把视觉输入、价值估计、动作输出接到同一个训练流程里
DDPG 可以拆成 三件事:
-
actor 直接给动作:actor 像驾驶员,看到状态
s后直接输出动作a。类比:司机不是查一本”每种路况选哪个按钮”的表,而是直接微调方向盘和油门。 -
critic 给 actor 打分:critic 像教练,判断”在这个状态做这个动作,长期看能拿多少回报”。它学的是
Q(s, a),所以 actor 可以沿着”让 Q 变大”的方向更新。 -
DQN 的稳定器搬过来:经验回放打乱连续经历,目标网络提供慢慢变化的训练目标。类比:练车录像随机抽样复盘,不只盯着刚发生的一小段,同时教练评分标准不要每分钟大变。
这三件事合起来,就是把 DPG 的确定性策略梯度装进深度网络,再用 DQN 的经验稳定技巧保护训练。
案例 1:为什么不能把连续动作粗暴切格子
Section titled “案例 1:为什么不能把连续动作粗暴切格子”假设机械臂有 7 个关节,每个关节只允许三个动作:
const choicesPerJoint = 3const joints = 7const totalActions = choicesPerJoint ** jointsconsole.log(totalActions) // 2187逐部分解释:
choicesPerJoint表示每个关节只取”负、零、正”三个粗动作joints表示人形手臂这种多自由度系统2187还只是很粗的控制;如果每个关节分 11 档,动作数会变成11 ** 7
这就是论文说 DQN 难以直接迁移的原因:连续动作空间里,每一步都找 argmax_a Q(s, a) 太慢,离散化又太粗。
案例 2:actor-critic 一步训练在做什么
Section titled “案例 2:actor-critic 一步训练在做什么”DDPG 的一次更新可以用伪代码理解:
batch = replay_buffer.sample()y = r + gamma * target_critic(s2, target_actor(s2))critic.minimize((critic(s, a) - y) ** 2)actor.maximize(critic(s, actor(s)))soft_update(target_actor, actor, tau=0.001)soft_update(target_critic, critic, tau=0.001)逐部分解释:
critic先学会估计”这一步动作之后的长期收益”actor再选择能让critic打高分的动作target_actor和target_critic不立刻复制参数,而是慢慢跟上,避免训练目标剧烈晃动
这里最关键的直觉是:actor 不需要枚举所有动作,它问 critic “往哪个方向调动作会更好”。
案例 3:探索噪声为什么要单独加
Section titled “案例 3:探索噪声为什么要单独加”DDPG 的 actor 是确定性的,同一个状态会给同一个动作,所以训练时要主动加噪声:
def choose_action(state, training=True): action = actor(state) if training: action = action + ou_noise.sample() return clip(action, low=-1, high=1)逐部分解释:
actor(state)是当前策略给出的动作ou_noise是带时间相关性的噪声,适合有惯性的物理控制clip保证动作仍在环境允许范围内
论文使用 Ornstein-Uhlenbeck 噪声,是因为机械系统的动作通常不应每一帧都毫无关联地乱跳。
-
把 DDPG 当成 DQN 的小改版:错在忽略连续动作不能便宜枚举,actor 网络正是为绕开这个瓶颈而来。
-
只保留 actor,不认真训练 critic:原因是 actor 的梯度来自 critic,如果 critic 价值估计乱,actor 就会朝错误方向变得更自信。
-
去掉 target network 还能稳定:论文消融显示目标网络很关键,因为 bootstrap 目标如果跟着当前网络剧烈变化,Q 学习容易发散。
-
以为 OU 噪声是算法本体:OU 噪声只是探索策略的一种选择,后来的算法常换成更简单的高斯噪声或熵正则探索。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 动作是连续实数的控制任务,比如机械臂、摆杆、赛车、行走机器人
- 有模拟器可以大量采样的任务,因为 DDPG 仍然需要很多交互数据
- 想理解 TD3、SAC、现代 actor-critic 系列算法的历史起点
- 需要从低维状态或像素输入直接训练策略的基线实验
不适用:
- 动作本来就是少量离散按钮的任务 → DQN / PPO 可能更自然
- 真实机器人上采样极贵的任务 → 纯 model-free DDPG 往往数据效率不够
- 对训练稳定性要求极高的场景 → TD3 / SAC 通常比原始 DDPG 更稳
- 需要严格收敛保证的理论分析 → 深度非线性函数逼近让保证基本失效
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2013-2015 年:DQN 用经验回放和目标网络稳定了 Atari 像素游戏里的 Q 学习。
- 2014 年:Silver 等人提出 Deterministic Policy Gradient,说明确定性策略也可以有策略梯度。
- 2015 年:Lillicrap 等人把 DPG、DQN 稳定技巧和深度 actor-critic 合在一起,形成 DDPG。
- 2018 年:TD3 直接针对 DDPG 的过估计和脆弱性做补丁,加入双 critic、延迟 actor 更新和 target policy smoothing。
- 之后:SAC 用随机策略和熵正则把探索做得更稳,成为连续控制常用默认选择之一。
- 连续动作不能靠枚举硬凑:动作维度稍高,离散化就会指数爆炸。
- actor 和 critic 是分工合作:actor 负责做决定,critic 负责评价决定,并给 actor 提供改进方向。
- 稳定技巧常比公式更重要:replay buffer、target network、batch normalization 是 DDPG 能跑起来的关键工程部件。
- DDPG 是许多后来算法的”原型机”:TD3 和 SAC 都是在回答”DDPG 哪里不稳,以及怎么修”。
- 论文 PDF:Continuous Control with Deep Reinforcement Learning
- dqn —— DDPG 借用了 DQN 的经验回放和目标网络,只是把离散动作换成连续动作。
- td3-2018 —— TD3 是对 DDPG 训练不稳、Q 值过估计的直接修补。
- sac-2018 —— SAC 保留 actor-critic 框架,但用最大熵目标强化探索和稳定性。
- online-evolution-deep-convolutional-network-vision-based-2014 ——
paper-context找到的相关视觉强化学习工作,可作为像素控制背景阅读。
- dqn —— 给 DDPG 提供 replay buffer 和 target network 这两件稳定器。
- td3-2018 —— 继承 DDPG 框架,并修正过估计和 actor 更新太频繁的问题。
- sac-2018 —— 同属连续控制 actor-critic,但用随机策略和熵奖励替代确定性探索。
- ppo —— 另一条主流策略梯度路线,更常用于通用强化学习基线。
- deterministic-policy-gradient-2014 —— DDPG 的理论前身,说明确定性 actor 如何更新。
- mujoco-2012 —— DDPG 实验中大量物理控制任务所依赖的模拟器。
- sac-2018 —— Soft Actor-Critic — 让强化学习既会拿分又愿意多试