从去噪自编码器到生成模型
By 苏剑林 | 2019-10-31 | 121516位读者 |在我看来,几大顶会之中,ICLR的论文通常是最有意思的,因为它们的选题和风格基本上都比较轻松活泼、天马行空,让人有脑洞大开之感。所以,ICLR 2020的投稿论文列表出来之后,我也抽时间粗略过了一下这些论文,确实发现了不少有意思的工作。
其中,我发现了两篇利用去噪自编码器的思想做生成模型的论文,分别是《Learning Generative Models using Denoising Density Estimators》和《Annealed Denoising Score Matching: Learning Energy-Based Models in High-Dimensional Spaces》。由于常规做生成模型的思路我基本都有所了解,所以这种“别具一格”的思路就引起了我的兴趣。细读之下,发现两者的出发点是一致的,但是具体做法又有所不同,最终的落脚点又是一样的,颇有“一题多解”的美妙,遂将这两篇论文放在一起,对比分析一翻。
去噪自编码 #
两篇论文的根本出发点都是去噪自编码器,更准确地说,它利用了去噪自编码器的最优解
基本结果: 若x,ε∈Rd,并且x∼p(x),ε∼u(ε),这里u(ε)=N(0,σ2Id),那么 r(x)=argminrEx∼p(x),ε∼N(0,σ2Id)[‖
其中\hat{p}(x)=[p*u](x)=\int p(x-\varepsilon)u(\varepsilon) d\varepsilon=\int p(\varepsilon)u(x-\varepsilon) d\varepsilon指的是分布p(x)和u(\varepsilon)的卷积运算,具体含义是x+\varepsilon的概率密度,换言之,如果p(x)代表真实图片的分布,那么如果我们能实现从\hat{p}(x)中采样,那么得到的是一批带有高斯噪声的真实图片。
结果\eqref{eq:denoise}也就是说加性高斯噪声的最优去噪自编码器是能显式地计算出来,并且结果跟分布的梯度有关。这个结果非常有意思,也非常深刻,值得我们多加回味。比如,式\eqref{eq:denoise}告诉我们r(x)-x实际上就是对(带噪声的)真实分布梯度的估计,而有了真实分布的梯度,其实可以做很多事情,尤其是生成模型相关的事情。
证明:其实\eqref{eq:denoise}的证明并不困难,变分目标得到
\begin{equation}\begin{aligned}&\delta \iint p(x)u(\varepsilon)\left\Vert r(x + \varepsilon) - x\right\Vert_2^2 dx d\varepsilon\\ =&\delta \iint p(x)u(y-x)\left\Vert r(y) - x\right\Vert_2^2 dx dy\\ =&2\iint p(x)u(y-x)\left\langle r(y) - x, \delta r(y)\right\rangle dx dy\\ \end{aligned}\end{equation}
所以\int p(x)u(y-x)(r(y) - x)dx=0,即
\begin{equation}r(y) = \frac{\int p(x)u(y-x)x dx}{\int p(x)u(y-x) dx}\end{equation}
代入表达式u(\varepsilon)=\frac{1}{(2\pi \sigma^2)^{d/2}}\exp\left(-\frac{\left\Vert\varepsilon\right\Vert_2^2}{2\sigma^2}\right),即得
\begin{equation}r(y) = y + \sigma^2\nabla_y \log\left[p*u\right](y)\end{equation}
曲径通幽处 #
我们首先来介绍一下《Learning Generative Models using Denoising Density Estimators》的思路。按照GAN和VAE的通常习惯,我们是希望训练一个映射x=G(z),使得从先验分布q(z)中采样出来的z都能被映射为一个真实样本,用概率的话说,那就是希望拉近p(x)和下述的q(x)的距离:
\begin{equation}q(x) = \int q(z)\delta(x - G_{\theta}(z))dz\end{equation}
为此,GAN常用的优化目标是最小化KL(q(x)\Vert p(x)),这个观点可以参考《用变分推断统一理解生成模型(VAE、GAN、AAE、ALI)》和《能量视角下的GAN模型(二):GAN=“分析”+“采样”》。但是,由于前面估计的是\hat{p}(x)的梯度,我们可以换个目标:最小化KL\left(\hat{q}(x)\big\Vert \hat{p}(x)\right)。
为了,我们可以进行演算:
\begin{equation}\begin{aligned}KL\left(\hat{q}(x)\big\Vert \hat{p}(x)\right)=&\int \hat{q}(x) \log \frac{\hat{q}(x)}{\hat{p}(x)}dx\\
=&\int q(x)u(\varepsilon) \log \frac{\hat{q}(x+\varepsilon)}{\hat{p}(x+\varepsilon)}dx d\varepsilon\\
=&\int q(z)\delta(x-G_{\theta}(z))u(\varepsilon) \log \frac{\hat{q}(x+\varepsilon)}{\hat{p}(x+\varepsilon)}dx d\varepsilon dz\\
=&\int q(z)u(\varepsilon) \log \frac{\hat{q}(G_{\theta}(z)+\varepsilon)}{\hat{p}(G_{\theta}(z)+\varepsilon)}d\varepsilon dz\\
=&\,\mathbb{E}_{z\sim q(z), \varepsilon\sim u(\varepsilon)}\big[\log \hat{q}(G_{\theta}(z)+\varepsilon) - \log \hat{p}(G_{\theta}(z)+\varepsilon)\big]\\
\end{aligned}\label{eq:dae-1}\end{equation}
这个目标需要我们能得到\log\hat{p}(x)和\log\hat{q}(x)的估计。我们可以用神经网络构建两个\mathbb{R}^d \to \mathbb{R}的模型E_p(x)和E_q(x),然后分别去最小化
\begin{equation}\begin{aligned}\mathop{\text{argmin}}_{E_p}\mathbb{E}_{x\sim p(x),\varepsilon\sim \mathcal{N}(0,\sigma^2 I_d)}\left[\Vert \nabla_x E_p(x + \varepsilon) + \varepsilon\Vert^2\right]\\
\mathop{\text{argmin}}_{E_q}\mathbb{E}_{x\sim q(x),\varepsilon\sim \mathcal{N}(0,\sigma^2 I_d)}\left[\Vert \nabla_x E_q(x + \varepsilon) + \varepsilon\Vert^2\right]
\end{aligned}\label{eq:e-grad}\end{equation}
也就是用\nabla_x E_p(x)+x和\nabla_x E_q(x)+x作为去噪自编码器,根据结果\eqref{eq:denoise},我们就有
\begin{equation}\left\{\begin{aligned}\nabla_x E_p(x)+x=x+\sigma^2 \nabla_x \log \hat{p}(x)\\
\nabla_x E_q(x)+x=x+\sigma^2 \nabla_x \log \hat{q}(x)\end{aligned}\right.
\quad\Rightarrow\quad \left\{\begin{aligned}E_p(x) = \sigma^2 \log \hat{p}(x) + C_1\\
E_q(x) = \sigma^2 \log \hat{q}(x) + C_2\end{aligned}\right.\end{equation}
也就是说在相差一个常数的情况下,E_p(x)正比于\log \hat{p}(x),E_q(x)也正比于\log \hat{q}(x),而常数不影响优化,所以我们可以将E_p(x)和E_q(x)替换到\eqref{eq:dae-1}里边去,得到
\begin{equation}KL\left(\hat{q}(x)\big\Vert \hat{p}(x)\right)\sim\,\mathbb{E}_{z\sim q(z), \varepsilon\sim u(\varepsilon)}\big[E_q(G_{\theta}(z)+\varepsilon) - E_p(G_{\theta}(z)+\varepsilon)\big]\label{eq:dae-2}\end{equation}
这就得到了一个生成模型的流程:
选定先验分布q(z),初始化G_{\theta}(z),事先求好E_p(x)。循环执行下面的3步直到收敛:
1、选一批z\sim q(z),选一批噪声\varepsilon\sim\mathcal{N}(0,\sigma^2 I_d),合成一批带噪声的假样本x = G_{\theta}(z)+\varepsilon;
2、利用这批带噪声的假样本训练E_q(x);
3、固定E_p,E_q,用梯度下降根据\eqref{eq:dae-2}更新若干步G_{\theta};
这篇论文的实验比较简单,只做了mnist和fashion mnist的实验,证明了它的可行性:
峰回路转间 #
另外一篇论文《Annealed Denoising Score Matching: Learning Energy-Based Models in High-Dimensional Spaces》就更粗暴直接了,它相当于去噪自编码器跟《能量视角下的GAN模型(三):生成模型=能量模型》的结合。
因为\eqref{eq:denoise}已经帮我们得到了\nabla_x\log\hat{p}(x)=(r(x)-x)/\sigma^2了(当然这篇论文的实际做法也不是直接用神经网络拟合r(x),而是像\eqref{eq:e-grad}一样用神经网络拟合一个标量函数的,但这不影响思想),其实这就能够帮助我们从\hat{p}(x)采样了。当然采样出来的图片是有噪声的,我们还需要它采样出来的结果传入r(x)去噪一下,即
p(x) = \mathbb{E}_{x_{noise}\sim \hat{p}(x)} \big[\delta(x - r(x_{noise}))\big]
那具体来说怎么从\hat{p}(x)采样呢?Langevin方程!因为已经知道了\nabla_x\log\hat{p}(x),那么下述Langevin方程
\begin{equation}x_{t+1} = x_t + \frac{1}{2}\varepsilon \nabla_x\log\hat{p}(x) + \sqrt{\varepsilon}\alpha,\quad \alpha \sim \mathcal{N}(\alpha;0,1)\label{eq:sde}\end{equation}
当\varepsilon\to 0且t\to\infty时,序列\{x_t\}所服从的分布就是从\hat{p}(x),换句话说,\hat{p}(x)是该Langevin方程的静态分布。
于是,从\hat{p}(x)采样这个过程,就被《Annealed Denoising Score Matching: Learning Energy-Based Models in High-Dimensional Spaces》用这么一种粗暴直接(但我觉得不优雅)的方法解决了,所以训练完去噪自编码后,就自动地得到了一个生成模型了...
总的过程是:
1、训练去噪自编码器r(x),得到\nabla_x\hat{p}(x);
2、用迭代过程\eqref{eq:sde}采样,采样结果是一批带噪声的真实样本;
3、将第2步的采样结果传入r(x)去噪,得到无噪声的样本。
当然,论文还有很多细节,论文的核心技巧是用了退火技巧来稳定训练过程,提高生成质量,但笔者对这些并不是很感兴趣,因为我只是想学习一些新奇的生成模型思想,拓宽视野。不过不得不说,虽然做法有点粗暴,这篇论文的生成效果还是有一定的竞争力的,在fashion mnist、CelebA、cifar10都有相当不错的生成效果:
曲终人散时 #
本文介绍了投稿ICLR 2020的两篇类似的论文,都是利用去噪自编码器来做生成模型的,因为之前我没了解过相关思路,所以就饶有兴致对比阅读了一番。
且不说生成效果如何,我觉得它们都是颇具启发性的,能引起我的一些思考(不仅是CV,还包括NLP方面的)。比如Bert的MLM预训练方式本质上也是一个去噪自编码器,那有没有类似\eqref{eq:denoise}的结果?或者反过来,类似\eqref{eq:denoise}的结果能不能启发我们构造一些新的预训练任务,又或者能不能借此说清楚pretrain + finetune这种流程的本质原理?
转载到请包括本文地址:https://kexue.fm/archives/7038
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Oct. 31, 2019). 《从去噪自编码器到生成模型 》[Blog post]. Retrieved from https://kexue.fm/archives/7038
@online{kexuefm-7038,
title={从去噪自编码器到生成模型},
author={苏剑林},
year={2019},
month={Oct},
url={\url{https://kexue.fm/archives/7038}},
}
November 2nd, 2019
1式漏写了log
谢谢指出,已经补充~
November 3rd, 2019
我发现用\eqref{eq:e-grad}式来评估加性噪声后分布\hat{p}(x)的信息熵h_{\hat{p}(x)}貌似不错,
给定p(x)的批采样集合\{x\}_{b},加噪声后得到\{\hat{x}\}_b,优化\eqref{eq:e-grad}式并求得h_{\hat{p}(x)} = c*<E_{p}(\hat{x})>_b + d。
貌似应该没问题吧?
没看懂你的h_{\hat{p}(x)}是什么意思
h_{\hat{p}(x)} = -\int \hat{p}*log(\hat{p})d\hat{x}是加噪声后样本的信息熵。
这样确实可以考虑用这个指标。
November 10th, 2019
抱歉,再说一个,\eqref{eq:e-grad}应该是:
\mathop{\arg\min}_{E_p}\mathbb{E}_{x\sim p(x),\varepsilon\sim \mathcal{N}(0,\sigma^2 I_d)}\left[\Vert \nabla_x E_p(x + \varepsilon) \color{red}+ \varepsilon\Vert^2\right]
符号有误。
感谢感谢,公式太多,加之这一块也没打算深入研究,推导得有点粗糙了~
November 15th, 2019
请问公式(1)里,r(x) 表示什么,是你上文里提到的去噪自编码器的最优解,也就是说是个编码器?编码器得到的不该是特征 z 吗,为何公式右边又有 \Vert r(x + \varepsilon) - x\Vert^2,z 和 x之间可以算L2?
麻烦先去搜索一下自编码器是什么...
November 19th, 2019
Score Function + Langevin Dynamics做生成确实是一个很有趣的想法,效果也很不错,但是采样速度还是堪忧,这可能是一个可以发力的角度。
献丑提供几篇有趣的参考文献:
Transport Analysis of Innitely Deep Neural Network
On the Anatomy of MCMC-based Maximum Likelihood Learning of Energy-Based Models
Implicit Generation and Modeling with Energy-Based Models
Sliced Score Matching: A Scalable Approach to Density and Score Estimation
Generative Modeling by Estimating Gradients of the Data Distribution
一些统计和生成模型的强组,手还是相当快,基本都争相做了一篇,感觉值得思考的细节还有很多。
基本都看过,结论是有一种“无力感”,就是思路很有趣,理论也不错,但就是很难work得漂亮...
November 19th, 2019
还有这个,名字很有趣~
BERT has a Mouth, and It Must Speak: BERT as a Markov Random Field Language Model
December 9th, 2019
公式(2)第二个等式右边那个内积是怎么推导出来的,一直想不明白
d\Vert x\Vert^2 = d\langle x, x\rangle = 2\langle x, dx\rangle
February 13th, 2020
苏神,请教一下,您能否确认下,式子(5)没有问题吗?
z经过G(z)变换得到x,还有一个空间变形的问题吧~不知道我说的对不对
不知道你想表达什么
没问题
5式的左边是q(x)关于x的分布,右边q(z)是关于z的分布,应该还差一个雅克比项吧。
这又不是积分变换,哪来的雅可比...
June 24th, 2021
博主你好。请问,峰回路转章节中"因为(1)已经帮我们得到了\log\hat{p}(x)=(r(x)−x)/σ^2了,也就是\hat{p}(x)=e^{(r(x)−x)/σ^2}。"是怎么得到的?
当时写得有点凌乱了,这句话是错的,原文现在已经修正。谢谢反馈。
July 1st, 2022
第一式其实很奇怪,求argmin,返回的应该是x本身?好多地方都引用了这个式子,感觉哪里漏条件了
oh crap我终于看懂了,r(x)里面的其实是 r(\hat x) , 实际上r是接触不到无噪x的,这就是个变分近似,等价于Bayes后验.
自变量的记号只是一个纯粹的记号,关键还是在于函数本身的映射关系而已。