ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DRNN对角递归神经网络自适应控制:在线自整定与工程实践

DRNN对角递归神经网络自适应控制:在线自整定与工程实践 简介这份PDF文献面向从事自动控制、智能算法与非线性系统建模的研究人员及研究生聚焦实际系统中难以用线性模型精确描述的控制难题。文中提出一种基于DRNN神经网络的自适应PID控制算法通过回归神经网络对系统进行非线性辨识再结合自适应机制在线整定控制参数从而提升控制精度与响应速度。资源包内含1个PDF文件大小约1.14MB完整呈现了论文的公式推导、网络结构图、辨识流程与仿真验证结果便于读者系统理解DRNN三层回归网络在系统辨识中的作用以及自适应控制算法的设计思路与实现细节。内容涵盖非线性系统挑战、DRNN网络结构、辨识误差与权值调整等关键知识点并讨论了算法在鲁棒性、抗干扰能力与泛化性能方面的表现。目前已有128人学习适合希望将神经网络方法应用于机器人控制、过程控制等场景的读者参考借鉴。1. 从“调参靠猜”到“在线自整定”DRNN自适应控制到底在解决什么做过程控制的人大多有过这种经历被控对象一换工况原先整定好的 PID 参数立刻不灵超调、振荡、稳态误差轮番上阵现场调一次参数能耗掉半天。一种基于 DRNN 神经网络的自适应控制算法针对的正是这类“对象时变、模型不准、扰动未知”的场景。DRNN 指对角递归神经网络Diagonal Recurrent Neural Network它在普通前馈网络的基础上给隐层每个节点加了一条自反馈支路让网络具备短时记忆能力从而在线辨识对象动态、实时修正控制器参数。它适合谁适合已经会写基础控制回路、想把手动整定换成在线自整定的工程师也适合做仿真验证的研究生。核心价值一句话把“离线调好的固定参数”换成“跟着误差自己走的动态参数”。2. DRNN 的结构与自适应控制回路怎么搭2.1 对角递归到底“递归”在哪结构拆解普通 BP 神经网络是纯前馈的输入进隐层、隐层进输出同一时刻的输出只依赖当前输入。DRNN 的区别在于隐层每个神经元多了一条指向自己的延迟反馈第 j 个隐层节点在 k 时刻的输入除了来自输入层的加权和还叠加了它自己在 k-1 时刻的输出乘以一个反馈权。这就是“对角”的含义——反馈矩阵只在对角线上有值节点之间不交叉反馈计算量比全连接递归网络小得多工程上更容易落地。用公式说清楚。设输入向量为 x(k)隐层第 j 个节点的净输入为net_j(k) sum_i w_ij * x_i(k) w_j^D * h_j(k-1)其中 w_ij 是输入到隐层的权w_j^D 是对角反馈权h_j(k-1) 是上一时刻该节点的输出。输出层再对隐层输出做线性组合。反馈权的存在让网络输出不仅看当前误差还看误差的历史轨迹这对辨识带惯性的被控对象很关键。为什么不用 LSTM 或 GRU在控制回路里采样周期常在毫秒到几十毫秒级LSTM 的门控结构参数量大、单步推理慢而 DRNN 结构简单、单步计算量小配合在线学习足够用。这是选型上的现实取舍不是理论最优。2.2 控制回路拓扑辨识器 控制器双网络落地时常见做法是搭两个 DRNN一个做辨识器Identifier一个做控制器Controller。辨识器用对象的输入输出数据在线学习逼近被控对象的动态控制器则以系统误差为目标通过辨识器回传的梯度更新自身权值。这种结构叫“间接自适应”好处是控制器更新时不需要对象的解析雅可比用辨识网络的梯度近似即可。回路信号流大致是设定值 r(k) 减去实际输出 y(k) 得到误差 e(k)控制器 DRNN 输出控制量 u(k) 作用于对象对象输出 y(k) 同时喂给辨识器 DRNN。辨识器输出 y_hat(k) 与 y(k) 的差用于更新辨识器权值控制器权值则通过误差对控制量的敏感度链式回传。提示如果对象本身近似线性且时不变直接上 DRNN 是杀鸡用牛刀PID 加前馈就够。DRNN 自适应真正划算的场景是对象增益、时间常数随工况漂移或者存在未建模动态。2.3 最小可跑通实现Python 仿真骨架下面给一个能跑起来的骨架用一阶惯性加纯滞后对象做验证。代码只保留核心逻辑方便你替换成自己的对象模型。import numpy as np class DRNN: def __init__(self, n_in, n_hidden, n_out, lr0.05): # 输入层到隐层权值 self.W1 np.random.randn(n_in, n_hidden) * 0.1 # 对角反馈权只在对角线上 self.Wd np.random.randn(n_hidden) * 0.1 # 隐层到输出层权值 self.W2 np.random.randn(n_hidden, n_out) * 0.1 self.lr lr self.h np.zeros(n_hidden) # 上一时刻隐层输出 def forward(self, x): # 隐层净输入 输入加权 对角反馈 net x self.W1 self.Wd * self.h h_new np.tanh(net) # 隐层激活 y h_new self.W2 # 输出层线性 self.h h_new # 保存供下一时刻反馈 return y, h_new def update(self, x, h, error): # 输出层梯度 dW2 np.outer(h, error) # 隐层误差回传含反馈项近似 dh (error self.W2.T) * (1 - h ** 2) dW1 np.outer(x, dh) dWd dh * self.h self.W2 self.lr * dW2 self.W1 self.lr * dW1 self.Wd self.lr * dWd逻辑说明forward 里self.Wd * self.h就是对角递归项self.h在每次前向结束后更新保证下一时刻拿到的是上一时刻的隐层输出。update 里隐层误差回传用了 tanh 的导数1 - h**2反馈权梯度dWd用当前隐层误差乘上一时刻隐层输出近似。参数说明n_hidden一般取 5 到 15太少拟合不动太多在线学习容易震荡lr学习率建议从 0.01 起调对象快变时适当加大但超过 0.1 常出现权值发散。2.4 把辨识器和控制器接起来def simulate(steps2000): plant_y 0.0 ident DRNN(n_in2, n_hidden8, n_out1, lr0.03) ctrl DRNN(n_in2, n_hidden8, n_out1, lr0.02) y_hist, u_hist [], [] for k in range(steps): r 1.0 if k 50 else 0.0 # 阶跃设定值 e r - plant_y # 控制器输入当前误差和上一时刻误差 u, _ ctrl.forward(np.array([e, e])) u float(np.clip(u, -5, 5)) # 控制量限幅防积分饱和 # 一阶惯性对象离散近似 plant_y 0.95 * plant_y 0.05 * u # 辨识器学习对象动态 y_hat, h_id ident.forward(np.array([u, plant_y])) ident.update(np.array([u, plant_y]), h_id, plant_y - float(y_hat)) # 控制器用误差更新 _, h_c ctrl.forward(np.array([e, e])) ctrl.update(np.array([e, e]), h_c, e) y_hist.append(plant_y) u_hist.append(u) return y_hist, u_hist逻辑说明控制器输入用当前误差和上一时刻误差给网络一点误差变化趋势的信息。控制量限幅是必须的否则启动阶段大误差会让输出爆掉。辨识器用对象输入 u 和输出 plant_y 作为输入去逼近 plant_y误差是plant_y - y_hat。参数说明对象离散系数 0.95/0.05 对应时间常数约 20 个采样周期你可以按实际对象改两个网络学习率分开设控制器通常比辨识器小一点避免控制动作过激。3. 在线学习率与反馈权三个决定成败的参数3.1 学习率不是越小越稳很多人以为学习率调小就安全实际在自适应控制里学习率太小会导致网络跟不上对象变化表现为误差收敛慢、工况切换后长时间回不到设定值。我一般先固定辨识器学习率在 0.02 到 0.05控制器在 0.01 到 0.03然后做阶跃和扰动实验看收敛速度。如果误差曲线在设定值附近缓慢爬行说明学习率偏小如果出现高频抖动说明偏大。一个实用技巧是给学习率加衰减前期大步长快速逼近后期小步长精细收敛。lr lr0 / (1 decay * k) # k 为迭代步数decay 取 0.001 量级3.2 反馈权初始化与稳定性边界对角反馈权 Wd 初始化不能太大。它相当于给隐层加了记忆强度值过大时隐层状态会自激输出持续振荡。经验做法是初始化在 ±0.1 以内训练中如果发现 Wd 绝对值持续增长超过 1基本可以判定回路要发散需要降低学习率或加权值约束。下面这个约束在每步更新后执行能有效防止反馈权跑飞self.Wd np.clip(self.Wd, -0.9, 0.9)3.3 隐层节点数的取舍隐层节点数直接决定网络表达能力。做一阶、二阶对象5 到 8 个节点足够对象有纯滞后或多模态时可以加到 12 到 15。但节点数增加会带来两个代价单步计算量上升在线更新时梯度噪声变大。我的习惯是从 6 个起步每次加 2 个做对比实验直到误差不再明显下降为止。别一上来就堆到几十个在线控制里参数量大不等于效果好。参数常用范围偏小表现偏大表现辨识器学习率0.02~0.05辨识滞后权值抖动控制器学习率0.01~0.03收敛慢控制量振荡隐层节点数6~15拟合不足计算慢、噪声大反馈权范围±0.9记忆弱自激发散4. 避坑与排查现场最容易翻车的四个点4.1 控制量不限幅导致启动即发散现象仿真第一步误差很大控制量输出几百甚至上千对象直接被“打飞”后续曲线完全失控。原因网络初始权值随机大误差输入经线性输出层放大没有物理约束。解决在控制器输出后加限幅限幅值按执行机构实际行程设定比如阀门 0 到 100、电机 -5 到 5。限幅不是可选项是必选项。4.2 辨识器和控制器学习率同值设置现象系统能收敛但超调大或者收敛后稳态有小幅极限环。原因辨识器和控制器共用一个学习率时两者更新速度不匹配控制器基于还没辨识准的梯度更新容易过冲。解决辨识器学习率略大于控制器让对象模型先跟上控制器再基于较准的梯度调整。常见比例是 1.5:1 到 2:1。4.3 反馈权不约束导致隐层自激现象训练一段时间后输出出现等幅振荡误差不收敛也不发散像卡住了。原因对角反馈权在更新中逐渐增大隐层状态形成正反馈自激。解决每步更新后对反馈权做 clip范围 ±0.9同时监控反馈权范数持续增长就降学习率。4.4 用同一组数据同时更新两个网络现象代码能跑但辨识误差和控制误差都不下降。原因把对象输入输出直接喂给控制器更新控制器学的是对象动态而不是控制策略目标错了。解决控制器更新只用误差信号及其历史辨识器才用对象输入输出。两个网络的数据流必须分开这是间接自适应控制的基本要求。5. 进阶把 DRNN 自适应控制用到真实回路的验证方法仿真跑通只是第一步真正判断这套算法值不值得投入要看它在真实回路或半实物平台上的表现。我一般按三步验证。第一步用现场采集的开环阶跃响应数据离线训练辨识器看辨识输出和实测输出的拟合度拟合度低于 90% 就别急着上控制器。第二步把训练好的辨识器固定控制器在线学习做设定值阶跃实验观察超调量和调节时间是否优于原 PID。第三步加负载扰动看回路能否在扰动后自动恢复恢复时间是否可接受。验证时有两个容易忽略的细节。一是采样周期要和 DRNN 单步计算时间匹配如果单步推理超过采样周期的三分之一在线学习就会拖累实时性这时要么减节点数要么降采样率。二是数据要归一化对象输入输出量纲差异大时不归一化会让某些权值更新主导收敛变慢。归一化用均值和标准差在线滚动计算即可别用全局统计量否则工况切换后失效。一个具体技巧给控制器输出加一个很小的探测信号幅度取控制量满量程的 1% 到 2%持续注入。它的作用是让辨识器持续获得激励避免对象进入稳态后辨识器“饿死”、梯度消失。探测信号频率要远低于回路带宽否则会干扰控制精度。这个做法在自适应控制里叫持续激励是保证长期稳定性的关键很多人仿真时不加没事一上真实回路就出问题。我自己踩过的最大坑是早期图省事把辨识器和控制器写成一个网络结果怎么调都稳不住后来拆成两个网络、分开学习率一次就过了。做这类算法结构上的清晰比调参技巧重要得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表