# 重参数化技术：从“随机采样不可直接反传”到路径导数

重参数化技术（reparameterization trick）主要用于解决这样一类问题：
$$
J(\phi)
=
\mathbb E_{z\sim q_\phi(z)}  
\big[f(z)\big],  
$$

其中随机变量 ($z$) 的分布 ($q_\phi(z)$) 依赖待优化参数 ($\phi$)。我们希望计算


$$
\nabla_\phi J(\phi)
=
\nabla_\phi  
\mathbb E_{z\sim q_\phi(z)}  
[f(z)].  
$$

困难在于：参数 ($\phi$) 不只出现在被积函数中，还控制了**采样分布本身**。普通反向传播要求计算图中的节点是确定性、可微的函数，而“从 ($q_\phi$) 中抽取一个样本”通常不会自动提供普通意义下的导数。

重参数化的核心操作是：

$$
\boxed{  
z\sim q_\phi(z)  
\quad\Longrightarrow\quad  
\epsilon\sim p(\epsilon),\qquad  
z=g_\phi(\epsilon)  
}  
$$

其中：

- ($p(\epsilon)$) 是不依赖 ($\phi$) 的固定噪声分布；
    
- ($g_\phi$) 是关于 ($\phi$) 可微的确定性函数；
    
- ($g_\phi(\epsilon)$) 的分布恰好等于 ($q_\phi(z)$)。
    

