怎么理解生成模型VAE?( 二 )


怎么理解生成模型VAE?

文章插图
变分自动编码器的厉害之处
假设你正在开发一款开放性世界端游 。且游戏里的景观设定相当复杂 。
你聘用了一个图形设计团队来制作一些植物和树木以装饰游戏世界 。但是将这些装饰植物放进游戏中之后 。你发现它们看起来很不自然 。因为同种植物的外观看起来一模一样 。这时你该怎么办呢?
首先 。你可能会建议使用一些参数化来尝试随机地改变图像 。但是多少改变才足够呢?又需要多大的改变呢?还有一个重要的问题:实现这种改变的计算强度如何?
这是使用变分自动编码器的理想情况 。我们可以训练一个神经网络 。使其学习植物的潜在特征 。每当我们将一个植物放入游戏世界中 。就可以从“已学习”的特征中随机抽取一个样本 。生成独特的植物 。事实上 。很多开放性世界游戏正在通过这种方法构建他们的游戏世界设定 。
再看一个更图形化的例子 。假设我们是一个建筑师 。想要为任意形状的建筑生成平面图 。可以让一个自动编码器网络基于任意建筑形状来学习数据生成分布 。它将从数据生成分布中提取样本来生成一个平面图 。详见下方的动画 。
怎么理解生成模型VAE?

文章插图
对于设计师来说 。这些技术的潜力无疑是最突出的 。
再假设我们为一个时装公司工作 。需要设计一种新的服装风格 。可以基于“时尚”的服装来训练自动编码器 。使其学习时装的数据生成分布 。随后 。从这个低维潜在分布中提取样本 。并以此来创造新的风格 。
在该节中我们将研究fashion MNIST数据集 。
怎么理解生成模型VAE?

文章插图
自动编码器
传统自动编码器
自动编码器其实就是非常简单的神经结构 。它们大体上是一种压缩形式 。类似于使用MP3压缩音频文件或使用jpeg压缩图像文件 。
怎么理解生成模型VAE?

文章插图
自动编码器与主成分分析(PCA)密切相关 。事实上 。如果自动编码器使用的激活函数在每一层中都是线性的 。那么瓶颈处存在的潜在变量(网络中最小的层 。即代码)将直接对应(PCA/主成分分析)的主要组件 。通常 。自动编码器中使用的激活函数是非线性的 。典型的激活函数是ReLU(整流线性函数)和sigmoid/S函数 。
网络背后的数学原理理解起来相对容易 。从本质上看 。可以把网络分成两个部分:编码器和解码器 。
怎么理解生成模型VAE?

文章插图
编码器函数用?表示 。该函数将原始数据X映射到潜在空间F中(潜在空间F位于瓶颈处) 。解码器函数用ψ表示 。该函数将瓶颈处的潜在空间F映射到输出函数 。此处的输出函数与输入函数相同 。因此 。我们基本上是在一些概括的非线性压缩之后重建原始图像 。
编码网络可以用激活函数传递的标准神经网络函数表示 。其中z是潜在维度 。
怎么理解生成模型VAE?

文章插图
相似地 。解码网络可以用相同的方式表示 。但需要使用不同的权重、偏差和潜在的激活函数 。
怎么理解生成模型VAE?

文章插图
随后就可以利用这些网络函数来编写损失函数 。我们会利用这个损失函数通过标准的反向传播程序来训练神经网络 。
怎么理解生成模型VAE?

文章插图
由于输入和输出的是相同的图像 。神经网络的训练过程并不是监督学习或无监督学习 。我们通常将这个过程称为自我监督学习 。自动编码器的目的是选择编码器和解码器函数 。这样就可以用最少的信息来编码图像 。使其可以在另一侧重新生成 。
如果在瓶颈层中使用的节点太少 。重新创建图像的能力将受到限制 。导致重新生成的图像模糊或者和原图像差别很大 。如果使用的节点太多 。那么就没必要压缩了 。
压缩背后的理论其实很简单 。例如 。每当你在Netflix下载某些内容时 。发送给你的数据都会被压缩 。一旦这个内容传输到电脑上就会通解压算法在电脑屏幕显示出来 。这类似于zip文件的运行方式 。只是这里说的压缩是在后台通过流处理算法完成的 。
去噪自动编码器
有几种其它类型的自动编码器 。其中最常用的是去噪自动编码器 。本教程稍后会和Keras一起进行分析 。这些自动编码器在训练前给数据添加一些白噪声 。但在训练时会将误差与原始图像进行比较 。这就使得网络不会过度拟合图像中出现的任意噪声 。稍后 。将使用它来清除文档扫描图像中的折痕和暗黑区域 。

推荐阅读