【Learning Notes】变分自编码器(Variational Auto-Encoder,VAE)

近年,随着有监督学习的低枝果实被采摘的所剩无几,无监督学习成为了研究热点。VAE(Variational Auto-Encoder,变分自编码器)[1,2] 和 GAN(Generative Adversarial Networks) 等模型,受到越来越多的关注。

笔者最近也在学习 VAE 的知识(从深度学习角度)。首先,作为工程师,我想要正确的实现 VAE 算法,以及了解 VAE 能够帮助我们解决什么实际问题;作为人工智能从业者,我同时希望在一定程度上了解背后的原理。

作为学习笔记,本文按照由简到繁的顺序,首先介绍 VAE 的具体算法实现;然后,再从直观上解释 VAE 的原理;最后,对 VAE 的数学原理进行回顾。我们会在适当的地方,对变分、自编码、无监督、生成模型等概念进行介绍。

我们会看到,同许多机器算法一样,VAE 背后的数学比较复杂,然而,工程实现上却非常简单。

这篇 Conditional Variational Autoencoders 也是 by intuition 地介绍 VAE,几张图也非常用助于理解。

1. 算法实现

这里介绍 VAE 的一个比较简单的实现,尽量与文章[1] Section 3 的实验设置保持一致。完整代码可以参见 repo

1.1 输入:

数据集 XRn

做为例子,可以设想 X MNIST 数据集。因此,我们有六万张 0~9 的手写体 的灰度图(训练集), 大小为 28×28 。进一步,将每个像素归一化到 [0,1] ,则 X[0,1]784

MNIST
图1. MNIST demo (图片来源)

1.2 输出:

一个输入为 m 维,输出为 n 维的神经网络,不妨称之为 decoder [1](或称 generative model [2])(图2)。

decoder
图 2. decoder

  • 在输入输出维度满足要求的前提下,decoder 以为任何结构——MLP、CNN,RNN 或其他。
  • 由于我们已经将输入数据规一化到 [0, 1] 区间,因此,我们令 decoder 的输出也在这个范围内。这可以通过在 decoder 的最后一层加上 sigmoid 激活实现 :
    f(x)=11+ex
  • 作为例子,我们取 m = 100,decoder 的为最普遍的全连接网络(MLP)。基于 Keras Functional API 的定义如下:
n, m = 784, 2
hidden_dim = 256
batch_size = 100

## Encoder
z = Input(batch_shape=(batch_size, m))
h_decoded = Dense(hidden_dim, activation='tanh')(z)
x_hat = Dense(n, activation='sigmoid')(h_decoded)

1.3 训练

VAE overview
图 3. VAE 结构框架

1.3.1 encoder

为了训练 decoder,我们需要一个辅助的 encoder 网络(又称 recognition model)(如图3)。encoder 的输入为 n 维,输出为 2×m 维。同 decoder 一样,encoder 可以为任意结构。

encoder
图 4. encoder

1.3.2 采样(sampling)

我们将 encoder 的输出( 2×m 个数)视作分别为 m 个高斯分布的均值(z_mean)和方差的对数(z_log_var)。

接着上面的例子,encoder 的定义如下:

## Encoder
x = Input(batch_shape=(batch_size, n))
h_encoded = Dense(hidden_dim, activation='tanh')(x)
z_mean = Dense(m)(h_encoded)    # 均值
z_log_var = Dense(m)(h_encoded) # 方差对数

然后,根据 encoder 输出的均值与方差,生成服从相应高斯分布的随机数:

epsilon = K.random_normal(shape=(batch_size, m), 
                          mean=0.,std=epsilon_std) # 标准高斯分布
z = z_mean + exp(z_log_var / 2) * epsilon

z 就可以作为上面定义的 decoder 的输入,进而产生 n 维的输出 x^

sampler
图5. 采样

