15

EAE:自编码器 + BN + 最大熵 = 生成模型

 4 years ago
source link: https://kexue.fm/archives/7343
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

生成模型一直是笔者比较关注的主题,不管是NLP和CV的生成模型都是如此。这篇文章里,我们介绍一个新颖的生成模型,来自论文 《Batch norm with entropic regularization turns deterministic autoencoders into generative models》 ,论文中称之为 EAE (Entropic AutoEncoder)。它要做的事情给变分自编码器(VAE)基本一致,最终效果其实也差不多(略优),说它新颖并不是它生成效果有多好,而是思路上的新奇,颇有别致感。此外,借着这个机会,我们还将学习一种统计量的估计方法——$k$邻近方法,这是一种很有用的非参数估计方法。

自编码器vs生成模型

普通的自编码器是一个“编码-解码”的重构过程,如下图所示:

jIzQJjj.png!web

典型自编码器示意图

其loss一般为

\begin{equation}L_{AE} = \mathbb{E}_{x\sim \tilde{p}(x)}\left[\left\Vert x - \hat{x}\right\Vert^2\right] = \mathbb{E}_{x\sim \tilde{p}(x)}\left[\left\Vert x - D(E(x))\right\Vert^2\right]\end{equation}

当训练完成后,我们自然可以针对每一幅图像$x$,得到它的编码$z=E(x)$以及重构图$\hat{x}=D(z)$,而当$x$与$\hat{x}$足够接近时,我们就可以认为$z$是$x$的有效表征,它已经充分包含了$x$的信息。

那么,生成模型又是什么情况呢?“生成”指的是随机生成,也就是说允许我们能随机构建一幅图像来,对于自编码器的解码器$D(z)$,并不是每一个$z$解码出来的$D(z)$都是一幅有意义的图像,因此普通的自编码器并不能视为生成模型。如果我们能够事先知道所有的$x$编码出来的$z=E(x)$所构成的分布,并且这个分布是一个易于采样分布,那么就可以实现随机采样生成了。

所以,从自编码器到生成模型,缺的那一步就是确定隐变量$z$的分布,更准确来说,是迫使隐变量$z$服从一个易于采样的简单分布,比如标准正态分布。VAE通过引入KL散度项来达到这一点,那么EAE又是怎么实现的呢?

我们知道,最大熵原理是一个相当普适的原理,它代表着我们对未知事件的最客观认知。最大熵原理的一个结论是:

在所有均值为0、方差为1的分布中,标准正态分布的熵最大。

如果读者还不了解最大熵的相关内容,可以参考旧作 《“熵”不起:从熵、最大熵原理到最大熵模型(二)》 。上述结论告诉我们,如果我们能有某种手段保证隐变量的均值为0和方差为1,那么我们只需要同时最大化隐变量的熵,就可以得到“隐变量服从标准正态分布”这个目的了,即

\begin{equation}\begin{aligned}&L_{EAE} = \mathbb{E}_{x\sim \tilde{p}(x)}\left[\left\Vert x - D(E(x))\right\Vert^2

\right] - \lambda H(Z)\\

&\text{s.t.}\,\,\text{avg}(E(x))=0,\,\text{std}(E(x))=1

\end{aligned}\end{equation}

其中$\lambda > 0$是超参数,而

\begin{equation}H(Z)=\mathbb{E}_{z\sim p(z)}[-\log p(z)]\end{equation}

是隐变量$z=E(x)$对应的熵,最小化$- \lambda H(Z)$意味着最大化$\lambda H(Z)$,即最大熵。

问题是如何保证这两个约束呢?如果计算隐变量的熵呢?

先来解决第一个问题:如何达到——至少近似地达到——“隐变量的均值为0、方差为1”这个约束?因为只有满足这个约束的前提下,最大熵的分布才是标准正态的。解决这个问题的办法是我们熟悉的批归一化,也就是BN(Batch Normalization)。

在BN的训练阶段,我们会直接对每个变量减去其batch内的均值并且除以batch内标准差,这保证了训练阶段每个batch的变量均值确实为0,方差确实为1;然后,它会将每个batch内的均值方差滑动平均并缓存下来,用于推断阶段的预测。总而言之,就是将BN应用于隐变量,就可以使得隐变量(近似地)满足相应的均值方差约束。

此时,我们就得到

\begin{equation}L_{EAE} = \mathbb{E}_{x\sim \tilde{p}(x)}\left[\left\Vert x - D(\mathcal{N}(E(x)))\right\Vert^2\right] - \lambda H(Z)\label{eq:eae}\end{equation}

这里的$\mathcal{N}(\cdot)$代表BN层。

