GAN全称为Generative Adversarial Network,即生成对抗网络。基本原理跟造假钞犯罪集团和警察的关系一样,生成器负责生成尽可能逼真的“假钞”,而鉴别器要尽可能甄别出“真钞”和“假钞”,给出一个该样本是真样本的概率(0~1)。所谓道高一尺魔高一丈,两者互相牵制,生成器生成的越来越真,鉴别器越来越难辨别真伪,最终达到以0.5概率辨别真伪的平衡态。
在平衡态,是极大极小博弈的最优点,极大极小博弈中的目标函数是
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)=Ex−pdata(x)[logD(x)]+Ez−pz(z)[log(1−D(G(z)))]
公式看起来比较复杂,其实可以分为两部分看。首先固定G,看maxD的部分,作为鉴别器,他要做的是要对所有服从真实数据分布pdata(x)的真样本D(x)=1的判断,对所有生成器生成的样本给出D(G(z))=0的判断,这使得V(D,G)最大化,这就是maxD的原因。同理,固定D,只含有D的第一项可以删去,第二项中,生成器的生成样本要尽可能真,即生成器保证D(G(z))尽可能大,即生成器期望第二项尽可能小,所以是minG。
因为包含上述问题在内的多个问题的存在,GAN的训练并不容易,往往需要很多技巧,因此许许多多GAN的变体也在提出。其中走进更多普通人眼里的要数最近在网络上大火的StyleGAN,每刷新一下网页,就能生成一副逼真的人脸,而现实世界中这个人脸却是不存在的,让不少网民大喊细思极恐。接下来让我们看看GAN的经典变体。
Deep convolutional GAN(论文链接),生成器是一个上采样的过程,也就是小数步长卷积,也就是反卷积(fractional strided convolution).鉴别器就是一个常见的卷积网络。特征100维,图像64643的RGB图像。
主要的特点:
关于什么是反卷积,这篇博客中运用矩阵与矩阵转置的乘法,展示了卷积与反卷积的过程与关系。
这里是可视化过程。
论文链接
条件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)=Ex−pdata(x)[logD(x)]+Ez−pz(z)[log(1−D(G(z,y),y))]
论文链接
损失函数
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)=Ex−pdata(x)[D(x)]−Ez−pg(z)[D(G(z))]
等式右侧表达式又叫Wasserstein距离,这种度量分布的方式,相比传统GAN中用的JS散度(交叉熵),极大缓解了模型坍塌问题。
论文链接
自带自动编码器,也就是说判别器是一个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)生成器最小化生成图像的重构损失。
论文链接
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)=Ey−pdata(y)[logDY(y)]+Ex−pdata(x)[log(1−DY(G(x)))]Lcyc(G,F)=Ex−pdata(x)[∣∣F(G(x))−x∣∣1]+Ey−pdata(y)[∣∣G(F(y))−y∣∣1]L=LGAN(G,DY,X,Y)+LGAN(G,DX,Y,X)+λ∗Lcyc(G,F)
论文链接
这里的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=−ExA∼pA[logDB(GAB(xA))]LDB=−ExB∼pB[logDB(xB)]−ExA∼pA[log(1−DB(GAB(xA)))]LG=LCONSTA+LCONSTB+LGANA+LGANBLD=LDA+LDB
论文链接
深度学习总希望网络做得更深,网络的层叠往往能达到更好的效果,stackGAN就是利用层叠的多个生成网络实现从文本生成图像。
StackGAN分为两个stage,stage-Ⅰ生成器根据文本描述生成大致物体轮廓和颜色等,stage-Ⅱ则在第一步的基础上填充背景和细节等信息,生成更逼真的图像。
总之,以上GAN的变种包含了从损失函数入手进行改进,优化真实样本分布与生成样本分布之间的距离度量,越来越多跨域,跨模态的GAN被提出。
开博客以来,第一次走心的总结,第一次学习使用markdown语言。算是碌碌无为的寒假里的一个小小小工作。这是篇概述,重点参考了《GAN:实战生成对抗网络,Kuntal
Ganguly著》这本书。其中GAN的诸多变种的原理也是一笔带过,下一步还是结合实践,阅读经典原作,关于其他GAN的变体后续博客可能会继续写一些。