flowchart TD
subgraph ContinuousFlow["连续动作空间强化学习策略建模流水线"]
direction TB
State["机器人状态观测 s_t (关节角度、传感器)"] --> PolicyNet["连续策略网络 (Actor MLP / Transformer)"]
PolicyNet --> OutputMean["预测高斯均值 mu(s) 与对数标准差 log_std(s)"]
OutputMean --> Reparam["1. 重参数化采样 (Reparameterization Trick)<br>u = mu + std * epsilon (其中 epsilon ~ N(0, I))"]
Reparam --> TanhSquash["2. 物理边界非线性压缩 (Tanh Squashing)<br>a = tanh(u) 强制动作映射在 [-1, 1] 物理区间"]
TanhSquash --> LogProbFix["3. 概率测度微积分修正 (Jacobian Determinant)<br>log pi(a; s) = log pi(u; s) - sum(log(1 - a^2))"]
LogProbFix --> SmoothReward["4. 动力学防抖惩罚 (Smoothness & Jerk Cost)<br>R_total = R_task - lambda_1 * ||a_t - a_t-1||^2"]
end
第 13 课:连续动作空间 RL 系统:高斯与 Beta 策略、动作平滑惩罚与动力学约束
参考答案版:包含完整代码实现与问答题深度参考解析。建议先独立完成练习题后再展开核对。
本课目标与完成标准
学完后你应能:
- 深刻剖析大模型离散 Token 强化学习(PPO / GRPO 面向离散词表)与机器人/自动驾驶物理连续动作空间强化学习的数学与系统鸿沟;
- 深入推导高斯策略(Gaussian Policy)重参数化技巧(Reparameterization Trick)与 Tanh 截断的雅可比行列式对数概率修正(Jacobian Correction);
- 掌握避免边界概率死锁的 Beta 分布策略与物理紧凑域映射;
- 掌握物理执行器动力学平滑惩罚(Smoothness Loss)与加速度/急加度(Jerk)约束的工程实现。
通过必须同时满足:
- 独立补齐本课代码填空题(连续高斯策略重参数化采样、Tanh 雅可比修正与动力学平滑惩罚器),并通过测试断言;
- 三个问答题均说明概率测度变换与物理执行器损伤因果链;
- 总分不低于 8/10。
前置关系
- 前置要求:第 3 课:策略梯度与基线、第 8 课:SAC:最大熵与温度。
- 本课位置:强化学习主线从大模型对齐向具身实体物理控制演进的关键课程。
核心心智模型
1. 离散 Token 概率 vs 连续物理动作空间
在大模型后训练(如 DeepSeek-R1、ChatGPT RLHF)中,策略网络在每一步输出词表大小()的离散 Softmax 概率分布,采样得到单个整数 Token ID。
但在机械臂或自动驾驶中,动作是多维实数向量(Continuous Action Vector): 例如机械臂的 7 个关节目标力矩或转速。如果简单地将连续区间离散化为网格,维度诅咒(Curse of Dimensionality)会导致动作空间呈指数级爆炸( 万种组合),策略梯度根本无法收敛!
图 13-1:连续动作空间高斯策略建模、边界压缩与平滑惩罚体系
2. Tanh 边界压缩的数学陷阱:雅可比行列式修正
为了将无界的高斯采样值 限制在真实电机的物理安全范围 内,标准做法是使用双曲正切函数:
根据概率论的随机变量换元定理(Change of Variables Theorem),对于非线性单射变换 ,其概率密度函数满足:
对数概率必须显式扣除雅可比导数项:
- 致命警示:如果漏掉这一项(直接将 当作实际动作概率),会导致越靠近边界()的状态熵被极其严重的病态高估,策略会过早将动作死锁在最大极限位置,导致电机堵转烧毁。
代码实战:连续动作高斯策略与动力学平滑惩罚器
我们实现一个工业级连续动作空间采样与损失惩罚器,包含重参数化采样、Tanh 边界雅可比修正与时序动作平滑惩罚。
练习题描述
补齐 ContinuousActionPolicy 类: 1. sample_action(mean, log_std): - 给定高斯分布参数,使用标准正态噪声生成重参数化隐变量 ; - 应用 将动作压缩至 ; - 严格根据概率变换公式,计算正确的对数概率 ; 2. compute_smoothness_penalty(action_history, lambda_smooth=0.1, lambda_jerk=0.05): - 输入包含历史几步动作的序列 ; - 计算一阶差分速度惩罚:; - 计算二阶差分急加度(Jerk)惩罚:; - 返回加权惩罚损失标量。
import numpy as np
class ContinuousActionPolicy:
def __init__(self, action_dim=7):
self.action_dim = action_dim
def sample_action(self, mean, log_std, noise=None):
"""
重参数化采样高斯动作并进行 Tanh 雅可比修正。
参数:
- mean: np.ndarray, 形状 [Batch, Action_Dim]
- log_std: np.ndarray, 形状 [Batch, Action_Dim]
- noise: np.ndarray or None, 预注入的标准高斯噪声 (用于确定性单测)
返回:
- action: np.ndarray, 压缩至 [-1, 1] 的物理动作
- log_prob: np.ndarray, 形状 [Batch], 修正后的真实对数概率
"""
# TODO: YOUR CODE HERE
pass
def compute_smoothness_penalty(self, action_seq, lambda_smooth=0.1, lambda_jerk=0.05):
"""
计算动作轨迹的一阶平滑与二阶急加度惩罚。
action_seq: list of np.ndarray [a_{t-2}, a_{t-1}, a_t], 每个形状 [Action_Dim]
返回: float 标量惩罚值
"""
# TODO: YOUR CODE HERE
pass检查与验证代码
policy = ContinuousActionPolicy(action_dim=2)
mock_mean = np.array([[0.0, 0.5]], dtype=np.float32)
mock_log_std = np.array([[0.0, -0.5]], dtype=np.float32) # std 约为 1.0 与 0.6065
mock_noise = np.array([[0.5, -0.2]], dtype=np.float32)
# 1. 验证采样与 Tanh 截断
act, log_prob = policy.sample_action(mock_mean, mock_log_std, noise=mock_noise)
print("采样动作:", act, "对数概率:", log_prob)
assert act.shape == (1, 2)
assert np.all(act >= -1.0) and np.all(act <= 1.0)
# 手动推导 u:
# u[0] = 0.0 + 1.0 * 0.5 = 0.5 -> tanh(0.5) = 0.4621
# u[1] = 0.5 + exp(-0.5) * (-0.2) = 0.5 - 0.1213 = 0.3787 -> tanh(0.3787) = 0.3616
assert abs(act[0, 0] - 0.4621) < 1e-3
assert abs(act[0, 1] - 0.3616) < 1e-3
# 2. 验证平滑度与急加度 (Jerk) 惩罚
# 构造一段连续跳变的动作历史: [0.0, 0.0] -> [0.1, 0.1] -> [0.5, 0.5] (发生明显突跳)
a_t2 = np.array([0.0, 0.0])
a_t1 = np.array([0.1, 0.1])
a_t0 = np.array([0.5, 0.5])
cost = policy.compute_smoothness_penalty([a_t2, a_t1, a_t0], lambda_smooth=1.0, lambda_jerk=1.0)
# 一阶差分 (a_t0 - a_t1) = [0.4, 0.4] -> L2平方 = 0.16 + 0.16 = 0.32
# 二阶差分 (a_t0 - 2*a_t1 + a_t2) = [0.5-0.2, 0.5-0.2] = [0.3, 0.3] -> L2平方 = 0.09 + 0.09 = 0.18
# 总惩罚 = 1.0 * 0.32 + 1.0 * 0.18 = 0.50
print("计算出的平滑与急加度惩罚:", cost)
assert abs(cost - 0.50) < 1e-4
print("连续动作空间策略与动力学惩罚器验证通过!")思考与问答题
Q1:为什么连续动作策略中,Beta 分布往往比 Tanh 高斯分布更能避免“边界死锁”?
当物理动作被天然限制在有限紧凑区间 时,Tanh 高斯策略在接近边界 时梯度极其平坦;而基于两个正形状参数 的 Beta 分布在定义域天然有界,它是如何在数学上从根源消除雅可比修正奇点和梯度消失的?
你的答案:
Q2:在端到端强化学习中,如果不加动力学平滑惩罚,智能体会学出什么病态策略?
在机械臂插拔或机器人行走任务中,如果仅仅给予最终任务奖励(如“成功插入目标孔隙得 +100 分”),智能体策略往往会输出极其高频的“Bang-Bang 控制”(即在极短时间内在 和 最大极限值之间剧烈抖动切换)。为什么这种策略在仿真中能得分但在物理真机上一秒就会烧毁电机?
你的答案:
Q3:如何将连续动作策略网络在 GPU 向量化环境(如 Isaac Gym)中进行大规模并行采样?
在管理上万个并发仿真的 GPU 强化学习集群中,Actor 采样如何利用同一个 PyTorch Tensor 消除所有 CPU 循环?为什么说“状态收集、策略推理、物理步进与奖励计算全在同一张 GPU 显存内闭环”是现代具身强化学习吞吐暴涨 1000 倍的核心秘诀?
你的答案:
评分与通过规则
- 代码 4 分:正确实现高斯重参数化、Tanh 换元雅可比修正与一阶二阶差分动力学惩罚,通过测试断言;
- Q1~Q3 各 2 分:深入阐述边界概率测度变换、Bang-Bang 控制危害与 GPU 全片上闭环因果链;
- 通过线:总分 。