这样，随机性被移动到参数无关的 ($\epsilon$) 上，而参数 ($\phi$) 只出现在可微映射 ($g_\phi$) 中。VAE 论文正是通过这一方法构造可用标准随机梯度方法优化的变分下界估计器；同期的 stochastic backpropagation 工作则从随机计算图角度给出了相同思想。([arXiv](https://arxiv.org/abs/1312.6114?utm_source=chatgpt.com "Auto-Encoding Variational Bayes"))

---

## 一、最重要的例子：高斯分布

假设编码器给出：


$$
q_\phi(z\mid x)
=
\mathcal N  
\left(  
z;\mu_\phi(x),\sigma_\phi^2(x)  
\right).  
$$

直接写为：


$$
z\sim  
\mathcal N  
\left(  
\mu_\phi(x),\sigma_\phi^2(x)  
\right)  
$$


时，(z) 是一个随机采样节点。

高斯分布可以等价地写成：

$$
\epsilon\sim\mathcal N(0,1),  
$$

$$
\boxed{  
z
=
\mu_\phi(x)  
+  
\sigma_\phi(x)\epsilon  
}  
$$

这就是最常见的高斯重参数化。

### 为什么两种写法分布完全相同

标准高斯满足：

$$
\mathbb E[\epsilon]=0,  
\qquad  
\operatorname{Var}(\epsilon)=1.  
$$

于是：

$$
\mathbb E[z]
=
 \mathbb E[\mu+\sigma\epsilon]
=
 \mu+\sigma\mathbb E[\epsilon]
=
\mu,  
$$

并且：


$$
\operatorname{Var}(z)
=
 \operatorname{Var}(\sigma\epsilon)
=
 \sigma^2\operatorname{Var}(\epsilon)
=
\sigma^2.  
$$

由于标准高斯的仿射变换仍然是高斯分布，因此：

$$
\mu+\sigma\epsilon  
\sim  
\mathcal N(\mu,\sigma^2).  
$$


重参数化没有改变目标分布，只改变了**生成样本的计算表示**。

---

# 二、为什么原始采样形式不好求梯度

考虑：

$$
J(\phi)
=
\mathbb E_{z\sim q_\phi(z)}  
[f(z)].  
$$

写成积分：


$$
J(\phi)
=
\int f(z)q_\phi(z),dz.  
$$

其梯度为：

$$
\nabla_\phi J(\phi)
=
\nabla_\phi  
\int f(z)q_\phi(z),dz.  
$$

如果满足交换微分和积分的条件，可以写成：

$$
\nabla_\phi J(\phi)
=
\int f(z)\nabla_\phi q_\phi(z),dz.  
$$

注意，这里参数通过**概率密度函数**影响目标，而不是通过一条普通的确定性计算路径影响 (z)。

从自动微分角度，原始计算图大致为：


$$
\phi  
\longrightarrow  
q_\phi  
\longrightarrow  
\boxed{\text{sample}}  
\longrightarrow  
z  
\longrightarrow  
f(z).  
$$

采样节点不是普通的确定性可微函数。对于一次已经得到的样本 (z)，系统不知道：

> 当 ($\phi$) 发生一个无穷小变化时，这个“同一个随机样本”应当如何移动？

这里并不是说期望 (J(\phi)) 在数学上不可微，而是说**不能把普通链式法则直接穿过一个未重参数化的随机采样操作**。

---

# 三、重参数化后如何使用链式法则

假设存在：

$$
z=g_\phi(\epsilon),  
\qquad  
\epsilon\sim p(\epsilon),  
$$

且 ($p(\epsilon)$) 与 ($\phi$) 无关。

那么：

$$
J(\phi)
=
\mathbb E_{\epsilon\sim p(\epsilon)}  
\left[  
f(g_\phi(\epsilon))  
\right].  
$$

写成积分：

$$
J(\phi)
=
\int  
f(g_\phi(\epsilon))  
p(\epsilon),d\epsilon.  
$$


因为 ($p(\epsilon)$) 不依赖 ($\phi$)，梯度只需作用于可微函数：


$$
\nabla_\phi J(\phi)
=
\int  
\nabla_\phi  
f(g_\phi(\epsilon))  
p(\epsilon),d\epsilon.  
$$


应用链式法则：

$$
\nabla_\phi  
f(g_\phi(\epsilon))
=
\nabla_z f(z)  
\frac{\partial g_\phi(\epsilon)}{\partial\phi}.  
$$

所以：
$$
\boxed{  
\nabla_\phi J(\phi)
=
\mathbb E_{\epsilon\sim p(\epsilon)}  
\left[  
\nabla_z f(z)  
\frac{\partial z}{\partial\phi}  
\right],  
\qquad  
z=g_\phi(\epsilon)  
}  
$$
这称为：

- 重参数化梯度；
    
- 路径导数（pathwise derivative）；
    
- 路径梯度估计器。
    

“路径”指的是：固定一次噪声 ($\epsilon$)，改变参数 ($\phi$)，观察样本

$$
z=g_\phi(\epsilon)  
$$


沿着怎样的连续路径移动。

---

## 固定噪声的几何意义

以高斯为例：

[  
$$
z=\mu+\sigma\epsilon.  
$$
]

在一次前向和反向传播中，采到的 ($\epsilon$) 被视为固定常数。

若 ($\epsilon=1.2$)，则：


$$
z=\mu+1.2\sigma.  
$$


改变均值：


$$
\frac{\partial z}{\partial\mu}=1;  
$$


改变标准差：

$$
\frac{\partial z}{\partial\sigma}=\epsilon=1.2.  
$$


因此，自动微分可以清楚地判断：

- 增加 (\mu) 会把当前样本整体向右移动；
    
- 增加 (\sigma) 会根据当前样本所在的标准化分位数移动样本。
    

下一次前向传播可以重新采样新的 (\epsilon)，但在一次反向传播过程中，(\epsilon) 不参与求导。

---

# 四、蒙特卡洛梯度估计

通常无法精确计算：

[  
$$
\mathbb E_{\epsilon}[f(g_\phi(\epsilon))].  
$$
]

可以采样：

[  
$$
\epsilon^{(1)},\ldots,\epsilon^{(L)}  
\overset{\text{i.i.d.}}{\sim}p(\epsilon),  
$$
]

构造蒙特卡洛估计：

$$
\widehat J_L(\phi)
=
\frac1L  
\sum_{l=1}^{L}  
f\left(g_\phi(\epsilon^{(l)})\right).  
$$

相应梯度为：

$$
\nabla_\phi\widehat J_L(\phi)
=
\frac1L  
\sum_{l=1}^{L}  
\nabla_z f(z^{(l)})  
\frac{\partial g_\phi(\epsilon^{(l)})}{\partial\phi}.  
$$

在满足正则条件时：


$$
\mathbb E[  
\nabla_\phi\widehat J_L(\phi)  
]
=
\nabla_\phi J(\phi).  
$$


也就是说，这通常是无偏梯度估计器。

需要区分：

- 单次采样得到的梯度一般不等于真实期望梯度；
    
- 但对采样随机性再取期望，可以恢复真实梯度；
    
- 增大 (L) 通常降低蒙特卡洛方差，但增加计算量。
    

VAE 常用每个数据点一个潜变量样本，即 (L=1)。Kingma 和 Welling 指出，在较大 minibatch 下，一个样本通常已经可以提供有效的随机梯度估计。([arXiv](https://arxiv.org/pdf/1312.6114?utm_source=chatgpt.com "Auto-Encoding Variational Bayes"))

---

# 五、一个可以直接验证的例子

设：

[  
$$
z\sim\mathcal N(\mu,\sigma^2),  
$$
]

目标为：

# [  
$$
J(\mu,\sigma)
=
\mathbb E[z^2].  
$$
]

由高斯二阶矩：

# [  
$$
J(\mu,\sigma)
=
\mu^2+\sigma^2.  
$$
]

所以真实梯度是：

# [  
$$
\frac{\partial J}{\partial\mu}
=
2\mu,  
$$
]

# [  
$$
\frac{\partial J}{\partial\sigma}
=
2\sigma.  
$$
]

