今天读小样本的论文又遇到了重参数技巧,记得之前在 VAE 中也看到了它。遂来做一个归纳整理,了解重参数到底是什么,一般都用在什么背景下。
VAE 中重参数生成高斯分布
在 VAE 中,需要从 $p(Z|X)$ 中采样得到样本,但采样的过程本身是不可逆的,就导致整个过程无法反向传播。我们已经知道 $P(Z|X)$ 是服从正态分布的,也知道均值和方差,那么如何产生数据呢?这个时候就是重采样技术了。
我们首先生成一个均值为0, 标准差为1的高斯分布 $N\sim (0,1)$。在这个分布中中采样数据 $\epsilon$,经过一个变换后得到目标分布:$Z=\mu + \sigma \epsilon$。$\mu$为均值,$\sigma$为方差,由网络计算得出。伪代码如下:
1 | def reparametrization(z_mean, z_log_var): |
此时,返回的变量就具有了梯度,而采样的过程在整个计算图之外,采样的 $\epsilon$ 就是一个常量,此时便可以梯度下降。
Gumbel Softmax
https://static01.imgkr.com/temp/8798f13886ad45d78ed32dbdccdb0386.png
上图在 DARTS 算法中表示为一个 Cell。每个 Cell 由多个 Node 组成,Node 和 Node 之间有多条边,每条边代表的操作不一样,比如可能是CNN,可能是RNN,可能是 maxpool。每条边都有一个权重 $\alpha$,权重是可以学习的。根据权重来选择每条边到底执行什么操作。
假设每条边上有三条操作。如果只是简单地选择权重最大的操作,那么[0.2,0.3,0.5]
和[0.1,0.2,0.7]
并没有本质的区别了,而且这样一来可能第一个和第二个操作根本就没有机会得到更新,但从概率上来说这两个权重分布差别是巨大的,所以需要一种方法不仅选出动作,而且遵从概率的含义。
所以一个很自然的想法就是我们希望以 0.1 的概率选择第一个操作,0.2 的概率选择第二个操作,0.7 的概率选择第三个操作。实现起来很简单,按照概率选择就好。但问题又来了,这个过程没有办法梯度下降。所以需要借助重采样技术。
- 生成均匀分布 $U(0,1)$,从中采样得到样本 $\epsilon$;
- 计算 $G$,$G=-\log(-\log(\epsilon))$;
- 计算新的权重向量:$w=[w_1+G_1, w_2+G_2, \cdots, w_n+G_n]$;
- softmax一下,使得每个操作都能以一定的概率被选中,所以gumbel softmax成功地引入了随机性:
\begin{equation}
w’=\frac{\exp (w/\tau)}{\sum_{i=1}^n\exp(w_i/\tau)}
\end{equation}
$\tau$控制着softmax的程度,温度越高,生成的分布越平滑(接近这里的均匀分布);温度越低,生成的分布越接近离散的one-hot分布。因此,训练时可以逐渐降低温度,以逐步逼近真实的离散分布,且保留了梯度信息。
总结
大概可以发现,有两种情况会使用重参数:
- 需要对某一分布的数据进行采样;
- 需要保留梯度信息用于反向传播。
参考
- VAE:https://kexue.fm/archives/5253
- Gumbel Softmax:https://www.cnblogs.com/marsggbo/p/13227992.html