拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Meta-Gradient强化学习:从手动调参到超参自适应更新

写这篇东西之前我先说说自己的感受。强化学习调参这件事做过的人都知道有多磨人。学习率、折扣因子、GAE的λ每个超参数都有自己的一套脾气而且它们之间还会互相影响。更为关键的是训练过程中环境反馈的非平稳性意味着最优超参数可能一直在变手工调参本质上是在追逐一个移动靶。Meta-Gradient Reinforcement Learning是我这两年读过之后觉得后劲特别足的一篇工作它跳出了“人肉调参”的框框把超参数本身也放进了优化目标里。这篇文章我尽量用偏实操的视角把Meta-Gradient的核心推导、实现细节和训练中容易踩的坑都捋一遍给正在接触Meta-RL的读者一条能上手的路。1. 内容整体设计与思路拆解1.1 先说清楚Meta-Gradient到底解决什么问题传统强化学习训练时我们会固定一组超参数从头跑到尾。问题是不同训练阶段对超参数的需求其实完全不同。训练初期策略还比较随机步子可以迈大一点到了后期策略逐渐收敛过大的学习率反而会导致震荡。折扣因子γ也类似环境回报的稀疏程度和任务的可分辩性在训练过程中都会发生变化。Meta-Gradient的核心想法非常直白既然我们已经在用梯度更新策略参数那为什么不能用同样的思路去更新这些超参数本身它把γ、λ、学习率这些传统意义上的“超参数”统称为meta-parameter通过一个额外的元梯度meta-gradient来调整它们的取值让算法在训练过程中自动适配当前的学习状态。这里需要强调一下Meta-Gradient属于Meta-RL的范畴但它和常见的MAML、RL²这类元学习算法走的是完全不同的路线。MAML是在大量任务上学习一个初始化参数让新任务能在几步梯度更新内快速收敛RL²则直接把强化学习过程建模成一个序列预测问题用RNN隐式地学习学习规则。Meta-Gradient不跨任务它追求的是在单个任务的训练过程中通过梯度信息动态调整超参数让算法自身具备“自适应调参”的能力。1.2 为什么选择梯度方式而不是网格搜索或贝叶斯优化一个很自然的疑问是调超参数不是有现成的Optuna或者网格搜索吗为什么还要费劲推导meta-gradient关键在于成本。网格搜索、随机搜索、贝叶斯优化本质上都属于黑盒优化每次评估一组超参数都要完整跑一遍训练流程。强化学习本身训练就贵再乘上超参数组合的数量预算根本撑不住。而且这些方法假设超参数在训练过程中保持不变这本身就与真实需求矛盾。Meta-Gradient的优势在于它使用了白盒信息。既然策略参数是通过梯度更新的那么超参数对策略更新方向的影响在数学上是可微的我们完全可以通过链式法则把这个梯度算出来。这就好比一个人想调整自己的跑步姿势如果只能靠“跑完看成绩再凭感觉改”效率很低但如果有高速摄像机逐帧分析每一个关节角度对成绩的影响调整就会精准得多。Meta-Gradient就是那台高速摄像机。更重要的是meta-gradient是逐时间步计算的超参数可以在训练过程中持续变化而不是像黑盒搜索那样只能得到一个固定的最优值。这一点在后面讲γ和λ的自动调整时会看到它们的动态变化对样本效率的提升非常显著。2. 核心推导拆解meta-gradient为什么可行2.1 从策略梯度出发建立两层优化结构先定义一下记号。设策略参数为ηmeta-parameter为θ比如γ、λ、学习率β这些强化学习的内层优化是η η β * ∇_η J(η, θ)也就是用当前的策略梯度更新一步策略参数。这里的β本身也可以是meta-parameter之一即学习率也参与自动调整。传统强化学习只关心J(η)这个目标而Meta-Gradient关心的是J(η)也就是更新之后的策略参数能够获得多少期望回报。为什么在意η而不是η因为η代表了算法实际执行的一步”动作”我们希望这一步动作本身是高质量的。外层优化目标写作max J(η(θ))对θ求导∂J(η)/∂θ ∂J(η)/∂η * dη/dθ第一项 ∂J(η)/∂η 就是更新后的策略梯度可以直接用策略梯度定理估计。关键在于第二项 dη/dθ它刻画了超参数θ如何通过影响内层更新来间接影响策略参数。2.2 链式展开里最重要的那个单位矩阵将η的更新式代入dη/dθdη/dθ d(η β * ∇_η J(η, θ))/dθ dη/dθ β * d(∇_η J(η, θ))/dθ这里有个很关键的处理dη/dθ这一项该怎么理解。由于η和θ在优化开始时是相互独立的通常设dη/dθ I单位矩阵表示策略参数相对于自身的变化率为1。但实际上θ对η的间接影响已经通过第二项β * d(∇_η J(η))/dθ包含了所以单位矩阵项起到的是恒等映射的作用保证梯度链的起点正确。第二项展开后涉及策略梯度的二阶导数。直接计算海森矩阵在深度强化学习中是不现实的论文里通过一个巧妙的近似来处理在实现中用一个额外的网络或者直接利用采样得到的轨迹来估计∂J(η)/∂η再结合超参数的敏感性用一阶近似绕开显式的二阶计算。我在复现时的一个体会是这个dη/dθ I的设置给实现带来了很大的简化。它意味着我们不需要追踪η对θ的历史依赖只需要关心当前这一步更新的敏感度。但相应地这也丢失了一些长期依赖信息所以Meta-Gradient本质上是一种“短视”的元学习。2.3 Retrace与重要性采样让元梯度计算可行如果直接在on-policy设置下计算元梯度需要考虑数据的分布偏移问题。策略更新后旧轨迹的分布已经不同于新策略的分布直接用旧数据计算梯度会有偏差。论文中使用了一个叫做Retrace的操作来修正这个问题。简单理解Retrace是一种重要性采样与截断加权结合的技术它给每个样本乘以一个权重使得在off-policy的情况下仍然能获得无偏或低方差的回报估计。实际实现中Meta-Gradient Policy GradientMG-PG利用当前策略η采样轨迹同时用Retrace修正Q值估计。Meta-Gradient Q-LearningMG-QL则是在DQN的基础上加入类似的修正。我这里更建议读者先从MG-PG入手因为它和传统的Actor-Critic结构更接近改造起来比较顺手。提示如果你对Retrace的具体推导感兴趣可以去看Safe and Efficient Off-Policy Reinforcement Learning那篇论文。不过复现Meta-Gradient时不需要把Retrace的数学完全吃透只需要知道它是在用旧数据算新策略梯度时的一个保命符就够了。3. 实操过程与核心环节实现3.1 网络结构的改造建议Meta-Gradient实现的核心是双网络结构一个网络输出策略和价值估计另一个网络输出meta-parameter的梯度。我这里以MG-PG为例给出一个经过验证的Actor-Critic改造方案。Actor网络和Critic网络的架构与普通PPO没有什么区别区别在于需要额外维护一个meta-parameter向量θ包括折扣因子γ、GAE的λ、学习率β。它们被初始化为经验值并在训练过程中通过元梯度持续更新。外层元梯度的更新频率不需要和内层策略梯度一致。我自己习惯的做法是每更新N步策略参数后用这批累积的数据计算一次元梯度并更新θ。N取50到100之间比较合适太频繁会让元梯度估计的方差偏高太稀疏则会让超参数调整跟不上策略的变化节奏。3.2 元梯度的近似实现伪代码下面给出一份可以直接照着写的伪代码框架语言用的是Python风格的描述性代码重点在于把meta-gradient的计算流程讲明白。# meta_parameter: theta [gamma, lambda, lr] # policy_parameter: eta def meta_update(eta, theta, replay_buffer): # 1. 用当前策略采样一批轨迹 trajectories collect_trajectories(eta) # 2. 计算内层策略梯度 inner_grad compute_policy_gradient(trajectories, theta) # 3. 模拟一步内层更新得到eta eta_prime eta theta.lr * inner_grad # 4. 用eta重新计算策略梯度这里用Retrace做重要性修正 outer_grad compute_policy_gradient_with_retrace(trajectories, eta_prime) # 5. 计算meta-gradient: dJ(eta)/dtheta # 利用d_eta_prime/d_theta I lr * d(inner_grad)/d_theta # 实际用一阶近似或者Hack方法实现 meta_grad outer_grad * (I theta.lr * compute_sensitivity(inner_grad, theta)) # 6. 更新meta-parameter theta meta_lr * meta_grad # 7. 更新策略参数 eta eta_prime这段伪代码里最关键的是第5步的compute_sensitivity。完整实现中这里需要计算二阶导数或者采用近似方案我建议初次复现时直接忽略这个敏感度项只保留单位矩阵也就是让meta_grad outer_grad然后观察效果。等流程跑通之后再逐步加入敏感度项。我自己的经验是忽略敏感度项会让meta-parameter更新方向变得比较粗糙但依然比固定超参数效果好。加入敏感度项之后γ的学习会比λ稳定得多可能是因为γ对返回值的影响更直接。3.3 三个meta-parameter的实验效果详解论文里对γ、λ、学习率三类参数分别做了实验。我在自己的复现中也观察到了类似的现象展开说一下。折扣因子γγ控制的是智能体对远期回报的重视程度。实验中发现meta-gradient会自动把γ调整到与任务的时间尺度匹配。如果在某个阶段任务需要长期规划γ会趋势性地增大如果环境回报变得短视γ又会回落。这个自适应的特性实际上是手动调参很难做到的因为人很难实时判断当前状态到底压多少折现率合适。GAE的λλ控制的是偏差与方差的权衡。λ接近1时方差大但偏差小λ接近0时相反。Meta-Gradient学到的λ变化规律很有意思它会在训练初期保持一个中等偏高的水平以加速探索后期逐渐降低使策略更新更稳定。这背后的直觉是训练初期策略远未收敛较大的λ能引导智能体更快发现有效行为后期策略接近最优需要精细调整较小的λ避免噪声干扰。学习率β学习率是最难学的meta-parameter之一因为它的梯度信号通常很嘈杂。我在实验中尝试过让meta-gradient直接更新学习率效果时好时坏。论文中其实没有把学习率作为重点描述对象我更倾向于保持学习率固定只让γ和λ参与元梯度更新。这样既保证了稳定性又拿到了自适应的大部分收益。3.4 训练流程的五个阶段落地整个MG-PG的训练流程可以拆成五个阶段按顺序执行初始化Actor网络、Critic网络以及meta-parameter向量θθ的初始值使用常规强化学习中的经验配置比如γ0.99、λ0.95、lr3e-4。按当前策略采样一批轨迹利用GAE计算优势函数同时得到内层策略梯度和价值损失。执行内层更新得到策略参数η。此时暂不更新θ。利用Retrace修正后的回报重新计算策略梯度并以dη/dθ为桥梁计算元梯度更新θ。重复步骤2到4直到训练收敛。这里有个容易忽略的细节meta-parameter的更新会影响GAE和优势函数的计算方式。因为γ和λ在变所以每轮计算优势函数时要使用当前最新的θ值不能用上一轮的。初始实现时很容易忽略这一点会出现reward都在涨但训练异常振荡的情况排查了半天才发现是γ在旧值上反复横跳导致的。4. 常见问题与排查技巧实录4.1 元梯度发散loss爆炸的排查记录我在第一次跑MG-PG时遇到的最奇怪的问题是策略的reward曲线在初始阶段一直稳步上升但到某个点之后突然剧烈震荡甚至直接发散。排查了很久最后发现是meta-parameter里的γ被更新到了超过1.0的值。γ大于1意味着智能体对远期回报的估计是发散的因为回报序列的加权和会随步数爆炸。为什么meta-gradient会把γ推到这种危险区域因为从梯度角度看增大γ确实能提高当前轨迹的估计回报但这会牺牲长期稳定性。解决办法也很直接给meta-parameter加上范围约束。γ限制在0到0.999之间λ限制在0到1之间。我建议在每次meta更新之后加一个clip操作而不是在计算loss时约束这样能保证meta-parameter永远在合理区间内移动梯度也不会因为clip而产生奇怪的偏置。4.2 元梯度方差大为什么需要累积再更新另一个常见问题是meta-parameter更新的方差非常大γ一会在0.95一会在0.85完全看不出明显的趋势性变化。这和策略梯度的方差问题同源但meta-parameter用了更少的样本去估计天然方差更高。我的处理方式是累积多个时间步的meta-gradient再做平均更新相当于给meta-parameter更新加了一个滑动窗口。窗口大小取10到20之间即可。另一个经验是meta-parameter的更新步长至少要比策略参数小一个数量级我通常设meta_lr 3e-5而策略学习率是3e-4。这样虽然meta-parameter更新得慢但胜在稳定长期趋势反而更清晰。4.3 超参数间的耦合与手动锚定技巧meta-parameter之间不是独立的。比如增大γ会改变GAE的计算等效于改变λ的影响权重。这意味着meta-gradient更新γ时λ的梯度计算也会受到影响两者之间存在隐式的耦合。如果发现γ和λ都在各自更新但reward曲线纹丝不动可以从两个方向排查。第一查看γ和λ的更新速度是否差异过大如果γ变化很快而λ几乎不动考虑两个meta-parameter使用不同的meta_lr。第二给其中一个meta-parameter做“锚定”比如前1000步固定λ只让γ参与更新等γ稳定后再放开λ。我在实验中用这个技巧解决过几次训练不收敛的问题。4.4 常见问题速查表问题现象可能原因解决方案训练中期reward骤降γ被更新到超过1对meta-parameter加clipγ限制在0.999以内meta-parameter剧烈振荡元梯度过早更新样本不足累积多个时间步的梯度再更新策略一直不收敛学习率参与meta更新导致不稳定固定学习率只让γ和λ参与更新γ和λ更新互相干扰超参数间存在隐式耦合分阶段锚定先调γ再调λ外层梯度计算过于耗时二阶导数计算开销大用一阶近似替代或忽略敏感度项离线数据下效果差on-policy假设失效引入Retrace或V-trace修正5. 实现细节中的设计哲学与个人思考5.1 为什么说Meta-Gradient是“学习如何学习”的另一种范式从Meta-RL的视角看Meta-Gradient和MAML虽然共享“元学习”这个帽子但它们看待任务的方式完全不同。MAML在任务分布上学习初始化追求的是跨任务的快速适应能力Meta-Gradient在单个任务内部寻找学习过程本身的自适应机制追求的是训练过程中的样本效率。我在跑实验时体验最深的是Meta-Gradient不需要准备多任务数据它只需要正常的强化学习训练数据额外计算一个元梯度就行。这使得它可以直接嵌入现有的PPO、DQN实现中改造成本比想象中低很多。如果你已经有一个跑通了的强化学习项目想换到Meta-Gradient大约只需要增加几百行代码。5.2 计算开销与收益的权衡建议Meta-Gradient不是免费的午餐。计算元梯度需要额外的前向和反向传播每次更新大约增加20%到50%的计算开销具体取决于网络规模和元参数数量。收益则取决于任务性质在需要长期信用分配的任务中自动学习的γ能带来明显的收益在短视任务中收益就会小很多。我给出的建议是先在一个中小规模的基准环境上做验证跑通之后再决定是否投入全量训练资源。如果任务本身对超参数不敏感用固定参数也能达到不错的性能那Meta-Gradient带来的提升可能非常有限甚至因为额外方差而略微变差。5.3 我踩过的一个印象很深的坑两个更新不同步有一次训练中我注意到策略参数和meta-parameter的更新频率不一致策略每步都更新meta-parameter每50步更新一次。起初没在意后来发现meta-parameter更新后策略梯度方向会发生突变因为γ和λ变了旧的优势估计已经不对了。这导致一个隐性Bug策略参数明明在按梯度方向更新但γ和λ一变更整个优化曲面就变了策略相当于在追一个不断移动的目标。后来我改成在meta-parameter更新后重新计算一轮优势函数再做策略更新才解决了这个不同步问题。如果你做的是并行环境训练更要小心。多个环境采样的数据分布不同合并计算meta-gradient时要确保样本量足够否则某个环境里的极端样本会主导元梯度导致meta-parameter被带偏。5.4 后续扩展方向的个人建议Meta-Gradient这个思路的延展性很强。比如可以试着把熵系数、KL惩罚系数也纳入meta-parameter的范畴让算法自动调整探索与利用的平衡。再比如把Meta-Gradient和分布式强化学习如IMPALA结合在大规模数据下做超参数自适应。不过要提醒的是meta-parameter的数量越多元梯度的方差就越大。一次加太多参数进去会显著增加训练的不稳定性。我建议一次只加入一到两个新参数跑通稳定后再逐步扩展。从更长远的角度看Meta-Gradient最有想象力的方向是把离线强化学习中常见的保守系数、行为约束系数也变成可学习的meta-parameter让离线训练不再依赖人工调参。虽然目前相关的公开工作还不多但这条路一旦走通对实际工程落地会有很大的帮助。我在实际使用中的体会是Meta-Gradient不是一个拿来即用的算法包它更像一个思考框架。它让我重新审视了“哪些东西应该被固定哪些东西可以被优化”这个问题。传统的机器学习流程里超参数似乎是不可触碰的领域但Meta-Gradient用数学告诉我们只要有合适的梯度路径没有什么是不能学的。如果你正在做一些长时间训练才能收敛的任务并且已经厌倦了每跑一轮就回来调一遍γ和λ那Meta-Gradient值得你花上一两个星期去试试。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门