You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Matlab/Simulink中我的PPO强化学习代理动作超出设定上下限?

MATLAB内置PPO Agent非对称动作空间越界问题修复方案

故障原因

MATLAB 自带的rlPPOAgent对连续动作空间的默认输出逻辑仅适配对称上下限(如[-1,1])场景,会直接对tanh激活的输出乘以动作上限值完成缩放,不会自动适配你设置的非对称动作范围(第一路动作上下限为[0,1],其余为[-1,1])。而DDPG等离线策略算法内部默认开启了动作范围校验裁剪,因此不会出现该问题。

修复方案

你可以选择以下任意一种方案解决问题:

  • 方案1:启用PPO内置动作裁剪开关(快速修复,适合初步验证)
    只需在rlPPOAgentOptions中新增"ClipAction", true配置,即可让PPO自动将输出动作裁剪到你定义的上下限范围内,修改后的配置代码如下:

    ppo_opt = rlPPOAgentOptions("SampleTime", 0.01, "ClipAction", true);
    

    注意:该方案属于硬裁剪,可能在训练初期导致梯度传递异常,训练收敛速度变慢,仅适合临时验证使用。

  • 方案2:自定义Actor网络适配非对称动作范围(推荐,训练稳定性更高)
    手动构建Actor网络,对不同动作维度使用对应激活函数直接输出符合范围要求的动作值,无需依赖后续裁剪,示例代码如下:

    % 构建Actor网络
    obsInput = featureInputLayer(17, "Name", "obs");
    hidden1 = fullyConnectedLayer(64, "Name", "fc1");
    relu1 = reluLayer("Name", "relu1");
    hidden2 = fullyConnectedLayer(64, "Name", "fc2");
    relu2 = reluLayer("Name", "relu2");
    % 输出层:输出5个动作原始值
    fcOut = fullyConnectedLayer(5, "Name", "fcOut");
    % 自定义缩放层:第一路过sigmoid输出0~1,其余4路过tanh输出-1~1
    scalingLayer = functionLayer(@(x) [sigmoid(x(:,1)), tanh(x(:,2:5))], "Name", "actionScale");
    
    actorNet = layerGraph(obsInput);
    actorNet = addLayers(actorNet, [hidden1, relu1, hidden2, relu2, fcOut, scalingLayer]);
    
    % 创建Actor表示
    actor = rlContinuousDeterministicActor(actorNet, obsInfo, actInfo);
    % 用自定义Actor创建PPO Agent
    agent_ppo = rlPPOAgent(actor, obsInfo, actInfo, ppo_opt);
    
  • 方案3:Simulink环境侧动作后处理
    不需要修改Agent代码,直接在Simulink模型的Agent输出端加Saturation模块,分别为5路动作设置对应的上下限,直接硬限制输入到被控对象的动作值范围。

故障复现参考波形

两路RL Agent动作动态示波器波形(第一路动作应处于01区间,第五路应处于-11区间,可见实际输出均超出限制范围)

内容的提问来源于stack exchange,提问作者dasadasade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:15:03