变量代换定理
对一个随机变量进行“变形(映射)”时,它的概率密度会随着空间的“拉伸”或“挤压”而发生改变,这一定理就是用来计算这个变化量的。
1. 直观比喻:拉伸面团与涂果酱
假设有一根 10 厘米长的面条(代表动作的取值范围)。在面条上均匀地涂了 10 克果酱。
这时候,果酱的密度是: 10克/10厘米=1克/厘米。
(这里的果酱总数 10 克,就代表总概率为 1;果酱的密度,就是“概率密度”)。
把这根面条的两端拉伸,让它变成了 20 厘米长。
但是现在密度变成了: 10克/20厘米=0.5克/厘米。
变量代换定理告诉我们:如果把一段空间放大了 2 倍(导数为 2),那么这段空间上的“密度”就会除以 2。反之,如果把空间挤压了,密度就会飙升。
2. 数学表述
假设有一个随机变量 X(比如 AI 网络输出的原始高斯分布的动作 u),它的概率密度函数是 PX(x)。
现在我们用一个函数 y=f(x)(比如 tanh 函数)把它变成了新的变量 Y(最终被限制在 [−1,1] 的动作 a)。
新变量 Y 的概率密度 PY(y) 不能直接等于 PX(x),必须乘以一个修正系数:
PY(y)=PX(x)×∣∣dydx∣∣
这个 ∣∣dydx∣∣ 就是修正系数。
- dydx 代表空间拉伸或挤压的比例。
- 如果是多维变量(比如同时控制 2 个推进器),这个导数就变成了一个矩阵(雅可比矩阵,Jacobian Matrix),修正系数就变成了“雅可比矩阵行列式的绝对值”(Jacobian Determinant)。
3. 强化学习中的应用(结合 tanh)
在强化学习里,高斯分布输出的原始动作 u 范围是 (−∞,∞)。
但环境要求的动作 a 必须在 [−1,1] 之间。所以用 a=tanh(u)。
tanh 是一个形状像“S”的函数:
- 在中间(u 接近 0 时):曲线是直的,没有拉伸和挤压。
- 在两端(u 很大或很小时):它把无限长的 (−∞,∞) 疯狂地挤压进了 [−1,1] 的边缘。
既然无穷大的空间被挤压到了边界上,那么边界上的概率密度会急剧飙升!如果不做修正,计算机就会认为 AI 在边界上的动作概率大得离谱,导致训练直接崩溃。
4. 定理推导到代码
我们知道:
新动作 a=tanh(u)。
它的导数(拉伸/挤压比例)是:duda=1−tanh2(u)=1−a2。
根据变量代换定理的对数形式(前面说过,计算都用对数防止溢出):
logP(a)=logP(u)+log∣∣dadu∣∣
因为 dadu=duda1,根据对数的性质 log(x1)=−log(x),公式变成:
logP(a)=logP(u)−log∣∣duda∣∣
把刚才的导数 duda=1−a2 代进去:
logP(a)=logP(u)−log(1−a2)
仔细看代码里的 _squash_log_det 函数:
return torch.log(torch.clamp(1.0 - action.pow(2), min=_ACTION_SQUASH_EPS)).sum(dim=-1)
然后在 sample 方法里:
logprob = self.base.log_prob(pre_tanh).sum(dim=-1) - _squash_log_det(action)
总结
变量代换定理,就是**“空间变形时的概率密度守恒定律”。
因为我们用 tanh 把无限的高斯空间“挤压”成了有限的 [−1,1],所以必须用这个定理算出“挤压带来的密度变化修正项”**(也就是 _squash_log_det),减去这个修正项,我们才能得到真实的动作概率。