现在,来到了整个EAE模型的最后一部分、同时也是最硬核的一部分了,也就是如何估计熵$H(Z)$。理论上来说,为了算$H(Z)$我们需要知道$p(z)$,但我们现在只有样本$z_1, z_2, \dots, z_n$而不知道$p(z)$的表达式,在这种前提下对$H(Z)$做的估计叫做非参数估计。

先给结论:

熵的最临近估计设$z_1,z_2,\dots,z_n\in\mathbb{R}^d$是从$\sim p(z)$采样出来的$n$个样本,记$\varepsilon(i)$为$z_i$到它最邻近的样本的距离,即$\varepsilon(i) = \min\limits_{j\neq i} \Vert z_i - z_j \Vert$,$B_d$是$d$维单位球的体积,$\gamma=0.5772\dots$是 欧拉常数 ,则 \begin{equation}H(Z)\approx \frac{d}{n}\sum_{i=1}^n \log \varepsilon(i) + \log B_d + \log (n - 1) + \gamma \label{eq:1nn}\end{equation}

抛开跟优化不相关的常数,上述结论实际上就是说$H(Z)\sim \sum\limits_{i=1}^n \log \varepsilon(i)$,这就是我们需要添加到loss的项。

这个看上去很奇怪、实际上确实也不容易理解的结果是怎么得来的呢?事实上,它是一种重要的估计方法——$k$邻近方法——的经典例子。下面将会给出它的推导过程,该过程参考自论文 《A non-parametric k-nearest neighbour entropy estimator》

让我们考虑特定的样本$z_i$,设$z_{i(k)}$是它的第$k$个最邻近的样本,即将所有的$z_j (j\neq i)$按照$\Vert z_j - z_i\Vert$从小到大排列,第$k$个就是$z_{i(k)}$,记$\varepsilon_k(i) = \left\Vert z_i - z_{i(k)}\right\Vert$,我们现在考虑$\varepsilon_k(i)$的概率分布。

假设$\varepsilon \leq \varepsilon_k(i) \leq \varepsilon + d\varepsilon$,那么就意味着剩下的$n-1$个样本之中,有$k-1$个落在了“以$z_i$为球心、以$\varepsilon$为半径”的球内,有$n-k-1$个落在了“以$z_i$为球心、以$\varepsilon+d\varepsilon$为半径”的球外,剩下一个夹在两球之间,不难得到这种情况发生的概率是

\begin{equation}\binom{n-1}{1}\binom{n-2}{k-1}P_i(\varepsilon)^{k-1}(1 - P_i(\varepsilon + d\varepsilon))^{n-k-1}(P_i(\varepsilon + d\varepsilon) - P_i(\varepsilon))\label{eq:dp-1}\end{equation}

其中$\binom{n-1}{1}$代表着从$n-1$个样本中挑出$1$个样本夹在两球之间的组合数,而$\binom{n-2}{k-1}$则是从剩下的$n-2$个样本中挑出$k-1$个样本放到球内的组合数(剩下的$n-k-1$个自动就在球外了);$P_i(\varepsilon)$是单个样本位于球内的概率,即

\begin{equation}P_i(\varepsilon) = \int_{\Vert z - z_i\Vert \leq \varepsilon} p(z)dz\end{equation}

所以$P_i(\varepsilon)^{k-1}$是挑出来的$k-1$个样本都在球内的概率,$(1 - P_i(\varepsilon + d\varepsilon))^{n-k-1}$是$n-k-1$个样本都在球外的概率,$P_i(\varepsilon + d\varepsilon) - P_i(\varepsilon)$则是一个样本在球间的概率,所有项乘起来就是式$\eqref{eq:dp-1}$,而展开并只保留一阶项得到近似式:

\begin{equation}\binom{n-1}{1}\binom{n-2}{k-1}P_i(\varepsilon)^{k-1}(1 - P_i(\varepsilon))^{n-k-1}dP_i(\varepsilon)\label{eq:dp-2}\end{equation}

注意上式描述了一个合理的概率分布,因此它的积分必然为1。

现在我们可以做个 近似假设 ,值得注意的是,这是整个推导过程的唯一假设,而最终结果的可靠程度也取决于这个假设的成立程度:

\begin{equation}p(z_i) \approx \frac{1}{B_d \varepsilon_k(i)^d}\int_{\Vert z - z_i\Vert \leq \varepsilon} p(z)dz = \frac{P_i(\varepsilon)}{B_d \varepsilon_k(i)^d}\end{equation}

其中$B_d \varepsilon_k(i)^d$就是半径为$\varepsilon_k(i)$的球的体积,上述假设就是说$p(z)$在半径为$\varepsilon$的球内的均值约等于它在球中心的值,并且积分的有效半径只有$\varepsilon_k(i)$。根据这个近似我们有$p(z_i) B_d \varepsilon_k(i)^d \approx P_i(\varepsilon)$,或者

