读论文系列【一】:VAE/GAN网络结构的介绍

摘要

  自动编码器(AE)是数据检索,数据降噪的有力工具,变分自动编码器(VAE)更是一种有效的生成模型。14年生成对抗网络(GAN)的提出,为图像处理,信号处理等领域提供了新的处理工具。我以VAE/GAN这一篇经典的网络结构为主,辅以GAN和VAE的概念,对这一篇论文进行了分析和总结。
  论文:Anders Boesen, Lindbo Larsen, Søren Kaae Sønderby, Hugo Larochelle, Ole Winther“Autoencoding beyond pixels using a learned similarity metric” , ICML. 2016

Variational Autoencoder

  VAE作为一种生成模型,在生成能力方面和GAN有着不同的优点和缺陷。
为方便理解分析,参考一位博主的blog,引入如下的图片例子。
一个生成模型,输入为一个向量,输出为一张图片
  普通的卷积神经网络的输入向量为one-hot向量,很稀疏。为了解决这个问题,我们想使用实数值向量而不是0,1向量。我们可认为这种实数值向量是原图片的一种编码,这也就引出了编码/解码的概念。举个例子,[3.3, 4.5, 2.1, 9.8]代表猫,[3.4, 2.1, 6.7, 4.2] 代表狗。这个已知的初始向量可以作为我们的潜在变量。

AE

  如果像我上面一样,随机初始化一些向量去代表图片的编码,这不是一个很好的办法,我们更希望计算机能帮我们自动编码。在autoencoder模型中,我们加入一个编码器,它能帮我们把图片编码成向量。然后解码器能够把这些向量恢复成图片。
经典的AE网络结构
  AE的主要用途用于降维分析,初始化神经网络,数据降噪以及数据检索(文本,图片)等方面。

VAE

  我们可以对编码器添加约束,就是强迫它产生服从单位高斯分布的潜在变量。正是这种约束,把VAE和标准自编码器给区分开来了。现在,产生新的图片也变得容易:我们只要从单位高斯分布中进行采样,然后把它传给解码器就可以了。
  对于我们的损失函数,我们可以把这两方面进行加和。一方面,是图片的重构误差,我们可以用平均平方误差来度量,另一方面。我们可以用KL散度来度量我们潜在变量的分布和单位高斯分布的差异。算法见下图,图自原论文。
LOSS for VAE
VAE的Loss
  为了优化KL散度,我们需要应用一个简单的参数重构技巧:不像标准自编码器那样产生实数值向量,VAE的编码器会产生两个向量:一个是均值向量,一个是标准差向量。
VAE的网络结构

  更明确的流程图见下,源自《Tutorial on Variational Autoencoders》:
  VAE作为一种生成模型,用于在latent space上调整不同的属性来生成不同的输出。
VAE的网络结构

生成对抗网络GAN

  本段只简单介绍GAN网络的特点和简单的算法,具体的理解本文暂不介绍和分析。
  若想了解GAN,可以参考李宏毅老师的GAN网络课程

  以下两段摘自维基百科:
  “生成对抗网络(Generative Adversarial Networks)是非监督式学习的一种方法,通过让两个神经网络相互博弈的方式进行学习。该方法由伊恩·古德费洛等人于2014年提出。生成对抗网络由一个生成网络与一个判别网络组成。生成网络从潜在空间(latent space)中随机取样作为输入,其输出结果需要尽量模仿训练集中的真实样本。判别网络的输入则为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能分辨出来。而生成网络则要尽可能地欺骗判别网络。两个网络相互对抗、不断调整参数,最终目的是使判别网络无法判断生成网络的输出结果是否真实。
  虽然生成对抗网络原先是为了无监督学习提出的,它也被证明对半监督学习、完全监督学习、强化学习是有用的。”
  生成模型是一种自下而上的模型,容易生成更深一层的模型,但是容易忽略掉生成节点之间的关系。
  判别模型作为一种自下而上的模型,考虑到了模型总体的情况,即各部分之间的关系,但是生成负样本时并不简单,特别是模型很复杂时,生成的负样本在短时间内并不会改善。
  GAN结合了生成模型和判别模型各自的特点,清晰易懂,结构合理,正是这样的特点为14年之后的GAN的广泛应用做了铺垫。