现在重参数化：

[  
$$
z=\mu+\sigma\epsilon,  
\qquad  
\epsilon\sim\mathcal N(0,1).  
$$
]

单个样本损失：

# [  
$$
\widehat J
=
(\mu+\sigma\epsilon)^2.  
$$
]

对 ($\mu$) 求导：

# [  
$$
\frac{\partial\widehat J}{\partial\mu}
=
2(\mu+\sigma\epsilon).  
$$
]

再对 (\epsilon) 取期望：


$$
\mathbb E_\epsilon  
\left[  
\frac{\partial\widehat J}{\partial\mu}  
\right]
=
 2\mu+2\sigma\mathbb E[\epsilon]
=
2\mu.  
$$


对 ($\sigma$) 求导：


$$
\frac{\partial\widehat J}{\partial\sigma}
=
2(\mu+\sigma\epsilon)\epsilon.  
$$


取期望：


$$
\begin{aligned}  
\mathbb E_\epsilon  
\left[  
\frac{\partial\widehat J}{\partial\sigma}  
\right]  
&=  
2\mu\mathbb E[\epsilon]  
+ 
2\sigma\mathbb E[\epsilon^2]
\\&=  
0+2\sigma  \\
&=  
2\sigma.  
\end{aligned}  
$$


因此蒙特卡洛路径梯度的期望正好等于真实梯度。

---

# 六、重参数化在 VAE 中解决了什么

## 1. VAE 的变分下界

给定观测 (x)、潜变量 (z)，生成模型为：

# [  
$$
p_\theta(x,z)
=
p(z)p_\theta(x\mid z).  
$$
]

真实后验：

[  
$$
p_\theta(z\mid x)  
$$
]

通常难以直接求解，因此引入编码器：

[  
$$
q_\phi(z\mid x).  
$$
]

证据下界为：


$$
\mathcal L(\theta,\phi;x)
=
\mathbb E_{z\sim q_\phi(z\mid x)}  
\left[  
\log p_\theta(x\mid z)  
\right]
-
D_{\mathrm{KL}}  
\left(  
q_\phi(z\mid x)  
|p(z)  
\right).  
$$


第一项是重构或条件似然项：


$$
\mathcal L_{\mathrm{rec}}
=
\mathbb E_{q_\phi(z\mid x)}  
[\log p_\theta(x\mid z)].  
$$

第二项约束近似后验不要偏离先验：


$$
\mathcal L_{\mathrm{KL}}
=
D_{\mathrm{KL}}(q_\phi|p).  
$$


