Published on

变分自编码器(1)

Authors
  • avatar
    Name
    zmy
    Twitter

变分自编码器VAE(1)

参考 https://spaces.ac.cn/archives/5253

概述

  • 变分:分布变换
  • 希望构建一个从隐变量 ZZ 到目标数据 XX 的模型
  • 假设 ZZ 服从某种常见分布,通过构建一个生成器 gg ,使得 X=g(Z)X = g(Z),这样就可以从常见分布中随机采样然后生成目标数据了

实现

理想情况1

  • 假设 ZZ 服从标准正态分布,则可以从标准正态分布中随机采样,来生成符合目标数据分布的图像:
Xk^=g(Zk)\hat{X_k} = g(Z_k)
  • 只要能训练出这个生成器 gg,那么这就是一个终极理想的生成模型,但是存在以下困难导致这样理想的情况基本不可能实现
    • 目标数据的分布是无法写出分布表达式的,也就无法衡量生成数据的分布是否与目标数据的分布的相似度(无法通过KL散度来计算,因为需要分布表达式)
    • 也无法通过计算具体的生成图像与其ground_truth的差异,因为无法确定哪个生成图像对应哪个目标图像
  • 为解决没有合适的度量来评判生成数据是否符合目标数据的分布,GAN的做法是将这个度量用神经网络训练出来(判别器),而VAE则采用了另外的做法

理想情况2

  • VAE将上式进行了改写,转变为如下形式:
p(X)=Zp(XZ)p(Z)p(X) = \underset{Z}{\sum} p(X|Z)p(Z)
  • 假设 ZZ 符合标准正态分布,则可以随机采样 ZZ,然后生成 XX ,但是这样实际上也是不能确定生成的图像与目标图像的对应关系的,也无法进行优化
  • 但是这种情况只要找到生成数据和真实数据的对应关系就可以训练了

VAE做法

  • VAE并没有假设 p(Z)p(Z) 是标准正态分布,而是假设了后验分布 p(ZX)p(Z|X) 符合标准正态分布。

    • 即给定一个目标样本 XkX_k ,假设存在一个专属于 XkX_k 的分布 p(ZXk)p(Z|X_k) ,并且此分布是正态分布(并不一定是标准正态分布)
  • 有了上述假设,就可以定义一个完整的流程了:

    1. 对于真实数据 XkX_k ,可以获得 p(ZXk)p(Z|X_k) ,且符合正态分布
    2. p(ZXk)p(Z|X_k) 中采样一个 ZkZ_k ,通过生成器 X^k=g(Zk)\hat{X}_k = g(Z_k)
    3. 由于 p(ZXk)p(Z|X_k) 是专属于 XkX_k 的,那么有理由认为 X^k\hat{X}_k 对应真实数据中的 XkX_k ,这样就可以进行优化训练了
  • 对于第一步,如何根据真实数据 XkX_k ,获得符合正态分布的 p(ZXk)p(Z|X_k)

    • 对于正态分布,只需要知道其均值和方差即可确定这个分布,VAE的做法是用神经网络拟合出来,即构建了以下两个神经网络:
    μk=f1(Xk)logσ2=f2(Xk)\mu_k = f_1(X_k)\\ \log\sigma^2 = f_2(X_k)

分布标准化

  • 对于上面的训练过程,最终目标是重构 XX ,也就是最小化 X^k,X2\lVert\hat{X}_k, X\rVert_2 ,但是由于 ZkZ_k 是重新采样过的,在重构的过程中会受到噪声的影响,而噪声(即方差)是通过神经网络计算出来的,那么模型为了重构的更好,会将方差往0的方向优化,而一旦方差为0,则没有随机性了,同时模型不再具备生成能力(因为不管怎么采样都是确定的结果)。
  • 针对这种情况,VAE的做法是让所有的 P(ZX)P(Z|X) 都向标准正态分布看齐,这样就防止了噪声为0,同时保证了模型的生成能力。
p(Z)=Xp(ZX)p(X)=X(0,1)p(X)=(0,1)Xp(X)=(0,1)p(Z) = \underset{X}{\sum}p(Z|X)p(X) = \underset{X}{\sum}(0,1)p(X) = (0,1)\underset{X}{\sum}p(X)=(0,1)
  • 这样就达成了理想情况2中的假设,即 ZZ 符合标准正态分布,可以利用理想情况2进行生成了
  • 至于如何让所有的 P(ZX)P(Z|X) 都向标准正态分布看齐,如果没有外部知识的情况下,最直接的方法就是在重构误差的基础上添加额外的loss:
lossu=f1(Xk)2lossσ2=f2(Xk)2loss_u = \lVert f_1(X_k) \rVert_2 \\ loss_{\sigma^2} = \lVert f_2(X_k) \rVert_2
  • 因为 f1f_1f2f_2 分别计算的是均值以及方差的对数,当达到标准正态分布(0,1)时,这两个loss的值应该为0,但是这样会面临着两个loss的比例如何确定的问题,比例确定不好的话会导致生成的图像模糊,VAE直接计算了一般正态分布与标准正态分布的KL散度作为这个额外loss:
loss=KL(N(μ,σ2)N(0,1))=12i=1d(μ(i)2+σ(i)2logσ(i)21)loss = KL(N(\mu,\sigma^2) \rVert N(0, 1)) = \frac{1}{2}\sum_{i=1}^d(\mu_{(i)}^2+\sigma_{(i)}^2-\log\sigma_{(i)}^2-1)

重参数技巧

  • 要从 p(ZXk)p(Z|X_k) 中采样一个 ZkZ_k 出来,尽管知道 p(ZXk)p(Z|X_k) 符合正态分布,其均值方差都是靠模型推算出来的,需要通过这个采样的过程来优化计算均值方差的模型

  • 但是采样这个过程是不可导的,而采样的结果是可导的

  • VAE 的做法是 Z=μ+ϵσZ = \mu + \epsilon*\sigma ,其中 ϵ\epsilon 符合标准正态分布,这样采样的过程就不需要参与梯度下降了,而是采样的结果参与,整个模型就可训练了