《智能系统与技术丛书 生成对抗网络入门指南》—3.1.2自动编码器
3.1.2 自动编码器
我们已经了解生成模型其实要做的事情就是让机器学习大量的训练数据,从而具备能够产生同类型新数据的能力。那么现在我们来看一下,究竟有哪些方法可以实现上述功能呢?从本小节开始,我们来看一下实际可用的生成模型。
首先在这里介绍一个叫作自动编码器(auto-encoder)的方法。自动编码器是一种神经网络模型,该模型的最初意义是为了能够对数据进行压缩。如图3-2所示是一个标准的自动编码器,它的基本结构是一个多层感知器的神经网络,从输入层到输出层之间有多个隐层,它的结构特点在于输入层与输出层拥有相同的节点数量,中间编码层的节点数量需要小于输入层与输出层的节点数。
该网络结构希望能够在输出层产生的数据X′良好地还原出输入层的数据X,由于中间的编码层数据z拥有的维度数量低于输入层与输出层的维度,所以如果输出层可以还原输入层的话相当于对输入数据进行了降维,也就是前面所说的数据压缩。
在自动编码器中,我们把输入层到编码层的网络部分(也就是整个神经网络的前半部分)称为编码器,把编码层到输出层的网络部分(图3-2中后半部分)称为解码器。编码器的作用是可以实现数据的压缩,将高维度数据压缩成低维度数据,解码器则可以将压缩数据还原成原始数据,当然由于对数据进行了降维处理,所以在还原的过程中数据会有一些损失。
自动编码器的训练过程需要将编码器与解码器绑定在一起进行训练,训练数据一般是无标签数据,因为我们会把数据本身作为它自身的标签。大致训练过程的伪代码如下。
伪代码1 自动编码器训练过程
while循环输入数据X do
前向传输通过所有隐层,得到输出层数据X′;
计算X′与X的偏差程度;
反向传输误差值,从而更新网络参数;
end while
除了数据压缩的功能以外,研究人员也使用自动编码器来实现生成模型的功能。当我们使用如上训练过程对自动编码器进行了某类型数据的训练后,编码器与解码器分别具备了此类型数据的编码/解码能力。在训练之后,我们可以单独使用解码器作为生成模型,在编码层输入任意数据,解码器都可以产生对应的生成数据。
图3-3展示的是自动编码器在手写数字数据集上的应用,可以看到原始输入数据的手写数字“2”在经过编码器后形成了一组压缩形式的编码,而这项编码经过解码器之后输出了一个与原始数据非常接近的输出图像,虽然有些许模糊,但是基本还原了手写数字“2”的形态。
图3-3 自动编码器在手写数据集上的应用
如图3-3所示,在生成模型的应用中我们仅使用模型的后半部分,当我们对解码器输入任意编码时,解码器会给出相应的输出数据。由于受到训练数据集的限制,生成的数据往往也是与输入数据相关的内容。
我们可以在网络上找到自动编码器的具体实现方法,比如Keras的官方博客给出了自动编码器在Keras上的实现,在这里本书不做过多介绍。
自动编码器看起来似乎是生成模型的一个不错的实现方案,但是在实际使用中存在很多问题,导致自动编码器其实并不太适合用来做数据生成,现在的自动编码器网络结构仅仅能够记录数据,除了通过编码器以外我们无法产生任何隐含编码(latent code)用来生成数据,如图3-4所示。
图3-4 生成模型的应用
还是以手写数字数据集作为例子,对于每一个手写数字我们会产生一个相应的编码,当我们对解码器输入相应的编码的时候往往能够很好还原出当时的手写数字,然而当我们对解码器输入一个训练集中未出现过的编码时,我们可能会发现输出的内容居然是噪声,也就是说与手写数字数据集完全没有关系。这不是我们想要的结果,我们希望生成模型能够对任意的输入编码产生有相关意义的数据。针对这个问题,研究人员提出了自动编码器的升级版本—变分自动编码器(Variational Auto-Encoder,VAE)。
- 点赞
- 收藏
- 关注作者
评论(0)