变分自编码器(七):球面上的VAE(vMF-VAE)
By 苏剑林 | 2021-05-17 | 128832位读者 |在《变分自编码器(五):VAE + BN = 更好的VAE》中,我们讲到了NLP中训练VAE时常见的KL散度消失现象,并且提到了通过BN来使得KL散度项有一个正的下界,从而保证KL散度项不会消失。事实上,早在2018年的时候,就有类似思想的工作就被提出了,它们是通过在VAE中改用新的先验分布和后验分布,来使得KL散度项有一个正的下界。
该思路出现在2018年的两篇相近的论文中,分别是《Hyperspherical Variational Auto-Encoders》和《Spherical Latent Spaces for Stable Variational Autoencoders》,它们都是用定义在超球面的von Mises–Fisher(vMF)分布来构建先后验分布。某种程度上来说,该分布比我们常用的高斯分布还更简单和有趣~
KL散度消失 #
我们知道,VAE的训练目标是
\begin{equation}\mathcal{L} = \mathbb{E}_{x\sim \tilde{p}(x)} \Big[\mathbb{E}_{z\sim p(z|x)}\big[-\log q(x|z)\big]+KL\big(p(z|x)\big\Vert q(z)\big)\Big]
\end{equation}
其中第一项是重构项,第二项是KL散度项,在《变分自编码器(一):原来是这么一回事》中我们就说过,这两项某种意义上是“对抗”的,KL散度项的存在,会加大解码器利用编码信息的难度,如果KL散度项为0,那么说明解码器完全没有利用到编码器的信息。
在NLP中,输入和重构的对象是句子,为了保证效果,解码器一般用自回归模型。然而,自回归模型是非常强大的模型,强大到哪怕没有输入,也能完成训练(退化为无条件语言模型),而刚才我们说了,KL散度项会加大解码器利用编码信息的难度,所以解码器干脆弃之不用,这就出现了KL散度消失现象。
早期比较常见的应对方案是逐渐增加KL项的权重,以引导解码器去利用编码信息。现在比较流行的方案就是通过某些改动,直接让KL散度项有一个正的下界。将先后验分布换为vMF分布,就是这种方案的经典例子之一。
vMF分布 #
vMF分布是定义在$d-1$维超球面的分布,其样本空间为$S^{d-1}=\{x|x\in\mathbb{R}^d, \Vert x\Vert=1\}$,概率密度函数则为
\begin{equation}p(x) = \frac{e^{\langle\xi,x\rangle}}{Z_{d, \Vert\xi\Vert}},\quad Z_{d, \Vert\xi\Vert}=\int_{S^{d-1}}e^{\langle\xi,x\rangle} dS^{d-1}\end{equation}
其中$\xi\in\mathbb{R}^d$是预先给定的参数向量。不难想象,这是$S^{d-1}$上一个以$\xi$为中心的分布,归一化因子写成$Z_{d, \Vert\xi\Vert}$的形式,意味着它只依赖于$\xi$的模长,这是由于各向同性导致的。由于这个特性,vMF分布更常见的记法是设$\mu=\xi/\Vert\xi\Vert, \kappa=\Vert\xi\Vert, C_{d,\kappa}=1/Z_{d, \Vert\xi\Vert}$,从而
\begin{equation}p(x) = C_{d,\kappa} e^{\kappa\langle\mu,x\rangle}\end{equation}
这时候$\langle\mu,x\rangle$就是$\mu,x$的夹角余弦,所以说,vMF分布实际上就是以余弦相似度为度量的一种分布。由于我们经常用余弦值来度量两个向量的相似度,因此基于vMF分布做出来的模型,通常更能满足我们的这个需求。当$\kappa=0$的时候,vMF分布是球面上的均匀分布。
从归一化因子$Z_{d, \Vert\xi\Vert}$的积分形式来看,它实际上也是vMF的母函数,从而vMF的各阶矩也可以通过$Z_{d, \Vert\xi\Vert}$来表达,比如一阶矩为
\begin{equation}\mathbb{E}_{x\sim p(x)} [x] = \nabla_{\xi} \log Z_{d, \Vert\xi\Vert}=\frac{d \log Z_{d,\Vert\xi\Vert}}{d\Vert\xi\Vert}\frac{\xi}{\Vert\xi\Vert}\end{equation}
可以看到$\mathbb{E}_{x\sim p(x)} [x]$在方向上跟$\xi$一致。$Z_{d, \Vert\xi\Vert}$的精确形式可以算出来,但比较复杂,而且很多时候我们也不需要精确知道这个归一化因子,所以这里我们就不算了。
至于参数$\kappa$的含义,或许设$\tau=1/\kappa$我们更好理解,此时$p(x)\sim e^{\langle\mu,x\rangle/\tau}$,熟悉能量模型的同学都知道,这里的$\tau$就是温度参数,如果$\tau$越小($\kappa$越大),那么分布就越集中在$\mu$附近,反之则越分散(越接近球面上的均匀分布)。因此,$\kappa$也被形象地称为“凝聚度(concentration)”参数。
从vMF采样 #
对于vMF分布来说,需要解决的第一个难题是如何实现从它里边采样出具体的样本来。尤其是如果我们要将它应用到VAE中,那么这一步是至关重要的。
均匀分布 #
最简单是$\kappa=0$的情形,也就是$d-1$维球面上的均匀分布,因为标准正态分布本来就是各向同性的,其概率密度正比于$e^{-\Vert x\Vert^2/2}$只依赖于模长,所以我们只需要从$d$为标准正态分布中采样一个$z$,然后让$x=z/\Vert z\Vert$就得到了球面上的均匀采样结果。
特殊方向 #
接着,对于$\kappa > 0$的情形,我们记$x=[x_1,x_2,\cdots,x_d]$,首先考虑一种特殊的情况:$\mu = [1, 0, \cdots, 0]$。事实上,由于各向同性的原因,很多时候我们都只需要考虑这个特殊情况,然后就可以平行地推广到一般情形。
此时概率密度正比于$e^{\kappa x_1}$,然后我们转换到球坐标系:
\begin{equation}
\left\{\begin{aligned}
x_1 &= \cos\varphi_1\\
x_2 &= \sin\varphi_1 \cos\varphi_2 \\
x_3 &= \sin\varphi_1 \sin\varphi_2 \cos\varphi_3 \\
&\,\,\vdots \\
x_{d-1} &= \sin\varphi_1 \cdots \sin\varphi_{d-2} \cos\varphi_{d-1}\\
x_d &= \sin\varphi_1 \cdots \sin\varphi_{d-2} \sin\varphi_{d-1}
\end{aligned}\right.
\end{equation}
那么(超球坐标的积分变换,请直接参考“维基百科”)
\begin{equation}\begin{aligned}
e^{\kappa x_1}dS^{d-1} =& e^{\kappa\cos\varphi_1}\sin^{d-2}\varphi_1 \sin^{d-3}\varphi_2 \cdots \sin\varphi_{d-2} d\varphi_1 d\varphi_2 \cdots d\varphi_{d-1} \\
=& \left(e^{\kappa\cos\varphi_1}\sin^{d-2}\varphi_1 d\varphi_1\right)\left(\sin^{d-3}\varphi_2 \cdots \sin\varphi_{d-2} d\varphi_2 \cdots d\varphi_{d-1}\right) \\
=& \left(e^{\kappa\cos\varphi_1}\sin^{d-2}\varphi_1 d\varphi_1\right)dS^{d-2} \\
\end{aligned}\end{equation}
这个分解表明,从该vMF分布中采样,等价于先从概率密度正比于$e^{\kappa\cos\varphi_1}\sin^{d-2}\varphi_1$的分布采样一个$\varphi_1$,然后从$d-2$维超球面上均匀采样一个$d-1$维向量$\varepsilon = [\varepsilon_2,\varepsilon_3,\cdots,\varepsilon_d]$,通过如下方式组合成最终采样结果
\begin{equation}x = [\cos\varphi_1, \varepsilon_2\sin\varphi_1, \varepsilon_3\sin\varphi_1, \cdots, \varepsilon_d\sin\varphi_1]\end{equation}
设$w=\cos\phi_1\in[-1,1]$,那么
\begin{equation}\left|e^{\kappa\cos\varphi_1}\sin^{d-2}\varphi_1 d\varphi_1\right| = \left|e^{\kappa w} (1-w^2)^{(d-3)/2}dw\right|\end{equation}
所以我们主要研究从概率密度正比于$e^{\kappa w} (1-w^2)^{(d-3)/2}$的分布中采样。
然而,笔者所不理解的是,大多数涉及到vMF分布的论文,都采用了1994年的论文《Simulation of the von mises fisher distribution》提出的基于beta分布的拒绝采样方案,整个采样流程还是颇为复杂的。但现在都2021年了,对于一维分布的采样,居然还需要拒绝采样这么低效的方案?
事实上,对于任意一维分布$p(w)$,设它的累积概率函数为$\Phi(w)$,那么$w=\Phi^{-1}(\varepsilon),\varepsilon\sim U[0,1]$就是一个最方便通用的采样方案。可能有读者抗议说“累积概率函数不好算呀”、“它的逆函数更不好算呀”,但是在用代码实现采样的时候,我们压根就不需要知道$\Phi(w)$长啥样,只要直接数值计算就行了,参考实现如下:
import numpy as np
def sample_from_pw(size, kappa, dims, epsilon=1e-7):
x = np.arange(-1 + epsilon, 1, epsilon)
y = kappa * x + np.log(1 - x**2) * (dims - 3) / 2
y = np.cumsum(np.exp(y - y.max()))
y = y / y[-1]
return np.interp(np.random.random(size), y, x)
这里的实现中,计算量最大的是变量y
的计算,而一旦计算好之后,可以缓存下来,之后只需要执行最后一步来完成采样,其速度是非常快的。这样再怎么看,也比从beta分布中拒绝采样要简单方便吧。顺便说,实现上这里还用到了一个技巧,即先计算对数值,然后减去最大值,最后才算指数,这样可以防止溢出,哪怕$\kappa$成千上万,也可以成功计算。
一般情形 #
现在我们已经实现了从$\mu=[1,0,\cdots,0]$的vMF分布中采样了,我们可以将采样结果分解为
\begin{equation}x = w\times\underbrace{[1,0,\cdots,0]}_{\text{参数向量}\mu} + \sqrt{1-w^2}\times\underbrace{[0,\varepsilon_2,\cdots,\varepsilon_d]}_{\begin{array}{c}\text{与}\mu\text{正交的}d-2\text{维}\\ \text{超球面均匀采样}\end{array}}\end{equation}
同样由于各向同性的原因,对于一般的$\mu$,采样结果依然具有同样的形式:
\begin{equation}\begin{aligned}
&x = w\mu + \sqrt{1-w^2}\nu\\
&w\sim e^{\kappa w} (1-w^2)^{(d-3)/2}\\
&\nu\sim \text{与}\mu\text{正交的}d-2\text{维超球面均匀分布}
\end{aligned}\end{equation}
对于$\nu$的采样,关键之处是与$\mu$正交,这也不难实现,先从标准正态分布中采样一个$d$维向量$z$,然后保留与$\mu$正交的分量并归一化即可:
\begin{equation}\nu = \frac{\varepsilon - \langle \varepsilon,\mu\rangle \mu}{\Vert \varepsilon - \langle \varepsilon,\mu\rangle \mu\Vert},\quad \varepsilon\sim\mathcal{N}(0,1_d)\end{equation}
vMF-VAE #
至此,我们可谓是已经完成了本篇文章最艰难的部分,剩下的构建vMF-VAE可谓是水到渠成了。vMF-VAE选用球面上的均匀分布($\kappa=0$)作为先验分布$q(z)$,并将后验分布选取为vMF分布:
\begin{equation}p(z|x) = C_{d,\kappa} e^{\kappa\langle\mu(x),z\rangle}\end{equation}
简单起见,我们将$\kappa$设为超参数(也可以理解为通过人工而不是梯度下降来更新这个参数),这样一来,$p(z|x)$的唯一参数来源就是$\mu(x)$了。此时我们可以计算KL散度项
\begin{equation}\begin{aligned}
\int p(z|x) \log\frac{p(z|x)}{q(z)} dz =&\, \int C_{d,\kappa} e^{\kappa\langle\mu(x),z\rangle}\left(\kappa\langle\mu(x),z\rangle + \log C_{d,\kappa} - \log C_{d,0}\right)dz\\
=&\,\kappa\left\langle\mu(x),\mathbb{E}_{z\sim p(z|x)}[z]\right\rangle + \log C_{d,\kappa} - \log C_{d,0}
\end{aligned}\end{equation}
前面我们已经讨论过,vMF分布的均值方向跟$\mu(x)$一致,模长则只依赖于$d$和$\kappa$,所以代入上式后我们可以知道KL散度项只依赖于$d$和$\kappa$,当这两个参数被选定之后,那么它就是一个常数(根据KL散度的性质,当$\kappa\neq 0$时,它必然大于0),绝对不会出现KL散度消失现象了。
那么现在就剩下重构项了,我们需要用“重参数(Reparameterization)”来完成采样并保留梯度,在前面我们已经研究了vMF的采样过程,所以也不难实现,综合的流程为:
\begin{equation}\begin{aligned}
&\mathcal{L} = \Vert x - g(z)\Vert^2\\
&z = w\mu(x) + \sqrt{1-w^2}\nu\\
&w\sim e^{\kappa w} (1-w^2)^{(d-3)/2}\\
&\nu=\frac{\varepsilon - \langle \varepsilon,\mu\rangle \mu}{\Vert \varepsilon - \langle \varepsilon,\mu\rangle \mu\Vert}\\
&\varepsilon\sim\mathcal{N}(0,1_d)
\end{aligned}\end{equation}
这里的重构loss以MSE为例,如果是句子重构,那么换用交叉熵就好。其中$\mu(x)$就是编码器,而$g(z)$就是解码器,由于KL散度项为常数,对优化没影响,所以vMF-VAE相比于普通的自编码器,只是多了一项稍微有点复杂的重参数操作(以及人工调整$\kappa$)而已,相比基于高斯分布的标准VAE可谓简化了不少了。
此外,从该流程我们也可以看出,除了“简单起见”之外,不将$\kappa$设为可训练还有一个主要原因,那就是$\kappa$关系到$w$的采样,而在$w$的采样过程中要保留$\kappa$的梯度是比较困难的。
参考实现 #
vMF-VAE的实现难度主要是重参数部分,也就还是从vMF分布中采样,而关键之处就是$w$的采样。前面我们已经给出了$w$的采样的numpy实现,但是在tf中未见类似np.interp
的函数,因此不容易转换为纯tf的实现。当然,如果是torch或者tf2这种动态图框架,直接跟numpy的代码混合使用也无妨,但这里还是想构造一种比较通用的方案。
其实也不难,由于$w$只是一个一维变量,每步训练只需要用到batch_size
个采样结果,所以我们完全可以事先用numpy函数采样好足够多(几十万)个$w$存好,然后训练的时候直接从这批采样好的结果随机抽就行了,参考实现如下:
def sampling(mu):
"""vMF分布重参数操作
"""
dims = K.int_shape(mu)[-1]
# 预先计算一批w
epsilon = 1e-7
x = np.arange(-1 + epsilon, 1, epsilon)
y = kappa * x + np.log(1 - x**2) * (dims - 3) / 2
y = np.cumsum(np.exp(y - y.max()))
y = y / y[-1]
W = K.constant(np.interp(np.random.random(10**6), y, x))
# 实时采样w
idxs = K.random_uniform(K.shape(mu[:, :1]), 0, 10**6, dtype='int32')
w = K.gather(W, idxs)
# 实时采样z
eps = K.random_normal(K.shape(mu))
nu = eps - K.sum(eps * mu, axis=1, keepdims=True) * mu
nu = K.l2_normalize(nu, axis=-1)
return w * mu + (1 - w**2)**0.5 * nu
一个基于MNIST的完整例子可见:
至于vMF-VAE用于NLP的例子,我们日后有机会再分享。本文主要还是以理论介绍和简单演示为主~
文章小结 #
本文介绍了基于vMF分布的VAE实现,其主要难度在于vMF分布的采样。总的来说,vMF分布建立在余弦相似度度量之上,在某些方面的性质更符合我们的直观认知,将其用于VAE中,能够使得KL散度项为一个常数,从而防止了KL散度消失现象,并且简化了VAE结构。
转载到请包括本文地址:https://spaces.ac.cn/archives/8404
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (May. 17, 2021). 《变分自编码器(七):球面上的VAE(vMF-VAE) 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/8404
@online{kexuefm-8404,
title={变分自编码器(七):球面上的VAE(vMF-VAE)},
author={苏剑林},
year={2021},
month={May},
url={\url{https://spaces.ac.cn/archives/8404}},
}
May 10th, 2022
e^κw * (1−w2)^(d−3)/2并不一定是一个单调非减函数,为什么能够求得逆函数呢
不是$e^{\kappa w} (1-w^2)^{(d-3)/2}$的逆函数,是它的累积概率的逆函数,也就是$\Phi(w)=\int_{-1}^w e^{\kappa t} (1-t^2)^{(d-3)/2} dt$的逆函数。
May 11th, 2022
$\kappa > 0$ 并不能直接说明 (13) 式恒大于 0 吧?至少我看来并不显然。因为 $ r(\kappa) = \log C_{d,\kappa} - \log C_{d,0}$ 的符号并不确定。
经过我非严格验证(见r 函数的图像),在三维的情况(即$d=3$),$\kappa > 0$ 时,$r(\kappa) < 0$, 因此,即使 $\kappa >0$, (13) 式整体还是有可能等于 0 的。
要严格证明,就不得不求出 $C_{d, \kappa}$, 并利用函数的单调性,过程还是蛮复杂的。
由于 $\mathbb{E}_{z\sim p(z|x)}[z]$ 与 $\mu(x)$ 方向一致,(13) 式可以进一步化简为:
$$
\begin{equation*}\begin{aligned}
\int p(z|x) \log\frac{p(z|x)}{q(z)} dz =&\, \int C_{d,\kappa} e^{\kappa\langle\mu(x),z\rangle}\left(\kappa\langle\mu(x),z\rangle + \log C_{d,\kappa} - \log C_{d,0}\right)dz\\
=&\,\kappa\left\langle\mu(x),\mathbb{E}_{z\sim p(z|x)}[z]\right\rangle + \log C_{d,\kappa} - \log C_{d,0} \\
=&\,\kappa + \log C_{d,\kappa} - \log C_{d,0}
\end{aligned}\end{equation*}
$$
需要证明, 对任意 $d\in \mathbb{Z}_+, \kappa > 0$ 函数
$$
f(\kappa) = \kappa + \log C_{d,\kappa} - \log C_{d,0} > 0
$$
猜想可以通过证明其在 $\{0\} \cup \mathbb{R_+}$ 上单调递增,在 0 点处严格单调递增,以及计算其在 0 点的值大于等于 0,来进行证明。
以三维情况为例,
$$
f(\kappa) = \kappa + \log C_{3,\kappa} - \log C_{3,0} = \kappa + \log\dfrac{\kappa }{2\pi (e^\kappa - e^{-\kappa})} - \log\dfrac{1}{4\pi}
$$
其图像如 https://www.wolframalpha.com/input?i=plot+x%2Bln%28x%2F%282*pi+*+%28exp%28x%29+-+exp%28-x%29%29%29%29+-+ln%281%2F%284*pi%29%29+from+-1+to+5 所示。从图像来看,以上三点都得到满足的。我比较懒,就不严格证明了。
如果要简单理解,那就是KL散度$\int p(z|x) \log\frac{p(z|x)}{q(z)} dz\geq 0$,当且仅当$p(z|x)=q(z)$时取等号,而对于$p(z|x)$有$\kappa > 0$,对于$q(z)$有$\kappa = 0$,两者不相等,所以只能是大于0。
不过,这只是经典分析视角。从泛函角度来看,“相等”是需要被定义的,比如$p(z|x)$和$q(z)$不严格相等、但几乎处处相等,那么KL散度依然等于0。然而对于vMF分布来说,它的连续性很好,所以不可能存在不严格相等但又几乎处处相等的情形,因此两个$\kappa$不等的vMF分布的KL散度是必然大于0的。
当然,严格说明这件事情还需要花费一些功夫,即要证明它们差异部分的测度大于0,不过我认为借助“KL散度等于0当且仅当两个分布等于0”这个经典认知,那么这个结论算是比较直观易懂的了。
最后补充一点就是$\mathbb{E}_{z\sim p(z|x)}[z]$ 只是与 $\mu(x)$ 方向一致,但不等,所以不能得出$\left\langle\mu(x),\mathbb{E}_{z\sim p(z|x)}[z]\right\rangle=1$。
1. (2)到(3)式,对 $\xi$ 做了归一化得到 $\mu$, 因此 (3) 式中的 $\mu$ 应该是归一化的。如文章中所述,尽管使用内积的记号,但实际上(3) 式里面的 $\langle \mu, x\rangle$ 实际含义是 $\mu$ 与 $x$ 夹角的 $\cos$ 值。 因此 (3) 式中,$\mu$ 位置的输入值应该是归一化的值。这样 (12) 式中 $\mu(x)$ 也应该是归一化的才符合定义域。
2. 由于 $z \sim p(z|x)$,因此每个 $z$ 都是归一化的,其期望当然也应该是归一化的, 即 $\mathbb{E}_{z\sim p(z|x)}[z] = 1$
综上两点,是可以证明 $\left\langle\mu(x),\mathbb{E}_{z\sim p(z|x)}[z]\right\rangle=1$ 的。
最后,如果 $\left\langle\mu(x),\mathbb{E}_{z\sim p(z|x)}[z]\right\rangle \not=1$. 在小于 1 的时候,会导致$f(\kappa) = \kappa + \log C_{d,\kappa} - \log C_{d,0}$ 出现负的值。 这在 3 维的时候很好验证。这显然是矛盾的。当然,大于 0 推不出矛盾。
就是你说的第2点不成立,如果$\Vert x\Vert=\Vert y\Vert = 1$但$x\neq y$,那么显然$\Vert (x+y)/2\Vert < 1$。
是的,你是对的。我想成了正态分布期望为 0 的情况了。从 Wikipedia 来看,这个期望是小于 1 的一个$\kappa$ 和 $d$ 的函数。如果直接从 (13) 式最后的表达式证明其大于 0,的确不是一个简单的问题。谢谢!
May 12th, 2022
式(11)上面一段话,为什么z是从“标准正态分布”中采出的d维向量?不是希望v是d-2维球面上的均匀分布吗
$(11)$式就是$d-2$维球面上的均匀分布。
May 29th, 2022
特殊方向的参考实现里
~~~
import numpy as np
def sample_from_pw(size, kappa, dims, epsilon=1e-7):
x = np.arange(-1 + epsilon, 1, epsilon)
y = kappa * x + np.log(1 - x**2) * (dims - 3) / 2
y = np.cumsum(np.exp(y - y.max()))
y = y / y[-1]
return np.interp(np.random.random(size), y, x)
~~~
x 是(-1,1)
可是在return里,np.random.random是[0,1),这样采样会不会遗漏什么?
我不大清楚你想表达什么。你想说没有采样到$1$的可能性,还是说没有采样到$(-1,0)$的可能性?
如果是前者,严格等于某个数的概率是0,去掉也不影响什么;如果是后者,那就是你完全没理解原理,乱提的疑问,文章已经说得很清楚,$w$的采样方式是$w=\Phi^{-1}(\varepsilon),\varepsilon\sim U[0,1]$。
May 31st, 2022
苏神你好,看了您很多VAE的文章觉得受益匪浅,其中感觉最为突出的就是对于VAE“做了一件什么事”的理解。但是我发现在一些非自回归机器翻译的论文中VAE的使用动机就很让人迷惑,比如:https://arxiv.org/pdf/1908.07181v5.pdf。这些Non-Autoregression MT论文都把VAE描述为一种“最直接”的方式从而融入到网络中,但对VAE的作用机理却都未提及。
我目前的个人理解是:相对自回归机翻,非自回归机翻缺失了翻译词之间的依赖关系的捕捉,为了弥补这种缺失,NAT论文向网络中引入各种信息(比如借助外部对齐工具、NER等)和手段来弥补,而VAE就作为一种“直接获取隐变量”的手段被应用,但为什么“隐变量”能奏效却总是想不通。
另外一个关键点也想请教一下苏神看是否正确:应用于机翻的这些VAE并非原始意义上的自编码器了,它将重建loss替换成了翻译loss,或者可以理解成“在另一种语言形式上的重建”。如果确实是这样的话,那是不是VAE可以进一步扩展,不再拘泥于“重建”,用于更多的“目标”?
VAE用于非自回归的理念在于“独立模型相加就不是独立了”,即非自回归模型$p(y|x)=\prod\limits_t p(y_t|x)$,然而如果有两个非自回归模型相见,比如$\prod\limits_t p_1(y_t|x)+\prod\limits_t p_2(y_t|x)$,那么这就不是每个token都独立的模型了。
从这个思想出发,我们可以引入随机变量$z$,使得$p(y_t|x)$与$z$相关,然后加权平均,即$p(y|x)=\int \prod\limits_t p(y_t|x, z) q(z)dz$,这就类似VAE所做的模型假设了,后面的推导就跟VAE一样了。
其实VAE用于非自回归模型的目标也应该是重建,注意到输入$x$只是模型的条件,我们可以理解为是输入$(x,y)$来重建$y$。
March 30th, 2023
关于vmf分布的期望有一点我其实比较好奇:
既然样本空间都在超球面空间上,为什么得到的期望会在球内呢(公式4前面相当于是一个scalar系数 乘上 $\mu$)?
对应wiki:https://en.wikipedia.org/wiki/Von_Mises–Fisher_distribution 里面的$A_p(\kappa)$.
这是个好问题。因为VMF的期望运算还是普通的欧氏空间的运算,并没有流形上的定义,所以没法保证加减乘除之后仍然还在流形上。
June 14th, 2023
苏老师好。 关于vae 不同 变体 选型 可以 指导下吗?
主要考虑 两方面
1、训练稳定性 避免 kl vanish
2、特征提取 效果 更好
例如
1、bn+vae
2、(vMF-VAE)
3、Nvae
等等
大道至简。
最好的 避免 kl vanish 的 方式是?
好的的 vae 架构是?如何根据优劣势 选型呢
按照你这个需求,应该就是本文的vmf-vae比较好吧
June 14th, 2023
苏老师 好
在 特征提取场景(用VAE 监督学习 估计某个特征,而非还原为自己)
VAE引入了随机性(针对每个样本 都生产了专属的 Z分布)
随机性的引入。会不会 降低 特征提取质量?(特征的 精度)
对于 特征 的 偏差、方差 影响分别是?
在这个场景,选择什么类型的vae比较好?kl vanish用 哪个方法 更好呢?
谢谢
vae本质还是在学习分布,vae本身也不知道特征的好坏,因为好坏取决于你下游想要做的任务。
苏老师。我在研究 变分推理的 下界。
1、针对kl loss 有些案例 完全依赖于 两重超参微调。belta*kl_weight*(kl-c_max) 约束最终kl大小(c_max) 和 调整值域(kl_weight 和 belta)
2、c_max 最优下界是?
各种变分 貌似 有 理论推导的 最优 变分下界。这块儿 完全手动调(成本高),还是用什么理论kl下界 更好?
3、1中 调整值域 (kl_weight 和 belta) 目的是 让和重建误差 在优化时 控制 优先级。
step 1)根据具体任务 看 重建误差的值域范围。
step 2)调整kl_weight 让 kl 值域 和 重建误差相近
step 3) 用退火 控制 初七 kl loss=0 后期逐渐增大
我的理解是否有误,苏老师建议是?
4、预热 anneal 是否有必要用?单调增长 还是 不断循环往复的 哪种更好?
5、现在vae 有没有 更自动化调整的方案?
1)anneal 2) c_max 4) kl_weight 5)belta 等
苏老师如果方便,可以加Q (942152145) 我在研究变分推理 各个变体时,还有很多思考想和老师探讨
我好像不大了解你这个话题,很抱歉~
August 2nd, 2023
为了看懂这篇专门去看来VMF分布,苏神这里采用了很多近似吧?
1 采用插值采样来模拟一个维度的VMF分布采样,插值肯定是有误差的。
2 采用一个维度的采样扩展到多个维度,我理解数学上是没问题的,但是ANN算出来的mu一定是一个维度的吗?可以通过施密特正交化扩展到多个维度吗?
3 还是(11)式,这里的eps采用正态分布模拟,如果vmf分布是wrraped 正态或许可以(我不确定),但是vmf分布只是多维球正态分布的近似,所以这里eps正态分布采样应该也是近似。这或许是别人依然用老方法采用的原因?
4 代码实现中只有一个交叉熵,是不是缺少了KL散度项,即输出和隐变量的内积项?
对,这里还有一个问题,如果假设为vmf分布只是为了让KL散度项不为0,那好像完全没必要做这种改进。一方面,我理解正则项就是防止KL为0的,另一方面,苏神你自己也在NVAE那篇博文中提到了,为了计算KL散度项,假设其中三项为高斯分布,就导致了KL散度不会为0。
我不清楚有哪个正则项防止KL为0
1、采样算法理论上是精确的,要不然照你这样说,任何数值算法都有误差了;
2、没看懂你说什么;
3、同样看不懂你说什么,老方法改变的只是$w$的采样方式,其他都是一致的;
4、KL散度是常数。
August 21st, 2023
苏老师,我刚接触这个方向,请问,d维的特征,为啥是定义d-1维的超球面来进行研究?
它还是$d$维的向量,只不过全体集合构成的是$d-1$维的超球面。很多情况下数据分布都只是高维空间中的一个低维子流形,所以这种约束通常都不会有什么大问题。