\begin{equation}\log p(z_i) \approx \log P_i(\varepsilon) - \log B_d - d \log \varepsilon_k(i) \end{equation}

用$\eqref{eq:dp-2}$乘以上式两端,并对$\varepsilon$积分(积分区间为$[0,+\infty)$,或者等价于对$P_i$在$[0,1]$积分)。除$\log P_i(\varepsilon)$外,其余几项都是跟$\varepsilon$无关,所以积分后依然等于自身,而

\begin{equation}\begin{aligned}&\int_0^1 \binom{n-1}{1}\binom{n-2}{k-1}P_i(\varepsilon)^{k-1}(1 - P_i(\varepsilon))^{n-k-1} \log P_i(\varepsilon) d P_i(\varepsilon) \\

=&\psi(k)-\psi(n)\end{aligned}\end{equation}

其中$\psi$代表着 双伽马函数 。(别问我这些积分是怎么算出来的,我也不知道,但我知道用Mathematica软件能把它都算出来~)

于是我们得到近似

\begin{equation}\log p(z_i) \approx \psi(k)-\psi(n) - \log B_d - d \log \varepsilon_k(i) \end{equation}

所以最终熵的近似为:

\begin{equation}\begin{aligned}H(Z)=&\, \mathbb{E}_{z\sim p(z)}[-\log p(z)]\\

\approx&\, -\frac{1}{n}\sum_{i=1}^n \log p(z_i)\\

\approx&\, \frac{d}{n}\sum_{i=1}^n \log \varepsilon_k(i) + \log B_d + \psi(n)-\psi(k)

\end{aligned}\label{eq:knn}\end{equation}

这是比式$\eqref{eq:1nn}$更一般的结果。事实上式$\eqref{eq:1nn}$是上式$k=1$时的结果,因为$\psi(1)=-\gamma$,而$\psi(n)= \sum\limits_{m=1}^{n-1}\frac{1}{m}-\gamma\approx \log(n-1)$,这些变换公式都可以在维基百科上找到。

开头就已经提到过,$k$邻近方法是一种很有用的非参数估计方法,它还跟笔者之前介绍过的IMLE模型有关。但笔者本身也不熟悉$k$邻近方法,还需要多多学习,目前找到的资料是 《Lectures on the Nearest Neighbor Method》 。此外,关于熵的估计,还可以参考斯坦福的资料 《Theory and Practice of Differential Entropy Estimation》

有了$\eqref{eq:1nn}$或$\eqref{eq:knn}$,式$\eqref{eq:eae}$所描述的EAE的loss就完成了,所以EAE模型也就介绍完毕了。剩下的是实验结果,就不详细介绍了,反正就是感觉生成的图像跟VAE差不多,但指标上更优一些。

VN7zYnM.jpg!web

来自EAE论文的实验对比

nmay6ni.jpg!web

来自EAE论文的效果图示

那EAE相比VAE的好处在哪呢?在VAE中,比较关键的一步是重参数(可以参考笔者的 《变分自编码器(一):原来是这么一回事》 ),就是这一步降低了模型训练的方差(相比REINFORCE方法,可以参考笔者的 《漫谈重参数:从正态分布到Gumbel Softmax》 ),从而使得VAE可以有效地训练下去。然而,虽然重参数降低了方差,但事实上方差依然不小,简单来说就是重参数这一步带来较大的噪声(尤其是训练早期),导致decoder无法很好地利用encoder的信息,典型的例子就是将VAE用在NLP时的“KL散度消失”现象。

但是EAE基本上不存在这个问题,因为EAE基本上就是普通的自编码器,多加的BN不会对自编码性能有什么影响,而多加的熵正则项原则上也只是增加隐变量的多样性,不会给编码信息的利用与重构带来明显困难。笔者认为,这就是EAE相对于VAE的优势所在。当然,笔者目前还没有对EAE进行太多实验,上述分析多为主观推断,请读者自行甄别。如果笔者有进一步的实验结论,到时会继续在博客与大家分享。

本文介绍了一个称之为EAE的模型,主要是把BN层和最大熵塞进了普通的自编码器中,使得它具有生成模型的能力。原论文做的不少实验显示EAE比VAE效果更好,所以应该是一个值得学习和试用的模型。此外,EAE的关键部分是通过$k$邻近方法来估计熵,这部分比较硬核,但事实上也很有价值,值得对统计估计感兴趣的读者细细阅读。

转载到请包括本文地址: https://kexue.fm/archives/7343

更详细的转载事宜请参考: 《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎/本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (2020, Apr 20). 《EAE:自编码器 + BN + 最大熵 = 生成模型 》[Blog post]. Retrieved from https://kexue.fm/archives/7343


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK