一、GAN的组成
首先,生成对抗网络(GAN Generative Adversarial Nets)由生成器(Generator)和鉴别器(Discriminator)构成。
1、关于生成器Genertor的基本认识
生成器:输入一些向量(Vector)经过生成器可以生成希望得到的图像或者语句。
比如下面这张图中,首先我输入一个向量,生成器生成的图像可以看做是高维度的向量,输入第一个向量(左上)得到第一张二次元人物头像。一般来说,每个参数都代表着图像的不同特征,假设第一个参数代表头发的长度,把第一个数从0.1修改为3,则生成的人物头像就成了长发;类似的,假设倒数第二个参数代表头发蓝色的深浅度,则把倒数第二个数从2.4修改为5.4,生成的人物头像的发色就成了深蓝色;最后,假设最后一个参数表示人物头像嘴巴的大小,把最后一个数从0.9修改为3.5,生成的人物头像嘴巴就张大了。
2、关于鉴别器Discriminator的基本认识
鉴别器:输入图片经过鉴别器以后会得到一个数值(scalar),鉴别器输出的数值越大表示这个输入图片越接近真实。
比如下面这张图中,我需要画出二次元人物头像,分别输入第一行的两张图片得到的输出数值都为1,表明头像画得很好,而分别输入第二行的两张图片得到的输出数值都为0.1即表明图像表现很差,一般来说把输出值为1.0看做是最大值。
3、Generator和Discriminator之间的关系
如下图所示,第一代生成器生成的图片输入到鉴别器中,鉴别器会将输入图片与真实图片(即给定数据集中的图片)进行比较,输出一个数值返回给生成器,第一代生成器会不断学习调整直到生成的图片能够“欺骗”过第一代鉴别器,即进化成第二代生成器;而与此同时,第一代鉴别器也进行相应的学习调整进化成第二代鉴别器,第二代生成器要实现的目标仍然是不断学习直到能够“欺骗”过第二代鉴别器,就是在生成器和鉴别器不断的学习和对抗的过程中,网络最终能很好地学习给定数据集的特征,输出所需要的内容。
生成器和鉴别器可以说是“亦敌亦友”的关系,它们相互对抗却也相互成就。
二、算法步骤
初始化生成网络和鉴别网络,每次训练迭代的步骤:
Step1:固定生成器的参数同时更新鉴别器的参数。
首先随机采样的向量输入生成器网络,输出的图像表现一般都很差,同时把从数据集中采样的图像与生成器输出的图像通过鉴别器进行比较,鉴别器不断学习调整自身的参数,直到能够达到以下的类似效果:输入数据集中采样的图像返回值接近为1而输入表现较差的生成器网络生成的图像则返回值接近为0。
Step2:固定鉴别器的参数同时更新生成器的参数。
上一步已经更新好了鉴别器的参数,也就是说此时的鉴别器能够比较好得去给输入的图像一个可靠的输出值来评判输入图像接近真实值的程度。而这步需要做的是生成器根据鉴别器输出的值再不断进行调整学习,使得鉴别器输出的值越来越高,也就是上面说的直到生成器输出的图像能够“欺骗”过鉴别器。
事实上生成器和鉴别器串联起来可以看做是一个大的神经网络,即输入向量经过这个神经网络输出一个数值,而生成器在这其中生成的图片类似于神经网络中的隐藏层,假设生成器和鉴别器都是五层网络构成,则这个大的神经网络就是十层,我们做的实际上就是先固定前面隐层的参数调整后面的参数,再固定后面的参数调整前面的参数。而固定的原因是:如果没有固定,则机器会自动只调整最后连接输出值那层的参数以实现输出值越来越大的结果。
三、为什么生成器不可以自己学习?而需要鉴别器和它进行对抗训练呢?
机器学习需要学习如何规划,即拥有整体的意识。就像生成器生成图片,其实是通过划分及学习图片的组成部分再输出整体。所以如果生成器自己学习而没有鉴别器进行对抗训练,那么它很难学习到图片组成部分之间的正确联系,只能单独地学习每个组成部分的特征对应的参数。
机器学习的学习规划意识
机器处理图片的方式:编码-输出向量-解码