从对抗样本说起
下图是一个有趣的例子。最左边是一个熊猫的图片,也能被模型正确地分类(57.7%的置信度),但稍微加了一点点干扰后,新的图片人眼看上去几乎无差异,但模型立马就(十分肯定地)把它分到了长臂猿。
![](https://i-blog.csdnimg.cn/blog_migrate/53a4077cb51c3818842a2fd85edc3f15.webp?x-image-process=image/format,png)
这在某种程度上说明了很多模型在训练的时候并没有学到数据的内在表达,而更多的是学到了跟分类相关的某种模式以最小化目标函数而已。
平均化效益
下图说明了在多模态形式场景,对抗训练的优越性。左图是需要预测的真实图片,中间图片是基于大量样本最小化均方差的图片,右图是对抗网络生成的图片。对比可以发现,对于很多模型来说,最小化均方差往往意味着平均化,往钟型曲线的中部靠拢,而对于样本是多模态的场景则并不适用。
![](https://i-blog.csdnimg.cn/blog_migrate/61413aff54dd2153e497c81b6b065f7b.webp?x-image-process=image/format,png)
上述两个例子表明,在通过样本学习真实数据分布的时候,引入对抗机制是可能的方向之一。
GAN的家谱
生成式对抗网络 (Generative Adversarial Nets,GAN) 在16的NIPS大放异彩,成为神经网络最受关注的技术之一, 但数典归宗,GAN还是在生成式模型的大门派里。 这是Ian Goodfellow给谱的家谱。按Ian的分法,(基于最大似然的)生成式模型本质上都是通过样本来学习真实数据的概率分布P_data,进而使用学到的概率分布P_model来生成新的样本,当然期望P_data和P_modal的偏差尽可能小。
![](https://i-blog.csdnimg.cn/blog_migrate/c99e654c39afe7488c131349b828171a.webp?x-image-process=image/format,png)
在有些情况下,p_model的密度函数是可以显式地(或近似地)表示出来,这就是图中左边的模型,包括前几年炙手可热的变分自解码(Variational Autoencoder,VAE)和玻尔兹曼机,VAE最大的问题在于需要有个预设先验分布,这一点会带来许多桎梏,Ian就提到,对于VAE来讲,先验弄的不好,后面做的再好也是白搭,“路线错了,知识越多越反动”。在图的右边是无法显式表达密度函数的模型,其中GAN和马尔科夫链不同之处在于,马尔科夫链需要多轮运行才能生成一个样本,此外,对于高维空间的计算也十分困难。
左右互搏的哲学
大道至简,GAN的思想其实十分朴素:
有一对模型,一个生成模型(G)生成假样本,最好是六耳猕猴,直叫众人真假难辨;一个判别模型(D)识别假样本,最好是火眼金睛,敢让赝品无所遁形。
![](https://i-blog.csdnimg.cn/blog_migrate/4e3b2762bafc9a790c22cb65b967f98e.webp?x-image-process=image/format,png)
那么GAN的训练过程就变成了生成模型(G)和判别模型(D)之间的竞争过程——随机从真实样本和由生成模型(G)生成出的“假样本”中取一个,让判别模型(D)去判断是否为真。把这个问题,转化为了一个博弈的问题。利用纳什均衡来得到最终的目标函数:
![](https://i-blog.csdnimg.cn/blog_migrate/6315248aa3d2b7b75e5f9139fadc4aa7.webp?x-image-process=image/format,png)
其实这个思想韩非子两千年前也给我们举了个例子,说不定当时的匠人已经学会用对抗训练的方法来打造他的矛和盾。
![](https://i-blog.csdnimg.cn/blog_migrate/b0b8e98d34f89f31cb35a7114e165e55.webp?x-image-process=image/format,png)
GAN的演进
由上可以看到简单GAN其实非常“自由”:首先生成模型(G)生成的分布很可能只是样本分布空间中的一个子流形,并没有逼近真实分布;其次判别模型很有可能只需要一个简单分类,区分这个子流形和真实样本分布就可以。因此,一些新的工作就通过加一些限制以改善GAN的效果。另外,最近也有一些工作是在GAN的序列化改进上。
![](https://i-blog.csdnimg.cn/blog_migrate/edbb9cbcd677b3402eb01e22281db1d0.webp?x-image-process=image/format,png)
一些有趣的应用
看到下图是不是联想到在word2vec里面的词语运算?
![](https://i-blog.csdnimg.cn/blog_migrate/10dd298902ed047f28bd953ae88d23c9.webp?x-image-process=image/format,png)
在GAN中也可以实现图片的运算了。在左边首先通过三张图片生成一个特定样本,比如戴眼镜的男性,不戴眼睛的男性,不戴眼镜的女性,再通过GAN的隐空间里实现图片的加减法,生成带眼睛的女性图片。
另外一个直接应用就是文字生成图像:
![](https://i-blog.csdnimg.cn/blog_migrate/2013fc2f2709db61fa4a4cd55f80e506.webp?x-image-process=image/format,png)
这其实就是带有限制条件的GAN,只是这里的限制是文本信息,以加强生成图片和文本之间的关联。
GAN在文本应用的难点
Ian本尊曾经在reddit上参与GAN应用到自然语言处理中(NLP)的讨论,他的看法是由于在对抗训练中,扰动通常都是通过对实值数据细微的修改产生,这一点在图片中易于实现,因为图片本身即是以连续实值矩阵的形式存储在计算机中。但文本基础单元(字、词)的表示通常是离散的,例如,无法知道“企鹅”+0.01是个什么词,即便将“企鹅”嵌入成连续向量,这个向量的细微修改很有可能根本不能对应到任何词汇,亦即无法生成一个伪造的自然语言样本。这是在NLP中直接应用GAN的最大阻碍。
![](https://i-blog.csdnimg.cn/blog_migrate/10f36182da49101284c7470cfd22bafa.webp?x-image-process=image/format,png)
当然最近也有一些工作,通过间接的方式运用GAN到NLP中,例如,先将文本向量化,将GAN作为中间层,然后再接入RNN,这样即便GAN产生的扰动无法对应到真实世界里的文本,但对于RNN来说这一点关系不大。
![](https://i-blog.csdnimg.cn/blog_migrate/42b95655054d8dd7cac156822c4d659a.webp?x-image-process=image/format,png)