ARTICLE DETAIL

资讯详情

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

从PI到TD3:并网逆变器电流控制的强化学习实践

从PI到TD3:并网逆变器电流控制的强化学习实践 搞电力电子控制的人听到“强化学习”这个词第一反应大概率是这也太学术了离工程远得很。我一开始也这么想直到在并网逆变器的电流控制上被传统PI参数整定折磨过几轮之后才开始认真看这个方向。这篇文章把我从建模、仿真、训练到部署前思考的完整过程做一个梳理不谈虚的全部是实际项目里要面对的问题。先交代一下背景。我做的是一台单相全桥并网逆变器直流侧400V交流侧220V/50Hz并网通过3mH电感接入电网。控制目标是让并网电流稳定跟踪参考电流实现单位功率因数并网。传统方案就是PI控制器加电网电压前馈靠频域法设计参数再上实验台微调。这套做法在电网阻抗稳定、谐波不大的环境下没问题但一旦遇到弱电网条件或者电网阻抗大幅波动固定参数的PI就会暴露出整定困难、鲁棒性不足的问题。1. 单相并网电流控制传统PI在哪里露出疲态1.1 PI控制器的经典结构与整定思路单相并网逆变器的电流环经典做法是PI控制器加电网电压前馈。结构上很清晰参考电流和实际电流的误差经过PI调节器得到调制波加上电网电压前馈量进入PWM比较器产生占空比。数学形式上就是个一阶惯性系统L * di_g/dt (2d-1) * Vdc - v_g其中d是占空比v_g是电网电压。忽略电网电压扰动从占空比到电流的传递函数近似为 Vdc/(sL)。PI参数按典型I型或II型系统设计带宽取到开关频率的十分之一以下一般500Hz到1kHz相位裕度45度以上。这套方法写在教科书里也写在无数篇论文里工程上稳定性经过大量验证。PI的局限也不难理解它本质上一个线性控制器设计时基于固定模型和标称参数。当电网阻抗变化导致L值偏移或者LCL滤波器谐振峰位置改变时固定参数的裕度会缩小。电网电压畸变时PI对谐波电流的抑制能力也有限通常需要额外加谐振控制器去定点补偿特定次的谐波。1.2 电网环境变化后固定参数控制器的困境我在实验中发现一个比较典型的情况在实验室的模拟电网环境下PI参数调好之后电流THD大约4%波形很干净。但把设备接到一个公共电网接入点那里电网阻抗更大、背景谐波更复杂同样一组PI参数并网电流纹波明显增大波形出现畸变THD上升到了7%以上。这就是固定参数控制器的困境。你说它不能用吗能用。但工程上要求逆变器适应不同的并网环境不能每换一个接入点就重新整定一组参数。自动整定方案也有比如基于阻抗辨识自整定参数但实现复杂而且辨识结果仍受模型准确性制约。1.3 强化学习解决的是哪一类问题强化学习不是万能的它适合的恰恰是这一类问题被控对象动态随环境变化、难以精确建模、同时又存在明确控制目标的任务。神经网络作为非线性函数逼近器理论上可以学习到一个比线性PI适应范围更宽的控制器。强化学习的本质是试错学习通过不断与环境交互根据奖惩信号自动调整策略参数最终学到一种从状态到动作的映射。对并网电流控制而言某种意义上它在寻找一个非线性控制律而这个控制律是连续可调的不依赖精确的系统模型。但这种“不依赖模型”是有条件的需要大量交互数据需要设计好状态空间和奖励函数需要控制训练过程不出现灾难性发散。这篇文章后面讲的就是这些实际操作层面的问题。2. 从电路方程到强化学习环境仿真平台的搭建细节2.1 单相全桥并网逆变器的离散化数学模型做强化学习的第一步不是训练而是把被控对象建成一个可供算法反复交互的环境。控制模型基于单相全桥逆变器的电路方程电压方程L * di_g/dt (2d-1) * Vdc - v_g其中d为占空比取值范围[0,1]。用前向欧拉法离散化控制周期Ts对应开关周期50us时一个周期内的状态更新为i_g[k1] i_g[k] (Ts / L) * ((2d[k]-1) * Vdc[k] - v_g[k])v_g[k] Vg_peak * sin(2 * π * 50 * t[k])只要有了这个递推关系被控对象就可以在Python中作为一个独立的环境类实现。电网电压可以叠加谐波和幅值波动直流母线电压也可以模拟波动这样环境就能表达出真实系统中各种扰动。2.2 环境接口设计状态、step、回合的定义环境接口遵循Gym风格核心是reset和step两个函数但具体设计要充分考虑电力电子控制任务的特点。reset函数做的事情随机初始化电网电压相位、直流母线电压、电网电压幅值等参数。训练阶段采用Domain Randomization策略对这些参数在一定范围内随机抽取目的是让策略学会适应不同的运行条件而不是只记住一组特定参数。step函数的执行流程动作a[k]是占空比目标值或占空比增量下一节细说环境根据当前状态计算下一个控制周期的电流值再返回新状态、奖励和回合是否结束。关键问题是回合长度的定义。电流控制任务本身是连续控制没有天然的终止条件我设定一个回合为20个工频周期即0.4s。对应50us的控制周期一个回合包含8000个step。为什么这么设计回合太短策略没机会观察到完整的正弦周期回合太长会拖慢训练且增加探索阶段的危险累积。2.3 为什么先在Python里训练再去Simulink验证这是整个项目里我认为比较重要的一步取舍。很多人会直接在PSIM或Simulink里搭完整的开关模型做联合仿真训练这样最接近真实电路行为。但问题是联合仿真一个回合要跑20个工频周期而每次step都经过仿真接口通信一个训练回合动辄几十秒整个训练要几千个回合时间成本不可接受。我的做法是分两步第一步在Python中用离散化方程构建简化环境只描述平均状态下的电流动态不包含开关纹波细节。这个环境训练速度快一个训练回合只需毫秒级可以让算法迭代出基本可用的策略。第二步把训练获得的策略接入更精细的Simulink/PSCAD仿真模型带实际开关调制和采样延迟做动态响应、THD、谐波特性验证。这样既保证了训练效率又能对策略在更真实场景下的表现做评估。纯简化环境训练的策略直接上实验台风险太高。两步走的价值在于当精细仿真验证出问题回到训练阶段修改设计时迭代周期仍然可控。3. 状态、动作、奖励的三件套设计决定RL能不能收敛3.1 状态空间比你想的要多一点MDP建模是强化学习在控制应用中最容易出问题的地方。状态空间设计如果不够完备策略无法学到正确的控制规律但如果状态冗余过多又会导致训练困难。我最开始只用了电流误差e i_ref - i_g作为状态结果训练了很久算法都没有收敛。分析原因是单相并网电流是正弦交流量控制器在工频周期不同相位上需要输出不同的占空比。只有电流误差作为状态控制策略无法区分当前处于周期中哪个位置也就无法给出正确的方向性判断。改进后的状态向量包含以下分量电流误差e误差积分项∫e·dt提供类似PI积分的稳态消除作用同时限定积分限幅避免饱和电网电压相位信息sin(θ)和cos(θ)这是让策略感知周期位置的关键直流母线电压Vdc母线波动直接影响占空比计算上一时刻的动作a[k-1]给策略提供记忆保证动作输出平滑实际训练下来加入相位信息后策略的学习效率有显著提升。3.2 动作空间增量式占空比输出更安全动作空间的设计同样重要。最初我尝试让网络直接输出占空比绝对值d∈[0,1]训练早期探索阶段会出现一个实际问题动作随机扰动过大占空比在0和1之间剧烈跳变电流瞬间飙升环境数值发散。解决的办法是改用增量式动作。动作a[k]代表占空比变化量限制在[-0.02,0.02]范围内然后下一拍的实际占空比为d[k] d[k-1] a[k]这个设计相当于为控制量加了速率限制。好处是即使策略在探索初期输出接近限幅的随机动作占空比每拍最多变化2%电流不会发生灾难性过冲。同时增量式动作天然包含积分作用稳态误差会被消除。为什么不把动作离散化成比如10个档位因为离散动作在相邻档位切换时会引起电流阶跃产生额外纹波和振荡控制效果不如连续动作平滑。所以选择连续动作空间配合增量式表达。3.3 奖励函数量纲分析避免学习信号被淹没奖励函数的设置直接决定强化学习的收敛质量也是被很多人低估的环节。我采用的奖励形式是R -w1 * e² - w2 * (a[k] - a[k-1])² - w3 * |e|三项分别惩罚电流跟踪误差、动作变化率即控制能量和绝对误差的线性项。这里有一个具体的量纲分析也是我在训练初期踩过的坑。假设电流误差在0.1A附近e²约为0.01量级。如果动作变化率限制在0.02以内其平方项只有0.0004量级。如果权重w1和w2都设为1误差项和控制平滑项几乎同级但目标其实是以追踪精度为主惩罚项比例失衡策略会把重心放在降低动作变化上电流跟踪性能反而变差。我实际使用的权重是w1100w210w30.5。这样在正常误差水平下误差惩罚项主导学习方向动作变化项起平滑约束作用。如果电流误差达到1A量级误差惩罚项会达到100远大于其他项策略会更重视恢复跟踪。3.4 一个具体的MDP配置示例为了让整体配置更直观把环境参数和MDP配置汇总如下配置项参数值说明直流母线电压Vdc400V ± 10%随机扰动模拟母线波动电网电压有效值220V ± 5%随机扰动模拟弱电网幅值变化并网电感L3mH被控对象标称参数控制周期Ts50us对应20kHz开关频率参考电流幅值10A可随机扰动模拟工况变化回合长度20个工频周期(0.4s)每个回合8000个step状态维度6维e, ∫e, sinθ, cosθ, Vdc, a_prev动作范围[-0.02, 0.02]占空比增量每拍限幅这个配置在我的项目里成了一个稳定的基线后续调优基本围绕权重、网络结构和学习率展开环境本身没有再反复改动过。4. TD3训练过程实录与稳定性调优4.1 算法选型为什么不用DDPG而选TD3连续状态连续动作的强化学习主流算法就那么几个DDPG、TD3、SAC。DDPG是最先尝试的代码简单、框架经典但实际训练过程中遇到了典型的高估问题——Q值估计偏差导致策略在训练中段突然恶化表现不稳定。TD3在DDPG基础上引入三项改进Clipped Double-Q Learning用两个Critic网络取较小值抑制Q值高估Target Policy Smoothing对目标动作加入噪声平滑降低对策略尖峰过拟合Delayed Policy Update延迟策略网络更新先让Critic更稳定实际训练下来TD3的稳定性确实明显优于DDPG。SAC也有很好的性能但引入了熵系数调节超参数更多训练也更慢。对这个项目而言控制环境确定性较强不需要过强的探索TD3的“保守”反而是优势——它不会在训练中期突然把动作推到极端。4.2 先用PI收集数据做预热再进入在线强化学习这是我在实际项目中比较满意的一个设计先不让强化学习从零开始探索而是用传统PI控制器收集一批交互数据用这些数据做行为克隆预训练。具体做法是运行一个固定参数的PI控制器记录状态与动作对s, a到经验池中收集约10万条数据然后离线训练策略网络让它先学会“模仿”PI的行为。直接将策略网络替换为PI或者作为PI的改进起点这个预热之后策略在初始时刻就具备和PI差不多的控制基础在线训练时不会从零探索大大降低了早期随机动作导致过流的风险。这个思路和离线强化学习中的行为克隆预训练类似但不需要额外引入复杂的IQL或CQL等离线算法简单有效。之后再加载预训练权重用TD3在线交互训练策略会在PI基础上继续优化。4.3 训练超参数清单下面是我调参后实际用于该项目的一组超参数超参数数值备注Actor网络结构三层MLP每层256个节点输出层tanh激活后映射到动作范围Critic网络结构三层MLP每层256个节点两个Critic独立Actor学习率3e-4使用Adam优化器Critic学习率1e-4不收敛时优先降Critic学习率经验池大小100万条经验足够覆盖多种工况组合Batch Size256常规值未做特殊调优折扣因子γ0.99连续控制任务常规选择Target网络更新率τ0.005软更新探索噪声初始std0.2高斯噪声探索噪声末期std0.02在2万个episode内线性衰减策略更新延迟2Critic每步更新Actor每2步更新探索噪声的衰减曲线值得特别留意。衰减过快会导致策略过早收敛到次优解衰减过慢则训练后期动作依然大幅抖动电流纹波大。线性衰减到0.02之后保持恒定这既保证后期策略稳定输出又保留一定的抗环境突变能力。4.4 训练中常见的发散问题与排查路径训练不是一路顺畅跑完的记录几个典型问题和排查过程。问题一训练中期策略突然输出极端占空比。收敛了大约1500个episode后某次训练过程中电流突然失控占空比跳到限幅值。排查思路是先看奖励曲线发现回报在发散前出现了一个尖峰提升这说明Critic产生了Q值高估策略被引导到了非真实最优的方向。修复措施降低Critic学习率到1e-4同时将Target Policy Smoothing噪声std从0.1调大到0.15政策更新从每2步改为延迟到3步。调整后训练稳定了许多。问题二电流跟踪误差一直不下降。这个问题的根因通常是奖励信号被其他项支配了。按前面量纲分析检查w2是不是过大或者状态里是否缺少关键相位信息。我对照过几次多数情况是奖励权重或状态缺失导致的。问题三验证环境表现与训练环境表现差异大。这说明策略过拟合了训练环境的特定扰动分布。对策是加大Domain Randomization范围比如把电网电压幅值扰动从5%加到10%同时把参考电流幅值也做随机化让策略必须学会宽工况适应。5. 策略部署到控制器之前先想清楚这三件事5.1 网络规模压缩与推理转换强化学习训练的神经网络在PyTorch环境里运行完全没问题但部署到DSP或FPGA控制器上就是另一回事。控制周期50us也就是20kHz开关频率下每个开关周期MCU都要执行一次神经网络前向推理。DSP做一次包含几百个乘法累加操作的三层网络推理计算时间可能超过控制周期。因此部署前需要做网络压缩。我的做法是知识蒸馏把训练好的256节点教师网络蒸馏到一个64节点的学生网络验证性能损失在可控范围。同时考虑浮点转定点将权重和激活量化为16位定点数进一步降低计算负载。另外在工程实现上网络推理和PWM更新要做流水线调度千万不能前向算完再更新占空比导致一拍滞后。5.2 安全监督层与PI备份工程上不能期望神经网络策略覆盖所有极端工况。我的设计是在RL策略外层加一个安全监督层。当电流误差绝对值超过阈值比如5A或者直流母线电压超出允许范围时安全逻辑立即将控制权切回PI控制器。这是一个纯粹逻辑判断的模块处理周期微秒级不依赖神经网络推理。这个安全监督层的存在不是否定RL策略的价值而是给系统一个可解释、可信赖的安全兜底。做实际工程项目要的是在任何条件下系统都不会崩溃。RL策略负责在标称工况内做性能优化安全层负责在异常工况下兜底分工明确。5.3 传感器延迟与一拍滞后的建模仿真环境里假设控制器获得电流采样后立刻计算并输出占空比没有延迟。真实DSP实现中有实际的信号链延迟电流传感器采样延时、ADC转换时间、计算时间这些加起来通常有一到两个控制周期。延迟会让实际系统相位裕度下降在训练时如果不考虑这个延迟上板后会出现系统振荡。处理办法很直接在仿真环境训练时就把延迟建模进去。在环境step中当前动作影响的不是下一拍的电流而是下下一拍或第三拍的电流。具体延迟拍数由目标控制芯片的时序决定。把延迟统一建模到环境里训练得到的策略天然对这种时序有适应性部署后不需要再做大的补偿调整。5.4 仿真验证结果的一个对比视角用前面的方法我把训练好的策略放回带开关调制细节的Simulink模型里和经典PI控制器做了对比验证。测试工况是电网电压叠加5%的背景谐波同时直流母线电压施加±10%的随机跌落。固定PI参数仍然保持标称值RL策略则是通过Domain Randomization训练出来的。在固定PI控制下并网电流THD在谐波工况下从标称的4%左右上升到7%左右。RL策略在同样工况下THD控制在3.5%上下。电网电压瞬时跌落30%的动态响应上RL策略的电流恢复时间也比PI快约一个工频周期。这个结果印证了一个观点RL策略的增益不在标称工况下的性能而在非标称工况下的鲁棒性。这正是单一固定参数PI的短板所在。当然也要说明这个结果基于仿真模型验证尚未覆盖实验台上所有真实物理效应比如电流传感器噪声、温度漂移、死区效应等。但这些干扰可以通过在训练环境中进一步增加扰动项来逐步逼近真实场景这也是后续可以继续深化的方向。回顾整个项目我认为最值得分享的一套思路是先把被控对象模型吃透设计一个合理的MDP再用传统PI做行为克隆预热用TD3做在线微调最后在更精细的仿真里验证并规划部署方案。这套流程每一步都在降低不确定性——模型层面降低环境风险预热降低探索风险验证降低部署风险。如果你也想在这个方向尝试不推荐直接跳到算法调参把前面的基础工作做扎实训练过程会顺利得多。
返回列表