VAE 的关键难点是：重构项中的采样分布依赖编码器参数 (\phi)。重参数化使编码器与解码器能够通过普通反向传播联合优化。([arXiv](https://arxiv.org/abs/1312.6114?utm_source=chatgpt.com "Auto-Encoding Variational Bayes"))

---

## 2. 高斯编码器

通常设：


$$
q_\phi(z\mid x)
=
\mathcal N  
\left(  
\mu_\phi(x),  
\operatorname{diag}(\sigma_\phi^2(x))  
\right).  
$$


编码器输出：

$$
\mu_\phi(x),  
\qquad  
\log\sigma_\phi^2(x).  
$$


然后采样：

[  
$$
\epsilon\sim\mathcal N(0,I),  
$$

$$
\boxed{  
z
=
\mu_\phi(x)  
+  
\sigma_\phi(x)\odot\epsilon  
}  
$$

其中 ($\odot$) 表示逐元素乘法。

解码器产生：

$$
\hat x
=
d_\theta(z).  
$$

计算图变成：

$$
x  
\longrightarrow  
(\mu_\phi,\sigma_\phi)  
$$

$$
\epsilon\sim\mathcal N(0,I)  
$$

$$
(\mu_\phi,\sigma_\phi,\epsilon)  
\longrightarrow  
z=\mu_\phi+\sigma_\phi\odot\epsilon  
\longrightarrow  
d_\theta(z)  
\longrightarrow  
\mathcal L.  
$$

现在从重构损失到编码器有完整可微路径：

$$
\mathcal L  
\rightarrow  
z  
\rightarrow  
\mu_\phi,\sigma_\phi  
\rightarrow  
\phi.  
$$


---

## 3. 编码器参数怎样获得重构梯度

设重构损失为：


$$
\mathcal L_{\mathrm{rec}}
=
\ell(d_\theta(z),x),  
$$


且：


$$
z=\mu_\phi(x)+\sigma_\phi(x)\odot\epsilon.  
$$

对编码器参数 (\phi)：

$$
\nabla_\phi\mathcal L_{\mathrm{rec}}
=
\frac{\partial\mathcal L_{\mathrm{rec}}}{\partial z}  
\frac{\partial z}{\partial\phi}.  
$$


而：


$$
\frac{\partial z}{\partial\phi}
=
\frac{\partial\mu_\phi}{\partial\phi}  
+  
\epsilon\odot  
\frac{\partial\sigma_\phi}{\partial\phi}.  
$$

因此：

$$
\boxed{  
\nabla_\phi\mathcal L_{\mathrm{rec}}
=
\frac{\partial\mathcal L_{\mathrm{rec}}}{\partial z}  
\left(  
\frac{\partial\mu_\phi}{\partial\phi}  
+  
\epsilon\odot  
\frac{\partial\sigma_\phi}{\partial\phi}  
\right)  
}  
$$

这使编码器能够学习：

- 哪些输入应映射到什么潜变量均值；
    
- 哪些潜变量维度应有较大或较小不确定性；
    
- 怎样组织潜空间，才能让解码器重构数据。
    

如果采样节点切断梯度，那么编码器无法从重构误差中获得有效训练信号，只能接受 KL 项的梯度。

---

# 七、为什么实际网络输出 `logvar`

神经网络通常不直接输出标准差 (\sigma)，而输出：


$$
\ell=\log\sigma^2.  
$$


然后计算：


$$
\sigma
=
\exp\left(\frac12\ell\right).  
$$


重参数化写为：

# [  
$$
\boxed{  
z
=
\mu  
+  
\exp\left(\frac12\ell\right)\odot\epsilon  
}  
$$
]

原因主要有两个。

第一，标准差必须满足：

[  
$$
\sigma>0.  
$$
]

而 (\ell\in\mathbb R) 不受约束，通过指数映射自动保证正性。

第二，对数方差在数值优化中通常比直接预测极小或极大的正数更稳定。

其局部导数为：

[  
$$
\frac{\partial z}{\partial\mu}=1,  
$$
$$
\frac{\partial z}{\partial\ell}
=
 \frac12  
\exp\left(\frac12\ell\right)\epsilon
=
\frac12\sigma\epsilon.  
$$


---

## 标准高斯先验下的 KL 项

若：

# [  
$$
q_\phi(z\mid x)
=
\mathcal N(\mu,\operatorname{diag}(\sigma^2)),  
$$
]

[  
$$
p(z)=\mathcal N(0,I),  
$$
]

则 KL 散度有解析形式：


$$
D_{\mathrm{KL}}(q|p)
=
 \frac12  
\sum_{j=1}^{d}  
\left(  
\mu_j^2  
+  
\sigma_j^2
-
 \log\sigma_j^2
-
1  
\right).  
$$

若用：


$$
\ell_j=\log\sigma_j^2,  
$$


则：

$$
D_{\mathrm{KL}}(q|p)
=
 \frac12  
\sum_{j=1}^{d}  
\left(  
\mu_j^2  
+  
e^{\ell_j}
-
\ell_j
-
1  
\right).  
$$


这一项不需要蒙特卡洛采样，可以直接求导。

因此常见 VAE 训练目标写成：


$$
\mathcal L_{\mathrm{loss}}
=
\mathcal L_{\mathrm{rec}}  
+  
\beta  
D_{\mathrm{KL}}(q_\phi(z\mid x)||p(z)).  
$$


---

# 八、ACT 中的重参数化具体如何工作

在 ACT 中，CVAE 编码器根据：

- 当前关节状态；
    
- 专家未来动作序列；
    

构造动作风格潜变量：


$$
q_\phi  
\left(  
z  
\mid  
a_{t:t+k},\bar o_t  
\right),  
$$


其中 ($\bar o_t$) 是不含图像的本体感知观测。

编码器输出对角高斯参数：


$$
\mu_\phi,  
\qquad  
\sigma_\phi.  
$$


然后使用：

[  
$$
\epsilon\sim\mathcal N(0,I),  
$$
 
$$
\boxed{  
z
=
\mu_\phi  
+  
\sigma_\phi\odot\epsilon  
}  
$$

获得风格变量样本。

ACT 解码器预测动作块：


$$
\hat a_{t:t+k}
=
\pi_\theta(o_t,z).  
$$


训练目标为：


$$
\mathcal L
=
\mathcal L_{\mathrm{reconst}}  
+  
\beta\mathcal L_{\mathrm{reg}},  
$$

其中：


$$
\mathcal L_{\mathrm{reg}}
=
D_{\mathrm{KL}}  
\left[  
q_\phi(z\mid a_{t:t+k},\bar o_t)  
||  
\mathcal N(0,I)  
\right].  
$$


论文正文说明实际重构项使用 L1 损失。附录的详细架构图也明确标出了从编码器预测 ($z_{\text{mean}}$)、($z_{\text{std}}$)，再通过 reparameterization 采样 (z) 的过程。

---

## ACT 中梯度如何传递

动作重构损失：


$$
\mathcal L_{\mathrm{rec}}
=
 \left||  
\hat a_{t:t+k}
-
a_{t:t+k}  
\right||_1.  
$$


由于：


$$
\hat a_{t:t+k}
=
\pi_\theta(o_t,z),  
$$


以及：

$$
z
=
\mu_\phi+\sigma_\phi\odot\epsilon,  
$$

梯度为：


$$
\frac{\partial\mathcal L_{\mathrm{rec}}}{\partial\phi}
=
\frac{\partial\mathcal L_{\mathrm{rec}}}  
{\partial\hat a}  
\frac{\partial\hat a}{\partial z}  
\left(  
\frac{\partial\mu_\phi}{\partial\phi}  
+  
\epsilon\odot  
\frac{\partial\sigma_\phi}{\partial\phi}  
\right).  
$$

这条路径使 CVAE 编码器可以学习：

> 对于当前动作序列，应当产生怎样的潜变量 (z)，才能帮助解码器准确重建这一段专家动作。

如果没有重参数化，动作重构误差难以通过随机采样节点反传到 CVAE 编码器。

---

## 测试时为什么不再需要重参数化

ACT 测试时没有专家未来动作序列，因此不能计算：

$$
q_\phi(z\mid a_{t:t+k},\bar o_t).  
$$


论文丢弃 CVAE 编码器，直接设置：

$$
z=0.  
$$


这是先验：


$$
p(z)=\mathcal N(0,I)  
$$

的均值。

所以 ACT 中的重参数化只用于训练阶段：


$$
\text{训练：}  
\quad  
z=\mu+\sigma\epsilon;  
$$

$$
\text{测试：}  
\quad  
z=0.  
$$


此时策略是确定性的。

---

# 九、与 REINFORCE／得分函数估计器的区别

重参数化并不是计算随机期望梯度的唯一方法。

仍考虑：


$$
J(\phi)
=
\mathbb E_{z\sim q_\phi(z)}  
[f(z)].  
$$


## 1. 得分函数估计器

利用恒等式：

$$
\nabla_\phi q_\phi(z)

q_\phi(z)\nabla_\phi\log q_\phi(z),  
$$

得到：


$$
\begin{aligned}  
\nabla_\phi J  
&=  
\int f(z)\nabla_\phi q_\phi(z),dz\\  
&=  
\int  
f(z)q_\phi(z)  
\nabla_\phi\log q_\phi(z),dz\\  
&=  
\boxed{  
\mathbb E_{z\sim q_\phi}  
\left[  
f(z)\nabla_\phi\log q_\phi(z)  
\right]  
}.  
\end{aligned}  
$$


这就是：

- score-function estimator；
    
- likelihood-ratio estimator；
    
- REINFORCE estimator。
    

它只需要 (f(z))，不需要 (\nabla_z f(z))，因此可用于：

- 离散随机变量；
    
- 不可微环境；
    
- 黑盒奖励函数。
    

---

## 2. 路径梯度估计器

如果可以写成：

[  
$$
z=g_\phi(\epsilon),  
$$
]

则：

# [  
$$
\boxed{  
\nabla_\phi J
=
\mathbb E_\epsilon  
\left[  
\nabla_z f(z)  
\frac{\partial g_\phi(\epsilon)}{\partial\phi}  
\right]  
}.  
$$
]

它要求：

- (f) 对 (z) 可微；
    
- (g_\phi) 对参数可微；
    
- 能找到合适的参数无关基础噪声。
    

PyTorch 的概率分布文档也明确区分了 score-function estimator 与 pathwise derivative estimator；其中 `sample()` 一般不保留重参数化梯度，而支持路径梯度的分布使用 `rsample()`。([PyTorch Documentation](https://docs.pytorch.org/docs/stable/distributions.html?utm_source=chatgpt.com "Probability distributions - torch.distributions — PyTorch 2.13 documentation"))

---

## 3. 为什么重参数化通常方差更低

得分函数估计器使用：

[  
$$
f(z)\nabla_\phi\log q_\phi(z).  
$$
]

它只观察函数值 (f(z))，并不知道函数在样本附近的局部变化方向。

重参数化使用：

[  
$$
\nabla_zf(z)  
\frac{\partial z}{\partial\phi}.  
$$
]

它直接利用：

- 损失关于样本的局部导数；
    
- 参数变化如何移动样本。
    

因此在连续、可微问题中，路径梯度往往具有较低方差。Monte Carlo 梯度估计综述将两者分别归纳为 score-function 和 pathwise 两类基本估计器。([Journal of Machine Learning Research](https://www.jmlr.org/papers/v21/19-346.html?utm_source=chatgpt.com "Monte Carlo Gradient Estimation in Machine Learning"))

但“重参数化方差永远更低”并不是无条件定理。具体方差还取决于：

- 目标函数；
    
- 参数化形式；
    
- 分布；
    
- 控制变量；
    
- 维度和样本数。
    

---

# 十、重参数化没有“消除随机性”

一个常见误解是：

> 重参数化把随机采样变成了确定性计算，所以模型不再随机。

这是错误的。

原来随机性来自：

$$
z\sim q_\phi(z).  
$$
重参数化后随机性来自：


$$
\epsilon\sim p(\epsilon).  
$$

只要每次重新采样 ($\epsilon$)，(z) 仍然是随机变量：

$$
z=g_\phi(\epsilon).  
$$

改变的只是随机性的所在位置：


$$
\boxed{  
\text{参数相关随机节点}  
\quad\longrightarrow\quad  
\text{参数无关噪声}  
+  
\text{参数相关确定性变换}  
}  
$$
这使普通链式法则可以通过确定性变换传播。

---

# 十一、更一般的重参数化

## 1. 多元高斯

若：

$$
z\sim\mathcal N(\mu,\Sigma),  
$$
对协方差作 Cholesky 分解：

$$
\Sigma=LL^\top.  
$$
令：

$$
\epsilon\sim\mathcal N(0,I),  
$$
则：

[  
$$
\boxed{  
z=\mu+L\epsilon  
}  
$$
]

满足：

[  
$$
\mathbb E[z]=\mu,  
$$

$$
\operatorname{Cov}(z)
=
 LIL^\top
=
 LL^\top
=
\Sigma.  
$$


VAE 常用对角协方差，对应：


$$
L=\operatorname{diag}(\sigma).  
$$


---

## 2. 一般位置—尺度分布族

若随机变量属于位置—尺度族：

[  
$$
z=\mu+\sigma\epsilon,  
$$
]

其中 (\epsilon) 来自固定标准分布，就可以直接重参数化。

例如：


$$
\epsilon\sim\operatorname{Logistic}(0,1)  
\quad\Rightarrow\quad  
z=\mu+s\epsilon  
$$


服从位置为 ($\mu$)、尺度为 (s) 的 Logistic 分布。

---

## 3. 逆累积分布函数

对一维连续分布，若其 CDF 为：

[  
$$
F_\phi(z),  
$$
]

可令：


$$
u\sim\operatorname{Uniform}(0,1),  
$$

$$
\boxed{  
z=F_\phi^{-1}(u)  
}  
$$


这就是逆变换采样。

只要 ($F_\phi^{-1}$) 关于 (\phi) 可微，就可以形成路径梯度。

高斯形式：


$$
z
=
\mu+\sigma\Phi^{-1}(u)  
$$

与：


$$
z=\mu+\sigma\epsilon,  
\qquad  
\epsilon\sim\mathcal N(0,1)  
$$


本质相同。

---

## 4. 隐式重参数化

Gamma、Beta、Dirichlet 等分布通常很难写出简单的显式形式：

[  
$$
z=g_\phi(\epsilon).  
$$
]

隐式重参数化不要求显式求出 (g_\phi)，而从标准化关系：

[  
$$
S_\phi(z)=\epsilon  
$$
]

出发，利用隐函数求导：


$$
\frac{\partial S_\phi(z)}{\partial z}  
\frac{\partial z}{\partial\phi}  
+  
\frac{\partial S_\phi(z)}{\partial\phi}
$$



所以：


$$
\boxed{  
\frac{\partial z}{\partial\phi}
=
\left(  
\frac{\partial S_\phi(z)}{\partial z}  
\right)^{-1}  
\frac{\partial S_\phi(z)}{\partial\phi}  
}  
$$


Figurnov 等人将这一方法应用于 Gamma、Beta、Dirichlet 和 von Mises 等不方便使用经典显式重参数化的分布。([arXiv](https://arxiv.org/abs/1805.08498?utm_source=chatgpt.com "[1805.08498] Implicit Reparameterization Gradients"))

---

# 十二、离散变量为什么不能直接使用普通重参数化

假设：

[  
$$
z\sim\operatorname{Bernoulli}(p).  
$$
]

可以用：

[  
$$
u\sim U(0,1),  
$$
]

[  
$$
z=\mathbf 1[u<p].  
$$
]

虽然这在分布上完全正确，但映射：

[  
$$
p\mapsto\mathbf 1[u<p]  
$$
]

几乎处处导数为零，并在 (p=u) 处不连续：

[  
$$
\frac{\partial z}{\partial p}=0  
\quad\text{几乎处处}.  
$$
]

因此普通链式法则无法提供有用梯度。

分类变量也是类似问题：

[  
$$
z=\operatorname{onehot}  
\left(  
\arg\max_i(\log\pi_i+g_i)  
\right)  
$$
]

包含不可微的 (\arg\max)。

---

## Gumbel-Softmax

一种做法是把离散 one-hot 样本放松为连续向量：

# [  
$$
y_i
=
\frac{  
\exp((\log\pi_i+g_i)/\tau)  
}{  
\sum_j  
\exp((\log\pi_j+g_j)/\tau)  
},  
$$
]

其中：

[  
$$
g_i\sim\operatorname{Gumbel}(0,1).  
$$
]

温度 (\tau) 较大时分布平滑；当：

[  
$$
\tau\to0  
$$
]

时，结果逐渐接近 one-hot。

但此时优化的是连续放松问题，梯度相对于原始离散目标通常带有偏差。Gumbel-Softmax 与 Concrete distribution 正是为离散随机节点提供可微连续放松而提出的。([OpenReview](https://openreview.net/pdf?id=rkE3y85ee&utm_source=chatgpt.com "Published as a conference paper at ICLR 2017"))

---

# 十三、重参数化成立需要哪些条件

要严谨地写出：

# [  
$$
\nabla_\phi  
\mathbb E_{\epsilon}  
[f(g_\phi(\epsilon))]
=
\mathbb E_{\epsilon}  
\left[  
\nabla_\phi f(g_\phi(\epsilon))  
\right],  
$$
]

通常需要以下条件。

第一，基础噪声分布：

[  
$$
p(\epsilon)  
$$
]

不能依赖待求导参数 (\phi)。

第二，映射：

[  
$$
g_\phi(\epsilon)  
$$
]

应当对 (\phi) 几乎处处可微。

第三，目标：

[  
$$
f(z)  
$$
]

需要对 (z) 可微，至少几乎处处可微。ReLU、L1 损失等在少数点不可微通常不构成实践问题，因为可以使用次梯度，而且不可微点常具有零测度。

第四，必须允许交换积分和微分。一个常见充分条件是存在可积函数 (M(\epsilon))，使得邻域内：


$$
\left||  
\nabla_\phi  
f(g_\phi(\epsilon))  
\right| | 
\le M(\epsilon).  
$$
这类条件通常可由支配收敛定理或 Leibniz 积分法则支持。

第五，蒙特卡洛梯度最好具有有限方差：


$$
\operatorname{Var}  
\left[  
\nabla_\phi f(g_\phi(\epsilon))  
\right]  
<\infty.  
$$

否则即使理论无偏，优化也可能非常不稳定。

---

# 十四、常见实现形式

高斯重参数化通常写成：

```python
mu, logvar = encoder(x)

std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)

z = mu + std * eps
reconstruction = decoder(z)
```

或者使用支持路径梯度的分布接口：

```python
dist = torch.distributions.Normal(mu, std)
z = dist.rsample()
```

`rsample()` 的含义是 reparameterized sample；它保留样本对分布参数的可微路径。普通 `sample()` 通常只返回数值样本，而不允许梯度通过采样过程回到分布参数。([PyTorch Documentation](https://docs.pytorch.org/docs/stable/distributions.html?utm_source=chatgpt.com "Probability distributions - torch.distributions — PyTorch 2.13 documentation"))

---

# 十五、常见错误

## 1. 错把方差当标准差

如果网络输出：
$$
\log\sigma^2,  
$$
正确转换是：

$$
\sigma=\exp(0.5\log\sigma^2).  
$$


不是：


$$
\sigma=\exp(\log\sigma^2)=\sigma^2.  
$$


---

## 2. 对噪声求梯度

通常不需要优化 ($\epsilon$)。它是外源随机噪声：

$$
\epsilon\sim\mathcal N(0,I).  
$$
反向传播只需把当前 ($\epsilon$) 当作固定输入。

---

## 3. 使用 `detach`

如果写成：

```python
z = (mu + std * eps).detach()
```

则会切断：

$$
z\rightarrow\mu,\sigma  
$$
的梯度，失去重参数化的作用。

---

## 4. 误认为测试时必须采样

训练时采样是为了学习潜变量分布。测试时可以根据任务选择：

- 采样 (z)：获得多样输出；
    
- 取 ($z=\mu$)：获得确定性输出；
    
- 从先验采样：生成新样本；
    
- 设置 ($z=0$)：使用标准高斯先验均值。
    

ACT 使用最后一种方式。

---

## 5. KL 权重过大

若：

$$
\beta D_{\mathrm{KL}}  
$$
过强，编码器可能被迫输出：

$$
q_\phi(z\mid x)\approx\mathcal N(0,I),  
$$
使 (z) 几乎不再包含输入信息。这通常称为 posterior collapse。

此时即使重参数化本身完全正确，潜变量也可能被解码器忽略。

---

# 十六、重参数化的本质

从概率角度，它是一个**分布变换**：

$$
\epsilon\sim p(\epsilon)  
\quad\xrightarrow{g_\phi}\quad  
z\sim q_\phi(z).  
$$
从优化角度，它把：


$$
\text{参数控制概率分布}  
$$


改写成：

$$
\text{参数控制样本的确定性运动路径}.  
$$
从自动微分角度，它把：

$$
\phi  
\rightarrow  
\boxed{\text{随机采样}}  
\rightarrow  
z  
$$
改写为：

$$
\epsilon  
\rightarrow  
g_\phi(\epsilon)  
\leftarrow  
\phi.  
$$
从梯度估计角度，它把得分函数形式：


$$
f(z)\nabla_\phi\log q_\phi(z)  
$$
改写为路径导数形式：


$$
\nabla_zf(z)  
\frac{\partial z}{\partial\phi}.  
$$

因此最准确的概括是：


$$
\boxed{  
\text{重参数化并不取消随机性，  
而是把随机性与待优化参数分离，  
使参数能够通过一条可微的样本生成路径接受梯度。}  
}  
$$

在 ACT 中，这条可微路径具体是：


$$
\mathcal L_{\mathrm{action}}  
\rightarrow  
\hat a_{t:t+k}  
\rightarrow  
z  
\rightarrow  
(\mu_\phi,\sigma_\phi)  
\rightarrow  
\phi,  
$$

它使动作序列重构误差能够训练 CVAE 编码器，进而让潜变量 (z) 表达人类示范中不同的动作风格和轨迹变化。