GAN知识点总结

文章目录


参考
https://zhuanlan.zhihu.com/p/219847561?utm_source=wechat_session
https://zhuanlan.zhihu.com/p/74075915

GAN知识点

基础


  • H ( X ) = − ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) ) H(X)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(p\left(x_{i}\right)\right) H(X)=−i=1∑n​p(xi​)log(p(xi​))

  • KL散度(相对熵)
    D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) D_{K L}(p \| q)=\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right) DKL​(p∥q)=i=1∑n​p(xi​)log(q(xi​)p(xi​)​)
    因为对数函数是凸函数,所以KL散度的值为非负数;
    KL散度不是对称的;
    KL散度不满足三角不等式。

  • 交叉熵
    H ( p , q ) = − ∑ i = 1 n p ( x i ) log ⁡ ( q ( x i ) ) = D K L ( p ∥ q ) + H ( X ) H(p, q)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right)=D_{K L}(p \| q)+H(X) H(p,q)=−i=1∑n​p(xi​)log(q(xi​))=DKL​(p∥q)+H(X)

  • JS散度
    JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题。一般地,JS散度是对称的,其取值是0到1之间。
    J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∥ P 1 + P 2 2 ) J S\left(P_{1}|| P_{2}\right)=\frac{1}{2} K L\left(P_{1}|| \frac{P_{1}+P_{2}}{2}\right)+\frac{1}{2} K L\left(P_{2} \| \frac{P_{1}+P_{2}}{2}\right) JS(P1​∣∣P2​)=21​KL(P1​∣∣2P1​+P2​​)+21​KL(P2​∥2P1​+P2​​)

  • Wasserstein距离
    Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近;而JS散度在此情况下是常量,KL散度可能无意义。
    W ( P 1 , P 2 ) = inf ⁡ γ ∼ Π ( P 1 , P 2 ) E ( x , y ) ∼ γ [ ∥ x − y ∥ ] W\left(P_{1}, P_{2}\right)=\inf _{\gamma \sim \Pi\left(P_{1}, P_{2}\right)} \mathbb{E}_{(x, y) \sim \gamma}[\|x-y\|] W(P1​,P2​)=γ∼Π(P1​,P2​)inf​E(x,y)∼γ​[∥x−y∥]
    Π(P1,P2)是P1和P2分布组合起来的所有可能的联合分布的集合。对于每一个可能的联合分布γ,可以从中采样(x,y)∼γ得到一个样本x和y,并计算出这对样本的距离||x−y||,所以可以计算该联合分布γ下,样本对距离的期望值E(x,y)∼γ[||x−y||]。在所有可能的联合分布中能够对这个期望值取到的下界infγ∼Π(P1,P2)E(x,y)∼γ[||x−y||]就是Wasserstein距离。

GAN原理

GAN是一个生成模型,它的目的是想要将一个随机高斯分布或者其他分布的噪声向量通过一个生成网络得到一个和真的数据分布差不多的生成分布。训练的时候,怎么衡量这个生成分布和目标分布差不多呢?它是通过又构造一个叫判别器的分类神经网络来衡量。

然后,有了这两个网络,数学原理我们从它的目标函数来说:目标函数是一个极大极小问题。1)对于生成数据,需要它越逼真越好,所以训练生成器时,判别器接收后极大它的概率输出;但是在训练判别器时,判别器接收这个假样本后需要极小它的概率输出,这就是所谓对抗的意思。2)对于真实数据,训练判别器时,为了保持它有意义,当然也是极大化它的概率输出;(可以用torch.nn.BCELoss二分类交叉熵损失函数实现)。

数学解释:
z z z表示高斯噪声, x x x表示真实样本, D ( ) D() D()表示判别器输出的概率, G ( ) G() G()表示生成器输出的生成样本。 D D D和 G G G进行二人博弈: D D D的目标是使 D ( x ) D(x) D(x)更大, D ( G ( z ) ) D(G(z)) D(G(z))更小,也就是让 l o g ( D ( x ) ) log(D(x)) log(D(x))更大同时 l o g ( 1 − D ( G ( z ) ) ) log(1-D(G(z))) log(1−D(G(z)))更小。而 G G G的目标是是让 l D ( G ( z ) ) lD(G(z)) lD(G(z))更大。综上我们把损失函数写作
V ( D , G ) = E x [ l o g ( D ( x ) ) ] + E z [ l o g ( 1 − D ( G ( z ) ) ) ] V(D,G)= \mathbb{E}_x[log(D(x))]+ \mathbb{E}_z[log(1-D(G(z)))] V(D,G)=Ex​[log(D(x))]+Ez​[log(1−D(G(z)))]
最终的优化目标是
arg ⁡ min ⁡ G max ⁡ D V ( G , D ) \arg \min G \max D V(G, D) argminGmaxDV(G,D)

定理1:对于固定的生成器G,最优的判别器D满足:
D ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D^*(x)=\frac{p_{data}(x)}{p_{data}(x)+p_g(x)} D∗(x)=pdata​(x)+pg​(x)pdata​(x)​
其中 p d a t a ( x ) p_{data}(x) pdata​(x)表示真实数据的概率分布; p g ( x ) p_g(x) pg​(x)表示生成器省生成的数据的分布。


