CMDP强化学习入门指南:从零搭建智能决策系统

1次阅读
没有评论

共计 2197 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

传统强化学习(RL)在工业场景中常遇到一个棘手问题:训练出的策略虽然能最大化累积奖励,却可能违反实际业务中的硬性约束条件。比如在机器人控制中,算法可能让机械臂以危险速度运动;在金融交易中,策略可能超出风险敞口限制。这类问题源于标准马尔可夫决策过程(MDP)框架没有显式建模约束条件。

CMDP 强化学习入门指南:从零搭建智能决策系统

CMDP(Constrained Markov Decision Process)通过引入约束成本函数 $C(s,a)$ 和阈值 $d$,将问题表述为:

$$\max_\pi \mathbb{E}[\sum_{t=0}^T \gamma^t R(s_t,a_t)]$$
$$\text{s.t.} \quad \mathbb{E}[\sum_{t=0}^T \gamma^t C(s_t,a_t)] \leq d$$

技术对比

维度 MDP CMDP
状态空间 $S$ $S$ (附加约束观测)
奖励函数 $R(s,a)$ $R(s,a)$ + 拉格朗日惩罚项
策略目标 最大化累积奖励 在约束下优化奖励
数学表达 $\max_\pi J(\pi)$ $\max_\pi J(\pi) \text{s.t.} C(\pi) \leq d$

核心实现

下面是带 Lagrangian 乘数的 PPO 实现关键代码(PyTorch):

import torch
import torch.optim as optim

class ConstrainedPPO:
    def __init__(self, policy, cost_limit=0.2, lr=3e-4):
        # 约束阈值和拉格朗日乘数初始化
        self.cost_limit = cost_limit
        self.lagrangian = torch.tensor(1.0, requires_grad=True)
        self.optimizer = optim.Adam([{'params': policy.parameters()},
            {'params': [self.lagrangian], 'lr': 1e-2}
        ], lr=lr)

    def update(self, samples: Dict[str, torch.Tensor]):
        """
        更新策略和拉格朗日乘数
        Args:
            samples: 包含 states, actions, rewards, costs 的字典
        """
        # PPO 策略损失计算 (简化版)
        advantages = compute_gae(samples['rewards'])
        ratio = (new_log_prob - old_log_prob).exp()
        policy_loss = -torch.min(
            ratio * advantages,
            torch.clamp(ratio, 1-0.2, 1+0.2) * advantages
        ).mean()

        # 约束成本计算
        cost_surrogate = (samples['costs'] * ratio).mean()

        # 拉格朗日损失 (公式: max_λ min_π L(π,λ))
        lagrangian_loss = -self.lagrangian * (cost_surrogate - self.cost_limit)

        # 联合优化
        total_loss = policy_loss + lagrangian_loss
        self.optimizer.zero_grad()
        total_loss.backward()
        self.optimizer.step()

        # 乘数投影到非负空间
        with torch.no_grad():
            self.lagrangian.copy_(torch.clamp(self.lagrangian, min=0.0))

避坑指南

  1. 拉格朗日乘数初始化:
  2. 建议初始值设为 1.0-5.0 范围
  3. 学习率应小于策略网络学习率(通常 1 /10)

  4. 多约束处理:

  5. 对每个约束使用独立乘数
  6. 通过成本加权处理优先级:$\sum_i w_i C_i(s,a)$

验证环节

在 Safety-Gym 的 PointGoal1 环境测试结果:

方法 平均奖励 约束违反次数
PPO 25.7 83
CMDP-PPO 23.1 9

部署优化技巧:
1. 使用 TorchScript 导出模型减少推理延迟
2. 对约束成本函数进行移动平均滤波

延伸思考

动态约束适应机制的可能方向:
1. 基于场景识别的约束阈值调整
2. 分层强化学习架构:上层调整约束,下层优化策略
3. 在线学习乘数调整率

完整训练流程

import wandb

# 初始化 wandb
wandb.init(project="cmdp_demo", config={
    "cost_limit": 0.2,
    "lagrangian_lr": 1e-2
})

env = make_safe_env()
agent = ConstrainedPPO(PolicyNetwork())

for epoch in range(100):
    # 采样轨迹
    samples = collect_trajectories(env, agent)

    # 更新参数
    agent.update(samples)

    # 记录指标
    wandb.log({"reward": samples["rewards"].mean(),
        "cost": samples["costs"].mean(),
        "lagrangian": agent.lagrangian.item()})

通过以上实现,我们构建了一个考虑安全约束的强化学习系统。CMDP 框架的引入虽然增加了算法复杂度,但显著提升了策略的可靠性和可用性,特别适合自动驾驶、金融风控等对安全性要求高的场景。

正文完
 0
评论(没有评论)