本系列是自己看完李毅宏老师的GAN系列教程后整理的笔记,有错误的地方请指正。
生成(Generation)
什么是生成?就是模型通过学习一些数据,然后生成类似的数据。简单地说,喂给模型哪种类型的数据,然后让模型产生这种类型的数据。
GAN的原理
[... ...]
为什么generator不能自己学习?
为什么generator要听从discriminator的指导,自己不能自主学习生成数据呢?为了弄清这个问题,首先先了解一下generator是怎么回事。
实际上,G的学习可以简单的用如下表示:
- 输入:一个向量
-
输出:图片(当然也可以是结构化是数据,这里以图片为例子)
image.png
只要给定相应的数据,上面这个模型当然可以进行训练。但是正常情况下我们只有一些图片数据,如下图所示:
![](https://img.haomeiwen.com/i13326502/2111c87bea9ed58a.png)
因此,现在需要对每一张图片赋值一个向量,以达到监督学习的目的。假设对每一张图片赋予的向量如下:
![](https://img.haomeiwen.com/i13326502/d641883a68b506c1.png)
如果我们能获得这样的数据集,显然generator就能自己做训练了。
但是,目前的问题是如何来产生每一个图片所对应的向量呢?
-
随机生成。(×)
随机生成的向量之间没有联系,然而数据集中的图片正常情况下是有一定联系的。比如下面两张图片。我们希望向量在某种程度上表示这图片的特征,譬如向量中第一个维度表示图片是哪些数子,第二个维度表示图片中的数字是向右倾斜还是向左倾斜。显然这个关系是无法用随机生成的。
image.png
-
学习出向量与图片之间的关系。
现在想知道一张图片对应的向量该如何表示,即实际上我们想找到这么一个函数:
image.png
上图所示的结构恰好能帮我们来寻找图片和对应的向量之间的关系。中间部分把它叫做Encoder,即表示把一个结构化数据经过编码器后,得到一个低维的、能表示原来数据的向量。
但是要如何训练呢?每一张图片对应的code还是不知道。这就要引出一个经典的模型:Auto-encoder
![](https://img.haomeiwen.com/i13326502/3d1a59a511d1420a.png)
实际上,上图结构中后面三个部分就是一个Generator,上图模型训练结束后,就可以把后面三个部分抽出来。然后就可以根据任意一个向量,输出到Decoder里面去,得到一张图片。
然而,这么做还是一些问题存在。
![](https://img.haomeiwen.com/i13326502/5799bbe6ee3a97f8.png)
假如向量a输出一个向左倾斜的数子1,向量b输出一个向右倾斜的数字1,那么0.5a+0.5b是不是应该输出一个接近垂直的数字1?显然答案并不是。因为Decoder中的神经网络是一个非线性函数,输入的线性加成并不能导致结果的线性加成。
于是,便有人提出了一个改进:Variational Auto-encoder (VAE)。 VAE的想法是在训练模型时,增加一点噪声干扰,但仍希望模型能产生出正确的图片。正是在训练时加入了噪声,会使得训练出来的模型更具稳定性。
那么,讲到这里,是不是就可以得出结论:Generator可以自己学习,模型就是VAE。没错,Generator是可以自己学习,但是现存的VAE模型也有比较严重的缺点。
![](https://img.haomeiwen.com/i13326502/a230d83e0ae3717e.png)
左边是gt,右边是模型输出结果,其中,右上角的图片的误差显然比右下角的图片的误差要高,然而从结果上看,右上角的图片我们是可以接受的,而右下角的图片是不能接受的。因此,实际上VAE方法只能学习单个像素,它能指导某一个像素是不是要高亮,但不关心该像素周围的其他像素。然而实际上我们最终想得到的数据是一个结构化的数据,输出的数据里的每一个组件跟其他组件是有联系的。这也就是用GAN不用单独generator的原因了。
网友评论