证明:
V = E x ∼ P data  [ log ⁡ D ( X ) ] + E x ∼ P G [ log ⁡ ( 1 − D ( x ) ) ] = ∫ x P data  ( x ) log ⁡ D ( x ) d x + ∫ x p G ( x ) log ⁡ ( 1 − D ( x ) ) d x = ∫ x [ P data  ( x ) log ⁡ D ( X ) ] + P G ( x ) log ⁡ ( 1 − D ( x ) ) ] d x \begin{aligned} &V=E_{x \sim P_{\text {data }}}[\log D(X)]+E_{x \sim P_{G}}[\log (1-D(x))] \\ &=\int_{x} P_{\text {data }}(x) \log D(x) d x+\int_{x} p_{G}(x) \log (1-D(x)) d x \\ &\left.=\int_{x}\left[P_{\text {data }}(x) \log D(X)\right]+P_{G}(x) \log (1-D(x))\right] d x \end{aligned} ​V=Ex∼Pdata ​​[logD(X)]+Ex∼PG​​[log(1−D(x))]=∫x​Pdata ​(x)logD(x)dx+∫x​pG​(x)log(1−D(x))dx=∫x​[Pdata ​(x)logD(X)]+PG​(x)log(1−D(x))]dx​
对于这个积分,要取其最大值,我们希望对于给定的x,积分里面的项是最大的。
在数据给定,G给定的前提下, p d a t a ( x ) , p g ( x ) p_data(x),p_g(x) pd​ata(x),pg​(x)都可以看作是常数,我们可以分别用a,b来表示他们,这样我们就可以得到如下的式子:
f ( D ) = a log ⁡ ( D ) + b log ⁡ ( 1 − D ) d f ( D ) d D = a × 1 D + b × 1 1 − D × ( − 1 ) = 0 a × 1 D ∗ = b × 1 1 − D ∗ ⇔ a × ( 1 − D ∗ ) = b × D ∗ D ∗ ( x ) = P data  ( x ) P data  ( x ) + P G ( x ) \begin{aligned} &f(D)=a \log (D)+b \log (1-D) \\ &\frac{d f(D)}{d D}=a \times \frac{1}{D}+b \times \frac{1}{1-D} \times(-1)=0 \\ &a \times \frac{1}{D^{*}}=b \times \frac{1}{1-D^{*}} \\ &\Leftrightarrow a \times\left(1-D^{*}\right)=b \times D^{*} \\ &D^{*}(x)=\frac{P_{\text {data }}(x)}{P_{\text {data }}(x)+P_{G}(x)} \end{aligned} ​f(D)=alog(D)+blog(1−D)dDdf(D)​=a×D1​+b×1−D1​×(−1)=0a×D∗1​=b×1−D∗1​⇔a×(1−D∗)=b×D∗D∗(x)=Pdata ​(x)+PG​(x)Pdata ​(x)​​


定理2:最小最大博弈的最优点是: p g = p d a t a p_g=p_{data} pg​=pdata​
证明
max ⁡ V ( G , D ) = V ( G , D ∗ ) = E x ∼ P data  [ log ⁡ P data  ( x ) P data  ( x ) + P G ( x ) ] + E x ∼ P G [ log ⁡ P G ( x ) P data  ( x ) + P G ( x ) ] = ∫ x P data  ( x ) log ⁡ 1 2 P data  P data  ( x ) + P G ( x ) 2 d x + ∫ x P G ( x ) log ⁡ 1 2 P G ( x ) P d a t a ( x ) + P G ( x ) 2 d x = − 2 log ⁡ 2 + K L ( P data  ( x ) ∥ P data  ( x ) + P G ( x ) 2 ) + K L ( P G ( x ) ∥ P data  ( x ) + P G ( x ) 2 ) \begin{aligned} &\max V(G, D)=V\left(G, D^{*}\right) \\ &=E_{x \sim P_{\text {data }}}\left[\log \frac{P_{\text {data }}(x)}{P_{\text {data }}(x)+P_{G}(x)}\right]+E_{x \sim P_{G}}\left[\log \frac{P_{G}(x)}{P_{\text {data }}(x)+P_{G}(x)}\right] \\ &=\int_{x} P_{\text {data }}(x) \log \frac{\frac{1}{2} P_{\text {data }}}{\frac{P_{\text {data }}(x)+P_{G}(x)}{2}} d x+\int_{x} P_{G}(x) \log \frac{\frac{1}{2} P_{G}(x)}{\frac{P_{d a t a}(x)+P_{G}(x)}{2}} d x \\ &=-2 \log 2+K L\left(P_{\text {data }}(x) \| \frac{P_{\text {data }}(x)+P_{G}(x)}{2}\right)+K L\left(P_{G}(x) \| \frac{P_{\text {data }}(x)+P_{G}(x)}{2}\right) \end{aligned} ​maxV(G,D)=V(G,D∗)=Ex∼Pdata ​​[logPdata ​(x)+PG​(x)Pdata ​(x)​]+Ex∼PG​​[logPdata ​(x)+PG​(x)PG​(x)​]=∫x​Pdata ​(x)log2Pdata ​(x)+PG​(x)​21​Pdata ​​dx+∫x​PG​(x)log2Pdata​(x)+PG​(x)​21​PG​(x)​dx=−2log2+KL(Pdata ​(x)∥2Pdata ​(x)+PG​(x)​)+KL(PG​(x)∥2Pdata ​(x)+PG​(x)​)​
要实现 arg ⁡ min ⁡ G max ⁡ D V ( G , D ) \arg \min G \max D V(G, D) argminGmaxDV(G,D),只需要使得上述公式后边的JS散度变成0,此时 p g = p d a t a p_g=p_{data} pg​=pdata​。


