2019-06-01(未)

生成(Generation)

什么是生成?就是模型通过学习一些数据,然后生成类似的数据。简单地说,喂给模型哪种类型的数据,然后让模型产生这种类型的数据。

GAN的原理

[... ...]

为什么generator不能自己学习?

为什么generator要听从discriminator的指导,自己不能自主学习生成数据呢?为了弄清这个问题,首先先了解一下generator是怎么回事。

实际上,G的学习可以简单的用如下表示:

  1. 输入:一个向量
  2. 输出:图片(当然也可以是结构化是数据,这里以图片为例子)


    13326502-b08cd6c46ec878ce.png
    image.png

只要给定相应的数据,上面这个模型当然可以进行训练。但是正常情况下我们只有一些图片数据,如下图所示:


13326502-2111c87bea9ed58a.png
image.png

因此,现在需要对每一张图片赋值一个向量,以达到监督学习的目的。假设对每一张图片赋予的向量如下:


13326502-d641883a68b506c1.png
image.png

如果我们能获得这样的数据集,显然generator就能自己做训练了。
但是,目前的问题是如何来产生每一个图片所对应的向量呢?

  • 随机生成。(×)
    随机生成的向量之间没有联系,然而数据集中的图片正常情况下是有一定联系的。比如下面两张图片。我们希望向量在某种程度上表示这图片的特征,譬如向量中第一个维度表示图片是哪些数子,第二个维度表示图片中的数字是向右倾斜还是向左倾斜。显然这个关系是无法用随机生成的。


    13326502-6ddb8887e7ef6e9f.png
    image.png
  • 学习出向量与图片之间的关系。
    现在想知道一张图片对应的向量该如何表示,即实际上我们想找到这么一个函数:

    13326502-6d9810194e0e235d.png
    image.png

上图所示的结构恰好能帮我们来寻找图片和对应的向量之间的关系。中间部分把它叫做Encoder,即表示把一个结构化数据经过编码器后,得到一个低维的、能表示原来数据的向量。

但是要如何训练呢?每一张图片对应的code还是不知道。这就要引出一个经典的模型:Auto-encoder

13326502-3d1a59a511d1420a.png
image.png

实际上,上图结构中后面三个部分就是一个Generator,上图模型训练结束后,就可以把后面三个部分抽出来。然后就可以根据任意一个向量,输出到Decoder里面去,得到一张图片。

然而,这么做还是一些问题存在。

13326502-5799bbe6ee3a97f8.png
image.png

假如向量a输出一个向左倾斜的数子1,向量b输出一个向右倾斜的数字1,那么0.5a+0.5b是不是应该输出一个接近垂直的数字1?显然答案并不是。因为Decoder中的神经网络是一个非线性函数,输入的线性加成并不能导致结果的线性加成。

于是,便有人提出了一个改进:Variational Auto-encoder (VAE)。 VAE的想法是在训练模型时,增加一点噪声干扰,但仍希望模型能产生出正确的图片。正是在训练时加入了噪声,会使得训练出来的模型更具稳定性。

那么,讲到这里,是不是就可以得出结论:Generator可以自己学习,模型就是VAE。没错,Generator是可以自己学习,但是现存的VAE模型也有比较严重的缺点。

13326502-a230d83e0ae3717e.png
image.png

左边是gt,右边是模型输出结果,其中,右上角的图片的误差显然比右下角的图片的误差要高,然而从结果上看,右上角的图片我们是可以接受的,而右下角的图片是不能接受的。因此,实际上VAE方法只能学习单个像素,它能指导某一个像素是不是要高亮,但不关心该像素周围的其他像素。然而实际上我们最终想得到的数据是一个结构化的数据,输出的数据里的每一个组件跟其他组件是有联系的。这也就是用GAN不用单独generator的原因了。

转载于:https://www.jianshu.com/p/2a49edd70def

猜你喜欢

转载自blog.csdn.net/weixin_34235457/article/details/91098864