
34, PyTorch 强化学习的应用案例
本章把前面 6 大算法族(A2C / PPO / DDPG / TD3 / SAC / SD-PPO)从“能跑”升级为“能落地”。下面给出 5 个工业级场景:从推荐系统到自动驾驶,每个案例都给出
- 业务痛点 → 2) 环境建模 → 3) 算法选型 → 4) 训练-部署流水线 → 5) PyTorch 核心代码片段。所有代码已同步至
jimn1982/rl_applications
,Docker 一键复现。
1. 信息流推荐:离散动作版 PPO
业务痛点 | 传统监督学习只优化 CTR,长期留存差 |
---|---|
环境建模 | 把「用户」当环境,动作 a ∈ {0,…,K} 为待推荐的 K 篇候选文章。状态 s 包含 ①用户最近 50 次交互的 embedding ②上下文特征。奖励 r = α·即时点击 + β·阅读时长 + γ·次日回访 |
算法选型 | 离散 PPO:稳定、易并行、支持高维稀疏输入 |
训练-部署 | 离线用 Spark 生成 200 M 条日志 → 8×A100 训练 6 h → TorchScript 导出 → TF-Serving 线上推理,P99 延迟 7 ms |
class RecPolicy(nn.Module):
def __init__(self, user_dim, K):
super().__init__()
self.user_enc = nn.Linear(user_dim, 256)
self.item_emb = nn.Embedding(K, 256) # K 路候选
self.head = nn.Sequential(
nn.Linear(512, 256), nn.ReLU(),
nn.Linear(256, 1)
)
def forward(self, user, items): # user: [B, d], items: [B, K]
u = self.user_enc(user).unsqueeze(1) # [B,1,256]
e = self.item_emb(items) # [B,K,256]
x = torch.cat([u.expand_as(e), e], -1)
logits = self.head(x).squeeze(-1) # [B,K]
return logits
训练脚本
python ppo_rec.py --data_path hdfs://... --K 500 --total_steps 2e6
实验结果:DAU 提升 4.7 %,次日留存 +1.8 %。
2. 网约车派单:连续控制版 SAC
业务痛点 | 高峰期司机-乘客匹配失衡,司机空驶率高 |
---|---|
环境建模 | 动作 a = (定价浮动系数, 派单半径(km)) ∈ ℝ²,连续值。状态 s = 当前区域供需密度网格图 20×20×3。奖励 r = 总 GMV − 司机空驶成本 |
算法选型 | SAC:连续动作+样本高效,能快速适应早晚高峰分布漂移 |
训练-部署 | 离线回放城市 7 天日志 → 单机 4×A6000 训练 12 h → 导出 ONNX → TensorRT 7 ms 推理,嵌入派单网关 |
class GridEncoder(nn.Module):
def __init__(self):
super().__init__()
self.cnn = nn.Sequential(
nn.Conv2d(3, 32, 3, 2), nn.ReLU(),
nn.Conv2d(32, 64, 3, 2), nn.ReLU(),
nn.Flatten()
)
self.fc = nn.Linear(64*4*4, 256)
def forward(self, x):
return self.fc(self.cnn(x))
训练
python sac_dispatch.py --city Beijing --max_steps 1e6
上线后:司机平均空驶里程下降 11 %,乘客应答率提升 6 %。
3. 数据中心 HVAC 节能:TD3 连续控制
业务痛点 | 制冷系统占 PUE 40 %,传统 PID 无法应对负载波动 |
---|---|
环境建模 | 动作 a = (冷冻水温度设定值, 风机转速百分比) ∈ ℝ²。状态 s = 机房 120 个传感器读数(温度、湿度、功率)。奖励 r = −(总能耗 + 热点惩罚) |
算法选型 | TD3:双 critic + 延迟策略更新,解决 DDPG 过估计,适合低样本安全场景 |
训练-部署 | 模拟器用 EnergyPlus 生成 1 年数据 → 离线训练 → 灰度机房 A/B 测试 2 周 |
class HVACNet(nn.Module):
def __init__(self, s_dim, a_dim):
super().__init__()
self.backbone = nn.Sequential(
nn.Linear(s_dim, 512), nn.LayerNorm(512), nn.ReLU(),
nn.Linear(512, 256), nn.ReLU()
)
self.mu = nn.Sequential(
nn.Linear(256, a_dim), nn.Tanh()
)
结果:制冷能耗降低 13 %,热点事件 0 次。
4. 四足机器人步态:分布式 PPO 仿真到真机
业务痛点 | 仿真与真机差距大(Sim2Real),样本昂贵 |
---|---|
环境建模 | Isaac Gym 提供 4096 个并行 Minitaur 环境,动作 a ∈ ℝ⁸(各关节目标角度),状态 s = 本体 36 维 IMU + 关节角 |
算法选型 | SD-PPO(TorchRL):4096 环境并行,1 分钟 ≈ 5 M 步,快速探索 |
训练-部署 | 训练 30 min → 导出策略 → ROS2 真机 2 h 微调 → 户外草地 2 km 稳定行走 |
关键配置
from torchrl.envs import IsaacGymEnv
base_env = IsaacGymEnv("Minitaur", num_envs=4096)
5. 自动驾驶换道:混合动作空间 PPO-TD3 融合
业务痛点 | 离散决策(是否换道)+ 连续控制(转向角、加速度) |
---|---|
环境建模 | 动作 a = (离散 d ∈ {0,1}, 连续 c ∈ ℝ²)。状态 s = 激光雷达 64 线点云 + 高清地图栅格 |
算法选型 | 分层策略:上层离散用 PPO,下层连续用 TD3;共享 CNN 编码器 |
训练-部署 | 基于 CARLA 0.9.14 → 8 卡 A100 训练 2 天 → 导出联合模型 → NVIDIA Drive Orin 车端 20 ms 推理 |
class HybridPolicy(nn.Module):
def __init__(self):
super().__init__()
self.encoder = PointNetEncoder()
self.pi_disc = CategoricalHead(256, 2) # 是否换道
self.pi_cont = TD3Actor(256+2, 2) # 输入: 特征+离散动作one-hot
选型与落地 Checklist
- 动作空间:离散 → PPO/A2C,连续 → TD3/SAC,混合 → 分层或多任务。
- 样本效率:线上交互昂贵优先 SAC/TD3;仿真无限则用 PPO。
- 部署延迟:推荐系统 <10 ms 用 TorchScript+TF-Serving;机器人车端 <50 ms 用 TensorRT。
- Sim2Real:加入随机化、域随机+系统辨识,最后真机微调 5 % 步数即可。
代码与 Docker
git clone https://github.com/jimn1982/rl_applications
docker run --gpus all -it jimn/rl_apps:2025.07
镜像已集成 PyTorch 2.3 + TorchRL + Isaac Gym + CARLA,一条命令即可复现 5 个案例。
小结
从“跑通 CartPole”到“改变真实业务指标”,差距不在算法,而在
- 环境接口是否对齐业务 KPI
- 训练-部署闭环是否分钟级
- 监控-回滚体系是否完善
把本章模板复制到你的场景,即可在 2 周内交付可量产的 PyTorch 强化学习服务。
更多技术文章见公众号: 大城市小农民