首页 / 资讯中心 / 文章详情

DRNN对角递归神经网络自适应控制:原理、MATLAB复现与参数整定避坑指南

DRNN对角递归神经网络自适应控制:原理、MATLAB复现与参数整定避坑指南 ★ FEATURED ARTICLE
简介这份PDF文献面向控制工程、自动化与机器学习方向的研究者及研究生聚焦实际系统中难以用线性模型描述的非线性控制难题。全文围绕DRNN回归神经网络展开先剖析非线性系统对控制精度的高要求再介绍DRNN三层网络结构及其在系统辨识上的学习优势进而给出基于DRNN的自适应PID控制算法设计并通过仿真验证其在过渡时间、鲁棒性与抗干扰能力上的表现。资源包为单一PDF文件共1个文件压缩包约1.14MB便于直接阅读与存档。目前已有128人学习下载。读者可从中获取完整的算法推导、网络权值更新公式、辨识误差指标与仿真结论理解神经网络与自适应控制结合的建模思路为机器人控制、过程控制、自动驾驶等场景的算法研究提供参考。1. 从一份 PDF 标题说起DRNN 自适应控制到底在解决什么问题如果你手头有一份名为《一种基于DRNN神经网络的自适应控制算法.pdf》的资料大概率你正在做的是这样一件事被控对象模型说不清楚或者参数会随工况漂移传统 PID 调好的那组数在台架上跑得好好的一换负载、一升温、一磨损就开始发散。你想找一个能在线自己调整的控制器于是翻到了 DRNN 这个词。DRNN 指对角递归神经网络Diagonal Recurrent Neural Network。它和普通 BP 网络最大的区别在于隐层存在自反馈也就是隐层上一时刻的输出会参与这一时刻的计算这让它天然带记忆适合描述带惯性和迟滞的动态系统。把它塞进自适应控制回路里通常承担两个角色之一一是做被控对象的在线辨识器二是直接充当控制器用误差反传在线更新权值。这份资料适合两类人做过 PID 或模糊控制、想往神经网络控制方向走一步的工程师以及手上有 MATLAB/Simulink 环境、需要一套能跑起来的最小闭环的人。下面我按“原理立住—最小复现—参数怎么调—坑在哪—怎么验证”的顺序把这条路走一遍。2. DRNN 的结构与自适应控制回路的搭法2.1 对角递归到底“递归”在哪结构拆解先把结构说清楚不然后面代码看不懂。一个典型的 DRNN 是三层输入层、隐层、输出层。输入层接收当前时刻的外部信号比如误差 e(k)、误差变化率 de(k)、参考输入 r(k)。隐层的每个神经元除了接收输入层的加权和还接收自己上一时刻的输出乘上一个自反馈权重。输出层是隐层输出的线性组合。关键在于“对角”两个字隐层神经元之间不互相连接只和自己上一时刻连接。所以自反馈权重矩阵是对角阵。这个设计的好处是计算量小、稳定性分析相对容易代价是表达能力弱于全连接递归网络。对于单输入单输出的控制回路这个表达能力通常够用。数学上隐层第 j 个神经元在 k 时刻的状态写成S_j(k) W_j^I · X(k) W_j^D · S_j(k-1) O_j(k) f(S_j(k)) y(k) W^O · O(k)其中 X 是输入向量W^I 是输入权重W^D 是自反馈权重f 一般取 Sigmoid 或 tanh输出层通常线性。控制律常见写法是 u(k) u(k-1) y(k)也就是网络输出的是控制增量而不是绝对量这一点后面避坑章节会重点讲。2.2 自适应律怎么推把误差反传落到权值更新自适应控制的“自适应”体现在权值在线更新。目标函数取瞬时误差平方J(k) 0.5 * (r(k) - y_plant(k))^2但这里有个容易翻车的地方网络输出不是直接等于系统输出中间隔着被控对象。严格做法要用雅可比矩阵对象输出对控制输入的偏导而这个量往往未知。工程上常见的简化是用误差符号近似或者用对象的粗略模型估计。资料里如果没写清楚这一点你复现时大概率会卡在“权值更新方向对不对”上。我一般采用的更新式是带学习率和动量项的梯度下降W(k1) W(k) - eta * dJ/dW alpha * (W(k) - W(k-1))eta 是学习率alpha 是动量系数。隐层到输出层的梯度可以直接算输入层和自反馈权重的梯度要沿时间回传但因为只回传一步对角递归的特性实现上比 BPTT 简单很多。2.3 最小可跑闭环MATLAB 脚本骨架下面这段是我常用的骨架被控对象先用一个离散二阶系统代替你可以换成自己的模型。重点是看权值更新的位置和顺序。% DRNN 自适应控制最小闭环 clear; clc; N 2000; % 仿真步数 eta_I 0.02; % 输入权重学习率 eta_D 0.01; % 自反馈权重学习率 eta_O 0.03; % 输出权重学习率 alpha 0.05; % 动量系数 nh 6; % 隐层神经元个数 % 被控对象离散二阶可替换 a1 1.2; a2 -0.3; b1 0.5; b2 0.2; y_plant zeros(1,N); u zeros(1,N); % 网络权值初始化 W_I 0.1*randn(nh,2); % 输入e(k), de(k) W_D 0.1*randn(nh,1); % 自反馈 W_O 0.1*randn(1,nh); S zeros(nh,1); % 隐层状态 dW_I zeros(size(W_I)); dW_D zeros(size(W_D)); dW_O zeros(size(W_O)); r ones(1,N); % 参考输入阶跃 e zeros(1,N); de zeros(1,N); for k 3:N e(k) r(k) - y_plant(k-1); de(k) e(k) - e(k-1); X [e(k); de(k)]; S_prev S; S W_I*X W_D.*S_prev; % 对角递归逐元素乘 O tanh(S); du W_O * O; % 控制增量 u(k) u(k-1) du; u(k) max(min(u(k), 5), -5); % 限幅别省 % 对象更新 y_plant(k) a1*y_plant(k-1) a2*y_plant(k-2) ... b1*u(k-1) b2*u(k-2); % 权值更新简化雅可比取 1 delta e(k); dW_O alpha*dW_O eta_O * delta * O; dW_I alpha*dW_I eta_I * delta * (1-O.^2) * (W_O * X); dW_D alpha*dW_D eta_D * delta * (1-O.^2) .* (W_O .* S_prev); W_O W_O dW_O; W_I W_I dW_I; W_D W_D dW_D; end plot(y_plant); hold on; plot(r,--);逻辑说明每个采样周期先算误差和误差变化率前向算出控制增量累加到控制量上并限幅再更新对象状态最后反传更新三组权值。顺序不能乱尤其是对象更新必须在控制量算完之后。参数说明nh 取 4 到 8 之间通常够用再多容易过拟合噪声eta_O 一般比 eta_I 大因为输出层梯度路径短alpha 取 0.02 到 0.1太大引入振荡太小收敛慢限幅值按你执行机构的能力设这一步省掉是新手最常见的翻车点。3. 参数整定与在线辨识的工程做法3.1 学习率、动量与隐层节点三个必调参数学习率是这套算法里最玄学的参数。eta 太大权值在误差面上跳来跳去控制量抖得执行机构都响eta 太小跟踪阶跃要几百个周期才稳看起来像没生效。我的经验是先固定动量 alpha0把 eta_O 从 0.01 往上试找到刚好不振荡的值再除以 2然后加动量。隐层节点数 nh 不是越多越好。DRNN 的隐层带自反馈节点多了之后状态之间的耦合会让稳定性分析失效。单回路控制 nh5 或 6 是甜点区。如果你做的是多变量每个回路单独一个 DRNN 比一个大网络更稳。自反馈权重 W_D 的初始值建议设小比如 0.05 量级。设大了相当于隐层一开始就有强记忆误差反传的梯度会被历史状态淹没表现为控制量缓慢漂移。3.2 用 DRNN 做在线辨识和直接控制的区别如果你的方案是“DRNN 辨识 另一个控制器”那网络输出的是对象输出的预测值 y_hat误差是 y_plant - y_hat更新逻辑和上面几乎一样只是控制量由外部控制器给。这种结构的好处是辨识器和控制器解耦调试时可以先单独验证辨识精度。辨识模式下要注意输入向量的选择。常见做法是 [y(k-1), y(k-2), u(k-1), u(k-2)]也就是 NARX 结构。输入维度变了W_I 的列数要跟着改。辨识收敛后把 y_hat 和 y_plant 画在一起看相位和幅值是否跟上只看 MSE 会被直流偏置骗过去。3.3 采样周期与离散化别让连续域公式骗了你资料里给的推导往往是连续域的落到代码里必须离散化。采样周期 Ts 的选择有个硬约束要小于对象最小时间常数的十分之一。Ts 太大自反馈项 S(k-1) 携带的信息已经过期网络学不到动态。另一个坑是控制增量式输出。u(k) u(k-1) du 这种结构在 Ts 变化时行为会变因为 du 是每步的增量。如果你换采样率学习率要按比例调整否则等效增益变了。我一般把 eta 乘以 Ts 归一化这样换采样率时不用重调。4. 避坑与排查五条血泪记录4.1 控制量发散到限幅现象仿真跑几百步后 u(k) 一直顶在限幅值系统输出跟着飞。原因权值更新方向反了或者雅可比符号估计错误。误差反传时如果符号搞反梯度下降变成梯度上升。解决先把学习率降到原来的十分之一观察是否还发散。如果仍然发散检查 delta 的符号用 e(k) 而不是 -e(k) 试一次。确认方向后再逐步恢复学习率。4.2 稳态误差消不掉现象输出能跟上阶跃但始终差一个固定值。原因网络输出是控制增量积分作用隐含在累加里但如果 du 在稳态时被 tanh 饱和压到接近零累加就停了。解决检查隐层是否饱和。把 tanh 换成线性输出层或者给输出层加一个偏置项。另一个办法是在误差输入里显式加积分项。4.3 权值爆掉出现 NaN现象跑着跑着 W 变成 Inf 或 NaN。原因学习率过大加上 tanh 导数在饱和区接近零梯度计算里出现 0 乘 Inf。解决给权值加范数约束每次更新后如果 norm(W) 超过阈值就整体缩放。同时给误差加死区|e| 小于阈值时不更新。4.4 换工况后重新发散现象在工况 A 调好的参数切到工况 B 就振荡。原因学习率是按工况 A 的误差量级调的工况 B 误差大等效步长变大。解决用归一化学习率eta 除以输入向量的范数。或者加一个误差限幅更新时用 min(|e|, e_max) 代替原始误差。4.5 仿真好台架崩现象MATLAB 里完美烧进控制器后抖动或延迟。原因仿真里对象是理想离散模型实际有执行机构死区、传感器噪声、计算延迟。解决仿真阶段就加入噪声和一拍延迟把控制量限幅和变化率限幅都加上。上台架前先用实际采样周期跑一遍确认单步计算时间小于 Ts 的 50%。5. 进阶把 DRNN 自适应控制用到真实回路前先做这三步验证第一步是开环辨识验证。把控制器断开手动给一组激励信号看 DRNN 辨识出的 y_hat 能不能跟上 y_plant。激励信号用伪随机序列比阶跃好能激发更多动态。这一步不过闭环一定不过。第二步是变参考跟踪。给方波、正弦、斜坡三种参考看跟踪误差的收敛速度和超调。正弦跟踪最能暴露相位滞后如果相位差超过 10 度说明自反馈权重没学好把 eta_D 调大一点再试。第三步是抗扰测试。在稳态时加一个输出端的脉冲扰动看恢复时间。恢复时间应该和开环对象的时间常数同量级如果慢很多说明学习率在稳态时太小可以考虑误差死区外的自适应学习率。下面这张表是我常用的验证指标和判据你可以直接拿去对照验证项激励合格判据不达标先调开环辨识PRBS拟合度 85%nh、eta_I阶跃跟踪单位阶跃超调 10%稳态误差 2%eta_O、限幅正弦跟踪0.1Hz 正弦相位滞后 10 度eta_D、W_D 初值抗扰恢复脉冲扰动恢复时间 3 倍对象时间常数学习率调度最后说个我自己的习惯每次调这套算法我都会把权值范数和控制量一起画出来。控制量看行为权值范数看健康度。范数单调增长基本就是发散的先兆比等输出飞了再回头查省事得多。这套东西不难难的是耐心把每个参数和现象对上号。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站