资讯动态

SLAC潜空间随机模型:强化学习连续控制实战与调参避坑指南

发布时间:2026/10/26 11:16:26 来源:尧图企业网站定制
强化学习在连续控制任务里有个老问题一直没被彻底解决策略梯度方法样本效率低模型-based 方法又容易因为模型偏差把策略带偏。Stochastic Latent Actor-Critic简称 SLAC这篇工作试图在两者之间找一条中间路线——用一个随机隐变量模型在低维潜空间里做想象推演再让 actor-critic 在这个潜空间里学策略。我第一次读到这个思路时的直觉是这不就是把世界模型和 SAC 拼在一起吗但真正动手复现之后才发现随机隐变量的引入让整条训练链路的设计取舍变得非常微妙很多细节如果照搬确定性模型的套路会直接崩掉。下面我按自己复现和调参的实际顺序把 SLAC 的机制、实现要点和踩过的坑拆开讲适合有一定强化学习基础、想搞懂潜空间模型-based 方法到底怎么落地的人参考。1. 为什么要在潜空间里做随机建模1.1 像素输入下直接学策略的困境连续控制任务如果观测是高维图像直接把图像喂给 SAC 这类无模型方法样本效率会低到难以接受。原因不复杂策略网络和价值网络都要从像素里自己摸索出物体位置、速度这些真正决定动力学状态的信息而这个摸索过程需要海量交互数据。我在一个视觉推物任务上做过对比纯 SAC 从像素输入起步往往要几十万步才能看到策略开始收敛的迹象而同样的任务如果给的是低维状态向量几万步就有明显起色。模型-based 方法想解决的就是这个问题先学一个环境模型然后用模型生成的虚拟样本来训练策略减少真实交互。但这里有个关键分叉——模型建在什么空间里。如果直接在像素空间建模型预测下一帧图像本身就是个极难的任务误差会累积得很快更合理的做法是先把高维观测压缩到一个低维潜空间在潜空间里学动力学再在潜空间里做规划和策略学习。SLAC 走的就是这条路而且它坚持潜变量必须是随机的这一点是整篇工作的核心分歧点。1.2 确定性隐变量模型为什么会失效很多早期潜空间模型-based 方法用的是确定性编码器把观测映射成一个点估计。这种做法在短程预测上还行但一旦做多步想象推演问题就暴露了真实环境的动力学往往存在不可观测的随机因素比如物体的摩擦系数微小差异、执行器的随机抖动。确定性模型会把这些随机性全部抹平导致想象出来的轨迹过于干净策略在想象里表现很好一到真实环境就崩。SLAC 的解法是让隐变量服从一个分布而不是一个点具体用随机隐变量来承载观测中无法从历史动作推断出的那部分信息。这样模型在做多步推演时每一步都能从隐变量分布里采样天然带上了不确定性。我实测下来的感受是这个设计对长程想象的稳定性提升非常明显尤其是在那些动力学有明显随机性的任务上确定性版本的多步预测误差会指数级放大而随机版本至少能把误差控制在可接受范围内。1.3 随机隐变量带来的建模自由度从概率图的角度看SLAC 的模型结构可以理解成两层底层是隐状态随时间的马尔可夫转移上层是每个时间步的观测由当前隐状态生成。关键在于隐状态转移本身是随机的而观测生成也是随机的。这种双层随机结构让模型既能捕捉时序上的不确定性又能捕捉观测层面的噪声。这里有个容易被忽略的点随机隐变量并不意味着模型更难训练恰恰相反适度的随机性起到了正则化作用。我在一个小规模任务上试过把隐变量的方差人为压到接近零结果模型在训练集上的重构误差很低但想象推演的误差反而更大——过拟合了确定性的表面规律丢掉了真正有用的不确定性结构。所以隐变量的随机性不是可有可无的装饰而是模型泛化能力的一部分。2. SLAC 的整体架构拆解2.1 编码器-动力学-解码器三段式结构SLAC 的模型部分由三个网络组成我按数据流向来梳理。编码器负责把当前观测和动作映射成隐变量的后验分布参数注意这里是后验也就是看到了当前观测之后对隐状态的推断。动力学网络负责从上一时刻的隐状态和当前动作预测下一时刻隐状态的先验分布。解码器则从隐状态重构出观测同时还有一个奖励预测头从隐状态预测即时奖励。这三段式结构在训练时的损失由几部分组成重构损失保证隐状态保留了观测的关键信息KL 散度把后验拉向先验以保证动力学的一致性奖励预测损失让隐状态携带任务相关的信息。我在实现时踩过一个坑一开始只用了重构损失和奖励损失没加 KL 项结果隐空间完全失去了时序结构动力学网络学出来的转移和实际完全对不上。KL 项在这里不是可选项它是把编码器和动力学网络绑在一起的胶水。2.2 隐空间里 actor-critic 的运作方式策略学习部分SLAC 把 SAC 的 actor-critic 搬到了潜空间里。具体来说critic 的输入不是原始观测而是从后验分布里采样出来的隐状态加上动作。actor 同样在隐状态上输出动作分布。这样做的好处是策略网络面对的输入维度低、信息密度高学习效率自然上去了。但这里有个设计细节值得说清楚训练 critic 时用的隐状态是从真实数据的后验里采样的而做想象推演时用的是从先验里采样的隐状态。这两者之间存在分布偏移如果处理不好critic 会在想象数据上估值失准。SLAC 的处理方式是在想象推演时也用后验来校正具体做法是在推演的每一步都用当前观测更新隐状态的后验而不是纯粹靠先验往前滚。这个细节对稳定性影响很大我后面会单独展开。2.3 想象推演的长度与频率权衡模型-based 方法都绕不开一个问题想象推演多长合适。推演太短模型带来的样本效率优势发挥不出来推演太长模型误差累积会污染训练信号。SLAC 原文里用的推演长度不算特别长我实测下来这个长度和任务的动力学复杂度强相关。我的经验是先从一个保守的短长度起步观察想象轨迹和真实轨迹的偏差随步数的增长曲线找到偏差开始明显发散的那个步数然后把推演长度设在这个拐点之前。另外推演的频率也有讲究不是每个真实样本都要配一段想象比较稳的做法是每个真实 batch 配一段等长的想象 batch让真实数据和想象数据在训练中保持大致平衡。完全靠想象数据训练会很快过拟合模型偏差完全不用想象又失去了模型-based 的意义。3. 训练链路的实现细节3.1 后验采样与重参数化技巧隐变量的采样必须可导否则梯度传不回编码器。标准做法是重参数化从标准正态分布采样一个噪声然后通过均值和标准差变换得到隐变量样本。这里有个实现上的小陷阱标准差不能直接输出要先过一层 softplus 或者 exp 保证为正而且最好加一个下界防止数值下溢。我在早期版本里忘了给标准差加下界训练到中途偶尔会出现方差塌缩到零的情况表现为 KL 项突然变得很小、重构突然变差整个训练曲线出现断崖。后来给标准差加了个很小的下界这个问题就再没出现过。另外采样的时候建议用 rsample 而不是 sample前者保留梯度后者会切断梯度链路这个错误很隐蔽因为前向数值看起来完全正常只有反向传播时才出问题。3.2 KL 项的平衡与退火策略KL 散度项在 SLAC 里承担着对齐后验和先验的职责但它的权重很敏感。权重太大隐变量会被压得接近先验编码器学不到有用的信息重构变差权重太小后验和先验脱节动力学网络学到的转移和编码器的推断对不上想象推演直接失效。我试过固定权重和退火两种方案。固定权重需要针对任务反复调换一个任务就得重调退火方案是从一个较小的 KL 权重起步随着训练逐步增大到目标值让模型先充分学习重构再逐步约束隐空间结构。实测下来退火更省心尤其是在新任务上做首次尝试时不用一上来就纠结权重数值。退火曲线我一般用线性或者余弦从接近零的权重在训练前三分之一的时间里升到目标值后面保持恒定。3.3 奖励预测头的独立性与共享表示奖励预测头是从隐状态预测即时奖励的小网络。这里有个设计选择奖励头和解码器共享隐状态表示但网络参数是独立的。我一开始图省事让奖励头和解码器共享了部分参数结果发现奖励预测的梯度会干扰重构任务重构质量下降明显。分开之后两者各司其职效果稳定很多。另一个细节是奖励预测的损失尺度。不同任务的奖励量级差异很大有的任务奖励在零附近小幅波动有的任务奖励能到几百。如果不对奖励做归一化奖励预测损失会主导整个模型训练把重构和 KL 项压得没有存在感。我的做法是在数据预处理阶段对奖励做标准化训练时用标准化后的奖励评估和实际使用时再反变换回去。4. 想象推演中的分布偏移处理4.1 先验推演与后验校正的配合前面提到过想象推演时如果纯粹用先验往前滚隐状态会逐渐偏离真实后验导致 critic 在想象数据上的估值失真。SLAC 的做法是在推演的每一步都利用当前的真实观测来更新隐状态相当于在想象过程中不断用真实信息做校正。具体实现上推演的每一步先根据上一时刻隐状态和动作算出先验然后结合当前时刻的真实观测算出后验从后验里采样作为这一步的隐状态。这样想象轨迹虽然动作是策略生成的但隐状态始终锚定在真实观测附近偏差不会无限累积。我在一个长程推演任务上对比过纯先验推演和带后验校正的版本前者在推演超过十步之后 critic 的估值就明显偏离真实回报后者能稳定到二十步以上。4.2 推演起点的选择策略想象推演的起点是从真实数据里采样的隐状态后验。这里有个容易忽略的点起点的选择会影响想象数据的多样性。如果总是从训练数据的开头采样想象轨迹会集中在少数几个初始状态附近如果随机采样覆盖面更广但可能包含一些边缘状态。我的做法是从当前 batch 里随机采样起点但会过滤掉那些后验方差过大的样本因为方差大意味着编码器对该观测的推断不确定从这种状态出发的想象轨迹可信度低。这个过滤步骤看起来不起眼但对训练稳定性的帮助不小尤其是在训练早期编码器还没收敛的时候。4.3 critic 目标值的计算与截断critic 在想象数据上的目标值计算和标准 SAC 类似用当前策略在想象的下一个隐状态上采样动作算 Q 值加熵项。但这里有个模型-based 特有的问题想象出来的回报可能因为模型误差而偏离真实范围如果直接拿来当目标critic 会被带偏。我加了一个简单的保护措施对想象回报做截断限制在一个基于真实数据统计出来的合理范围内。这个范围可以从真实 batch 的回报分布里估计比如取真实回报的某个分位数区间。截断阈值不需要很精确它的作用主要是防止个别离谱的想象样本把 critic 拉爆。实测下来这个措施让训练曲线平滑了不少尤其是在模型还没训好的早期阶段。5. 实操中踩过的坑与调参经验5.1 隐变量维度的选择隐变量维度是个需要权衡的超参数。维度太低隐状态承载不了足够的动力学信息重构和预测都会变差维度太高隐空间变得稀疏动力学网络难以学到有效的转移结构而且计算开销上升。我的经验是从一个中等维度起步比如十六到三十二之间然后观察重构质量和想象推演误差。如果重构很好但推演误差大说明维度可能偏高动力学没学好如果重构本身就差说明维度偏低或者编码器容量不够。另外隐变量维度和观测复杂度相关像素输入的任务通常需要比低维状态输入更高的维度但也不是越高越好我见过维度设到一百多反而训练不稳定的情况。5.2 模型训练与策略训练的节奏SLAC 里模型和策略是交替训练的但两者的节奏需要协调。如果模型还没训好就开始大量策略更新策略会在错误的想象数据上学偏如果模型训得太久才更新策略样本效率优势又发挥不出来。我一般让模型先单独预热一段时间等重构损失和奖励预测损失降到相对稳定的水平再开始策略更新。预热阶段不需要太长关键是看损失曲线是否进入平台期。进入联合训练后我保持模型更新和策略更新的频率大致相当但会在模型损失出现明显波动时临时降低策略更新的比例等模型稳定后再恢复。这个动态调整没有严格的公式更多是靠观察损失曲线做判断。5.3 常见失败模式与排查思路复现 SLAC 时我遇到过几种典型的失败模式这里列出来供参考。第一种是策略完全不学表现为回报曲线平直。排查顺序是先看模型的重构质量如果重构都很差问题在模型训练如果重构正常但想象推演误差大问题在动力学或 KL 平衡如果模型和推演都正常问题可能在 critic 的目标值计算或者策略更新的学习率。第二种是训练中途崩溃回报突然断崖式下跌。这种多半是数值问题检查标准差是否有下界、KL 项是否出现极端值、奖励是否做了归一化。第三种是策略在想象里表现好但真实环境差这是典型的模型偏差问题需要缩短推演长度或者加强后验校正。失败模式首要排查点常见根因策略完全不学模型重构质量编码器容量不足或 KL 权重过大训练中途崩溃数值稳定性标准差无下界、奖励未归一化想象好真实差推演长度与校正模型偏差累积、缺后验校正收敛极慢训练节奏模型预热不足或策略更新过频5.4 计算开销与工程优化SLAC 的计算开销比纯无模型方法高不少因为多了编码器、动力学、解码器三个网络的训练还有想象推演的额外前向计算。我在单卡上跑中等规模任务时显存占用主要来自想象推演的批量前向推演长度和批量大小的乘积直接决定峰值显存。优化上我做了几件事把解码器的重构损失计算放在需要的时候才算不需要重构的更新步骤跳过解码器前向想象推演的批量不要设得太大够用就行模型和策略的网络尽量共享一些底层特征提取层减少重复计算。这些优化加起来能把训练速度提升一个可观的比例具体数值因任务而异但方向是明确的。6. 这套方法适合什么场景SLAC 这类潜空间随机模型方法最适合的场景是观测高维但真实动力学维度较低、且动力学存在明显随机性的连续控制任务。视觉输入的运动控制、机械臂操作这类任务观测是图像但真正决定状态的就那么几个变量正好契合潜空间压缩的思路。反过来如果任务本身就是低维状态输入、动力学也很确定那用 SLAC 的收益就不明显纯 SAC 可能更省事。我在选型时的判断标准是先看观测维度是否远高于有效状态维度再看动力学是否有不可忽略的随机性。两个条件都满足潜空间随机模型值得一试只满足一个收益会打折扣都不满足老老实实用无模型方法。另外这类方法对工程实现的要求比无模型方法高模型部分的任何一个小 bug 都会通过想象推演放大所以如果团队里没有能耐心调模型的人上手成本要提前算进去。最后分享一个我在调这类方法时养成的习惯每次改动模型结构或者损失权重都先把想象推演的轨迹和真实轨迹画出来对比而不是只盯着最终的回报曲线。回报曲线是滞后指标等它出问题往往已经训练了很久推演轨迹的偏差是先行指标能更早暴露模型层面的问题。这个习惯帮我省下了不少盲目调参的时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