ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在线ADP的命门:持续激励条件的工程实现与避坑指南

在线ADP的命门:持续激励条件的工程实现与避坑指南 做在线自适应动态规划(ADP)的人大概都经历过这么一幕同样的算法仿真环境里跑得漂漂亮亮换成实物实验或者稍微加点扰动网络权值就开始疯长控制量抖到飞起最后直接发散。很多人第一反应是调学习率、换网络结构、改奖励函数折腾一圈问题还在。我做过几轮ADP落地方案之后可以很直接地说问题多半不在这些地方而在一个看上去只属于数学证明的“假设”——持续激励(Persistent Excitation, PE)条件。这篇文章想把这件事彻底讲透。我会先拆解在线ADP到底在解什么问题然后解释持续激励条件为什么是这个领域的“命门”再给出我实际工程中反复验证过的PE信号设计方法和参数选取逻辑最后用一个简化算例走一遍从发散到收敛的完整调试过程。适合正在做ADP算法落地、强化学习在线控制、或者搞自适应控制的工程师和研究生参考。另外先插一句澄清这里的ADP是Adaptive Dynamic Programming的缩写翻译成自适应动态规划。有些云平台上也有叫ADP的部署工具产品那是另一个方向的话题两者只是缩写重合千万别混。1. 先搞清楚在线自适应动态规划到底在解什么问题1.1 从最优控制到自适应动态规划自适应动态规划本质上是最优控制问题的一类在线数值解法。传统最优控制比如LQR、H无穷都要求你先知道系统模型然后离线解Riccati方程或者HJI方程解出来一个固定的控制律再装到控制器里。问题是实际对象往往模型不准或者干脆就没有模型离线解出来的控制律到了现场要打折扣。ADP的思路是用函数逼近器神经网络、多项式、核函数等去逼近最优代价函数同时在线上根据系统的状态转移数据修正逼近器的参数。你不需要提前知道准确的系统模型只需要系统本身开着、数据能采到、代价能算出来就能逐步逼近最优解。这套思路和强化学习里的Q-learning、Actor-Critic在同一条脉络上只是ADP更强调和最优控制理论的连接收敛性分析大多建立在Bellman方程和Riccati方程的框架里。在线的含义是什么就是系统一边运行、一边更新控制器参数。每一拍采到当前状态计算控制量系统走到下一个状态拿到这一步的代价然后立刻修正代价函数的逼近参数。听起来非常优雅但在线更新恰恰是很多坑的来源数据是时序相关的、控制策略在变导致数据分布偏移、更新目标本身也在变。这些因素共同作用下网络参数能不能收敛到最优解根本不取决于你迭代了多少步而取决于数据里到底涵盖了多丰富的信息。1.2 持续激励条件ADP在线学习的“命门”研究ADP收敛性证明的论文里几乎都有一句话“施加探测噪声以保证持续激励条件成立。”很多工程人员看到这句话就跳过去了觉得这是数学家的偏好。但如果你真的在Matlab/Python里在线仿真过ADP或者接过实物实验就会明白这句话是所有理论证明里最触及工程核心的一条假设。持续激励条件要求你的回归向量在时间域上是信息充分的。回归向量可以是状态量、基函数值、或者由状态和输入组成的增广向量。PE条件成立意味着系统在运行过程中产生的数据能够持续地、均匀地覆盖到参数空间的各个方向。这就像你拍照要判断一个物体的大小如果只从一个角度拍永远测不准深度只有从多个角度持续采集才能收敛到可靠的三维模型。为什么在线ADP必须有PE条件关键在于代价函数逼近参数的可辨识性。你依据Bellman误差去修正参数实质是在做一个在线回归。回归能收敛前提是设计矩阵持续满秩。如果系统一直稳定在一个吸引子附近状态向量很快趋于恒定或者落在低维流形上设计矩阵退化参数更新方向就变得不确定。这时候网络权值会进入“假性收敛”状态代价误差看着很小实际参数离最优解十万八千里。这个点我在仿真里反复验证过。最典型的现象就是不加PE信号时前几百步参数确实在动但动一阵子就停了你觉得算法收敛了一测控制效果和离线最优解差一大截。这不是算法坏了而是数据早就喂不饱参数更新了。2. 持续激励条件到底是什么又该怎么理解2.1 从系统辨识到ADP同一个数学内核持续激励这个概念最早火起来是在自适应控制和系统辨识领域。做系统辨识的时候你要通过输入输出数据反推模型参数如果输入信号只有单一频率那只能辨识出该频率附近的动态特性其他频段的信息完全没有参数辨识矩阵奇异。这个道理拿到ADP里一模一样。在在线ADP里我们要辨识的不是系统模型而是最优代价函数或最优控制律的参数。但数学结构没有本质区别更新律都是基于某个回归向量的外积累积。PE条件用最通俗的话讲就是——你用来更新的回归数据必须足够“花哨”既要持续不断又要在各个方向上都有分量。很多做强化学习的同学对这个条件感觉很陌生因为深度强化学习里几乎不提PE条件。原因很简单深度网络参数规模大而经验回放池天然制造了某种“数据多样性”再加上随机策略本身就在持续探索PE条件在实践层面往往被隐式满足了。但隐式满足不等于一定满足尤其在环境趋于确定、策略迅速变得“自信”的时候数据多样性下降表现就是参数更新后期效率变低、甚至性能回退。这个现象和我们讲ADP的PE问题本质上是同一件事。2.2 PE条件的形式化表达PE条件的数学定义并不复杂。对于连续时间系统一个可能有界的信号向量 φ(t) 满足持续激励条件是指存在正常数 α1、α2 和时间窗口 T使得对任意时刻 t都有α1·I ≤ (1/T)·∫_{t}^{tT} φ(τ)φᵀ(τ)dτ ≤ α2·I其中 I 是单位阵。离散时间版本对应为α1·I ≤ (1/N)·Σ_{kt}^{tN-1} φ_k φ_kᵀ ≤ α2·I翻译成人话从任意一个时刻开始往前数一段固定长度的窗口窗口内数据算出来的“信息矩阵”必须始终落在正定有界区间内。α1 保证激励强度足够、各个方向都被覆盖α2 保证信号能量有上限、不会无限膨胀。在ADP里如果参数是P矩阵的对称元素回归向量往往是状态基函数。比如 LQR 场景下 V(x)xᵀPx你绕不开的就是由状态分量两两组合构成的回归项。只有当系统状态持续在相空间里“游荡”各个状态组合项都有充分的波动P矩阵的每个元素才能被有效辨识。2.3 不满足PE条件会怎样三种典型表现第一种是参数漂移。权值向量看起来在缓慢变化但是并没有朝正确方向走而是在某个子空间里来回晃动。原因是回归向量只在低维空间里取值参数中与该子空间垂直的分量被“遗忘”了误差梯度给不出有效的修正信号。第二种是假收敛。Bellman误差下降到一个很小的值但是控制性能远未达到最优。这个现象最坑人因为如果你只看代价曲线会觉得算法已经成功了可一旦换初始状态或者加扰动立刻露馅。第三种是数值爆炸。参数在某个方向上更新量累积得越来越大最终导致控制器输出振荡剧烈。这通常发生在系统本身不稳定、发散过程中数据越来越极端的情况下。我见过不少人在这一步判定“学习率太大”其实把学习率调小也只是延缓爆炸根因还是激励信息不足导致参数在某些方向上失控。这三种表现我都实测遇到过不是理论推演。它们的共性是你盯着的误差指标没有给出正确反馈因为回归数据的信息矩阵已经畸形了。3. 在线ADP中满足持续激励的工程实现3.1 探测噪声设计最基础也最实用的一招满足PE条件最朴素的做法是在控制输入上叠加一个探测信号。也就是实际施加的控制量变为 u u_nominal d(t)其中 u_nominal 是当前ADP控制器给出的控制量d(t) 是人为设计的激励信号。激励信号加分到哪个通道很关键。如果系统有m个输入理想情况下每个输入通道都要单独加激励。很多人只在一个通道加正弦信号以为这样“已经持续激励了”其实对于多输入系统来说其他输入通道对应的参数维度可能仍然不可辨识。我在自己搭的仿真环境里验证过对双输入系统只给第一个通道加激励P矩阵里和第二个通道相关的元素几乎不动收敛结果明显偏差。后来给两个通道分别加不同频率的激励参数收敛速度和精度立刻改善。这不是算法复杂度的差别而是基本的可辨识性要求。3.2 多正弦叠加激励的参数选择激励信号用什么形式我的首选是多正弦叠加而不是带限白噪声。原因有两个一是正弦信号频率成分明确便于你直观判断哪些频段被覆盖了二是工程上实现简单、轻微滤波不影响信号质量白噪声则需要处理采样率、滤波截止频率、频谱成型等问题。具体参数怎么取振幅方面我的经验是从控制量最大值的5%开始试。太小激励会被系统动态淹没太大控制性能损失明显、甚至会激起未建模动态。如果你同时有测量噪声激励幅值可以适当更低因为测量噪声本身也在提供高频激励。频率方面至少要选三个不同频率频段要拉开比如 0.5 rad/s、1.3 rad/s、2.7 rad/s。有三个以上不相关频率分量回归向量在频率域上就不会塌缩到单一方向。一个我踩过的坑两个频率如果成整倍数关系比如 1 rad/s 和 2 rad/s那么在某些非线性基函数下会产生耦合谐振信息矩阵的有效秩仍然不够。我现在习惯选互质或者非整倍数的频率比如 0.45、1.1、2.8效果更稳。3.3 间歇激励与事件触发方案很多人会问持续激励意味着控制输入永远在抖工业现场哪能接受这种东西这个顾虑是对的。严格意义上的持续激励条件要求激励从算法启动到收敛全程存在但工程应用往往采用间歇激励系统启动和参数更新初期施加激励参数趋于稳定后逐步撤掉激励让控制器恢复到纯最优控制的输出状态。间歇激励的难点在于“撤掉”的时机。撤早了参数还没完全收敛之后还会漂移撤晚了系统一直承受激励带来的性能损失。我常用的做法是监控信息矩阵的最小特征值。具体实现每个控制周期把回归向量的外积累积到一个滑动窗口里实时估计窗口内信息矩阵的最小特征值。当这个值持续稳定地高于某个预设阈值并且参数变化幅度小于设定值就认为辨识信息已经足够可以逐步削减激励幅值。严格做理论验证的时候我会在激励信号上再叠加一个衰减因子。比如前3秒用全幅激励3秒到5秒内按指数衰减到零。这样既不违反PE条件在有限时长内的约束又能让系统恢复平稳运行。注意在激励衰减期间学习率也应当同步调小否则参数更新的信噪比会一路恶化。3.4 结合经验回放缓解PE依赖经验回放是从深度强化学习那边借鉴来的技巧但在在线ADP里同样适用而且非常适合缓解PE条件难以严格满足的现实问题。实现思路也不复杂把每一拍的状态、控制输入、下一时刻状态、一步代价存进一个固定容量的循环缓冲区每次参数更新时从缓冲区随机抽取一小批历史样本计算Bellman误差并更新参数。经验回放的效果在于它天然打破时序相关性让当前回归向量即使暂时退化历史样本仍然能够提供多方向的更新信息。我做了一次对比实验同样的系统、同样的初始条件加PE且更新时只用当前时刻数据与不加PE但每次从回放缓冲区分批采样20条历史数据前者收敛速度略快后者在激励撤销后的参数稳定性反而更好。但注意经验回放不能完全替代PE信号。原因很简单缓冲区里的数据是从过去的状态分布中采集的如果系统只在平衡点附近反复运行缓冲区里存的全是相近状态的样本信息矩阵照样退化。所以经验回放更适合和PE信号配合使用它的价值在于降低PE幅值、减小激励对系统性能的扰动而不是彻底免掉PE。4. 一个简化仿真案例从发散到收敛的调试全记录4.1 仿真对象与参数辨识结构用一个连续时间线性系统来做演示状态方程ẋ A·x B·u其中 A [[0, 1], [1, -2]]B [0, 1]ᵀ。这个系统开环是不稳定的特征值有一个正根所以不加控制就会发散很适合观察在线学习过程。代价函数取标准LQR形式J ∫ (xᵀQx uᵀRu) dt取 Q 为单位阵R 1。用连续时间Riccati方程可以算出最优代价矩阵P* ≈ [[6.43, 2.41], [2.41, 1.13]]对应的最优控制增益 K* R⁻¹BᵀP* ≈ [2.41, 1.13]即 u* -2.41x1 - 1.13x2。在线ADP部分我们假设不知道这个P*用对称矩阵 P̂ [[p̂11, p̂12], [p̂12, p̂22]] 去逼近真实代价函数。控制律取 u -R⁻¹BᵀP̂x d(t)其中d(t)是PE激励信号。参数更新用Bellman误差的梯度下降δ_k x_kᵀP̂x_k - (x_kᵀQx_k u_kᵀRu_k) - x_{k1}ᵀP̂x_{k1}P̂ ← P̂ - η·δ_k·(∂δ_k/∂P̂)这里 η 是学习率。梯度项由状态的前后两拍组合构成具体展开就是 p̂11、p̂12、p̂22 分别对三个二次型项求导。仿真步长取 Δt 0.01s初始状态 x(0) [1, -1]ᵀP̂ 初始化为 0.1 倍单位阵。4.2 不加PE发散是必然的第一组实验不加任何激励信号d(t) ≡ 0。初始控制增益只有 [0, 0.1]远弱于最优增益 [2.41, 1.13]所以系统在最初一小段时间里几乎处于开环发散状态。用欧拉法仿真到0.5秒左右状态量已经涨到10的量级。Bellman误差随之变得非常大梯度更新被巨大误差主导P̂ 的参数很快向离谱的方向跑。到1秒时P̂元素已经出现明显正反馈控制增益变得过大控制量剧烈振荡系统状态在正负方向交替发散最终数值直接溢出。这个发散过程里学习率调小只是让爆发时间点延后并不改变发散本质。这个结果其实不意外。开环不稳定系统在控制律不合格的情况下状态轨迹是发散的回归向量只在幅度轴上膨胀方向信息非常有限。P̂ 对某个方向上的参数做出了错误的高估又因为这个错误高估改变了控制策略、生成了更极端的数据恶性循环。4.3 加PE之后收敛行为的变化第二组实验加上多正弦激励信号d(t) 0.3·sin(0.5t) 0.2·sin(1.3t) 0.1·sin(2.7t)学习率 η 保持0.02不变。仿真启动后状态轨迹受外部激励影响不会收敛到原点而是在原点附近维持有限幅度的持续振荡。这正是我们想要的系统状态在二维平面上不断“游走”x1x2的不同组合都被数据覆盖P̂ 的辨识条件得到保证。从第2秒左右开始p̂12 和 p̂22 已经有明显的收敛趋势接近P的对应元素。p̂11 收敛得稍慢一些因为状态x1由x2积分而来动态特性偏“慢”高频激励对x1的激发幅度天然小于x2。到第5秒三个P̂元素基本稳定在P附近相对误差在5%以内。注意一个细节激励信号叠加在控制输入上导致u也有小幅振荡。但系统处于持续激励下代价函数里的R项会有一定的激励损耗。仿真到稳定阶段我计算的长期平均代价会比纯LQR理论值高大约3%。这就是PE信号的工程代价要在辨识精度和控制性能之间取得平衡。4.4 后续还能怎么扩展案例到这里只是验证了线性系统的可行性。实际项目里我通常会做两步扩展第一步是参数在线监控。仿真过程中实时记录回归向量外积的最小特征值用它来判断当前数据是否满足PE的工程近似要求。特征值低的时候自动增大激励幅值特征值高的时候自动减小激励幅值。这个自适应机制能让PE信号“按需供给”既保证辨识又控制扰动。第二步是把线性Bellman误差换成非线性值函数逼近网络。比如用三层ReLU网络逼近V(x)回归向量变成神经网络的中间层特征由状态x映射而来。PE条件就变成要求这些隐藏特征在数据流中充分变化。这个要求比线性情况更难满足因为网络特征和参数高度耦合可能发生“特征坍缩”——网络输出变化很小但内部表示变得非常稀疏有效激励维度急剧下降。对这种场景我建议在网络输出层加降维监控定期检查特征协方差矩阵的特征值一旦发现有方向的特征值掉到零附近就主动注入状态噪声或者重置部分神经元。5. 常见问题与避坑清单5.1 激励信号“加了但等于没加”这是我在实际项目里遇到最多的问题。很多代码里你确实看到 u u_nominal d(t)但P̂ 还是不收敛。排查下来常见原因激励信号被闭环控制器给“吃掉”了。当P̂ 已经有一定增益时控制律本身会大幅抑制外部激励在状态上的体现。你加的d(t)是0.3经过反馈回路后状态上能观察到的波动可能只有0.03。解决思路是不要只盯着控制输入有没有加信号要盯着系统状态也就是回归向量的实际波动幅度。我习惯在仿真日志里同时记录u和x的功率谱密度如果发现某个频段的激励在状态上几乎没有响应就说明这个频段和系统动态不匹配需要调整激励频率。换句话说激励信号要往系统动态“顺势”的方向加而不是随便堆几个频率。5.2 激励过猛导致系统失稳或者执行器饱和有一种情况是PE幅值设得太大控制输入经常打到执行机构上下限。执行器饱和等于把控制量截断非线性特性被激发但ADP依据的Bellman方程假设的是线性或平滑非线性系统模型失配会让参数更新方向完全跑偏。我控制激励幅值的经验法则是先做一次开环或弱控制仿真看看在多大输入幅值下系统状态响应仍然保持线性不饱和、不触发保护逻辑取这个幅值的20%-50%作为激励基线。然后在闭环中根据信息矩阵特征值动态调整保证激励幅值既要足够、又要在执行机构的线性区间内。5.3 PE条件与稳态性能的冲突怎么权衡很多实际控制系统对稳态精度有硬要求你可以想象一个温控系统被持续激励信号折腾得多难受。这时候我推荐分阶段策略启动阶段全速辨识PE信号给足学习率给高参数基本稳定后进入运行阶段PE信号降到接近零学习率也同步降低。运行阶段如果检测到环境突变比如系统矩阵发生变化导致Bellman误差持续偏大再重新激活PE。这个策略的本质是给PE条件加上时间窗口。严格的理论要求是无限时间窗口内都满足PE但工程上能做到的是在有限的重点时段内让数据充分丰富其余时段依靠已经学到的参数维持控制。这个折中方案在实际应用中效果很好代价是环境漂移太快时可能追不上需要预留周期性再辨识的机制。5.4 学习率和PE幅值的匹配问题学习率和PE幅值其实是“配套”的。PE幅值大回归向量能量高信息矩阵特征值大学习率可以相应调大PE幅值小学习率必须同步调小否则参数更新会被单步的Bellman误差噪声主导。这里有一个在线自适应调节的实用做法把学习率设计成和信息矩阵的最小特征值成正比。每N步估计一次特征值 λmin然后令 η ρ·λmin_estimated其中 ρ 是缩放系数。这样PE强的时候学得快PE弱的时候学得慢且两个环节联动不容易失配。这个做法我写进过几个版本的控制代码里都不需要额外调参就能获得稳定的收敛行为。做ADP的这些年我最大的体会是这套方法能跑通的理论前提和工程前提之间有一条很宽的沟而持续激励条件就是沟上的独木桥。论文里一句话带过的假设到了实际项目里可能需要反复试错、持续监控、动态调整才能真正落地。回归数据的信息量是ADP在线更新真正的主宰PE条件的本质就是保证信息量不枯竭。理解了这一层你再看那些收敛性证明就会明白它们不是在纠结数学细节而是在保护算法最关键的生命线。
返回列表