0%

Note for Variational Auto-Encoder


直接看网络结构

  • 变分自编码器用了变分推断,但是因为其中的参数估计部分用的是神经网络的梯度下降方法,因此可以直接画出其网络结构——实际上我们称其为自编码器,也是因为其结构上和自编码器有许多相通之处,如果不从贝叶斯的角度出发,甚至可以将VAE直接看成一类特殊的自编码器。
  • 以原论文的mnist实验为例,我们直接看VAE的网络结构,之后再一般化模型并解释细节:
    • 整体和自编码器一样,一个encoder和一个decoder,目标是重构误差,获取有用的编码
    • 然而变分自编码器不对输入直接编码,而是假定编码服从多维正态分布,encoder编码的是这个多维正态分布的均值和方差
    • 也就是VAE假定编码很简单,就是服从正态分布,而我要训练出来并利用的是解码,这个解码器能从正态分布的采样中解码还原出输入,或者说,生成输出
  • mnist的输入为28*28,batch_size为128,假定隐层dim为200,参数dim为10,则整个网络为:
  1. 输入\(x\)[128,28*28],过一个linear+ReLu,得到编码器隐层\(h\)[128,200]
  2. \(h\)分别过两个linear,得到正态分布的参数\(\mu _e\)[128,10],\(\log \sigma _e\)[128,10]
  3. 从一个标准多维正态分布中采样\(\epsilon \sim N(0,I)\),得到\(\epsilon\)[128,10]
  4. 组合通过网络得到的参数\(\mu _e\)\(\log \sigma _e\)到标准多维正态分布的采样值中,\(z = \mu _e + \sigma _e \bigodot \epsilon\)[128,10],\(z\)即编码
  5. encoder部分就此完成,接下来是decoder部分:编码\(z\)过linear+ReLu得到解码隐层状态h[128,200]
  6. 解码隐层状态h经过linear+sigmoid得到\(\mu _d\)[128,28*28],即解码后的输出
  7. 解码后输出\(\mu _d\)与输入\(x\)计算伯努利交叉熵损失
  8. 此外还要加上一个类似正则项的损失\(\frac 12 \sum _{i=1}^{10} (\sigma _{ei}^2 + \mu _{ei}^2 -log(\sigma _{ei}^2) - 1)\)

直接对网络分析

  • 从网络可以看到,VAE相比AE最大的区别就是不直接对输入编码,而是将概率的思想引入了网络结构,对每一个输入单独构建一个满足多维正态分布的编码
  • 这么做的一个好处是,编码可以做插值,实现生成图像连续的变化:原始的AE对于每一个确定输入有确定的编码,而VAE中的网络只负责生成确定的均值和方差,也就是确定的正态分布,实际的编码只是在这个确定的正态分布中采样得到,依然是不确定的。在训练过程中VAE是对一片区域进行训练,而不是点训练,因此得到的编码具有连续性,在区域中心点附近也能生成相似的图像,甚至可以在两类图像输入确定的两个编码区域之间插值,实现两种生成图像的平滑过渡。
  • 步骤1,2,3,4实现的是编码器从一个\(N(\mu _e,\sigma _e ^2)\)的分布中采样得到编码,然而这里存在一个reparameterization的技巧,即:
    • 本来应该是让编码器神经网络拟合一个满足\(N(\mu _e,\sigma _e ^2)\)的分布,再从分布中采样
    • 但是采样得到的值无法进行反向传播
    • 因此改成神经网络只拟合分布的参数,然后从一个简单的标准多维正态分布中采样,采样值经过拟合参数处理,即\(z = \mu _e + \sigma