这里运用了 reparemerization 的技巧。由于 zN(μ,σ) ,我们应该从 N(μ,σ) 采样,但这个采样操作对 μ σ 是不可导的,导致常规的通过误差反传的梯度下降法(GD)不能使用。通过 reparemerization,我们首先从 N(0,1) 上采样 ϵ ,然后, z=σϵ+μ 。这样, zN(μ,σ) ,而且,从 encoder 输出到 z ,只涉及线性操作,( ϵ 对神经网络而言只是常数),因此,可以正常使用 GD 进行优化。方法正确性证明见[1] 2.3小节和[2] 第3节 (stochastic backpropagation)。

reparameterization
图6. Reparameterization (图片来源)

preparameterization 的代价是隐变量必须连续变量[7]。

1.3.3 优化目标

encoder 和 decoder 组合在一起,我们能够对每个 xX ,输出一个相同维度的 x^ 。我们目标是,令 x^ x 自身尽量的接近。即 x 经过编码(encode)后,能够通过解码(decode)尽可能多的恢复出原来的信息。

注:严格而言,按照模型的假设,我们要优化的并不是 x x^ 之间的距离,而是要最大化 x 的似然。不同的损失函数,对应着不是 p(x|z) 的不同概率分布假设。此处为了直观,姑且这么解释,详细讨论见下文([1] 附录C)。

由于 x[0,1] ,因此,我们用交叉熵(cross entropy)度量 x x^ 差异:

xent=i=1n[xilog(x^i)+(1xi)log(1x^i)]

xent 越小, x x^ 越接近。

我们也可以用均方误差来度量:

mse=i=1n(xix^i)2

mse 越小,两者越接近。

训练过程中,输出即是输入,这便是 VAE 中 AE(autoencoder,自编码)的含义。

另外,我们需要对 encoder 的输出 z_mean( μ )及 z_log_var( logσ2 )加以约束。这里使用的是 KL 散度(具体公式推导见下文):

KL=0.5(1+logσ2μ2σ2)=0.5(1+logσ2μ2exp(logσ2))

这里的KL, 其实是 KL 散度的负值,见下文。

总的优化目标(最小化)为:

  • 89
    点赞
  • 264
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
变分自编码器Variational Autoencoders,VAE)是一种生成模型,结合了自编码器变分推断的概念。 VAE的目标是学习输入数据的潜在表示,并通过该表示生成新的样本。与传统的自编码器不同,VAE引入了概率分布的概念,并通过变分推断来学习数据的分布。 以下是VAE的主要组成部分和工作流程: 1. 编码器(Encoder):编码器将输入数据映射到潜在空间中的潜在变量(latent variable),也称为编码(encoding)。编码器的目标是学习数据的分布,并产生潜在变量的均值和方差。 2. 解码器(Decoder):解码器接收潜在变量作为输入,并将其映射回原始数据空间中,以重构输入数据。解码器的目标是学习生成数据的分布,并尽可能准确地重构输入数据。 3. 潜在变量采样(Latent Variable Sampling):在训练过程中,从编码器中获得的均值和方差用于参数化一个概率分布,然后从该分布中采样潜在变量。这个采样过程使得VAE能够生成多样化的样本。 4. 损失函数(Loss Function):VAE使用重构损失和KL散度损失来训练模型。重构损失衡量重构样本与原始样本之间的差异,KL散度损失衡量潜在变量的分布与预定义的先验分布之间的差异。通过最小化这两个损失函数VAE能够学习到数据的潜在表示。 VAE的训练过程可以概括为以下几个步骤: 1. 输入数据经过编码器,获得潜在变量的均值和方差。 2. 根据潜在变量的均值和方差,从潜在空间中采样一些潜在变量。 3. 采样的潜在变量输入解码器,生成重构样本。 4. 计算重构损失和KL散度损失,并将它们相加得到总体损失。 5. 使用反向传播算法更新编码器和解码器的参数。 6. 重复步骤1-5,直到达到预定的训练迭代次数或达到训练目标。 VAE通过学习数据的潜在表示,能够生成新的样本,并且具有较好的样本多样性和连续性。它在图像生成、特征提取和数据压缩等领域具有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值