原始GAN-pytorch-生成MNIST数据集(原理)

1. GAN 《Generative Adversarial Nets》

Ian J. Goodfellow, Jean Pouget-Abadie, Yoshua Benjio etc.

https://dl.acm.org/doi/10.5555/2969033.2969125

1.1 相关概念

生成模型:学习得到联合概率分布 P ( x , y ) P(x,y) P(x,y),即特征x和标签y同时出现的概率,然后可以求条件概率分布和其他概率分布。学习到的是数据生成的机制。

判别模型: 学习得到条件概率分布 P ( y ∣ x ) P(y|x) P(yx),即在特征x出现的情况下标记y出现的概率

学习一个分布和近似一个分布?

1.2 公式理解

GAN的似然函数(损失函数还要加上一个负号哦):
m i n G m a x D V ( D , G ) = E x ∼ P d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] (1.1) \underset{G}{min}\underset{D}{max}V(D,G) = E_{x \sim P_{data}(x)}[log D(x)]+E_{z\sim p_{z}(z)}[log(1-D(G(z)))] \tag{1.1} GminDmaxV(D,G)=ExPdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))](1.1)

为了学习数据x的分布 p g p_g pg,定义了一个含有噪声的变量分布 p z ( z ) p_z(z) pz(z);V是评分方程(这个值是越大越好的),G是一个生成器,D是一个判别器;训练D最大化真实数据和生成数据的区别,训练G最小化真实数据和生成数据的区别;

注意这个公式有两项,第一项是指是否能正确识别真实的数据;第二项是指是否能够识别生成的数据;
(1) 完美D

  1. D ( x ) D(x) D(x)完美识别真实数据和生成数据, E x ∼ P d a t a ( x ) [ l o g D ( x ) ] E_{x\sim P_{data}(x)}[log D(x)] ExPdata(x)[logD(x)]趋近于1,而 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]趋近于0,整体趋近于1.
  2. D D D不完美的时候,由于存在 l o g log log会使得两项都是一个负数;那训练的目的就是使得这个负数尽量小
  3. 因此需要最大化判别器带来的值,来使得判别器D最佳。

(2) 完美G

  1. G只和 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]相关,如果G完美忽悠D的时候, E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]输出的结果就是负无穷;
  2. 当不是那么完美的时候,输出的值就是一个负数;我们目的是使得这个输出尽量小,以使得生成器最佳。
  3. 所以需要最小化生成器带来值 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]

训练过程

训练D说明

生成器生成的数据就是V(G,D)的第二项的输入: g ( z ) = x g(z) = x g(z)=x,那么对z的求和就可以变为对x的求和。
V ( G , D ) V(G,D) V(G,D)展开成积分/求和的形式
V ( G , D ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) d x + ∫ z p z ( z ) ⋅ l o g ( 1 − D ( g ( z ) ) ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) + p g ( x ) ⋅ l o g ( 1 − D ( x ) ) d x (1.2) \begin{aligned} V(G,D) &= \int_x p_{data} \cdot log(D(x))dx + \int_z p_z(z) \cdot log(1-D(g(z))) \\ &=\int_x p_{data} \cdot log(D(x)) + p_g(x) \cdot log(1-D(x))dx \end{aligned} \tag{1.2} V(G,D)=xpdatalog(D(x))dx+zpz(z)log(1D(g(z)))=xpdatalog(D(x))+pg(x)log(1D(x))dx(1.2)
对于 任意的 ( a , b ) ∈ R 2 \ { 0 , 0 } (a,b) \in R^2 \backslash \{0,0\} (a,b)R2\{ 0,0},函数 y → a l o g ( y ) + b l o g ( 1 − y ) y \rightarrow a log(y) + blog(1-y) yalog(y)+blog(1y)是一个凸函数,我们需要求这个函数的最大值,就求导数
a y + b 1 − y = 0 y = a a + b \begin{aligned} \frac{a}{y}+\frac{b}{1-y} = 0 \\ y = \frac{a}{a+b} \end{aligned} ya+1yb=0y=a+ba
则在 y = a a + b y = \frac{a}{a+b} y=a+ba的时候有最大值,对应于判别器的概率即为:
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D_G^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} DG(x)=pdata(x)+pg(x)pdata(x)
将最优解带入到价值函数之中
C ( G ) = m a x D V ( G , D ) = E x ∼ p d a t a [ l o g D G ∗ ( x ) ] + E z ∼ p z [ l o g ( 1 − D G ∗ ( G ( z ) ) ) ] = E x ∼ p d a t a [ l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) ] + E x ∼ p g [ l o g p g ( x ) p d a t a ( x ) + p g ( x ) ] (1.3) \begin{aligned} C(G) &= \underset{D}{max}V(G,D) \\ &= E_{x \sim p_{data}}[log D_G^*(x)] + E_{z \sim p_z}[log(1-D_G^*(G(z)))] \\ &= E_{x \sim p_{data}}[log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}] + E_{x \sim p_g}[log \frac{p_g(x)}{p_{data}(x) + p_g(x)}] \end{aligned} \tag{1.3} C(G)=DmaxV(G,D)=Expdata[logDG(x)]+Ezpz[log(1DG(G(z)))]=Expdata[logpdata(x)+pg(x)pdata(x)]+Expg[logpdata(x)+pg(x)pg(x)](1.3)
根据KL散度和JS散度的定义,可以将上面的公式改写为
C ( G ) = K L ( P d a t a ∣ ∣ p d a t a + p g 2 ) + K L ( p g ∣ ∣ p d a t a + p g 2 ) − l o g ( 4 ) = 2 ⋅ J S D ( p d a t a ∣ ∣ p g ) − l o g ( 4 ) (1.4) \begin{aligned} C(G) &= KL(P_{data} || \frac{p_{data}+p_g}{2}) + KL(p_g || \frac{p_{data}+p_g}{2}) -log(4) \\ &= 2 \cdot JSD(p_{data}||p_g) - log(4) \end{aligned} \tag{1.4} C(G)=KL(Pdata∣∣2pdata+pg)+KL(pg∣∣2pdata+pg)log(4)=2JSD(pdata∣∣pg)log(4)(1.4)

