VAE的推导

参考文章《Auto-Encoding Variational Bayes》.
假设数据集是独立同分布(I.I.D),每个样本皆服从随机分布 p() p ( ⋅ ) ,数据集有N个样本。我们构造由N个随机变量构成的联合分布 p(x1,...,xN)=Ni=1p(xi) p ( x 1 , ... , x N ) = ∏ i = 1 N p ( x i )
从最大似然观点来看联合分布,当N个变量恰好是数据集样本(即:由抽样点组成的联合状态的概率)此时的联合分布的概率应取最大值。
对联合分布取对数似然,有:

logp(x1,...,xN)=i=1Nlogp(xi)(1) log ⁡ p ( x 1 , ... , x N ) = ∑ i = 1 N log ⁡ p ( x i ) ( 1 )

因为Dataset背后的分布 P() P ( ⋅ ) 我们是不知道的,因而无法直接生成新的样本,这也是生成模型最终想要实现的目标。
VAE(Variational Auto-Encoder)是一个生成模型,它为解决上述目标,引入了一个隐变量模型,如图:
这里写图片描述

原来的随机变量只有一个 x x ,现在变成了两个随机变量的联合 (x,z) ( x , z ) ,原来的两个独立概率空间: xX x ∈ X zZ z ∈ Z ,变成了联合空间 X×Z ( X × Z ) 相应的边沿分布(Marginal Distribution)。构造该联合分布只有一个约束条件:要满足 x x 这一侧的边沿分布为 p(x) p ( x ) ,对 z z 没有要求,因而我们可以指定 z z 的分布,比如:正态分布。
由Figure1,为简化推导,考虑连续随机变量,处理公式(1)有:

logp(xi)=zqϕ(z|xi)dzlogp(xi)=zqϕ(z|xi)logp(xi)dz=zqϕ(z|xi)logp(xi)qϕ(z|xi)pθ(z|xi)qϕ(z|xi)pθ(z|xi)dz=zqϕ(z|xi)logpθ(xi,z)qϕ(z|xi)qϕ(z|xi)pθ(z|xi)dz=zqϕ(z|xi)logqϕ(z|xi)pθ(z|xi)dz + zqϕ(z|xi)logpθ(xi,z)qϕ(z|xi)dz(2) log ⁡ p ( x i ) = ∫ z q ϕ ( z | x i ) d z ⋅ log ⁡ p ( x i ) = ∫ z q ϕ ( z | x i ) ⋅ log ⁡ p ( x i ) d z = ∫ z q ϕ ( z | x i ) ⋅ log ⁡ p ( x i ) ⋅ q ϕ ( z | x i ) ⋅ p θ ( z | x i ) q ϕ ( z | x i ) ⋅ p θ ( z | x i ) d z = ∫ z q ϕ ( z | x i ) ⋅ log ⁡ p θ ( x i , z ) ⋅ q ϕ ( z | x i ) q ϕ ( z |
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值