下面简要概括一下GAN的算法:
In each training iteration:
——————————discriminator——————————
Sample m examples { x 1 , x 2 , ⋯   , x m } \{x^1,x^2,\cdots,x^{m}\} {x1,x2,,xm}from database
Sample m noise samples { z 1 , z 2 , ⋯   , z m } \{z^1,z^2,\cdots,z^{m}\} {z1,z2,,zm} from a distribution
Obtaining generated data { x ~ 1 , x ~ 2 , ⋯   , x ~ m } \{\tilde{x}^1,\tilde{x}^2,\cdots,\tilde{x}^{m}\} {x~1,x~2,,x~m}, x ~ i = G ( z i ) \tilde{x}^i=G(z^i ) x~i=G(zi)
Update discriminator parameters θ_d to maximize:
V = 1 m ∑ i = 1 m l o g D ( x i ) + 1 m ∑ i = 1 m l o g D ( 1 − x ~ i ) V = \frac{1}{m}\sum_{i=1}^m logD(x^i)+\frac{1}{m}\sum_{i=1}^m logD(1-\tilde{x}^i) V=m1i=1mlogD(xi)+m1i=1mlogD(1x~i)
θ d ← θ d + η ∇ V ( θ d ) \theta_{d}\leftarrow\theta_{d}+\eta\nabla V(\theta_{d}) θdθd+ηV(θd)
——————————generator——————————
Sample m noise samples { z 1 , z 2 , ⋯   , z m } \{z^1,z^2,\cdots,z^{m}\} {z1,z2,,zm} from a distribution
Update generator parameters θ g \theta_g θg to maximize:
V = 1 m ∑ i = 1 m l o g D ( G ( z i ) ) V = \frac{1}{m}\sum_{i=1}^m logD(G(z^i)) V=m1i=1mlogD(G(zi))
θ g ← θ g + η ∇ V ( θ g ) \theta_{g}\leftarrow\theta_{g}+\eta\nabla V(\theta_{g}) θgθg+ηV(θg)

VAE/GAN

主要贡献

译自原论文:
1.我们将VAEs和GANs合并成一个无监督生成模型,同时学习编码、生成和比较(判别)数据集样本。
2.我们证明了用学习相似性度量(similarity measure)训练的生成模型比用元素误差度量(element-wise error)训练的生成模型生成的图像样本更好。
3.我们证明了无监督训练的结果是一个潜在的图像表征,通过对带有视觉属性向量的人脸图像数据集的实验说明了这一点。实验表明,将简单的算法应用到学习的潜在空间中,可以生成反映这些属性变化的图像。

关于第二点的理解:
 VAE中用了L2损失来计算图片的重构误差,相应的需要最小化MSE,这种误差的人工选择方式,很大程度上决定了VAE在图像重建方面的效果总是模糊的。
  然而,GAN没有对最终损失函数的形式做任何假设。相反,它使用一个判别器来告诉我们样本是否来自期望的概率分布。来自判别器的信号(它使正负样本之间的交叉熵最小化)被反馈给生成器,然后生成器学习生成更好的样本。同样地,判别器也被串联地训练。这里的巧妙之处在于,GAN不会因为提出了一个人工设想的损失函数(如L1或L2损失)而受损,这种损失在数据中出现的复杂分布中可能是不足够准确衡量误差的。这就是为什么GANs能够产生看起来更清晰的样本的原因之一。
  因为VAE的bottleneck和GAN的input均为latent space,作者将VAE和GAN连接起来,Decoder便可作为GAN的generator。同时优化Encoder,Decoder(Generator)和Discriminator,使得encoder生成的latent space尽可能满足标准高斯分布,即图中的p(z),使得VAE前后的图片尽可能相似,即Decoder(generator)生成的图片尽可能real,使得Discriminator尽可能分辨出real和fake的图片。

该网络的简单算法实现如下:
Initialize E n , D e , D i s En, De, Dis En,De,Dis
In each iteration:
Sample M images { x 1 , x 2 , ⋯   , x M } \{x^1,x^2,\cdots,x^{M}\} {x1,x2,,xM} from database
Generate M codes { z 1 , z 2 , ⋯   , z M } \{z^1,z^2,\cdots,z^{M}\} {z1,z2,,zM} from encoder z ~ i = E n ( x i ) \tilde{z}^i=En(x^i) z~i=En(xi)
Generate M images { x ~ 1 , x ~ 2 , ⋯   , x ~ M } \{\tilde{x}^1,\tilde{x}^2,\cdots,\tilde{x}^{M}\} {x~1,x~2,,x~M} from decoder x ~ i = D e ( z ~ i ) \tilde{x}^i=De(\tilde{z}^i) x~i=De(z~i)
Sample M codes { z 1 , z 2 , ⋯   , z M } \{z^1,z^2,\cdots,z^{M}\} {z1,z2,,zM} from prior P ( z ) P(z) P(z)
Generate M images { x ^ 1 , x ^ 2 , ⋯   , x ^ M } \{\hat{x}^1,\hat{x}^2,\cdots,\hat{x}^{M}\} {x^1,x^2,,x^M} from decoder x ^ i = D e ( z ~ i ) \hat{x}^i=De(\tilde{z}^i) x^i=De(z~i)
Update E n En En to decrease ∥ x ~ i − x i ∥ \left\|\tilde{x}^i-x^i \right\| x~ixi, decrease K L ( P ( z ~ i ∣ x i ) ∥ P ( z ) ) KL(P(\tilde{z}^i|xi)\|P(z)) KL(P(z~ixi)P(z))
Update D e De De to decrease ∥ x ~ i − x i ∥ \left\|\tilde{x}^i-x^i \right\| x~ixi, increase D i s ( x ~ i ) Dis(\tilde{x} ^i ) Dis(x~i) and D i s ( x ^ i ) Dis(\hat{x}^i ) Dis(x^i)
Update D i s Dis Dis to increase D i s ( x i ) Dis(x^i ) Dis(xi), decrease D i s ( x ~ i ) Dis(\tilde{x} ^i ) Dis(x~i) and D i s ( x ^ i ) Dis(\hat{x}^i ) Dis(x^i)