注意 p d a t a + p g 2 \frac{p_{data}+p_g}{2} 2pdata+pg这里除以2是为了保证是一个分布(即概率的积分是等于1的)

在固定D训练G的时候,我们就是为了最小化这个 C ( G ) C(G) C(G),根据上面推导:
所以给出结论:当 p g = p d p_g = p_d pg=pd时, D G ∗ ( x ) = 1 2 D_G^*(x) = \frac{1}{2} DG(x)=21,因此 C ( G ) = l o g 1 2 + 1 2 = − l o g 4 C(G) = log\frac{1}{2} + \frac{1}{2} = -log4 C(G)=log21+21=log4,可以得到最小的 C ( G ) C(G) C(G)

1.3 图片理解

在这里插入图片描述

绿色是生成的分布;黑色是真实分布;蓝色是判别器的分布

(b)表示训练辨别器,使得辨别器可以非常好地区分二者
©表示训练生成器,继续欺骗判别器

1.4 熵、交叉熵、KL散度、JS散度

  1. (Entropy)
    K-L散度源于信息论,常用的信息度量单位为(Entropy)
    H = − ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) H = -\sum_{i=1}^{N}p(x_i) \cdot logp(x_i) H=i=1Np(xi)logp(xi)
    注意这个对数没有确定的底数(可以使2、e或者10)。

熵度量了数据的信息量,可以帮助我们了解用概率分布近似代替原始分布的时候我们到底损失了多少信息;但问题是如何将熵值压缩到最小值,即如何编码可以达到最小的熵(存储空间最优化)。

  1. 交叉熵 : 量化两个概率分布之间的差异
    H ( p , q ) = − ∑ x p ( x )    l o g    q ( x ) H(p,q) = -\sum_{x}p(x) \; log \; q(x) H(p,q)=xp(x)logq(x)

  2. KL散度kullback-Leibler divergence):量化两种概率分布 P和Q之间差异的方式,又成为相对熵
    将熵的定义公式稍加修改就可以得到K-L散度的定义公式:
    D K L ( P ∣ ∣ Q ) = ∑ i = 1 N p ( x i ) ⋅ ( l o g p ( x i ) − l o g q ( x i ) ) = ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^{N} p(x_i) \cdot (log p(x_i) - log q(x_i)) = \sum_{i=1}^{N}p(x_i) \cdot log \frac{p(x_i)}{q(x_i)} DKL(P∣∣Q)=i=1Np(xi)(logp(xi)logq(xi))=i=1Np(xi)logq(xi)p(xi)
    其中 p p p q q q分别表示数据的原始分布和近似的概率分布。

根据公式所示,K-L散度其实是数据的原始分布p和近似分布之间的对数差的期望。如果用2位底数计算,K-L散度表示信息损失的二进制位数,下面用期望表示式展示:
D K L ( P ∣ ∣ Q ) = E [ l o g p ( x ) − q ( x ) ] D_{KL}(P||Q) = E[log p(x) - q(x)] DKL(P∣∣Q)=E[logp(x)q(x)]

注意:

  • 从散度的定义公式中可以看出其不符合对称性(距离度量应该满足对称性)
  • KL散度非负性
  1. JS散度(Jensen-shannon divergence)
    由于K-L散度是非对称的,所以对其进行修改,使得其能够对称,称之为 JS散度
    (1) 设 M = 1 2 ( P + Q ) M = \frac{1}{2}(P+Q) M=21(P+Q),则:
    D J S ( P ∣ ∣ Q ) = 1 2 D K L ( P ∣ ∣ M ) + 1 2 D K L ( Q ∣ ∣ M ) D_{JS}(P||Q) = \frac{1}{2}D_{KL}(P||M) + \frac{1}{2}D_{KL}(Q||M) DJS(P∣∣Q)=21DKL(P∣∣M)+21DKL(Q∣∣M)
    (2) 将KL散度公式带入上面
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) 2 ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{\frac{p(x_i) + q(x_i)}{2}}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{\frac{p(x_i)+q(x_i)}{2}}) DJS=21i=1Np(xi)log(2p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(2p(xi)+q(xi)q(xi))
    (3) 将 l o g log log中的 1 2 \frac{1}{2} 21放到分子上
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( 2 p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( 2 q ( x i ) p ( x i ) + q ( x i ) ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{2p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{2q(x_i)}{p(x_i)+q(x_i)}) DJS=21i=1Np(xi)log(p(xi)+q(xi)2p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)2q(xi))
    (4) 提出2
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) ) + l o g ( 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{p(x_i)+q(x_i)}) + log(2) DJS=21i=1Np(xi)log(p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)q(xi))+log(2)
    注意这里是因为 ∑ p ( x ) = ∑ q ( x ) = 1 \sum p(x) = \sum q(x) = 1 p(x)=q(x)=1

JS散度的缺陷:当两个分布完全不重叠的时候,几遍两个分布的中心离得很近,其JS散度都是一个常数,所以其获取的梯度是0,是没有办法进行更新的。而两个分布没有重叠的原因:从理论和经验而言,真实的数据分布其实是一个低维流形(不具备高维特征),而是存在一个嵌入在高维度的低维空间内。由于维度存在差异,数据很可能不存在分布的重合。

1.5 其他相关(正在补充!)


猜你喜欢

转载自blog.csdn.net/jerry_liufeng/article/details/129238777
今日推荐