Generative Adversarial Networks是深度学习的一种技术,主要目标是生成近似于真实数据分布的新数据。它是由两部分组成:Generator和Discriminator。
Generator:Generator的任务是生成新的数据样本。在训练过程中,generator接收到一组随机噪声z,并通过该噪声生成数据。初期,generator生成的数据并不能很好的模仿真实的数据分布,但是随着训练的进行,generator将能够生成更好的模仿真实数据的样本。
Discriminator:Discriminator的任务是接收一个输入(这个输入可能是真实的数据,也可能是generator生成的数据),然后判断这个输入是真实数据还是generator生成的假数据。简单地说,discriminator的任务就是尽可能地分辨出真实数据和生成的数据。
GANs的训练过程类似于“零和游戏”或“对抗游戏”。生成器和判别器在训练过程中相互竞争,生成器试图欺骗判别器,而判别器则试图防止被欺骗。具体来说,生成器的目标是最大化判别器判断其生成的样本为真的概率,而判别器的目标是正确地区分出真实样本和生成的样本。
训练过程中,判别器和生成器的参数都会不断更新,生成器会逐渐生成更逼真的样本,而判别器也会变得更加精确。当训练稳定后,判别器应该对于真实样本和生成样本的判断概率均为0.5,这时候,生成器生成的样本将与真实数据无法区分。
Minimax Problem
首先,GANs的目标是通过学习一个生成模型G来尽可能接近真实数据分布 p data p_{\text{data}} pdata。换句话说,GANs试图最小化生成模型 P G P_G PG和真实数据分布 p data p_{\text{data}} pdata之间的分布散度:
G ∗ = arg min G D K L ( p data ∥ P G ) G^* = \arg\min_G D_{KL}(p_{\text{data}} \| P_G) G∗=argGminDKL(pdata∥PG)
这是生成模型的通常目标,其中 D K L D_{KL} DKL是Kullback-Leibler散度。
然而,直接最小化KL散度通常是困难的,因为我们通常无法显式地访问 p data p_{\text{data}} pdata。因此,我们引入了判别模型D,它的任务是区分来自 p data p_{\text{data}} pdata的样本和来自 P G P_G PG的样本。
判别器D的目标是最大化以下目标函数:
V ( D , G ) = E x ∼ p data [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log (1 - D(G(z)))] V(D,G)=Ex∼pdata[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
这里的目标函数实际上是两个二元交叉熵的和,其对应于判别器D对真实样本和生成样本的分类能力。
然后,我们的目标是找到能够最小化 V ( D , G ) V(D, G) V(D,G)的生成器G。换句话说,我们希望找到能够最大化判别器D分类错误的生成器G。
结合以上两步,我们得到了生成对抗网络的最小-最大问题:
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 ) ) ) ] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}(x)}[\log D(x)] + \mathbb{E}_{z \sim 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和D都足够强大并且有足够的训练时,最优的生成器G会生成与真实数据分布 p data p_{\text{data}} pdata相匹配的样本,而最优的判别器D则无法区分真实样本和生成样本。这一点可以通过观察当 P G = p data P_G = p_{\text{data}} PG=pdata时, V ( D , G ) V(D, G) V(D,G)对D的最大值是 log 4 \log 4 log4,而当 P G ≠ p data P_G \neq p_{\text{data}} PG=pdata时,最大值小于 log 4 \log 4 log4来证明。
另一方面,这个目标函数可以看作是生成分布和真实分布之间Jensen-Shannon散度的一个估计。
当我们求解 min G max D V ( D , G ) \min_G \max_D V(D, G) minGmaxDV(D,G) 这个最小-最大问题时,需要考虑生成器和判别器的最优解,即 D ∗ D^* D∗ 和 G ∗ G^* G∗。对于判别器 D D D,我们希望最大化以下目标函数:
V ( D , G ) = E x ∼ p data [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log (1 - D(G(z)))] V(D,G)=Ex∼pdata[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
在固定生成器 G G G 的情况下,对于每一个固定的 x x x,我们希望最大化 log D ( x ) \log D(x) logD(x)。对于从生成器 G G G 生成的样本,我们希望最大化 log ( 1 − D ( G ( z ) ) ) \log (1 - D(G(z))) log(1−D(G(z)))。如果我们设 p data ( x ) = p x p_{\text{data}}(x) = p_x pdata(x)=px 并且 p G ( x ) = p x ′ p_G(x) = p_x' pG(x)=px′,那么可以将 V ( D , G ) V(D, G) V(D,G) 写作如下形式:
V ( D ) = ∫ x p x log D ( x ) + p x ′ log ( 1 − D ( x ) ) d x V(D) = \int_x p_x \log D(x) + p_x' \log(1 - D(x)) dx V(D)=∫xpxlogD(x)+px′log(1−D(x))dx
在 D ( x ) D(x) D(x) 上取这个函数的导数并令其等于0,我们可以求解这个函数在什么情况下达到最大值。这样就得到了最优的判别器 D ∗ D^* D∗:
D ∗ ( x ) = p data ( x ) p data ( x ) + p G ( x ) D^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_G(x)} D∗(x)=pdata(x)+pG(x)pdata(x)
这个函数的意义是,如果一个样本 x x x 更可能来自真实数据,那么 D ( x ) D^(x) D(x) 就更接近于1。反之,如果一个样本 x x x 更可能来自生成器,那么 D ( x ) D^(x) D(x) 就更接近于0。
现在我们知道了最优判别器的形式,我们可以将其带入目标函数中,然后求解生成器的最小化问题。插入 D ∗ D^* D∗ 到目标函数中,我们有:
min
G
V
(
D
∗
,
G
)
=
E
x
∼
p
data
[
l
o
g
p
data
(
x
)
p
data
(
x
)
+
p
G
(
x
)
]
+
E
x
∼
p
G
[
l
o
g
p
G
(
x
)
p
data
(
x
)
+
p
G
(
x
)
]
\min_G V(D^*, G) = \mathbb{E}_{x \sim p_{\text{data}}}[log \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_G(x)}] + \mathbb{E}_{x \sim p_G}[log \frac{p_G(x)}{p_{\text{data}}(x) + p_G(x)}]
GminV(D∗,G)=Ex∼pdata[logpdata(x)+pG(x)pdata(x)]+Ex∼pG[logpdata(x)+pG(x)pG(x)]
如果我们设
p
data
(
x
)
=
p
x
p_{\text{data}}(x) = p_x
pdata(x)=px 并且
p
G
(
x
)
=
p
x
′
p_G(x) = p_x'
pG(x)=px′,那么这个函数可以简化为:
C ( G ) = ∫ x p x log 2 p x p x + p x ′ + p x ′ log 2 p x ′ p x + p x ′ d x C(G) = \int_x p_x \log \frac{2p_x}{p_x + p_x'} + p_x' \log \frac{2p_x'}{p_x + p_x'} dx C(G)=∫xpxlogpx+px′2px+px′logpx+px′2px′dx
可以证明这个函数等于 2 log 2 2 \log 2 2log2减去 2 J S ( p data ∣ ∣ p G ) 2JS(p_{\text{data}} || p_G) 2JS(pdata∣∣pG),因此,生成器的目标变为最小化 Jensen-Shannon 散度。
J S ( p ∣ ∣ q ) = 1 2 D K L ( p ∣ ∣ m ) + 1 2 D K L ( q ∣ ∣ m ) JS(p || q) = \frac{1}{2} D_{KL}(p || m) + \frac{1}{2} D_{KL}(q || m) JS(p∣∣q)=21DKL(p∣∣m)+21DKL(q∣∣m)
其中,
m ( x ) = 1 2 ( p ( x ) + q ( x ) ) m(x) = \frac{1}{2}(p(x)+q(x)) m(x)=21(p(x)+q(x))
D K L ( p ∣ ∣ q ) = − ∑ x p ( x ) log q ( x ) p ( x ) D_{KL}(p || q) = - \sum_x p(x) \log \frac{q(x)}{p(x)} DKL(p∣∣q)=−x∑p(x)logp(x)q(x)
Wasserstein GAN (WGAN)
使用JS散度在GAN的训练中可能会遇到梯度消失的问题。具体来说,当生成的分布 P G P_G PG与真实的数据分布 p data p_{\text{data}} pdata没有重叠时,JS散度是常数,而不依赖于生成的分布。因此,判别器D在区分真实样本和生成样本时变得过于优秀,生成器G在更新时会遇到梯度消失的问题,即无法得到有效的反馈来改进其生成的样本。
解决这个问题的一种方法是改变GAN的目标函数,用Wasserstein距离替代JS散度。Wasserstein距离在两个分布没有重叠的时候仍然有意义,因此它不会遇到JS散度的问题。以下是Wasserstein GAN目标函数的推导:
假设我们有两个概率分布 p data p_{\text{data}} pdata和 p G p_G pG,它们在 R n R^n Rn上定义。Wasserstein距离定义为:
W ( p data , p G ) = inf γ ∈ Π ( p data , p G ) E ( x , y ) ∼ γ [ ∣ ∣ x − y ∣ ∣ ] W(p_{\text{data}}, p_G) = \inf_{\gamma \in \Pi(p_{\text{data}}, p_G)} \mathbb{E}_{(x,y) \sim \gamma} [||x - y||] W(pdata,pG)=γ∈Π(pdata,pG)infE(x,y)∼γ[∣∣x−y∣∣]
其中, Π ( p data , p G ) \Pi(p_{\text{data}}, p_G) Π(pdata,pG)是所有以 p data p_{\text{data}} pdata和 p G p_G pG为边缘分布的联合分布的集合。
现在,我们设 D D D是判别器,但在WGAN中,它通常被称为判别函数或者critic。它是一个满足1-Lipschitz条件的函数,即对于所有的 x x x和 y y y,有 ∣ D ( x ) − D ( y ) ∣ ≤ ∣ ∣ x − y ∣ ∣ |D(x) - D(y)| \leq ||x - y|| ∣D(x)−D(y)∣≤∣∣x−y∣∣。Kantorovich-Rubinstein对偶定理告诉我们,我们可以等价地写出Wasserstein距离为:
W ( p data , p G ) = sup ∣ ∣ D ∣ ∣ L ≤ 1 E x ∼ p data [ D ( x ) ] − E x ∼ p G [ D ( x ) ] W(p_{\text{data}}, p_G) = \sup_{||D||_L \leq 1} \mathbb{E}_{x \sim p_{\text{data}}} [D(x)] - \mathbb{E}_{x \sim p_G} [D(x)] W(pdata,pG)=∣∣D∣∣L≤1supEx∼pdata[D(x)]−Ex∼pG[D(x)]
在这里,上确界(sup)是在所有满足1-Lipschitz条件的函数 D D D上取的。
然后,我们可以像普通GAN一样训练生成器和判别器(critic)。我们希望最大化判别器(critic)在真实数据和生成数据上的差别,并且最小化生成器使这个差别。因此,我们得到了以下的目标函数:
min G max ∣ ∣ D ∣ ∣ L ≤ 1 V ( D , G ) = E x ∼ p data [ D ( x ) ] − E z ∼ p z ( z ) [ D ( G ( z ) ) ] \min_G \max_{||D||_L \leq 1} V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}} [D(x)] - \mathbb{E}_{z \sim p_z(z)} [D(G(z))] Gmin∣∣D∣∣L≤1maxV(D,G)=Ex∼pdata[D(x)]−Ez∼pz(z)[D(G(z))]
在这里的第二个期望中, z z z是从先验噪声分布 p z p_z pz中采样的,然后被生成器 G G G映射(或转化)成一个“假”的样本 G ( z ) G(z) G(z),然后判别器 D D D对这个“假”的样本进行评分。所以,应该用 z ∼ p z ( z ) z \sim p_z(z) z∼pz(z),然后 D ( G ( z ) ) D(G(z)) D(G(z))。
注意,这个目标函数与原始的GAN目标函数有所不同:我们没有对判别器(critic)的输出应用sigmoid函数,我们没有取对数,而且我们需要保证判别器(critic)满足1-Lipschitz条件。
这两部分的损失函数可以分开来看。
对于判别器D,我们的目标是最大化以下的目标函数:
E
x
∼
p
data
[
D
(
x
)
]
−
E
z
∼
p
z
(
z
)
[
D
(
G
(
z
)
)
]
\mathbb{E}_{x \sim p_{\text{data}}} [D(x)] - \mathbb{E}_{z \sim p_z(z)} [D(G(z))]
Ex∼pdata[D(x)]−Ez∼pz(z)[D(G(z))]
这个目标函数表示判别器D尝试最大化对来自真实数据和生成器生成的数据的预测的差值。在此目标下,优秀的判别器将会赋予真实数据高的值,而生成的数据则会得到低的值。
对于生成器G,我们的目标是最小化以下的目标函数:
− E z ∼ p z ( z ) [ D ( G ( z ) ) ] - \mathbb{E}_{z \sim p_z(z)} [D(G(z))] −Ez∼pz(z)[D(G(z))]
这个目标函数表示生成器G尝试最小化判别器对其生成的数据的预测。换句话说,生成器希望产生越来越真实的样本,使得判别器无法区分这些生成的样本和真实的样本。
在训练时,我们会交替优化这两个目标函数。通常,我们会在一个步骤中优化判别器,然后在下一个步骤中优化生成器。这种训练方式有助于保持生成器和判别器之间的平衡,防止一个过于强大以至于完全主导另一个。
在实践中,我们通常通过在训练过程中加入一个梯度惩罚项来保证1-Lipschitz条件。这种方法被称为Wasserstein GAN with Gradient Penalty (WGAN-GP)。