实验结果

  本论文所用数据集为CelebA face images,作者分别用了VAE,VAE/GAN,GAN对人脸进行了生成和重建,对比了效果,直观感受VAE/GAN效果最好。
生成人脸
重建人脸  然后作者对latent space上的每一个维度所对应着特定的可视的属性,如:口红,刘海,胡须等,进行了可视化和一些有趣的调整。
“变脸”
  进一步,作者为了寻求对生成的图像进行更定量的评价标准,采用Labeled faces in the wild (LFW) images with attributes数据集, 学习基于面部属性的面部图像生成模型。
  在测试时,从所选择的属性配置中检索出人脸图像,并让一个单独训练的回归网络从所生成的图像中识别属性,根据属性识别的误差来量化三种方法的效果。
根据属性进行人脸生成
实验结果
  最终结果显示,与一般的VAE相比,VAE/GAN模型具有更好的识别性能,属性的存在性和误差都是更加优秀的。

总结

  本论文从VAE出发,巧妙地将自动编码器和生成对抗网络结合,从loss的根源分析并且用实验证明了VAE/GAN网络的优越性。

参考资料

1.Anders Boesen, Lindbo Larsen, Søren Kaae Sønderby, Hugo Larochelle, Ole Winther“Autoencoding beyond pixels using a learned similarity metric” , ICML. 2016
2.Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprint arXiv:1312.6114 (2013).
3.CARL DOERSCH Carnegie Mellon / UC Berkeley “Tutorial on Variational Autoencoders” August 16, 2016
4.VAE(Variational Autoencoder)的原理
5.李宏毅深度学习课程

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
VAE是一种生成模型,用于学习输入数据的潜在分布,并从中生成新的样本。它由一个编码器网络和一个解码器网络组成。编码器将输入图像映射为潜在空间中的两个向量,即均值向量z_mean和对数方差向量z_log_var。解码器则将潜在向量z解码为重建图像。 在Python中实现VAE的伪代码如下: ```python # VAE编码器网络 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras import backend as K from tensorflow.keras.models import Model img_shape = (28, 28, 1) batch_size = 16 latent_dim = 2 input_img = keras.Input(shape=img_shape) x = layers.Conv2D(32, 3, padding='same', activation='relu')(input_img) x = layers.Conv2D(64, 3, padding='same', activation='relu', strides=(2, 2))(x) x = layers.Conv2D(64, 3, padding='same', activation='relu')(x) = layers.Conv2D(64, 3, padding='same', activation='relu')(x) shape_before_flattening = K.int_shape(x) x = layers.Flatten()(x) x = layers.Dense(32, activation='relu')(x) z_mean = layers.Dense(latent_dim)(x) z_log_var = layers.Dense(latent_dim)(x) # VAE解码器网络 z = layers.Input(shape=(latent_dim,)) x = layers.Dense(np.prod(shape_before_flattening[1:]), activation='relu')(z) x = layers.Reshape(shape_before_flattening[1:])(x) x = layers.Conv2DTranspose(32, 3, padding='same', activation='relu', strides=(2, 2))(x) x = layers.Conv2D(1, 3, padding='same', activation='sigmoid')(x) reconstructed_img = x # 构建VAE模型 encoder = Model(input_img, z_mean, z_log_var) decoder = Model(z, reconstructed_img) vae_output = decoder(encoder(input_img)) vae = Model(input_img, vae_output) # 定义损失函数和训练过程 def vae_loss(input_img, vae_output): reconstruction_loss = keras.losses.binary_crossentropy(input_img, vae_output) reconstruction_loss *= img_shape[0] * img_shape[1] kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var) kl_loss = K.sum(kl_loss, axis=-1) kl_loss *= -0.5 vae_loss = K.mean(reconstruction_loss + kl_loss) return vae_loss vae.compile(optimizer='adam', loss=vae_loss) vae.fit(train_images, train_images, batch_size=batch_size, epochs=epochs) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值