1.AE(AutoEncoder)
上图是自编码器模型(AE)的示意图,想要让一个网络模型生成图片,很自然的可以想到上面的结构,我们利用一个编码器(Encoder)将训练图像压缩成一个向量,再利用解码器(Decoder)将这个压缩出来的向量还原成一幅图片,那么我们就能得到一个生成图片的模型了,显然这也是可以训练的,损失函数可以取原图与生成图之间的均方误差(MSE)
2. AE的问题
这里可以看到在AE中,把Decoder拿出来,我们就能通过构造隐含变量来让网络画图了。
这可行吗,当然不行,首先隐含变量是网络训练出来的,你根本不知道怎么来构建这个隐含变量,对于人来讲,这是个分布函数未知的随机变量。
哪我们不是还有Encoder吗,我们通过喂给他图片,让他来生成新图。这可行吗,似乎有点道理,但要注意到我们如果使用原始图片与生成图片之间的均方误差来训练模型,那么新的图片和原始图片相比几乎是没有差别的,那么我们训练这个模型有什么意义。
3.新的假设
根据以上问题,我们想要改进模型,那么我们就要给他加上条件。
首先,我们希望能够甩开Encoder,让隐含变量变得有规律。
其次,我们希望模型能够给我们带来惊喜,也就是不希望模型输入什么就得到什么。
那我们给新的模型加上一些人为的条件吧。
第一点,我们限制隐含变量服从一个标准正态分布 N(0,1)。
第二点,我们让Encoder不再输出一个固定的值,而是让它输出一个正态分布的参数,也就是中的μ和。
好了,条件加完了,训练也进行不下去了,你会发现,编码器和隐含变量之间的联系断开了,编码器构建的是一个概率密度函数,而隐含编码需要的是一个值。
怎么办?采样!隐含变量从由Encoder给出的正态分布里采样得到,也就是重参数。代码怎么实现呢,这里有个技巧,那就是用Encoder给出的均值矩阵,加上用Encoder给出的方差矩阵生成的均值为0的新矩阵。
至此,我们的新模型就构建好了。
4.Loss
新模型的理论部分已经构建完毕,那么剩下的就是根据理论构建新Loss。
具体推导不是本文的重点。
最后的公式
公式十分简单,求原图片与生成图片的均方误差加上一个正则公式令生成模型的Encoder产生均值为0方差1的概率密度函数。
参考:
一文理解变分自编码器(VAE) - 知乎 (zhihu.com)