CGAN

CGAN添加的额外信息y只需要和x与z进行合并,作为G和D的输入即可,由此得到了CGAN的损失函数如下:
min ⁡ G max ⁡ D V ( D , G ) = E x ∼ p data  ( x ) [ log ⁡ D ( x ∣ y ) ] + E z ∼ p z ( z ) [ log ⁡ ( 1 − D ( G ( z ∣ y ) ) ) ] \min _{G} \max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x} \mid \boldsymbol{y})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z} \mid \boldsymbol{y})))] Gmin​Dmax​V(D,G)=Ex∼pdata ​(x)​[logD(x∣y)]+Ez∼pz​(z)​[log(1−D(G(z∣y)))]
GAN知识点总结
y是不同类别对应的one-hot向量,可以认为y是服从category distribution的。

WGAN

  • GAN一直面临以下问题和挑战

    • 训练困难,需要精心设计模型结构,并小心协调 D和 G的训练程度
    • D和G的损失函数无法指示训练过程,缺乏一个有意义的指标和生成图片的质量相关联
    • 模式崩坏(mode collapse),生成的图片虽然看起来像是真的,但是缺乏多样性
  • 原生GAN的问题所在:

    • 判别器越好,生成器梯度消失越严重;
    • 最小化生成器loss函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是collapse mode即多样性不足。
  • WGAN的改进措施:

    • 判别器最后一层去掉sigmoid;
    • 生成器和判别器的loss不取log;
    • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c;
    • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行。

cycleGAN

CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络。两个GAN共享两个生成器,并各自带一个判别器,即共有两个判别器和两个生成器。一个单向GAN两个loss,两个即共四个loss。
GAN知识点总结

  • 生成器由编码器、转换器和解码器构成。

    • 编码:第一步利用卷积神经网络从输入图象中提取特征。将图像压缩成256个64*64的特征向量。
    • 转换:通过组合图像的不相近特征,将图像在DA域中的特征向量转换为DB域中的特征向量。作者使用了6层Reset模块,每个Reset模块是一个由两个卷积层构成的神经网络层,能够达到在转换时同时保留原始图像特征的目标。
    • 解码:利用反卷积层(decovolution)完成从特征向量中还原出低级特征的工作,最后得到生成图像。
  • CycleGAN的整体优化目标一共包含3个部分,第一部分LGAN(G,DY,X,Y)表示生成器G和判别器DY的优化目标;第二部分LGAN(F,DX,Y,X)表示生成器F和判别器DX的优化目标,这2部分是GAN算法本身的优化目标。第三部分Lcyc(G,F)表示cycle consistency loss,用于约束从变换域再变换到原域时图像的一致。https://www.jianshu.com/p/64bf39804c80GAN知识点总结
    https://blog.csdn.net/u014380165/article/details/98462928

  • 循环一致损失

    • 其中G(x)表示从X域到Y域的变化,F(G(X))表示再从Y域变换到X域,模型训练的目标当然是希望F(G(X))尽可能和X接近,因此用L1距离来约束,也就是x->G(x)->F(G(x))≈x,作者将这个称之为forward cycle consistency;同理对于y->F(y)->G(F(y))≈y称之为backward cycle consistency。
      GAN知识点总结

DCGAN

  • 使用卷积和去卷积代替池化层;
  • 生成器的输出层使用Tanh 激活函数,其他层使用RELU;
  • 判别器的所有层都是用LeakyReLU 激活函数;
  • 在生成器和判别器中都添加了批量归一化操作;
  • 将全连接层以全局池化层替代以减轻计算量;
  • 生成器使用微步卷积

AnoGAN

https://blog.csdn.net/qq7835144/article/details/110938996

GANomaly

https://blog.csdn.net/qq7835144/article/details/111029750

skip-GANomaly

https://blog.csdn.net/qq7835144/article/details/111066919

LSGANs

LSGANs的英文全称是Least Squares GANs,针对的是标准GAN生成的图片质量不高以及训练过程不稳定这两个缺陷进行改进。改进方法就是将GAN的目标函数由交叉熵损失换成最小二乘损失,而且这一个改变同时解决了两个缺陷。

上一篇:嵌入式新闻早班车-第27期


下一篇:High&NewTech:计算机视觉领域最新黑科技之秒变宝宝——回到最初的样子