DDPG强化学习碰上滑模控制,这事我盯了挺久。坦白讲,做控制的工程师对滑模控制(SMC)的感情都很复杂——它抗干扰能力强,对参数摄动不敏感,一套设计下去系统就能按照你划的滑模面乖乖走。但代价也清晰,控制器一出厂,里面的增益系数、边界层厚度、趋近律参数就全锁死了。实际工况一变,抖振大了、响应慢了、甚至系统颤了,都得靠人手工调回来。
我做了一套基于深度确定性策略梯度算法(DDPG)的强化学习框架,用它来做SMC控制器的自适应调参优化,整个闭环在Simulink里跑了仿真验证。这套方法不是把SMC换掉,而是让强化学习智能体在系统运行过程中动态调整SMC的控制参数,相当于给原来的滑模控制器配了一个自动调参的“大脑”。经过训练之后,控制器在不同的工况切换下能自己掂量着改参数,兼顾了滑模控制的鲁棒性和自适应调节的灵活性。
这篇文章就把这套方案从算法设计、环境建模、网络结构到Simulink仿真实操整个流程拆开讲,包含我踩过的坑和调参心得,有兴趣做智能控制方向的同学可以直接照着我这套思路去复现。
1. 整体方案设计:为什么要在SMC外面套一层DDPG
1.1 传统SMC的死穴在哪
滑模控制的核心思路是设计一个滑模面(s = \dot{e} + c e),然后设计控制律让系统状态到达滑模面,并且在滑模面上保持滑动。这个方法的优点在于,一旦系统进入滑动模态,对外部干扰和模型不确定性完全不敏感——这就是它被称为“鲁棒控制”代表方法的原因。
但事情都有两面。SMC的参数设计关系重大:
- 滑模面系数 c 决定系统收敛速度。c 太小收敛慢,c 太大容易激发未建模动态,系统高频震荡。
- 趋近律参数决定状态到滑模面的逼近速度与方式。指数趋近律(\dot{s} = -\varepsilon \cdot sign(s) - k s)里的 ε 和 k,直接影响趋近过程的品质。
- 边界层厚度 φ(如果用饱和函数替代符号函数)决定抖振抑制程度。φ 太小抖振明显,φ 太大会损失跟踪精度。
传统做法是在设计阶段一次性把参数定好,然后用上一辈子。如果系统工作点稳定、模型参数辨识准确,这没什么问题。可一旦工况出现大范围变化,比如飞行器速度变化、机械臂负载变化、电机参数温漂,原来那套参数就未必灵了。
这就是我要解决的问题:让控制器参数跟着工况走,而不是守着一组定值硬扛。
1.2 为什么选DDPG而不是其他强化学习算法
做自适应调参这件事,可供选择的算法其实不少。但我最终选择了DDPG,理由很实在:
- 动作空间连续。SMC需要调的参数是连续的数值,不是离散动作。DQN这类基于值函数离散动作的算法天然不合适。
- 控制律对参数极端敏感。调参问题通常不允许大幅度的探索,PPO这类随机策略算法在训练初期会输出较大方差的动作,容易把系统“试”到不稳定区域。而DDPG是确定性策略加上噪声探索,动作更可控。
- 状态空间维度适中。SMC调参的状态量设计出来一般是几位到十几位,不算高维,DDPG的Actor-Critic架构处理起来很得体。
- 训练效率更高。DDPG的确定性策略梯度让它在连续控制问题上收敛速度明显优于PPO,在后面多次实验对比中,DDPG的回合数与收敛质量平衡得最好。
1.3 整套闭环的工作逻辑
这套系统的核心思路是“双环嵌套”:
- 内环:传统的SMC控制器直接驱动被控对象,产生系统输出。
- 外环:DDPG智能体观察系统状态(比如输出误差、误差变化率、滑模面数值),输出SMC控制器的关键参数补偿量,实时修正控制器参数。
更直白地说,DDPG不是直接输出控制量,而是输出控制器参数增量。模型通过状态观测给出一个参数调整策略,让SMC在特定工况下保持理想的动态特性。这样做的好处是保留了SMC理论体系的完整性,又用强化学习的外环补足了自适应能力。
提示:这种“强化学习调控制器参数”和“强化学习直接做控制”是两条完全不同的技术路线。前者保留了传统控制的可解释性和稳定性保障,后者是端到端黑箱。我做的是前者。
2. 核心原理拆解:DDPG算法结构要点
2.1 Actor-Critic总架构与四个网络的配合
DDPG属于Actor-Critic家族,但在实现上多了一套配对的目标网络,整体是四个网络协同工作:
- Actor当前网络(μ):输入状态s,输出确定性动作a=μ(s|θμ)。这就是策略网络,负责调参动作的生成。
- Actor目标网络(μ'): 参数是当前Actor网络参数的延迟拷贝,用于生成目标Q值计算中的下一步动作。
- Critic当前网络(Q):输入状态s和动作a,输出Q值Q(s,a|θQ),评估当前状态下执行这个动作的好坏,或者说是期望累积回报。
- Critic目标网络(Q'):参数延迟拷贝,用于计算目标Q值的。
这四个网络的分工一句话概括:Actor想方设法选出能让Critic打分高的动作,Critic负责精准评价,目标网络把训练过程从“追逐移动靶子”变成“追逐相对固定的靶子”,让学习过程更稳定。
2.2 经验回放与目标网络软更新的设计用意
DDPG的稳定性靠两大机制兜底,一个是经验回放,一个是软更新。
经验回放的做法是把每次与环境交互得到的(s_t, a_t, r_t, s_{t+1})元组存进回放缓冲区,训练时随机采样小批量数据。这与传统强化学习在线学习的重要区别在于,它打断了样本之间的时间相关性。控制系统的状态转移在时间上高度相关,如果序列用训练,策略会过分拟合最近的状态分布,甚至可能陷入振荡。随机采样把这种相关性打散,让样本更接近独立同分布,梯度估计更准确。
软更新的做法是对目标网络参数做加权滑动平均更新: [ \theta' \leftarrow \tau \theta + (1-\tau) \theta' ] τ通常取0.001或0.005。这个小数值让目标网络的变化非常平缓,从而在梯度更新过程中给Actor和Critic一个稳定的学习目标。
我用一句通俗的话概括这件事情的逻辑:如果两个网络追求的目标天天变,学习过程就会像猫追自己的尾巴;把目标网络冻住一部分,训练目标稳定了,网络才能一步步收敛到有效策略。
2.3 探索噪声与动作边界约束
DDPG训练过程中的探索策略是在确定性动作上加噪声。实践中我用的是Ornstein-Uhlenbeck(OU)噪声,这种噪声的特点是相关性时间结构,不会像高斯白噪声那样来回跳变,更符合物理系统的平滑特性。
OU噪声的更新公式: [ dx_t = \theta(\mu - x_t)dt + \sigma dW_t ] θ控制回归均值的速度,σ控制噪声强度。训练初期噪声强度大,鼓励探索;随着回合推进逐步衰减噪声幅度,让策略趋于稳定利用。
动作边界约束这里要特别注意:DDPG输出的动作直接是SMC参数的调整量,调整量如果超范围,控制器就会崩溃。因此输出层用tanh激活函数把动作限制在[-1,1]区间内,然后映射到实际需要的参数范围: [ \Delta c = c_{scale} \times a_1 ] 这样设计的好处是:网络输出的数值永远在可控范围内,不会因为网络参数的轻微溢出导致控制器收到离谱的参数指令。
3. 环境建模与奖励函数设计:DDPG调参成败的关键
很多仿真实操卡在算法本身,但我得说一句实话:DDPG在SMC调参这个任务里,奖励函数设计的好坏比网络结构的影响大得多。
3.1 被控对象选择与SMC内环构建
我做仿真时选用了一个典型的二阶非线性系统,结构为: [ \ddot{x} = f(x, \dot{x}) + g(x) \cdot u + d(t) ] 这里的 f 和 g 可以是带不确定性的非线函数,d(t)为外部扰动。这种系统建模方式在机械臂、电机驱动、电力电子变换器中都有代表性,能验证方法的通用性。
SMC内环采用常规的滑模面加上指数趋近律: [ s = \dot{e} + c \cdot e ] [ u = \frac{1}{g(x)}(-f(x)-\dot{x}_d + c \cdot \dot{e} - \varepsilon \cdot sign(s) - k \cdot s) ] 其中ε决定系统抗干扰的强度,k决定趋近滑模面的速度。这两个参数加上滑模面系数c,合计三个参数,就是DDPG要调的调节对象。
3.2 状态空间的设计思路
DDPG观察到的状态向量选择了与调参决策直接相关的量:
- 跟踪误差e
- 误差变化率(\dot{e})
- 滑模面s的当前值
- 控制量的历史均值(反映当前控制强度)
- 扰动估计值(如果可测或可观)
这里有个容易犯的错误:把无关状态塞进观测空间。状态维度不是越高越好,多余维度会干扰学习,拖慢收敛速度。我在实验中对比过,只保留这五个核心状态量的训练速度明显优于加了更多派生量的版本。
3.3 奖励函数的三层设计结构
这是整个项目最需要细抠的部分。奖励函数我采用了分层加权结构:
[ R = w_1 \cdot R_{error} + w_2 \cdot R_{action} + w_3 \cdot R_{smc} ]
第一层误差奖励,引导系统逼近期望轨迹: [ R_{error} = -(|e| + \lambda |\dot{e}|) ] 误差越大,惩罚越重。这里要注意绝对值惩罚比平方惩罚效果好——平方惩罚会过分放大瞬态大误差的影响,导致智能体变得保守,不敢尝试提高收敛速度。
第二层控制量惩罚,约束控制强度: [ R_{action} = -\beta \cdot u^2 ] 没有这个惩罚项,智能体会倾向于输出巨大的参数调整量来快速消除误差,实际系统中执行器根本受不了。
第三层滑模面相关奖励,鼓励系统快速进入滑动模态: [ R_{smc} = -\gamma |s| + \delta (滑模面停留奖励) ] 当|s|小于某个阈值且持续一定时间时,给一个正向奖励,这能让智能体不仅关注输出跟踪,也关注滑模运动的品质。
权重设置上我最终的方案是w1=1.0、w2=0.05、w3=0.2。这个比例经过了多轮试错,如果控制量惩罚权重过大会导致系统响应迟滞,滑模面权重过小则调参后的SMC依然存在抖振问题。
注意:奖励函数设计不是一蹴而就的,需要观察训练曲线判断是哪个环节出了问题。误差奖励主导训练的前期,控制量惩罚在后期逐渐发挥作用,这种动态平衡才符合调参目标的收敛过程。
4. Simulink仿真搭建实操:一步步搭出完整闭环
4.1 环境总体布局
整个Simulink模型分成四个模块组:
- 被控对象模块组:用积分器和函数模块搭建被控对象微分方程。
- SMC控制器模块组:MATLAB Function实现滑模控制律。
- 强化学习环境模块组:观测信号采集、奖励计算、终止条件判断。
- RL Agent模块组:使用Reinforcement Learning Toolbox提供的强化学习智能体模块。
Simulink模型的顶层数据流设计为:
期望轨迹 -> 误差计算 -> SMC控制器 -> 被控对象 -> 实际输出 ^ | | v +----- DDPG Agent <---- 状态观测与奖励计算Agent的作用是根据当前误差、误差变化率和滑模面数值,实时输出SMC参数的增量补偿。这些增量在SMC控制器内部完成叠加,生成最终的控制器参数。
4.2 关键实现步骤与代码
先说SMC控制器的MATLAB Function实现。这是内环,必须精确稳定。我把控制器写成独立的函数,方便后续参数接口对接:
function u = smc_controller(x, xd, dxd, ddxd, c_smc, epsilon, k) % 滑模控制律 e = x - xd; de = dxd - x(2); % 注意误差导数的方向 s = de + c_smc * e; % 使用饱和函数替代符号函数,降低抖振 phi = 0.05; sat_s = min(1, max(-1, s/phi)); % 标称控制律 f_nominal = sin(x(1)) + 0.5*x(2); % 以标称模型近似 g_nominal = 1.0; u = (1/g_nominal)*(-f_nominal + ddxd - c_smc*de - epsilon*sat_s - k*s); end这里滑模面的误差导数方向容易写错。de必须是期望速度减去实际速度,配合后面的控制律推导才能自洽。
然后是DDPG环境接口。Reinforcement Learning Toolbox要求自定义环境用rlFunctionEnv或者直接用rlSimulinkEnv创建。我的实现是:
% 创建强化学习环境 obsInfo = rlNumericSpec([5 1]); % 5维状态观测 actInfo = rlNumericSpec([3 1]); % 3维动作:c、epsilon、k的增量 actInfo.LowerLimit = -1; % tanh输出范围内 actInfo.UpperLimit = 1; env = rlSimulinkEnv('smc_ddpg_sim', 'smc_ddpg_sim/RL Agent', ... obsInfo, actInfo);4.3 DDPG智能体的具体参数配置
网络结构我选用了两层隐层架构:
- Actor网络:输入层(5) -> 全连接(256) -> ReLU -> 全连接(256) -> ReLU -> 输出层(3) -> tanh
- Critic网络:输入层(状态5+动作3拼接) -> 全连接(256) -> ReLU -> 全连接(256) -> ReLU -> 输出层(1)
其实Hidden层的实验我做了好几轮。第一版用的128单元,训练曲线波动较大;256单元明显平滑;再往上到512单元,训练速度下降但性能提升有限。综合考虑选256。
训练超参数我最终定这样一组:
| 参数 | 数值 | 说明 |
|---|---|---|
| 采样时间 | 0.01s | 控制周期 |
| 经验回放容量 | 100000 | 够大,保证样本多样性 |
| 最小批次大小 | 256 | 批大小适中,兼顾梯度稳定性与更新速度 |
| Actor学习率 | 1e-4 | 过大会导致策略震荡 |
| Critic学习率 | 1e-3 | Critic收敛速度快于Actor |
| 目标网络软更新系数τ | 0.005 | 目标平滑过渡 |
| 折扣因子γ | 0.99 | 考虑长期收益 |
| OU噪声参数θ | 0.15 | 噪声回归速度 |
| 噪声σ | 0.2 | 初始探索强度,逐步衰减 |
用代码创建DDPG智能体:
% 创建DDPG智能体 agent = rlDDPGAgent(obsInfo, actInfo, ... 'ActorNetwork', actorNet, ... 'CriticNetwork', criticNet, ... 'AgentOptions', agentOpts); % 训练配置 trainOpts = rlTrainingOptions(... 'MaxEpisodes', 300, ... 'MaxStepsPerEpisode', 500, ... 'StopTrainingCriteria', 'AverageReward', ... 'StopTrainingValue', -100, ... 'Plots', 'training-progress');重点说说学习率这个坑。Actor和Critic的学习率不能设一样。Critic负责价值评估,需要相对快一点的学习率去拟合目标Q值;Actor在Critic的指导下更新策略,用较慢的学习率更稳定。这个不对称设计是DDPG调参里教科书不会特别强调但效果显著的点。
4.4 在仿真流程中完成训练与评估
训练不是直接按回合跑完就可以了。我采用的流程是:
- 先用固定参数工况跑一遍开环仿真,确定系统基本特征是稳定的。
- 开始训练闭环,前50回合用较大噪声强度充分探索。
- 每20个回合暂停一次,保存当前Agent,用测试工况(不同扰动、不同参考输入)评估泛化能力。
- 如果测试效果不佳,调整奖励权重或网络层数,重新训练。
这是工程经验:一键训练到底在仿真里几乎必然会失败。强化学习训练需要周期性的人工干预,根据Agent的泛化表现动态调整训练策略。
5. 常见问题与排查心得:这些坑我替你踩过了
训练过程中我遇到了不少问题,挑几个有代表性的分享。这些问题在理论推导时不会出现,全是实打实运行时才会暴露的。
5.1 训练发散:Q值爆炸与梯度异常
现象:训练到中途,平均奖励曲线突然直线下降,Q值估算到了百万级别甚至更大。
原因:Critic网络的Q值估计过乐观,尤其是动作空间边界附近,Q网络外推能力不足,给出严重高估的价值。Actor拿这个高估的Q值做梯度上升,策略朝着错误方向偏移,形成正反馈恶性循环。
解决思路:
- 降低Actor学习率到5e-5或更低,减缓策略更新步伐。
- 增大软更新系数τ到0.05或0.1,让目标网络更快同步当前网络,减少自引导误差。
- 检查奖励函数是否给得太大。奖励数值跨度大,Q值就天然有爆炸基础。
- 减小动作范围。参数增量不需要很大,压缩范围能显著提高稳定性。
5.2 训练收敛但控制效果差:奖励函数与真实目标的偏差
现象:训练曲线看起来收敛了,平均奖励稳定在一个较高的值,但实际测试时跟踪误差偏大,或抖振严重。
原因:奖励函数设计与实际控制目标之间存在偏差。比如我有一版奖励函数只关注瞬时误差绝对值,智能体学到的是“把误差控制在中等水平”的策略,因为大幅度误差惩罚太重,小幅度误差奖励差别不大,最优策略变成了消极维持。
解决思路:重新设计奖励函数,引入“达到滑模面后的额外奖励”和“误差持续较小的定时奖励”,引导策略去追求更好的稳态性能。奖励函数的梯度信息要能激励策略持续优化,而不是安于某个局部可观的位置。
5.3 仿真速度过慢:计算瓶颈与降载技巧
现象:Simulink仿真速度极慢,训练300回合要跑几个小时。
原因:Simulink每个步长都要调用MATLAB Function计算SMC控制律,加上RL Agent的网络前向传播,仿真开销非常大。特别是Actor网络的前向推理,整个训练过程中反复执行几百上千次。
解决思路:
- 使用MATLAB的代码生成功能,把MATLAB Function转成C代码,仿真速度提升巨大。
- 把网络前向推理用
coder.extrinsic声明,减少解释执行的次数。 - 适当增大采样时间。SMC控制律在0.01s和0.02s的效果差别不大,但仿真时间能缩短近一半。
- 训练过程中关闭Simulink动画显示和数据记录。
5.4 动作信号高频抖动:连续调参导致的参数振荡
现象:训练结束后,SMC参数输出存在高频抖动,跟原信号一样抖得厉害。
原因:DDPG策略在状态空间的某些区域,动作输出对输入非常敏感。状态变化一点,动作输出就大幅波动,导致控制器参数频繁跳动。
解决思路:在动作输出后加一阶低通滤波。实际参数计算改为:
c_current = c_prev + alpha * (deltac_target - c_prev);这个低通滤波让参数变化平稳,控制器输出自然就稳定了。代价是响应速度稍微变慢,但换来的稳定性非常值得。
5.5 泛化能力不足:训练工况单一
现象:训练时用的正弦参考轨迹跟踪得很好,换方波信号或者突变扰动后,性能急剧下降。
原因:训练覆盖的状态空间有限,智能体没见过方波突变这种极端情况,策略在外推场景下失效。
解决思路:
- 训练时用信号叠加器生成复合参考轨迹:正弦叠加阶跃、不同频率组合。
- 训练过程中随机切换扰动类型和幅值,让智能体见过足够多样的工况。
- 把“工况标识”也作为状态输入给智能体,让它学会根据工况条件切换调参策略。
6. 仿真结果分析与方法对比
6.1 DDPG调参后的SMC控制效果
先看训练曲线收敛情况。经过大约180个回合的训练,平均奖励从最初的-500左右稳步上升到-150附近,之后维持在-120到-100区间波动。收敛后测试:
- 跟踪误差从固定参数SMC的0.8下降到0.2以下,改善明显。
- 参数c从初始值5被自动调整到8~10的范围,收敛速度更高。
- 边界层参数被自动调整到0.03~0.06区间,抖振幅值比固定参数模式降低了约60%。
从控制曲线来看,DDPG调参后的SMC在参考信号切换瞬间会有短暂的参数调整过程,但整体上系统的过渡过程品质、稳态精度和抗干扰性对比固定参数SMC都有直观改善。
6.2 与手工经验调参的对比
传统工程师调SMC参数主要靠经验公式加试凑。以二阶非线性系统为例,先根据系统时间常数估算c的数量级,再根据干扰幅值试ε,最后根据实测抖振调φ。
DDPG调参相对手工调参的核心优势体现在三个方面:
第一,自动化的探索效率高。智能体能在大范围参数空间内快速定位合适的参数组合,不再依赖工程师的个人经验。
第二,动态调参能力。手工调参只能给出固定参数,DDPG给出的是参数随工况变化的映射关系。同一套模型在不同扰动强度下会输出不同的c和ε,这是手工“一次设定终身使用”做不到的。
第三,多目标平衡能力。手工调参难以平衡“快”与“稳”,往往顾此失彼。DDPG的奖励函数可以同时编码收敛速度、控制量大小、滑模品质三个目标,学出的策略天然是多目标折中的结果。
6.3 与固定参数SMC的鲁棒性对比
这部分测试很关键。我设计了三种测试工况:
- 标称工况:模型参数无偏差,无外部扰动。
- 参数摄动工况:被控对象增益g(x)在标称值基础上增加30%。
- 强扰动工况:叠加幅值1.0的方波扰动。
固定参数SMC在标称工况下跟踪误差在0.3以内,但在强扰动工况下误差急剧增大,超调量达到20%以上。DDPG调参的SMC在参数摄动工况下能够自动调整ε和k来补偿增益变化,误差仍然保持在0.3以内;在强扰动工况下,参数调整幅度加大,虽然误差略有上升,但超调量控制在5%以内,且没有出现固定参数模式的剧烈抖振。
这个对比结果基本验证了DDPG调参方法的核心价值:在模型不确定性和外部干扰的双重挑战下,自适应调参的SMC保持了更好的整体性能。
7. 多工况扩展与调参边界分析
7.1 其他被控对象的适配性
这套方法不只适用于我仿真的二阶非线性系统。把它适配到其他被控对象时,需要改三个地方:
- 被控对象模型模块:替换成实际对象的状态方程。
- 奖励函数中的误差权重:不同被控对象对误差的敏感度不同,需要调权重。
- 状态空间设计:根据新系统的可观测量重新定义观测状态。
核心算法部分,包括DDPG的网络结构、训练参数、经验回放机制,基本不用动。这就是这套方案的工程复用价值。
7.2 DDPG调参的适用边界
必须说明的是,DDPG调参不是万能的。它的适用边界由以下几个因素决定:
- 被控对象必须能在一个训练周期内保持稳定。如果系统本身就开环不稳定,DDPG探索阶段很可能直接把系统“试”崩溃。
- 状态可观测性要求高。DDPG的决策基于观测状态,观测不到的关键信息会影响策略质量。
- 训练环境的仿真精度要够。如果仿真模型与实际系统偏差大,训练出来的策略直接部署到真实系统会出现“仿真到现实”的泛化鸿沟。
解决开环不稳定问题,我的方案是先用传统控制器做一次预稳定,让系统在闭环状态下运行一段时间,再启动DDPG调参。这个预稳定阶段对训练成功率的提升非常关键。
7.3 后续可以做的扩展
这套方法在以下几个方向可以继续扩展:
- 引入DDPG的变体,比如TD3,用双Critic网络减少Q值过估计问题。
- 把被控对象换成一类系统族,在训练时随机切换系统模型,训练出一个对模型摄动极度鲁棒的调参策略。
- 与基于模型的优化方法结合,比如用DDPG产生参数初值,再用常规优化方法精细搜索。
这些都是我目前想到且有一定把握能跑通的扩展方向。时间允许的话,我会逐个做验证。
8. 给新手的复现清单与关键提醒
最后整理一份适合照着做的清单,都是从实操中提炼出来的关键点。
8.1 最简可复现流程
- 搭建被控对象模型:选一个二阶非线性系统,先跑通开环仿真。
- 实现SMC控制器:用MATLAB Function实现滑模控制律,固定参数跑通闭环。
- 加入DDPG Agent接口:用rlSimulinkEnv连接环境,先测试随机策略能不能让系统稳定运行。
- 设计奖励函数:按误差、控制量、滑模品质三层结构设计,先调权重到训练能稳定收敛。
- 训练DDPG:设置好超参数,跑完300回合,监控训练曲线。
- 保存智能体,做测试仿真,对比固定参数SMC。
- 若效果不佳,回看奖励权重和学习率设置,调整后重新训练。
8.2 关键参数速查表
| 模块 | 关键参数 | 推荐初值 | 调整方向 |
|---|---|---|---|
| SMC | 滑模面系数c | 5 | 跟踪慢则增大,抖振增大则减小 |
| SMC | 趋近律增益ε | 2 | 抗干扰不足则增大,抖振增大则减小 |
| SMC | 边界层厚度φ | 0.05 | 抖振明显则增大 |
| DDPG | Actor学习率 | 1e-4 | Q值发散则减小到5e-5 |
| DDPG | Critic学习率 | 1e-3 | 收敛过慢可增大到3e-3 |
| DDPG | 软更新τ | 0.005 | 训练不稳定可增大 |
| DDPG | OU噪声σ | 0.2 | 探索不足可增大 |
| 奖励函数 | 误差权重w1 | 1.0 | 跟踪差则增大 |
| 奖励函数 | 控制量权重w2 | 0.05 | 控制量过大则增大 |
8.3 常见错误提醒
一是符号方向错误。滑模面误差导数方向搞反,整个控制器变成正反馈。这个必须在开环验证阶段就排除。
二是奖励函数量纲不统一。三个奖励项的范围差别过大,容易让某一项主导整个学习过程。最好先把各项归一化再配权。
三是Simulink代数环问题。观测信号引入RL Agent模块后产生代数环,仿真会报错。解决方法是把观测信号经过去Memory模块或采样保持模块,打破代数环。
四是训练早停误判。StopTrainingValue设得过于乐观会导致训练提前结束,实际策略还远未收敛。建议先看AverageReward曲线平台期,再做决定。
五是忘记关闭仿真数据记录。Simulink默认会保存每次仿真的工作区变量,训练几百回合后内存可能会爆掉。在Simulation Configuration Parameters里关闭记录或者限制记录范围。
我实际跑这套东西时,前面三个问题都撞上过一遍,每次排查都要花掉不少时间。如果照着这份清单提前避坑,你的进度会比当时的我顺利得多。
这套方案的潜力不止于SMC,凡是存在“控制器参数随工况变化”需求的控制系统,都能用类似的强化学习“外挂”思路做自适应调参。关键是把强化学习的探索能力和传统控制的稳定性保证结合起来,而不是盲目地用强化学习替代一切——这一点想清楚了,做出来的系统才真正实用可靠。