综述各种各样的GAN:原理及功能

GAN的基本原理

GAN全称为Generative Adversarial Network,即生成对抗网络。基本原理跟造假钞犯罪集团和警察的关系一样,生成器负责生成尽可能逼真的“假钞”,而鉴别器要尽可能甄别出“真钞”和“假钞”,给出一个该样本是真样本的概率(0~1)。所谓道高一尺魔高一丈,两者互相牵制,生成器生成的越来越真,鉴别器越来越难辨别真伪,最终达到以0.5概率辨别真伪的平衡态。

GAN的损失函数

在平衡态,是极大极小博弈的最优点,极大极小博弈中的目标函数是
min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ log ⁡ D ( x ) ] + E z − p z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[\log D(x)]+E_{z-p_{z}(z)}[\log(1-D(G(z)))] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
公式看起来比较复杂,其实可以分为两部分看。首先固定G,看maxD的部分,作为鉴别器,他要做的是要对所有服从真实数据分布pdata(x)的真样本D(x)=1的判断,对所有生成器生成的样本给出D(G(z))=0的判断,这使得V(D,G)最大化,这就是maxD的原因。同理,固定D,只含有D的第一项可以删去,第二项中,生成器的生成样本要尽可能真,即生成器保证D(G(z))尽可能大,即生成器期望第二项尽可能小,所以是minG。

GAN的缺点

  1. 难以训练
    在训练过程中,初始化对模型是否最终能收敛到纳什均衡点来说很关键,因为这是一个高维非凸优化问题。在训练过程中,为了保证模型收敛,在每个回合,应该先训练判别器,再训练生成器。大多数情形下,生成器的进度要比判别器慢。若发现判别器损失降为零,则模型训练肯定是出现了问题。
  2. 模型坍塌问题
    指的是生成器开始单一重复地生成完全一致的图像。可以通过给判别器增加额外特征(批样本之间的距离)来避免这一问题。
  3. 计数和角度问题
    如在人脸合成中,可能计算机会合成三只眼睛的人脸,或者眼睛颜色不同的人脸,这样的人脸在真实世界中不会存在,说明生成器学到的真实样本分布并不全面。

GAN的变体

因为包含上述问题在内的多个问题的存在,GAN的训练并不容易,往往需要很多技巧,因此许许多多GAN的变体也在提出。其中走进更多普通人眼里的要数最近在网络上大火的StyleGAN,每刷新一下网页,就能生成一副逼真的人脸,而现实世界中这个人脸却是不存在的,让不少网民大喊细思极恐。接下来让我们看看GAN的经典变体。

DCGAN

Deep convolutional GAN(论文链接),生成器是一个上采样的过程,也就是小数步长卷积,也就是反卷积(fractional strided convolution).鉴别器就是一个常见的卷积网络。特征100维,图像64643的RGB图像。
主要的特点:

  1. 鉴别器中用步长卷积代替池化层(自学习空间下采样),生成器中用小数步长卷积代替池化层(自学习空间上采样)
  2. 生成器和鉴别器中使用批规范化(BN层)
  3. 消除全连接层,只是用平均值池化(提高模型稳定性,损害收敛速度)
  4. 生成器输出层使用tanh激活函数,其他层用relu;判别器均用leaky relu

关于什么是反卷积,这篇博客中运用矩阵与矩阵转置的乘法,展示了卷积与反卷积的过程与关系。
这里是可视化过程。

CGAN(conditional GAN)

论文链接
条件GAN是指定GAN生成器生成样本的类别y,D(x)和G(x)变成了D(x,y)和G(x,y).目标函数变成
min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ log ⁡ D ( x ) ] + E z − p z ( z ) [ log ⁡ ( 1 − D ( G ( z , y ) , y ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[\log D(x)]+E_{z-p_{z}(z)}[\log(1-D(G(z,y),y))] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z,y),y))]

Wasserstein GAN

论文链接
损失函数
min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ D ( x ) ] − E z − p g ( z ) [ D ( G ( z ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[D(x)]-E_{z-p_{g}(z)}[D(G(z))] GminDmaxV(D,G)=Expdata(x)[D(x)]Ezpg(z)[D(G(z))]
等式右侧表达式又叫Wasserstein距离,这种度量分布的方式,相比传统GAN中用的JS散度(交叉熵),极大缓解了模型坍塌问题。

BEGAN

论文链接
自带自动编码器,也就是说判别器是一个autoencoder的结构包括编码器,解码器,生成器与解码器构造相同,但权重上有差别。(这与后期师兄推荐读的ae+gan的一些组合论文思路很接近,好像只是loss的设计上略有不同。began可能是ae和gan的首次组合使用。)
损失函数
L D = L ( x ) − k t L ( G ( z D ) )    f o r   θ D L G = L ( G ( z G ) )    f o r   θ G k t + 1 = k t + λ x ( γ L ( x ) − L ( G ( z G ) ) )    f o r   e a c h   t r a i n i n g   s t e p   t γ = E [ L ( G ( z ) ) ] E [ L ( x ) ] L = L D + L G L_{D}=L(x)-k_tL(G(z_D)) ~~for~\theta_D\\ L_{G}=L(G(z_G))~~for~\theta_G\\ k_{t+1}=k_t+\lambda_x(\gamma L(x)-L(G(z_G)))~~for~each~training~step~t\\ \gamma = \frac{E[L(G(z))]}{E[L(x)]}\\ L=L_{D}+L_{G} LD=L(x)ktL(G(zD))  for θDLG=L(G(zG))  for θGkt+1=kt+λx(γL(x)L(G(zG)))  for each training step tγ=E[L(x)]E[L(G(z))]L=LD+LG
权重γ的大小是模型生成图片的真实度与多样性能力的调节。
模型允许在每一步同时以对抗方式训练生成器和判别器。
损失函数里面包括1)判别器最小化真实图像的重构损失,2)判别器最大化生成图像的重构损失,以及3)生成器最小化生成图像的重构损失。

