生成对抗网络是最近几年的热门研究方向,最近因为需要采用生成对抗网络对语音信息进行数据增广、增强处理,对一些论文进行了总结,如有不对之处,请大家多多指正。
生成对抗网络
生成对抗网络GAN(Generative adversarial networks)是在2014年由Ian Goodfellow大牛基于博弈论提出的,原文。如下图所示,生成对抗网络由两部分组成:生成器(Generator,G)和判别器(Discriminator,D)。生成器接收一个随机噪色,通过生成模型(一般为神经网络)生成一个假的样本。而判别器的输入为一个样本,通过判别网络判断这个输入的样本是来自于真实的数据还是由生成器生成的假数据。通过训练,判别器会给真实样本输出尽可能大的概率值,给生成样本尽可能小的概率值,而生成器会不断学习真实样本的数据分布,生成尽可能真的数据,直到判别器也无法判别这个样本是真实样本还是由生成样本(判别器的输出概率为0.5),即达到纳什平衡。
损失函数
由上面的描述可知,生成判别网络训练的时候,对于真实样本,判别器的输出越大越好(接近于1),即D(x)越大越好,而对于由生成器生成的样本,判别器的输出越小越好,即D(G(z))越小越好,但这两者是矛盾的,因此为了统一表示,将生成样本对应的判别器输出改写为1-D(G(z)),这样就能将这两者统一进行优化了,其损失函数可表示为:
这是一个最大最小优化,即包含了判别模型的优化,又包含了生成模型以假乱真的优化。
训练过程
因为生成对抗网络中生成模型和判别模型是两个完全独立的模型,不能够同时进行训练,因此采用单独交替迭代训练。下面分别介绍生成器和判别器的训练过程,这里参考博客的表述。
对于判别器,将真实样本的标签标记为1,将生成样本的标签标记为0,不管生成样本的质量如何。这其实就是一个二分类问题,直接送到神经网络里面进行分类就行了。
对于生成器,我们训练的目的是为了尽可能逼近真实的样本。那如何判别生成器生成的样本真不真,只能拉到判别器去遛遛。因此在训练生成器的时候需要联合判别器一起训练。那有一个问题,如何迷惑判别器呢?一个简单的方法就是在训练生成器的时候将生成样本的标签标记为1,这样就能达到迷惑判别器的作用。思路比较活跃的人会说,你这不是自欺欺人吗?你训练生成器的时候判别器的模型参数也会发生变化。没错,这非常关键,所以在训练生成器的时候,一个很重要的操作就是在进行梯度更新时不要让判别器的参数发生变化,只是把误差一直传下去。这样就完成了生成器的训练。
重复上述两个训练过程,直到判别器无法判断样本是真是假时停止训练,这样生成器就能够学到真实的数据分布了。
结果分析
在这里展示了原论文的一张图来进行分析:
上图展示的是GAN的生成器如何一步步从均匀分布学习到正太分布的过程。原始数据x服从正态分布,由上图中的黑点表示,蓝线表示判别器,绿线表示的是生成器的数据分布。由上图可知,通过训练,生成器能够有效学习真实样本的数据分布。
参考资料
1 https://arxiv.org/abs/1406.2661
2 https://www.leiphone.com/news/201706/ty7H504cn7l6EVLd.html
3 https://zhuanlan.zhihu.com/p/24767059