UTD 降为 1 的后果:从“特训班“降级为“自习室“
如果把 UTD 降为 1效果会大幅变差甚至完全学不会。把 cta_ratioUTD 比率从 20 降到 1导致效果变差的原理主要有三点导师还没谱学生瞎改Critic Lag在 SAC 中Actor学生的更新是基于 Critic导师给出的 Q 值梯度的。UTD 20每跑一步Critic 都要刷题 20 次。这让 Critic 能迅速消化新产生的数据把 Q 值身价算得非常准。当 Actor 来问我该怎么改时Critic 给出的方向是极其精准的。UTD 1Critic 只能练一次就给建议。对于精密插件任务由于视觉特征像素极其复杂Q 值需要海量的更新才能捕捉到插头对准插座那一瞬间的剧烈价值波动。此时 Critic 的评估可能还是模糊的。后果Actor 顺着错误的梯度方向去改只会越练越废。视觉特征提取的滞后Encoder TrainingSERL 使用的是从像素开始的端到端学习。原理ResNet 需要大量的反向传播才能从杂乱的背景中认出插孔。对比20 倍的更新频率意味着视觉编码器Encoder的学习速度提高了 20 倍。如果 UTD1你的机器人可能练了一整天ResNet 还没看清物体的轮廓。数据压榨率Sample Reuse机器人数据是昂贵的需要电机动需要时间。UTD 20每一条真实的物理轨迹都会被拿出来反复揉搓 20 遍。UTD 1这条数据用一次就扔了就像富二代在浪费极其稀有的成功样本。后果在数据极其稀疏的精密操作中UTD1 会导致机器人根本无法在有限的 1 小时训练内通过自发尝试撞到正确答案。4.1.6 High UTD 的副作用与应对但 High UTD 也有副作用。对同一批数据反复训练critic 容易过拟合和过估计最终让策略崩溃。因此SERL 还需要配套的稳定性机制。4.2 稳定性机制High UTD 是发动机但发动机太猛就需要刹车系统。SERL 通过多种机制的协同实现了在极高样本效率下的稳定训练。整体稳定性保障Critic Ensemble / REDQ多个 critic 像陪审团随机子采样取最小值压制 High UTD 带来的估值爆炸Critic LayerNorm让高频更新不至于数值失控支持更高 UTD ratiosSoft Update让目标网络缓慢跟随维持 Bellman 目标平稳保证策略更新平滑RLPD 50/50 采样demo 数据作为锚点防止策略偏离专家分布DrQ 数据增强random_crop 提供最重要的视觉正则化Actor encoder stop-gradient防止 actor loss 破坏视觉表征这些机制不是孤立工作的而是协同配合。SERL 的工程价值在于不是单独实现某个技巧而是把一整套相互配合的稳定性机制整合起来使得高 UTD 这种激进的训练策略能够在真机上稳定运行形成一套可工作的系统。SAC 的巧妙之处恰恰在于它如何利用不确定性来获得最终的稳定。我们接下来选择部分机制进行解读。0x05 Layer Normalization论文中提到regularizing the critic with layer normalization allows for higher UTD ratios and thus more efficient training。也就是说SERL 并不是单纯把 UTD 拉高而是通过 critic 正则化让高频更新不至于数值失控。即为了抗住 20 倍的更新强度而不崩盘SERL 在 Critic 网络中引入了LayerNorm。这在传统 SAC 中是不常见的但在高 UTD 的 RLPD 算法中至关重要。5.1 当前层归一化实现分析从 MLP可以看到已有的层归一化支持class MLP(nn.Module): use_layer_norm: bool False # 层归归一化开关 nn.compact def __call__(self, x: jnp.ndarray, train: bool False) - jnp.ndarray: for i, size in enumerate(self.hidden_dims): x nn.Dense(size, kernel_initdefault_init())(x) # 线性变换 if i 1 len(self.hidden_dims) or self.activate_final: # 正则化层可选 if self.dropout_rate is not None and self.dropout_rate 0: x nn.Dropout(rateself.dropout_rate)(x, deterministicnot train) if self.use_layer_norm: # 关键层归一化应用 x nn.LayerNorm()(x) # 标准化层输出 x activations(x) # 激活函数 return x5.2 层归一化的技术细节和优势Critic 网络的特点输入方差大观测编码和动作拼接导致输入分布不稳定梯度爆炸风险深度网络容易出现梯度问题Ensemble 训练多个 Critic 网络需要稳定的训练动态层归一化的具体好处稳定训练减少内部协变量偏移提高学习率可以使用更大的学习率加速收敛减少训练震荡改善泛化对输入扰动更鲁棒5.3 实现方案SACAgent 创建时启用层归一化.critic_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], }, policy_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], },针对 DrQAgent 的实现critic_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], }, policy_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], },VICE 中的层归一化已实现critic_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], }, vice_network_kwargs{ activations: nn.leaky_relu, use_layer_norm: True, hidden_dims: [ 256, ], dropout_rate: 0.1, }, policy_network_kwargs{ activations: nn.tanh, use_layer_norm: True, hidden_dims: [256, 256], },5.4 总结对 Critic 进行层归一化正则化的关键是配置启用在critic_network_kwargs中设置use_layer_norm: True正则化组合配合 Dropout 和权重衰减获得最佳效果超参数调整层归一化后可以使用更大的学习率针对性优化根据任务类型视觉/状态调整正则化强度性能监控添加统计信息验证层归一化的实际效果在 SERL 框架中这种实现方式既保持了代码的简洁性又充分利用了 Flax/JAX 的模块化优势是提高 Critic 网络训练稳定性和性能的有效手段。0x06 Soft Update REDQSoft Update 让目标网络始终缓慢追踪当前 Q 值保持贝尔曼目标的平稳性。在 REDQ 的高 UTD 场景下尤为重要。6.1 Soft Update 的力量在机器人控制中动作的连续性决定了硬件的寿命。SERL 坚持使用 Soft Update软更新维护目标网络平滑公式θ(target) τ θ_online (1−τ) θ{target}。其中 τ 通常设为极其微小的 0.005。硬件意义与直接拷贝权重的 Hard Update 不同Soft Update 让目标值Target以一种近乎流体的方式缓慢漂移。这反映到机器人身上就是动作的进化是渐进的不会因为模型权重的突跳导致机械臂产生瞬时的冲击电流或抖动。Soft update的核心实现如下def target_update(self, tau: float) - JaxRLTrainState: Performs an update of the target params via polyak averaging. The new target params are given by: new_target_params tau * params (1 - tau) * target_params new_target_params jax.tree_map( lambda p, tp: p * tau tp * (1 - tau), self.params, self.target_params ) return self.replace(target_paramsnew_target_params)这个方法在 SACAgent.update 中被调用# Update target network (if requested) if critic in networks_to_update: new_state new_state.target_update(self.config[soft_target_update_rate])原理分析Soft Update采用Polyak averaging的方式缓慢更新目标网络。这种方法的核心思想是让目标网络以平滑的方式跟踪主网络而不是周期性地完全复制。这种平滑跟踪有助于减少训练过程中的方差提高算法的稳定性防止因目标网络剧烈变化导致的训练震荡6.2 REDQCritic Ensemble 抑制过估计REDQ 模式支持把 Q 网络增加到 10 个以上并从中随机抽 2 个来计算 Target。这是另一种对抗高估问题的强力方法。原生2 个 CriticSERL10–20 个 Critic作用支持 High UTDUTD20。如果没有这么多 Critic 压阵SAC 会在疯狂更新中产生严重的数值爆炸。6.2.1 为什么需要 Critic EnsembleHigh UTD 虽然能加速学习但会带来致命副作用Q 值过估计Overestimation Bias。模型会因为反复研读少量样本而变得极端自信单Q网络容易高估未见过的状态一动作对的价值最终导致策略崩溃。SERL 引入了 REDQRandomized Ensembled Double Q-learning风格的机制来解决这个问题。我们可以将其理解为一种陪审团机制Critic Ensemble陪审团同时训练 10 到 20 个独立运行的 Critic 网络随机子集采样Randomized Subset在计算目标 Q 值时并不看所有人的意见而是随机抽取 2 个 Critic取最小值In-sample Min在抽出的子集中取分数的最小值min操作天然抑制0OD区域的过高估计通俗地说如果十个裁判里随机抽出的几个裁判中有一个觉得这个动作危险那我们就保守一点。这种悲观主义巧妙地抵消了 High UTD 带来的狂热乐观使训练在极高强度下依然稳如磐石。6.2.2 REDQ论文算法算法如下训练时的行为随机采样从 N 个默认 N10Critic 网络中随机无放回地选取 M 个默认 M2子集索引。前向传播仅将这 M 个网络的参数用于计算目标状态动作值 Q(s′,a′)Q(s′,a′)。取最小值对这 M 个输出值取最小值作为 Target Q 值的一部分即 mini∈subsetQi(s′,a′)。损失计算虽然 Target 只用了 M 个网络但在计算 Critic 损失时所有 N 个网络都会根据同一个 Target 进行梯度更新以维持集成多样性 。这种设计既保持了ensemble的容量优势又通过子采样降低了计算成本和过拟合风险。计算效率只计算 K 个网络的前向传播而非全部 N 个正则化效果随机子采样引入额外噪声提高泛化能力过拟合缓解避免始终使用相同的最好网络REDQ 论文证明min(2 from 10)的效果接近min(10)但计算量减少 5 倍。6.2.3 SERL 的实现架构细节# drq.py:124-125 和 launcher.py:165-166 critic_ensemble_size10, # 10 个独立 Q 网络 critic_subsample_size2, # 计算 target 时只随机选 2 个具体实现def critic_loss_fn(self, batch, params: Params, rng: PRNGKey): # ...前期准备代码... # 1. 计算所有ensemble成员的Q值 target_next_qs self.forward_target_critic( batch[next_observations], next_actions, rngrng, ) # shape: (critic_ensemble_size, batch_size) # 2. 如果配置了子采样则随机选择指定数量的网络 if self.config[critic_subsample_size] is not None: rng, subsample_key jax.random.split(rng) subsample_idcs jax.random.randint( subsample_key, (self.config[critic_subsample_size],), # 通常是2 0, self.config[critic_ensemble_size], # 通常是10 ) target_next_qs target_next_qs[subsample_idcs] # 只保留选中的网络 # 3. 在(子采样后的)ensemble成员中取最小值 target_next_min_q target_next_qs.min(axis0) # shape: (batch_size,) # ...后续使用target_next_min_q计算TD目标...与论文的区别