自动编码器的发明是为了重建高维数据(这可能不是变异自动编码器的真实情况)。一个很好的副产品是降维:瓶颈层捕获了一个压缩的潜在编码。这样的低维表示可以作为各种应用中的嵌入向量(如搜索),帮助数据压缩,或揭示潜在的数据生成因素。
Notation
Autoencoder
自动编码器是一个神经网络,旨在以无监督的方式学习一个恒等函数( identity function),以重建原始输入,同时在这个过程中压缩数据,从而发现一个更有效和压缩的表示。
包含以下两个部分:
编码器网络:将原始高维输入转换为低维隐变量编码, 输入尺寸大于输出尺寸。
解码器网络:解码器网络从编码中恢复数据,可能有越来越大的输出层。
编码器模型结构
编码器网络基本上完成了降维,就像我们使用主成分分析(PCA)或矩阵分解(MF)的方式。此外,自动编码器为从代码中重建数据进行了明确的优化。一个好的中间表征不仅可以捕捉潜在变量,而且还有利于全面解压过程。
该模型包含一个以\phi为参数的编码器函数g(.)和一个以\theta为参数的解码器函数f(.)。在瓶颈层为输入\mathbf{x}学习的低维编码是\mathbf{z} = g_\phi(\mathbf{x}),重建的输入是\mathbf{x}’ = f_\theta(g_\phi(\mathbf{x}))。
参数(\theta, \phi)一起学习,输出一个与原始输入相同的重建数据样本,\mathbf{x} \approx f_\theta(g_\phi(\mathbf{x})),或者换句话说,学习一个恒等函数。有各种指标可以量化两个向量之间的差异,比如激活函数为sigmoid时的交叉熵,或者简单的MSE损失。
L_\text{AE}(\theta, \phi) = \frac{1}{n}\sum_{i=1}^n (\mathbf{x}^{(i)} - f_\theta(g_\phi(\mathbf{x}{(i)})))2 \
去噪自动编码器
由于自动编码器学习的是恒等函数,当网络参数多于数据点的数量时,我们面临着过度拟合的风险。
为了避免过拟合和提高鲁棒性,去噪自动编码器(Vincent等人,2008)提出了对自动编码器的修改。通过在输入向量中添加噪声或以随机的方式掩盖一些数值,输入被部分破坏,\tilde{\mathbf{x}}\sim\mathcal{M}_\mathcal{D}(\tilde{\mathbf{x}} \vert \mathbf{x})。然后对模型进行训练以恢复原始输入。
\begin{aligned} \tilde{\mathbf{x}}^{(i)} &\sim \mathcal{M}\mathcal{D}(\tilde{\mathbf{x}}^{(i)} \vert \mathbf{x}^{(i)})\ L\text{DAE}(\theta, \phi) &= \frac{1}{n} \sum_{i=1}^n (\mathbf{x}^{(i)} - f_\theta(g_\phi(\tilde{\mathbf{x}}{(i)})))2 \end{aligned} \
其中\mathcal{M}_\mathcal{D}定义了从真实数据样本到噪声或损坏样本的映射。
设计的动机是人类可以很容易地识别一个物体或场景,即使视图被部分遮挡或损坏。为了修复部分被破坏的输入,去噪自动编码器必须发现和捕捉输入维度之间的关系,以推断出丢失的部分。
对于具有高冗余度的高维输入,如图像,该模型可能依赖于从许多输入维度的组合中收集的证据来恢复去噪版本,而不是过度拟合一个维度。这为学习稳健的潜在表征奠定了良好的基础。
稀疏自动编码器
稀疏自动编码器在隐藏单元的激活上应用了一个稀疏约束,以避免过度拟合并提高鲁棒性。它迫使模型只有少量的隐藏单元同时被激活,或者换句话说,一个隐藏神经元应该在大部分时间内不被激活。
回顾一下,常见的激活函数包括sigmoid, tanh, relu, leaky relu等。当数值接近1时,一个神经元被激活,当数值接近0时,神经元被灭活。
假设在隐藏层l中有s_l的神经元,该层中j的神经元的激活函数被标记为a^{(l)}_j(.),j=1, \dots, s_l。这个神经元\hat{\rho}_j的激活部分预计是一个小数\rho,称为稀疏参数;常见的配置是\rho = 0.05。
\hat{\rho}j^{(l)} = \frac{1}{n} \sum{i=1}^n [a_j{(l)}(\mathbf{x}{(i)})] \approx \rho \
这个约束是通过在损失函数中加入一个惩罚项来实现的。KL 散度D_\text{KL}衡量两个伯努利分布之间的差异,一个是均值\rho,另一个是均值\hat{\rho}_j^{(l)}。超参数\beta控制了我们要对稀疏性损失进行多强的惩罚。
k-Sparse Autoencoder
在k-Sparse Autoencoder(Makhzani&Frey,2013)中,通过在具有线性激活函数的瓶颈层中只保留前k个最高的激活来强制执行稀疏性。
首先,我们通过编码器网络运行前馈网络,得到压缩后的编码。\mathbf{z} = g(\mathbf{x})。对编码向量\mathbf{z}中的值进行排序。只有最大的k个值被保留,而其他神经元被设置为0。现在我们有了一个稀疏的编码。\mathbf{z}’ = \text{Sparsify}(\mathbf{z}).计算输出和稀疏代码的损失,L = |\mathbf{x} - f(\mathbf{z}') |_2^2。而且,反向传播只经过最上面的k个激活的隐藏单元!
Contractive Autoencoder
与稀疏自动编码器类似,收缩自动编码器(Rifai, et al, 2011)鼓励学习到的表示停留在收缩空间中,以获得更好的鲁棒性。
它在损失函数中增加了一个项,以惩罚对输入过于敏感的表示,从而提高对训练数据点周围小扰动的鲁棒性。敏感性是由编码器激活的雅各布矩阵对输入的Frobenius范数来衡量的。
|J_f(\mathbf{x})|F^2 = \sum{ij} \Big( \frac{\partial h_j(\mathbf{x})}{\partial x_i} \Big)^2 \
其中h_j是压缩b编码\mathbf{z}=f(x)中的一个单位输出。
这个惩罚项是所学编码相对于输入维度的所有偏导数的平方之和。作者声称,根据经验,这个惩罚项被发现可以刻画出一个对应于低维非线性流形的表征,同时对流形正交的多数方向保持不变。
VAE: Variational Autoencoder
变分自动编码器(Kingma &; Welling, 2014 )简称VAE,实际上与上述所有自动编码器模型不太相似,但深深扎根于变量贝叶斯和图形模型的方法。
他不是把输入映射成一个固定的向量,而是想把它映射成一个分布。我们把这个分布标记为p_\theta,参数为\theta。数据输入\mathbf{x}和潜在编码向量\mathbf{z}之间的关系可以完全定义为:
先验概率 p_\theta(\mathbf{z})
似然概率 p_\theta(\mathbf{x}\vert\mathbf{z})
后验概率 p_\theta(\mathbf{z}\vert\mathbf{x})
这个分布的真实参数\theta{*}。为了生成一个看起来像真实数据点的样本\mathbf{x}{(i)},我们遵循以下步骤: 首先,从先验分布p_{\theta*}(\mathbf{z})中抽取一个\mathbf{z}{(i)}。 然后,从条件分布p_{\theta^*}(\mathbf{x}\vert \mathbf{z} = \mathbf{z}^{(i)})中产生一个 \mathbf{x}^{(i)}的值。
最佳参数\theta^{*}是产生真实数据样本的概率最大化的参数。
\theta^{*} = \arg\max_\theta \prod_{i=1}^n p_\theta(\mathbf{x}^{(i)}) \
通常,我们使用对数概率将乘积转换为求和。
\theta^{*} = \arg\max_\theta \sum_{i=1}^n \log p_\theta(\mathbf{x}^{(i)}) \
现在让我们更新方程式,以更好地展示数据生成过程,以便涉及编码矢量。
p_\theta(\mathbf{x}^{(i)}) = \int p_\theta(\mathbf{x}^{(i)}\vert\mathbf{z}) p_\theta(\mathbf{z}) d\mathbf{z} \
不幸的是,以这种方式计算p_\theta(\mathbf{x}^{(i)})并不容易,因为遍历\mathbf{z}的所有可能值并将其相加是非常困难的。为了缩小数值空间以促进快速搜索,我们想引入一个新的近似函数q_\phi(\mathbf{z}\vert\mathbf{x}),输出在输入\mathbf{x}时可能出现的编码,参数是\phi。
这个结构看起来很像一个自动编码器。条件概率p_\theta(\mathbf{x} \vert \mathbf{z})定义了一个生成模型,与上面介绍的解码器f_\theta(\mathbf{x} \vert \mathbf{z})类似。p_\theta(\mathbf{x} \vert \mathbf{z})也被称为概率解码器。近似函数q_\phi(\mathbf{z} \vert \mathbf{x})是概率编码器,与上面的g_\phi(\mathbf{z} \vert \mathbf{x})的作用类似。
损失函数: ELBO
后验q_\phi(\mathbf{z}\vert\mathbf{x})的估计应该非常接近于真实的p_\theta(\mathbf{z}\vert\mathbf{x})。我们可以用Kullback-Leibler散度来量化这两个分布之间的距离。KL散度D_\text{KL}(X|Y)衡量如果用分布Y来表示X,会损失多少信息。我们希望D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) | p_\theta(\mathbf{z}\vert\mathbf{x}) )相对于\phi最小。
但是为什么要用D_\text{KL}(q_\phi | p_\theta)(反向KL)而不是D_\text{KL}(p_\theta | q_\phi)(正向KL)?Eric Jang在他的Bayesian Variational methods一文中有一个很好的解释。作为一个简单的回顾。
正向 KL 散度: D_\text{KL}(P|Q) = \mathbb{E}{z\sim P(z)} \log\frac{P(z)}{Q(z)}; 我们必须确保在 Q(z) >0 时 P(z) < 0. 优化的变量分布q(z) 必须覆盖整个 p(z).
反向 KL 散度: D\text{KL}(Q|P) = \mathbb{E}_{z\sim Q(z)} \log\frac{Q(z)}{P(z)}; 最小化反转KL发散,在 P(z)下挤压Q(z)
接下来我们展开这个公式:
\begin{aligned} & D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) |p_\theta(\mathbf{z}\vert\mathbf{x}) ) & \ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z} \vert \mathbf{x})} d\mathbf{z} & \ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})p_\theta(\mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} d\mathbf{z} & \scriptstyle{\text{; Because }p(z \vert x) = p(z, x) / p(x)} \ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \big( \log p_\theta(\mathbf{x}) + \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} \big) d\mathbf{z} & \ &=\log p_\theta(\mathbf{x}) + \int q_\phi(\mathbf{z} \vert \mathbf{x})\log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} d\mathbf{z} & \scriptstyle{\text{; Because }\int q(z \vert x) dz = 1}\ &=\log p_\theta(\mathbf{x}) + \int q_\phi(\mathbf{z} \vert \mathbf{x})\log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{x}\vert\mathbf{z})p_\theta(\mathbf{z})} d\mathbf{z} & \scriptstyle{\text{; Because }p(z, x) = p(x \vert z) p(z)} \ &=\log p_\theta(\mathbf{x}) + \mathbb{E}{\mathbf{z}\sim q\phi(\mathbf{z} \vert \mathbf{x})}[\log \frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z})} - \log p_\theta(\mathbf{x} \vert \mathbf{z})] &\ &=\log p_\theta(\mathbf{x}) + D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x}) | p_\theta(\mathbf{z})) - \mathbb{E}{\mathbf{z}\sim q\phi(\mathbf{z}\vert\mathbf{x})}\log p_\theta(\mathbf{x}\vert\mathbf{z}) & \end{aligned} \
有:
D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) |p_\theta(\mathbf{z}\vert\mathbf{x}) ) =\log p_\theta(\mathbf{x}) + D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x}) \ p_\theta(\mathbf{z})) - \mathbb{E}{\mathbf{z}\sim q\phi(\mathbf{z}\vert\mathbf{x})}\log p_\theta(\mathbf{x}\vert\mathbf{z}) \
重新排列方程的左右:
\log p_\theta(\mathbf{x}) - D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) |p_\theta(\mathbf{z}\vert\mathbf{x}) ) = \mathbb{E}{\mathbf{z}\sim q\phi(\mathbf{z}\vert\mathbf{x})}\log p_\theta(\mathbf{x}\vert\mathbf{z}) - D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x}) | p_\theta(\mathbf{z})) \
方程左侧正是我们在学习真实分布时想要最大化的东西:我们想要最大化产生真实数据的(对数)可能性(即log p_\theta(\mathbf{x})),同时最小化真实分布和估计后验分布之间的差异(D_\text{KL}像一个正则器一样发挥作用)。请注意,p_\theta(\mathbf{x})相对于q_\phi是固定的。
上述内容的负数定义了我们的损失函数。
\begin{aligned} L_\text{VAE}(\theta, \phi) &= -\log p_\theta(\mathbf{x}) + D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) |p_\theta(\mathbf{z}\vert\mathbf{x}) )\ &= - \mathbb{E}{\mathbf{z} \sim q\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) + D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \ p_\theta(\mathbf{z}) ) \ \theta^{}, \phi^{} &= \arg\min_{\theta, \phi} L_\text{VAE} \end{aligned} \
在变分贝叶斯方法中,这个损失函数被称为变分下界,或证据下界。名字中的下界部分来自于KL散度总是非负的,因此-L_\text{VAE}是log p_\theta (\mathbf{x})的下界。
-L_\text{VAE} = \log p_\theta(\mathbf{x}) - D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \ p_\theta(\mathbf{z}\vert\mathbf{x}) ) \leq \log p_\theta(\mathbf{x}) \
因此,通过最小化损失,即最大限度地提高生成真实数据样本的概率下界.
Reparameterization Trick
损失函数中的期望项涉及从\mathbf{z}\sim q_\phi(\mathbf{z}\vert\mathbf{x})生成的样本。采样是一个随机的过程,因此我们不能反向传播梯度。为了使其可训练,引入了重新参数化的技巧。通常可以将随机变量\mathbf{z}表达为确定性变量\mathbf{z} = \mathcal{T}\phi(\mathbf{x}, \boldsymbol{\epsilon})。其中\boldsymbol{\epsilon}是一个辅助的独立随机变量,转换函数\mathcal{T}\phi的参数为\phi,将\boldsymbol{\epsilon}转换成\mathbf{z}。例如,q_\phi(\mathbf{z}\vert\mathbf{x})的一个常见选择是具有对角线协方差结构的多变量高斯:
\begin{aligned} \mathbf{z} &\sim q_\phi(\mathbf{z}\vert\mathbf{x}^{(i)}) = \mathcal{N}(\mathbf{z}; \boldsymbol{\mu}^{(i)}, \boldsymbol{\sigma}^{2(i)}\boldsymbol{I}) & \ \mathbf{z} &= \boldsymbol{\mu} + \boldsymbol{\sigma} \odot \boldsymbol{\epsilon} \text{, where } \boldsymbol{\epsilon} \sim \mathcal{N}(0, \boldsymbol{I}) & \scriptstyle{\text{; Reparameterization trick.}} \end{aligned} \
其中 \odot 指点乘。.
重参数化技巧也适用于其他类型的分布,不仅仅是高斯分布。在多变量高斯的情况下,我们通过学习分布的均值和方差\mu和\sigma,重参数化技巧使模型可以训练,而随机性仍然在随机变量\boldsymbol{\epsilon}\sim\mathcal{N}(0, \boldsymbol{I})中。
Beta-VAE
如果推断出的潜在表征中的每个变量只对单一生成因素敏感,而对其他因素相对相对不变,我们就说这个表征是分解的或因素化的。分解表征通常带来的一个好处是良好的可解释性和易于推广到各种任务。
例如,一个在人脸照片上训练的模型可能会在不同的维度上捕捉到人的温柔、肤色、头发颜色、头发长度、情绪、是否戴眼镜以及其他许多相对独立的因素。这样的拆分表示对面部图像的生成非常有利。
β-VAE(Higgins等人,2017)是对变异自动编码器的修改,特别强调发现分解的潜在因素。遵循VAE中相同的激励机制,我们希望最大化生成真实数据的概率,同时保持常数\delta下,真实分布和估计后验分布之间的距离足够小:
\begin{aligned} &\max_{\phi, \theta} \mathbb{E}{\mathbf{x}\sim\mathcal{D}}[\mathbb{E}{\mathbf{z} \sim q_\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z})]\ &\text{subject to } D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x})|p_\theta(\mathbf{z})) < \delta \end{aligned} \
我们可以在KKT条件下改写成具有拉格朗日乘子\beta的拉格朗日函数。上述只有一个不等式约束的优化问题等同于最大化以下方程\mathcal{F}(\theta, \phi, \beta)。
\begin{aligned} \mathcal{F}(\theta, \phi, \beta) &= \mathbb{E}{\mathbf{z} \sim q\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) - \beta(D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x})|p_\theta(\mathbf{z})) - \delta) & \ & = \mathbb{E}{\mathbf{z} \sim q\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) - \beta D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x})|p_\theta(\mathbf{z})) + \beta \delta & \ & \geq \mathbb{E}{\mathbf{z} \sim q\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) - \beta D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x})|p_\theta(\mathbf{z})) & \scriptstyle{\text{; Because }\beta,\delta\geq 0} \end{aligned} \
\beta-VAE损失函数定义为:
L_\text{BETA}(\phi, \beta) = - \mathbb{E}{\mathbf{z} \sim q\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) + \beta D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x})|p_\theta(\mathbf{z})) \
其中拉格朗日乘子\beta被视为一个超参数。
由于L_\text{BETA}(\phi, \beta)的负值是拉格朗日\mathcal{F}(\theta, \phi, \beta)的下界。损失最小化等同于拉格朗日的最大化,因此对我们的初始优化问题有效。
当\beta=1时,它与VAE相同。当\beta>1时,它对latent bottleneck的约束更强,并限制了\mathbf{z}的表示能力。对于一些条件独立的生成因子,保持它们的分离是最有效的表示。因此,较高的\beta会鼓励更有效的隐编码,并进一步鼓励脱离纠缠的做法。同时,较高的\beta可能会在重建质量和分离程度之间产生权衡。
Burgess等人(2017)在信息瓶颈理论的启发下,深入讨论了beta-VAE中的distentangling问题,并进一步提出了对beta-VAE的修改,以更好地控制编码表达能力。
VQ-VAE and VQ-VAE-2
VQ-VAE(Vector Quantised-Variational AutoEncoder; van den Oord, et al. 2017)模型通过编码器学习一个离散的潜变量,因为离散的表示可能更适合语言、语音、推理等问题。
矢量量化(VQ)是一种将K维矢量映射为有限"编码 "矢量集的方法。这个过程与KNN算法非常相似。一个样本应该被映射到具有最小欧氏距离的最佳中心点编码向量。
让\mathbf{e}\in \mathbb{R}^{K \times D}, i=1, \dots, K为VQ-VAE中的隐向量空间(codebook),其中K为潜在变量类别的数量,D为嵌入的大小。一个单独的嵌入向量是\mathbf{e}_i\in\mathbb{R}^{D}, i=1, \dots, K。
编码器的输出E(\mathbf{x})=\mathbf{z}_e经过近邻查找,与K的一个嵌入向量相匹配,然后这个匹配的编码向量成为解码器D(.)的输入。
\mathbf{z}_q(\mathbf{x}) = \text{Quantize}(E(\mathbf{x})) = \mathbf{e}_k \text{ 其中 } k = \arg\min_i |E(\mathbf{x}) - \mathbf{e}_i |_2 \
在不同的应用中,离散的潜在变量可以有不同的形状;例如,一维的语音,二维的图像和三维的视频。
因为argmin()在离散空间上是不可微分的,来自解码器输入\mathbf{z}_q的梯度\nabla_z L被复制到编码器输出\mathbf{z}_e。除了重建损失外,VQ-VAE还可以优化:
VQ损失是向量空间和编码器输出之间的L2误差。
Commitment损失:鼓励编码器输出接近向量空间的方法,防止它从一个编码矢量到另一个编码矢量的波动过于频繁。
L = \underbrace{|\mathbf{x} - D(\mathbf{e}_k)|2^2}{\textrm{reconstruction loss}} + \underbrace{|\text{sg}[E(\mathbf{x})] - \mathbf{e}_k|2^2}{\textrm{VQ loss}} + \underbrace{\beta |E(\mathbf{x}) - \text{sg}[\mathbf{e}_k]|2^2}{\textrm{commitment loss}} \
其中 \text{sq}[.] 是stop_gradient操作. 编码本中的嵌入向量是通过EMA(指数移动平均)来更新的。给定一个编码向量\mathbf{e}i,假设我们有n_i编码器输出向量{{\mathbf{z}{i,j}}}_{j=1}^{n_i},它们被量化为\mathbf{e}_i。
N_i^{(t)} = \gamma N_i^{(t-1)} + (1-\gamma)n_i^{(t)};;; \mathbf{m}i^{(t)} = \gamma \mathbf{m}i^{(t-1)} + (1-\gamma)\sum{j=1}{n_i{(t)}}\mathbf{z}{i,j}^{(t)};;; \mathbf{e}_i^{(t)} = \mathbf{m}_i^{(t)} / N_i^{(t)} \
编码本中的嵌入向量是通过EMA(指数移动平均)来更新的。给定一个编码向量\mathbf{e}i,假设我们有n_i编码器输出向量,{{\mathbf{z}{i,j}}}_{j=1}^{n_i},它们被量化为\mathbf{e}_i。
VQ-VAE-2(Ali Razavi, et al. 2019)是一个两级分层的VQ-VAE,结合了自注意自回归模型。
第一阶段是训练分层的VQ-VAE:分层潜变量的设计意在将局部模式(即纹理)与全局信息(即物体形状)分开。较大的底层codebook的训练也是以较小的顶层编码为条件的,因此它不必从头开始学习一切。
第二阶段是在潜在的离散编码本上学习先验,以便我们从中取样并生成图像。通过这种方式,解码器可以接收从类似于训练中的分布中采样的输入向量。一个强大的自回归模型通过multi-headed self-attention 层来捕捉先验分布(PixelSNAIL; Chen et al 2017)。
考虑到VQ-VAE-2依赖于在一个简单的分层设置中配置的离散潜变量,其生成的图像质量相当惊人。
TD-VAE
TD-VAE (“Temporal Difference VAE”; Gregor et al., 2019) 适用于连续的数据。它依赖于三个主要想法,描述如下。
状态空间模型 在(潜在)状态空间模型中,一连串未观察到的隐藏状态\mathbf{z} = (z_1, \dots, z_T)决定了观察状态\mathbf{x} = (x_1, \dots, x_T)。图中马尔科夫链模型的每个时间步骤都可以用类似VAE的方式进行训练,其中难以解决的后验p(z\vert x)被一个函数q(z\vert x)所近似。
信念状态 代理应该学会编码所有过去的状态来推理未来,命名为信念状态(belief state),b_t = belief(x_1, \dots, x_t) = belief(b_{t-1}, x_t)。鉴于此,以过去为条件的未来状态分布可以写成p(x_{t+1}, \dots, x_T \vert x_1, \dots, x_t) \approx p(x_{t+1}, \dots, x_T \vert b_t) 。循环机制中的隐藏状态在TD-VAE中被用作代理的信念状态。因此,我们有b_t = \text{RNN}(b_{t-1}, x_t)。
跳跃性预测 此外,代理被期望根据迄今为止收集到的所有信息来预测遥远的未来,这表明他有能力进行跳跃式预测,也就是预测未来几步的状态。
回顾我们前面讲述的变分下界:
\begin{aligned} \log p(x) &\geq \log p(x) - D_\text{KL}(q(z|x)|p(z|x)) \ &= \mathbb{E}{z\sim q} \log p(x|z) - D\text{KL}(q(z|x)|p(z)) \ &= \mathbb{E}{z \sim q} \log p(x|z) - \mathbb{E}{z \sim q} \log \frac{q(z|x)}{p(z)} \ &= \mathbb{E}{z \sim q}[\log p(x|z) -\log q(z|x) + \log p(z)] \ &= \mathbb{E}{z \sim q}[\log p(x, z) -\log q(z|x)] \ \log p(x) &\geq \mathbb{E}_{z \sim q}[\log p(x, z) -\log q(z|x)] \end{aligned} \
现在让我们把状态x_t的分布建模为一个概率函数,它以所有过去的状态$x_{ \log p(x_t|x_{\lt {t}}) \geq \mathbb{E}{(z{t-1}, z_t) \sim q}[\log p(x_t, z_{t-1}, z_{t}|x_{\lt {t}}) -\log q(z_{t-1}, z_t|x_{\leq t})] \
继续展开:
\begin{aligned} & \log p(x_t|x_{\lt {t}}) \ &\geq \mathbb{E}{(z{t-1}, z_t) \sim q}[\log p(x_t, z_{t-1}, z_{t}|x_{\lt {t}}) -\log q(z_{t-1}, z_t|x_{\leq t})] \ &\geq \mathbb{E}{(z{t-1}, z_t) \sim q}[\log p(x_t|\color{red}{z_{t-1}}, z_{t}, \color{red}{x_{\lt {t}}}) + \color{blue}{\log p(z_{t-1}, z_{t}|x_{\lt {t}})} -\log q(z_{t-1}, z_t|x_{\leq t})] \ &\geq \mathbb{E}{(z{t-1}, z_t) \sim q}[\log p(x_t|z_{t}) + \color{blue}{\log p(z_{t-1}|x_{\lt {t}})} + \color{blue}{\log p(z_{t}|z_{t-1})} - \color{green}{\log q(z_{t-1}, z_t|x_{\leq t})}] \ &\geq \mathbb{E}{(z{t-1}, z_t) \sim q}[\log p(x_t|z_{t}) + \log p(z_{t-1}|x_{\lt {t}}) + \log p(z_{t}|z_{t-1}) - \color{green}{\log q(z_t|x_{\leq t})} - \color{green}{\log q(z_{t-1}|z_t, x_{\leq t})}] \end{aligned} \
其中: 根据马尔可夫假设,红色项可以被忽略。蓝色项根据马尔科夫假设被扩展。绿色项被扩展为包括回溯到过去的一步预测,作为一个平滑分布。具体一点,我们需要学习4个分布:
解码分布p_D(.):
p(x_t \mid z_t) 编码;
p(x_t \mid z_t) \to p_D(x_t \mid z_t);
转移分布p_T(.) :
p(z_t \mid z_{t-1}) 捕获隐状态间的序列依赖
p(z_t \mid z_{t-1}) \to p_T(z_t \mid z_{t-1});
信念分布p_B(.):
p(z_{t-1} \mid x_{\lt t}) 和 q(z_t \mid x_{\leq t}) 能根据信念状态预测隐变量;
p(z_{t-1} \mid x_{\lt t}) \to p_B(z_{t-1} \mid b_{t-1});
q(z_{t} \mid x_{\leq t}) \to p_B(z_t \mid b_t);
平滑分布p_S(.) :
回溯平滑项 q(z_{t-1} \mid z_t, x_{\leq t})也可以改写为取决于信念状态;
q(z_{t-1} \mid z_t, x_{\leq t}) \to p_S(z_{t-1} \mid z_t, b_{t-1}, b_t);
为了纳入跳跃性预测,顺序ELBO不仅要对t, t+1工作,还要对两个遥远的时间戳t_1 \lt t_2工作。这是最终要最大化的TD-VAE目标函数:
J_{t_1, t_2} = \mathbb{E}[ \log p_D(x_{t_2}|z_{t_2}) + \log p_B(z_{t_1}|b_{t_1}) + \log p_T(z_{t_2}|z_{t_1}) - \log p_B(z_{t_2}|b_{t_2}) - \log p_S(z_{t_1}|z_{t_2}, b_{t_1}, b_{t_2})] \
参考文献
[1] Geoffrey E. Hinton, and Ruslan R. Salakhutdinov. “Reducing the dimensionality of data with neural networks." Science 313.5786 (2006): 504-507.
[2] Pascal Vincent, et al. “Extracting and composing robust features with denoising autoencoders." ICML, 2008.
[3] Pascal Vincent, et al. “Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion.". Journal of machine learning research 11.Dec (2010): 3371-3408.
[4] Geoffrey E. Hinton, Nitish Srivastava, Alex Krizhevsky, Ilya Sutskever, and Ruslan R. Salakhutdinov. “Improving neural networks by preventing co-adaptation of feature detectors.” arXiv preprint arXiv:1207.0580 (2012).
[5] Sparse Autoencoder by Andrew Ng.
[6] Alireza Makhzani, Brendan Frey (2013). “k-sparse autoencoder”. ICLR 2014.
[7] Salah Rifai, et al. “Contractive auto-encoders: Explicit invariance during feature extraction." ICML, 2011.
[8] Diederik P. Kingma, and Max Welling. “Auto-encoding variational bayes." ICLR 2014.
[9] Tutorial - What is a variational autoencoder? on http://jaan.io
[10] Youtube tutorial: Variational Autoencoders by Arxiv Insights
[11] “A Beginner’s Guide to Variational Methods: Mean-Field Approximation” by Eric Jang.
[12] Carl Doersch. “Tutorial on variational autoencoders." arXiv:1606.05908, 2016.
[13] Irina Higgins, et al. “\beta-VAE: Learning basic visual concepts with a constrained variational framework.” ICLR 2017.
[14] Christopher P. Burgess, et al. “Understanding disentangling in beta-VAE." NIPS 2017.
[15] Aaron van den Oord, et al. “Neural Discrete Representation Learning” NIPS 2017.
[16] Ali Razavi, et al. “Generating Diverse High-Fidelity Images with VQ-VAE-2”. arXiv preprint arXiv:1906.00446 (2019).
[17] Xi Chen, et al. “PixelSNAIL: An Improved Autoregressive Generative Model." arXiv preprint arXiv:1712.09763 (2017).
[18] Karol Gregor, et al. “Temporal Difference Variational Auto-Encoder." ICLR 2019.
参考资料:
生成模型(二):VAE