对抗网络——GAN
人脸检测,图像识别,语音识别等等,人类或者机器总是在现有的事物的基础上做出描述和判断,那么大家考虑一个东西,能不能创造出这个世界上不存在的东西?——————————GAN(生成对抗网络)
GAN主要包含三个部分:生成,判别和对抗
生成和判别是两个独立的模块
生成器:负责使用随机向量产生内容,这些内容可以是图片,文字等等
判别器:负责判断接受到的内容是否是真实的
他会给出一个概率,代表内容的真实程度,那么生成器和判别器分别使用什么呢?没有规定,只要能够处理就可以,比如如果是图片任务就可以选择CNN,如果是文字类型的就可以使用RNN
对抗:这指的是GAN的交替训练的过程,先使用生成器生成一些假信息,和收集到的真的信息,一同交给判别器,让判别器学习区分两者,给真的高分,给假的低分,当判别器能够熟练判别这些信息的时候,再让生成器从判别器这个地方,获取高分为目标,不断的生成越来越好,越来越真实的信息,直到能骗过判别器,重复进行这个过程知道判别器分辨不出真假信息,这个时候就停止训练。
事例:
我们做GAN网络最终要达成的目标就是要训练最终一个很好的Generator生成器
其实想说明的意思呢,就是这个生成器,说白了就是要给网络,神经网络,当然也可以是全连接欸,只要能达到一个这样的目的:输入一个向量,经过这个生成器的网络,能获得到一张图片或者一句话。
生成器和判别器的异同点:
相同点:
这两个模型都可以看成是一个黑匣子,接受输入然后有一个输出,类似一个函数,一个输入输出映射。
不同点:
生成模型功能:比作是一个样本生成器,输入一个样本,然后把它包装成一个逼真的样本,也就是输出。
判别模型:比作一个二分类器(如同0-1分类器),来判断输入的样本是真是假。(就是输出值大于0.5还是小于0.5)
判别网络的目的:就是能判别出来属于的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,网络输出接近0,那么很完美,达到了很好判别的目的。
生成网络的目的:生成网络是造样本的,它的目的就是使得自己造样本的能力尽可能强,强到什么程度呢,你判别网络没法判断我是真样本还是假样本。
那么最终生成对抗网络我们想让谁赢?肯定是想让生成模型赢。
注意生成模型和判别模型是两个完全独立的模型,就好像两个完全独立的神经网络一样,在训练的阶段交替互相训练。
假设现在生成网络模型已经有了(可能不是最好的生成网络),那么给一堆随机数组,就会得到一堆假的样本集(因为不是最终的生成模型,那么现在生成网络可能就处于劣势,导致生成的样本就不咋地,可能很容易就被判别网络判别出来了说这货是假冒的),但是先不管这个,假设我们现在有了这样的假样本集,真样本集一直都有,现在我们人为的定义真假样本集的标签,因为我们希望真样本集的输出尽可能为1,假样本集为0,很明显这里我们就已经默认真样本集所有的类标签都为1,而假样本集的所有类标签都为0.
有人会说,在真样本集里面的人脸中,可能张三人脸和李四人脸不一样呀,对于这个问题我们需要理解的是,我们现在的任务是什么,我们是想分样本真假,而不是分真样本中那个是张三label、那个是李四label。况且我们也知道,原始真样本的label我们是不知道的。回过头来,我们现在有了真样本集以及它们的label(都是1)、假样本集以及它们的label(都是0),这样单就判别网络来说,此时问题就变成了一个再简单不过的有监督的二分类问题了,直接送到神经网络模型中训练就完事了。假设训练完了,下面我们来看生成网络。
对于生成网络,想想我们的目的,是生成尽可能逼真的样本。那么原始的生成网络生成的样本你怎么知道它真不真呢?就是送到判别网络中,所以在训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的。什么意思?就是如果我们单单只用生成网络,那么想想我们怎么去训练?误差来源在哪里?细想一下没有,但是如果我们把刚才的判别网络串接在生成网络的后面,这样我们就知道真假了,也就有了误差了。所以对于生成网络的训练其实是对生成-判别网络串接的训练,就像图中显示的那样。好了那么现在来分析一下样本,原始的噪声数组Z我们有,也就是生成了假样本我们有,此时很关键的一点来了,我们要把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本。
那么为什么要这样呢?我们想想,是不是这样才能起到迷惑判别器的目的,也才能使得生成的假样本逐渐逼近为正样本。好了,重新顺一下思路,现在对于生成网络的训练,我们有了样本集(只有假样本集,没有真样本集),有了对应的label(全为1),是不是就可以训练了?有人会问,这样只有一类样本,训练啥呀?谁说一类样本就不能训练了?只要有误差就行。还有人说,你这样一训练,判别网络的网络参数不是也跟着变吗?没错,这很关键,所以在训练这个串接的网络的时候,一个很重要的操作就是不要判别网络的参数发生变化,也就是不让它参数发生更新,只是把误差一直传,传到生成网络那块后更新生成网络的参数。这样就完成了生成网络的训练了。
在完成生成网络训练好,那么我们是不是可以根据目前新的生成网络再对先前的那些噪声Z生成新的假样本了,没错,并且训练后的假样本应该是更真了才对。然后又有了新的真假样本集(其实是新的假样本集),这样又可以重复上述过程了。我们把这个过程称作为单独交替训练。我们可以实现定义一个迭代次数,交替迭代到一定次数后停止即可。这个时候我们再去看一看噪声Z生成的假样本会发现,原来它已经很真了。
看完了这个过程是不是感觉GAN的设计真的很巧妙,个人觉得最值得称赞的地方可能在于这种假样本在训练过程中的真假变换,这也是博弈得以进行的关键之处。