文章目录
- AutoEncoder自动编码器
- (一)AutoEncoder的基本架构
- (二)AutoEncoder的概率理解
- (三)AutoEncoder的局限
- VAE变分自编码器(Variational AutoEncoder)
- (一)VAE简介
- (二)VAE的概率理解
- (三)VAE与AE
- (三)VAE与GAN
- (四)VAE的损失函数
- VQVAE量子化(离散化)的自编码器
- (一)VQVAE简介
- (二)VQVAE与VAE
- (三)VQVAE的训练损失
AutoEncoder自动编码器
(一)AutoEncoder的基本架构
最基础的AutoEncoder由一个Encoder和一个Decoder组成:
- Encoder对输入图片进行编码得到 latent code
- Decoder对 latent code进行重建
- 计算输入图片和生成图片的重构误差,训练的时候最小化重构误差
(二)AutoEncoder的概率理解
AutoEncoder可以理解为通过网络学习出任意概率分布,然后取概率分布中的最高点的横坐标作为编码的离散值。这会导致AutoEncoder的生成过程是不可控的,对输入噪声敏感,因为学习得到的概率分布是不能提前预知的。
(三)AutoEncoder的局限
AE结构只能对图像进行压缩和还原,并不能生成新的图像。
VAE变分自编码器(Variational AutoEncoder)
(一)VAE简介
VAE 模型是一种包含隐变量的生成模型,它利用神经网络训练得到两个函数(也称为推断网络和生成网络),进而生成输入数据中不包含的数据。
隐变量: 不可直接观测的综合性变量。
隐变量模型: 隐变量模型是一种概率模型,其中某些变量是不可观测的。(即包含隐变量的概率模型)
VAE通过Encoder学习出mean和std两个编码,同时随机采样一个正态分布的编码 ϵ \epsilon ϵ,然后通过 ϵ × s t d + m e a n \epsilon\times std+mean ϵ×std+mean重采样得到 latent code,然后通过Decoder进行重建。另外,由于正态分布的连续性,不存在不可导问题,可以通过重参数方法,对 latent code进行恢复,并通过链式求导法则进行梯度更新。
(二)VAE的概率理解
VAE将latent表达为高斯的概率分布,同时通过网络去自动学习平衡图像生成的精确度和概率分布的拟合度,这两者可以分别用MSE和KL散度来计算。之所以使用高斯分布,是因为高斯分布可以去累加映射得到任何的数据分布,同时高斯分布可以通过参数重整化转换为标准正态分布的线性表达,因此VAE中的latent中包括了高斯分布的均值和标准差。
(三)VAE与AE
-
VAE和AE的联系:VAE与AE从结构上看都含有Decoder和Encoder过程
-
VAE和AE的区别:
- 隐藏层:VAE隐藏层服从高斯分布,AE隐藏层无分布要求
- 训练时,AE训练得到Encoder和Decoder模型,VAE除了得到这两个模型,还能得到隐藏层的分布模型(即高斯分布的均值与方差)
- AE只能重构输入数据X,而VAE可以生成含有输入数据某些特征与参数的新数据。
-
变分自编码器的变分:
- “简单易懂的理解变分其实就是一句话:用简单的分布q去近似复杂的分布p。”
- VAE 中的隐变量z的生成过程就是一个变分过程,我们希望用简单的z来映射复杂的分布,这既是一个降维的过程,同时也是一个变分推断的过程。
(三)VAE与GAN
VAE相对于GAN来说像是一种相反的存在:GAN是输入latent生成图像,再用生成的图像去修正网络;而VAE是输入图像生成latent,让latent的尽量接近原数据集的分布。
(四)VAE的损失函数
- θ \theta θ:网络从x到z的映射; q θ ( z ∣ x ) q_{\theta}(z|x) qθ(z∣x):encoder
-
ϕ
\phi
ϕ:网络从z到x的重构;
p
ϕ
(
x
∣
z
)
p_{\phi}(x|z)
pϕ(x∣z):decoder
对于损失函数,可以从两个方面进行求和,一方面是图形的重构误差,即x~z~x的过程;另一方面用KL散度度量潜在变量的分布与单位高斯分布的差异,没有KL项,VAE就退化成AE
VQVAE量子化(离散化)的自编码器
(一)VQVAE简介
VQVAE通过Encoder学习出中间编码,然后通过最邻近搜索将中间编码映射为codebook中K个向量之一,然后通过Decoder对 latent code进行重建。
由于最邻近搜索使用argmax来找codebook中的索引位置,导致不可导问题,VQVAE通过stop gradient操作来避免最邻近搜索的不可导问题,也就是 latent code的梯度跳过最近邻搜索直接复制到中间编码上。
(二)VQVAE与VAE
VQ-VAE与VAE的最主要的区别是VQ-VAE采用离散隐变量。对于encoder的输出通过向量量化(vector quantisation,VQ)的方法来离散化。
将z离散化的关键就是VQ, 即vector quatization. 简单来说, 就是要先有一个codebook, 这个codebook是一个embedding table. 我们在这个table中找到和vector最接近(比如欧氏距离最近)的一个embedding, 用这个embedding的index来代表这个vector.
由于维护了一个codebook,编码范围更加可控,VQVAE相对于VAE,可以生成更大更高清的图片。
(三)VQVAE的训练损失
VQ-VAE共包含三个部分的训练loss:reconstruction loss,VQ loss,commitment loss:
第二项和第三项基本一样, 只是 s g sg sg的对象变了, 而且第三项多了 β \beta β, s g sg sg指的是stop gradient, 即gradient backpropagation到此为止, 不再往前传。
-
reconstruction loss
- 作用在encoder和decoder上
-
VQ loss
- 作用在codebook上,用来更新embedding空间
- 作用在codebook上,用来更新embedding空间
-
commitment loss
- 作用:约束encoder的输出和embedding空间保持一致,以避免encoder的输出变动较大
- 计算方式:encoder的输出 z e ( x ) z_e(x) ze(x)和对应量化得到的embedding向量 e k e_k ek的L2误差
-
s
g
sg
sg作用在embedding向量
e
k
e_k
ek上,意味着这个约束只会影响encoder
参考:
VAE 模型基本原理简单介绍
【图像生成】(三) VAE原理 & pytorch代码实例
VQ-VAE解读
生成模型之VAE与VQ-VAE