cycleGAN

论文链接
cycle consistent generative network,即循环一致生成网络。其核心思想是再没有其它信息辅助条件下,完成从原域到目标域的风格转换。如灰度图变RGB图,斑马变马等。如何实现这样的功能?需要有两个转换器F和G,其中F将图像从域A转为域B,G则相反。而且要保证对于域A中的图像x,期望G(F(x))要与x相同,对另一个域中图像的转换亦然。DX和DY表示区分域A和域B图像的判别器。损失函数:
L G A N ( G , D Y , X , Y ) = E y − p d a t a ( y ) [ log ⁡ D Y ( y ) ] + E x − p d a t a ( x ) [ log ⁡ ( 1 − D Y ( G ( x ) ) ) ] L c y c ( G , F ) = E x − p d a t a ( x ) [ ∣ ∣ F ( G ( x ) ) − x ∣ ∣ 1 ] + E y − p d a t a ( y ) [ ∣ ∣ G ( F ( y ) ) − y ∣ ∣ 1 ] L = L G A N ( G , D Y , X , Y ) + L G A N ( G , D X , Y , X ) + λ ∗ L c y c ( G , F ) L_{GAN}(G,D_Y,X,Y)=E_{y-p_{data}(y)}[\log D_Y(y)]+E_{x-p_{data}(x)}[\log(1-D_Y(G(x)))]\\ L_{cyc}(G,F)=E_{x-p_{data}(x)}[||F(G(x))-x||_1]+E_{y-p_{data}(y)}[||G(F(y))-y||_1]\\ L=L_{GAN}(G,D_Y,X,Y)+L_{GAN}(G,D_X,Y,X)+\lambda*L_{cyc}(G,F) LGAN(G,DY,X,Y)=Eypdata(y)[logDY(y)]+Expdata(x)[log(1DY(G(x)))]Lcyc(G,F)=Expdata(x)[F(G(x))x1]+Eypdata(y)[G(F(y))y1]L=LGAN(G,DY,X,Y)+LGAN(G,DX,Y,X)+λLcyc(G,F)

discoGAN

论文链接
这里的disco是discovery的缩写,非彼迪斯科。旨在探索跨域的关系。个人感觉与cycleGAN非常像,也许是所有的GAN都是万变不离其宗。此算法中包括两组编码器-解码器对,或者说两种autoencoder,但是隐变量是向其中的一个域映射。假设两个域是A和B,那么一组ae是完成从A到B再到A,另一组ae是完成从B到A再到B。假设DA和DB表示域A和域B上的判别器,A→B表示从域A图像生成域B图像的编码或解码器。对第一组ae,损失函数包括A→B→A的重构损失( L C O N S T A L_{CONST_A} LCONSTA),以及生成器A→B( L G A N B L_{GAN_B} LGANB)、判别器DB损失( L D B L_{D_B} LDB)。对第二组ae,损失函数包括B→A→B的重构损失以及生成器B→A、判别器DA损失。
L C O N S T A = d i s t ( G B A ( G A B ( x A ) ) , x A ) L G A N B = − E x A ∼ p A [ log ⁡ D B ( G A B ( x A ) ) ] L D B = − E x B ∼ p B [ log ⁡ D B ( x B ) ] − E x A ∼ p A [ log ⁡ ( 1 − D B ( G A B ( x A ) ) ) ] L G = L C O N S T A + L C O N S T B + L G A N A + L G A N B L D = L D A + L D B L_{CONST_A}=dist(G_{BA}(G_{AB}(x_A)),x_A)\\ L_{GAN_B}=-E_{x_A\sim p_A}[\log D_B(G_{AB}(x_A))]\\ L_{D_B}=-E_{x_B\sim p_B}[\log D_B(x_B)]-E_{x_A\sim p_A}[\log (1-D_B(G_{AB}(x_A)))]\\ L_G=L_{CONST_A}+L_{CONST_B}+L_{GAN_A}+L_{GAN_B}\\ L_D=L_{D_A}+L_{D_B} LCONSTA=dist(GBA(GAB(xA)),xA)LGANB=ExApA[logDB(GAB(xA))]LDB=ExBpB[logDB(xB)]ExApA[log(1DB(GAB(xA)))]LG=LCONSTA+LCONSTB+LGANA+LGANBLD=LDA+LDB

StackGAN

论文链接
深度学习总希望网络做得更深,网络的层叠往往能达到更好的效果,stackGAN就是利用层叠的多个生成网络实现从文本生成图像。
StackGAN分为两个stage,stage-Ⅰ生成器根据文本描述生成大致物体轮廓和颜色等,stage-Ⅱ则在第一步的基础上填充背景和细节等信息,生成更逼真的图像。
stackGAN结构图
总之,以上GAN的变种包含了从损失函数入手进行改进,优化真实样本分布与生成样本分布之间的距离度量,越来越多跨域,跨模态的GAN被提出。
开博客以来,第一次走心的总结,第一次学习使用markdown语言。算是碌碌无为的寒假里的一个小小小工作。这是篇概述,重点参考了《GAN:实战生成对抗网络,Kuntal
Ganguly著》这本书。其中GAN的诸多变种的原理也是一笔带过,下一步还是结合实践,阅读经典原作,关于其他GAN的变体后续博客可能会继续写一些。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值