一、GAN概述
-
GAN可让机器做的事:生成图像、句子、诗、文章…
-
GAN的样子:(假设我们要生成的是图像)
输入(vector)—>生成器(Genarator)—>Genarator输出Image,并输入—>判别器(Discrominator)—>输出数值(scalar)
注释:
(1)输入向量的每一维代表图像的一个特征。
(2)我们要生成什么,就让Genarator输出什么,就喂Discriminator吃什么。
(3)Discriminator输出的数值代表Image的质量。数值越大,质量越好。
-
训练目的:使从某种分布中随机采样的向量生成的图像的分布越接近数据库中图像的分布越好。
-
GAN名字的由来:GAN之所以叫生成对抗网络,是因为它在14年首次被提出时,论文里举的例子是印假钞的坏人和警察之间的对抗。
二、GAN举例
-
Gennerator和Discriminator的关系就好像猎食者和被猎食者。这里举一个枯叶蝶和麻雀的例子。
枯叶蝶: V1(彩色) —> V2(棕色) —> V3(叶脉纹路)
麻雀 : V1(吃彩色) —> V2(吃没有叶脉纹路) —> V3—>在对抗中不断进化
- 生成人像的例子。
(1)我们想要生成人像,首先我们就需要一个包含很多真实人像图片的数据库。
(2)
Generator: V1(生成噪声点) —> V2(生成彩色图像) —> V3(生成有嘴巴的图像)
Discriminator: V1(根据有无颜色判断是否是人像) —> V2(根据有无嘴巴判断是否是人像) —> V3
(3)Discriminator会不断进化,那么Generator就会产生越来越真实的人像图片了。
三、GAN的运作
-
首先初始化Generator和Discriminator网络的参数θ_g和θ_d。
-
迭代训练:
(1)固定Generator的参数θ_g不变,训练Discriminator的参数θ_d。
1)让Generator产生m张图片,再从数据库中采样m张图片。
2)把Generator产生的这些图片和数据库中采样出的m张图片丢到Discriminator里面训练。让Discriminator给Generator产生的图片低分(接近0),给数据库中的图片高分(接近1)。
(2)固定Discriminator的参数θ_d不变,训练Generator的参数θ_g。
1)让Gennerator产生的图片丢到Discriminator中能得到高分。
(实际上我们训练的时候是把Gennerator和Discriminator合起来当成一个网络,网络的最终输出是一个数值。训练Discriminator的时候相当于固定前面几个隐藏层,训练后面几个隐藏层;训练Gennerator的时候相当于固定后面几个隐藏层,训练前面几个隐藏层)
四、GAN算法
-
初始化Generator和Discriminator网络的参数θ_g和θ_d。
-
训练Discriminator:
1)从数据库中采m个样本向量:{x1 x2 … xm}
2)从高斯分布中采m个样本向量:{z1 z2 … zm}
3)Generator根据高斯分布中采样的m个样本,生成m张图片{x~1 x~2 … x~m } x~i = G(zi)
4)更新Discriminator的参数θ_d:
最大化 V~ = (1/m) [ ΣlogD(xi) + Σlog(1-D(x~i)) ]
更新 θ_d <— θ_d + lr*dV~(θ_d) (梯度上升) -
训练Generator:
1)从高斯分布中采m个样本向量:{z1 z2 … zm} (不需要和前面一样的向量)
2)更新Generator的参数θ_g:
最大化 V~ = (1/m) ΣlogD(G(zi))
更新 θ_g <— θ_g + lr*dV~(θ_g)