为何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路动作设置对应的上下限,直接硬限制输入到被控对象的动作值范围。
故障复现参考波形

内容的提问来源于stack exchange,提问作者dasadasade
相关产品推荐
相关产品推荐

