返回专辑
·Johan·3 分钟阅读

动作映射:tanh 之后还有一步

策略输出 [-1,1] 要线性映射到关节力矩/速度物理限位;scale 错等于隐式改 reward 和动力学。

动作映射:tanh 之后还有一步

1. 调学习率无效,可能是 scale 错了

连续控制里,常见库的策略网络输出经双曲正切压到负一到正一,再按动作空间的上下界仿射映射到环境范围:

若上下界设错——例如力矩写正负一实际应是正负二十牛米——策略以为小扭矩,实际很大,或反过来。表现像「调学习率无效」,实则是动作映射错了。我们曾把仿真里弧度当角度映射,策略看起来收敛,真机手臂几乎不动——输出被缩小约五十七倍。Scale 是动作空间的契约,写错等于隐式改了动力学和奖励,再精致的网络也只是在错误单位上收敛。

2. 语义:设定点还是增量

强化学习十赫兹输出目标位置,底层比例微分控制一千赫兹跟踪:动作语义是 设定点 还是 增量 要写清。目标等于当前加动作,与绝对位置完全不同,部署完全两样。说明文档与步进实现要一致。动作重复次数要与仿真跳帧一致。夹爪离散加手臂连续时,缩放常分开:手臂用双曲正切映射,夹爪用阈值。统一动作盒某一维范围极窄,双曲正切梯度消失,该维几乎不动。

3. Wrapper 链与重复映射

python
class ScaleAction(gym.ActionWrapper):
    def action(self, action):
        lo, hi = self.action_space.low, self.action_space.high
        return lo + (action + 1.0) * 0.5 * (hi - lo)

库内部对连续动作盒会做类似映射;环境外又缩放一次等于平方映射。真机部署时策略输出逆映射回物理单位,再交给底层控制器,保留与仿真相同的裁剪逻辑。评估时动作裁剪与训练不一致,部署行为会偏。高维动作某一维范围极窄,双曲正切梯度消失。

4. 仿真与部署对照

同一观测在仿真与部署节点各前向一次策略,动作的无穷范数差应仅来自数值误差。若部署多一层缩放,差会系统性偏——第一时间查包装器链而非重训。仿真到真机交接文档附映射公式与数值例子:策略输出零点三对应仿真真机各多少牛米或弧度。改动作空间后必须重训,旧检查点不可直接部署。

5. 案例:弧度与角度

某六轴臂任务,动作空间上下界按角度填写,底层控制器按弧度解释。训练曲线正常,真机试跑时手臂几乎不动——因为输出被缩小约五十七倍。回归对照:同一观测在仿真与部署各前向一次,差应仅来自数值误差;若系统性偏差,先查单位与裁剪顺序。随机策略不应瞬间饱和限位。训练前一百步的环境动作物理值应在预期范围。

6. 与控制频率的关系

强化学习输出频率与底层控制频率不匹配,动作语义是设定点还是增量更要写清。动作重复与仿真跳帧一致。夹爪离散加手臂连续时缩放分开更稳。部署节点回归:同一观测前向两次,输出应一致。增量与绝对语义写错,策略学的是「每步加小量」还是「直接去位置」,部署完全两样。

7. 验收

  • 训练前一百步的环境动作物理值在预期范围。
  • 随机策略不应 instant 饱和限位。
  • 评估时 action clip 与 train 一致。
  • 改 action_space 后必须重训。
  • 仿真部署回归:同一 obs forward 两次,输出一致。

Scale 写进交接文档,比口头传统可靠。映射公式错了,调参 months 也救不了真机不动。

← 全部文章

johan's blog