Variational Auto-Encoders又称为变分自编码器,要想学习它,首先需要弄清楚Autoencoder自编码器到底是个什么东西。我从MIT 6.S191中的Deep Generative Models课程中大受启发,感兴趣的朋友可以去看看,这里就附上课程链接:http://introtodeeplearning.com/,另外有篇关于VAEs的文章写得也很不错,本文由参考,附上连接可以自己看看:https://spaces.ac.cn/archives/5253。
Autoencoder又称为自编码器,是一种无监督的学习算法,也就是说,输入X时候我们并不知道X的label是什么,我们要通过此学习算法,学习输入X的低维度特征,重构原始的无标签数据X。如果你觉得有点难理解,来看图:
这里给出了一个图像,上面写了一个“Z”,但是要记住,此时是无监督学习,因此我们仅仅知道输入的X是一张图片,并不知道上面写了什么。接着,我们把这张图像输入到卷积层,通过卷积层输出潜在变量“z”,也就是将一张图片(一堆像素)编码成了一个字符“z”(一个低维度的数据)。
这称之为“encoder”(编码器)。为了方便理解,我们需要明确几个问题。
根据这种思路,我们补充一下模型:
我们引入了“decoder”(译码器),decoder的功能与encoder相反,它能帮助我们基于潜在变量重新构建出一张图片。
我们把输入的原始图片设为x,生成的图片设为x~,表示它的重构版本。
我们希望x与x~尽可能相同,因此设置损失函数Loss如下:$$ \mathcal{L}(x, \hat{x})=\|x-\hat{x}\|^{2} $$ 通过设置这种端到端的传播以及损失函数,我们可以尽可能地得到图片中的所有潜在变量,尽可能还原出原始图像。
这里要注意:潜在变量的维度大小将决定重建图片的质量。维度过低会限制生成图片的质量!来,看图。
所以说,Autoencoding也可以作为一种压缩方式!
变分自编码器实际上就是在自编码器上进行拓展。
我们先稍微回顾一下Autoencoder,对于同一张图片,他始终只能有一个输出,因为他的潜在变量z是永远不变的。
对比上图,VAEs实际上在找潜在变量的时候并不是一个确定的值,而是一个基于μ和σ的一个概率分布。因此,由于潜在变量不同,对于同一张图片的输入,我们生成的结果可能并不是一样的。
reconstruction loss是指重建模型的损失,通常跟autoencoder的损失函数相同,regularization term常用来确保我们计算的潜在变量遵循着我们定义的一些先验分布。
D:代表着两个分布的距离,P(z):代表z的先验分布。我们希望这两个分布尽可能接近!
这里我们选择使用KL散度(KL散度又称为相对熵,计算结果越趋于0,二者越接近)来描述两个分布的差异,具体公式如下:
既然已经表示出两个分布的差异程度,那么作为正则项,他起到的作用就是最小化差异,最小化正则项。
接下来,这里我们将z的先验分布设置成期望为0,方差为1的高斯分布:
但是,出大问题!我们这里如果把z表示成符合某种高斯分布的情况下,z的表达式如下:
发现如果这么表达z,无法做到后向传播!因为“采样”的操作是不可导的!!而采样的结果是可导的。
因此我们利用:
可以发现,(z−μ)/σ=ε 是服从均值为0,方差为1的标准正态分布的!因此,我们发现,从N(μ,σ2) 中采样一个Z,相当于从 N(0,I) 中采样一个ε,然后让 Z=μ+ε×σ 。通常我们把这一步称为“重参数技巧”。
因此,我们重新定义z,把μ和σ看成固定向量,同时σ与从先验分布中提取的随机常数相乘,表达式如下:
因此,当我们固定其他变量时,仅仅增加或者减少单个潜在变量,我们可以得到类似的结果:
我们看这个图片会觉得很自然,变化得很平滑,原因是这个潜在变量遵循着高斯分布,这仅仅是单个潜在变量的训练结果,如果在训练中有许多不同的潜在变量,当然,理想情况下我们希望这些潜在变量都是独立互不相干的,以便我们可以沿着我们固定的维度上走,观察到不同的表达。如图,这有两个潜在变量,一个是笑容,另一个是头的角度,我们完全可以做到通过扰动这两个数字完成微笑和头的角度的自定义。
我们来看看整体结构: