Deep Reinforcement Learning
深度强化学习(DRL)使用神经网络从像素等原始输入中学习策略和值函数。介绍 DQN、PPO、相关成果和局限。
深度强化学习(DRL)将强化学习(RL)与深度神经网络结合起来:强化学习中的代理通过试错学习以最大化奖励,而深度神经网络则表示代理学到的内容。经典强化学习会在表格中为每个状态存储一个数值;如果状态是摄像头图像或机器人连续变化的关节角度,这种做法就不可行。神经网络则会将像素、激光雷达扫描或文本等原始高维观测映射为动作值或动作概率,并能泛化到从未见过的状态。DeepMind 的 DQN 在 2015 年让这种方法广为人知:它只根据屏幕像素和游戏分数,学会了玩 49 款 Atari 2600 游戏,使用同一种网络架构和同一组超参数,达到与专业游戏测试人员相当的水平。
深度强化学习的工作原理#
代理仍然遵循马尔可夫决策过程的强化学习循环:观察状态、采取行动、接收奖励并进行更新。变化之处在于,现在由一个包含数百万个参数的网络来表示以下内容之一或多项:
- 价值函数: 网络预测每个动作的预期回报,代理选择回报最高的动作。DQN 的网络会读取最近四帧游戏画面,并将画面缩小到 84×84 像素,以便识别运动。
- 策略: 网络会为每个动作输出一个概率,或者为转向角等连续动作输出均值和离散程度;策略梯度方法会直接调整策略,使获得高回报的动作更有可能被选中。
- 行动者与评论家: 行动者网络选择动作,评论家网络估算价值,并告诉行动者每个动作比预期好多少,从而减少更新过程中的噪声。
- 世界模型: Dreamer 等基于模型的代理会训练网络来预测未来观测和奖励,然后在学到的模拟器中学习策略。
在代理自己生成的数据上训练网络并不稳定,因为连续帧高度相关,而且网络变化时训练目标也会跟着变化。DQN 通过两个后来算法沿用的思路解决了这个问题:经验回放缓冲区从过去的状态转移中随机抽取小批次进行训练;独立的目标网络则仅定期更新:
代码中的策略梯度#
策略梯度方法完全跳过价值表:它们从网络中采样动作,然后提高那些随后获得高回报的动作的概率。以下 PyTorch 示例使用 REINFORCE(最初的策略梯度算法)训练一个小型策略网络,使其在移动小车上保持杆子直立,并在Gymnasium CartPole 环境中运行:
import gymnasium as gym
import torch
from torch import nn
torch.manual_seed(0)
env = gym.make("CartPole-v1")
policy = nn.Sequential(nn.Linear(4, 64), nn.ReLU(), nn.Linear(64, 2)) # cart and pole state -> logits for left/right
optimizer = torch.optim.Adam(policy.parameters(), lr=0.02)
lengths = []
for episode in range(500):
obs, _ = env.reset(seed=episode)
log_probs, rewards, done = [], [], False
while not done: # play one episode with the current policy, earning +1 per step the pole stays up
dist = torch.distributions.Categorical(logits=policy(torch.as_tensor(obs)))
action = dist.sample()
obs, reward, terminated, truncated, _ = env.step(action.item())
log_probs.append(dist.log_prob(action))
rewards.append(reward)
done = terminated or truncated
# REINFORCE: raise the log-probability of actions followed by above-average discounted return
returns = torch.tensor([sum(0.99**k * r for k, r in enumerate(rewards[t:])) for t in range(len(rewards))])
loss = -(torch.stack(log_probs) * (returns - returns.mean()) / (returns.std() + 1e-8)).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()
lengths.append(len(rewards))
print(f"Average episode length: first 20 = {sum(lengths[:20]) / 20:.0f}, last 20 = {sum(lengths[-20:]) / 20:.0f}")它会打印 first 20 = 14, last 20 = 500:未经训练的网络大约在 14 步内就会让杆子倒下;训练 500 个回合后,它则能在每个回合的 500 步上限内保持平衡。使用其他随机种子运行时,同一脚本可能会在训练中途停滞或性能崩溃;评论家和近端策略优化(PPO)的裁剪更新正是为降低这种高方差而设计的。Stable-Baselines3等库提供经过测试的 PPO、DQN 和软行动者评论家(SAC)实现。
代表性应用#
- 游戏: 在 Atari 游戏之后,深度强化学习代理通过 AlphaGo 击败了围棋世界冠军,并通过 AlphaStar 达到《StarCraft II》宗师级水平;这些系统将从人类对局中学习与强化学习自我对弈结合起来。
- 无人机竞速: 苏黎世大学的 Swift 无人机先在模拟环境中使用深度强化学习训练,再利用真实飞行数据微调;2023 年,它在与三位冠军飞行员分别进行的多场正面对决中均获胜,并创下最快的有记录竞速时间。
- 聚变能源: DeepMind 和 EPFL 的 Swiss Plasma Center 使用深度强化学习策略控制托卡马克的磁线圈,将等离子体塑造成多种构型,其中包括同时形成两个彼此分离的等离子体“液滴”。
- 机器人技术: 足式机器人通过在数千个模拟机器人上训练的策略,学会在崎岖地形上行走;训练期间会随机改变摩擦力和质量,使策略能够适应真实硬件。
- 语言模型: 基于偏好或自动验证奖励的 Transformer 策略强化学习微调,造就了如今的聊天助手和推理模型。
感知作为观测#
DQN 的卷积神经网络只能通过奖励来学习如何识别图像,每一步都要处理 84×84×4 = 28,224 个像素值。许多机器人和自动驾驶系统则将预训练计算机视觉模型的输出输入策略网络,从而缩小观测空间,让 RL 算法把样本用于决策。Ultralytics YOLO26的跟踪模式会将每帧摄像头图像转换为每个物体的类别、边界框和持久 ID,形成以物体为中心的状态;策略网络还可以据此读取每个物体在不同帧之间的运动情况。
挑战#
深度 RL 对数据的需求很高:DQN 在每个游戏中使用 5,000 万帧进行训练,相当于约 38 天的游戏时间。这就是大多数机器人策略先在仿真环境中训练、再迁移到硬件上的原因。仿真物理永远无法与现实完全一致,因此工程师会使用领域随机化随机调整摩擦力、质量、光照和纹理,并添加合成数据来覆盖罕见情况。随机种子、超参数和实现细节也会显著影响结果;《深度强化学习的重要性》一文讨论了这一可复现性问题。强大的优化器还会利用任何不完善奖励函数中的漏洞,这种失败称为奖励破解;例如,某个赛艇智能体学会了无休止地绕圈收集分数,而不是完成比赛。
深度 RL 与相关术语的区别#
- 强化学习:更广泛的领域。表格型 RL 适用于小型问题,而深度 RL 是使用神经网络作为函数逼近器的 RL。
- 深度学习:常规深度学习使用固定的标注数据集进行训练。在深度 RL 中,智能体自身的动作会生成数据,训练信号则是延迟奖励,而不是标签。
- 基于人类反馈的强化学习 (RLHF):一种深度 RL 方法,使用根据人类偏好比较训练出的奖励模型替代手写奖励,用于对齐语言模型。
- 模型预测控制:MPC 会在每个控制步骤中基于显式模型重新进行优化,而经过训练的深度 RL 策略则通过网络的一次前向传播来选择每个动作。










