2026-06-09
算法
00

目录

变量代换定理
1. 直观比喻:拉伸面团与涂果酱
2. 数学表述
3. 强化学习中的应用(结合 tanh)
4. 定理推导到代码
总结

变量代换定理

对一个随机变量进行“变形(映射)”时,它的概率密度会随着空间的“拉伸”或“挤压”而发生改变,这一定理就是用来计算这个变化量的。

1. 直观比喻:拉伸面团与涂果酱

假设有一根 1010 厘米长的面条(代表动作的取值范围)。在面条上均匀地涂了 1010 克果酱。 这时候,果酱的密度是: 10/10厘米=1克/厘米10\text{克} / 10\text{厘米} = 1\text{克/厘米}。 (这里的果酱总数 1010 克,就代表总概率为 11;果酱的密度,就是“概率密度”)。

把这根面条的两端拉伸,让它变成了 2020 厘米长。

但是现在密度变成了: 10/20厘米=0.5克/厘米10\text{克} / 20\text{厘米} = 0.5\text{克/厘米}

变量代换定理告诉我们:如果把一段空间放大了 22 倍(导数为 22),那么这段空间上的“密度”就会除以 22。反之,如果把空间挤压了,密度就会飙升。


2. 数学表述

假设有一个随机变量 XX(比如 AI 网络输出的原始高斯分布的动作 uu),它的概率密度函数是 PX(x)P_X(x)。 现在我们用一个函数 y=f(x)y = f(x)(比如 tanh\tanh 函数)把它变成了新的变量 YY(最终被限制在 [1,1][-1, 1] 的动作 aa)。

新变量 YY 的概率密度 PY(y)P_Y(y) 不能直接等于 PX(x)P_X(x),必须乘以一个修正系数

PY(y)=PX(x)×dxdyP_Y(y) = P_X(x) \times \left| \frac{dx}{dy} \right|

这个 dxdy\left| \frac{dx}{dy} \right| 就是修正系数。

  • dxdy\frac{dx}{dy} 代表空间拉伸或挤压的比例。
  • 如果是多维变量(比如同时控制 2 个推进器),这个导数就变成了一个矩阵(雅可比矩阵,Jacobian Matrix),修正系数就变成了“雅可比矩阵行列式的绝对值”(Jacobian Determinant)。

3. 强化学习中的应用(结合 tanh)

在强化学习里,高斯分布输出的原始动作 uu 范围是 (,)(-\infty, \infty)。 但环境要求的动作 aa 必须在 [1,1][-1, 1] 之间。所以用 a=tanh(u)a = \tanh(u)

tanh\tanh 是一个形状像“S”的函数:

  • 在中间(uu 接近 00 时):曲线是直的,没有拉伸和挤压。
  • 在两端(uu 很大或很小时):它把无限长的 (,)(-\infty, \infty) 疯狂地挤压进了 [1,1][-1, 1] 的边缘。

既然无穷大的空间被挤压到了边界上,那么边界上的概率密度会急剧飙升!如果不做修正,计算机就会认为 AI 在边界上的动作概率大得离谱,导致训练直接崩溃。


4. 定理推导到代码

我们知道: 新动作 a=tanh(u)a = \tanh(u)。 它的导数(拉伸/挤压比例)是:dadu=1tanh2(u)=1a2\frac{da}{du} = 1 - \tanh^2(u) = 1 - a^2

根据变量代换定理的对数形式(前面说过,计算都用对数防止溢出): logP(a)=logP(u)+logduda\log P(a) = \log P(u) + \log \left| \frac{du}{da} \right|

因为 duda=1dadu\frac{du}{da} = \frac{1}{\frac{da}{du}},根据对数的性质 log(1x)=log(x)\log(\frac{1}{x}) = -\log(x),公式变成: logP(a)=logP(u)logdadu\log P(a) = \log P(u) - \log \left| \frac{da}{du} \right|

把刚才的导数 dadu=1a2\frac{da}{du} = 1 - a^2 代进去: logP(a)=logP(u)log(1a2)\log P(a) = \log P(u) - \log(1 - a^2)

仔细看代码里的 _squash_log_det 函数:

python
# torch.log(1.0 - action.pow(2)) 就是数学上的 log(1 - a^2) return torch.log(torch.clamp(1.0 - action.pow(2), min=_ACTION_SQUASH_EPS)).sum(dim=-1)

然后在 sample 方法里:

python
# 这里的减法,完美对应了推导出来的公式 logprob = self.base.log_prob(pre_tanh).sum(dim=-1) - _squash_log_det(action)

总结

变量代换定理,就是**“空间变形时的概率密度守恒定律”。 因为我们用 tanh\tanh 把无限的高斯空间“挤压”成了有限的 [1,1][-1, 1],所以必须用这个定理算出“挤压带来的密度变化修正项”**(也就是 _squash_log_det),减去这个修正项,我们才能得到真实的动作概率。

本文作者:James

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!