GAN 原理
GAN由两个部分组成
- Generator 尝试生成看起来可信的数据,产生的数据变为不正确的(negative)的数据
- Discriminator 则尝试将generator 生成的看起来可信实则不可信的数据与真正的数据进行对比,病对generator进行penalize。
generator在开始的几次训练中会生成明显不对的数据,随着训练的进行,generator距离具备可以产生骗过discriminator的能力越来越近。
最后 generator 具备了能够产生骗过discriminator的数据的能力,
截图来自 google developers
The Discriminator
GAN 中的Discriminator只是一个分类器。 它试图将真实数据与generator创建的数据区分开来。 它可以使用适合其分类数据类型的任何网络架构。
Discriminator 使用 back propagation来进行训练。当discriminator loss或者win,则对其进行训练。
Discriminator的训练数据来源:
- 真实数据,比如人类的真实照片等等。discriminator使用这些instance作为正面例子。
- 由generator产生的捏造的数据集。discriminator使用这些实例作为negative的例子。
During discriminator training:
- Discriminator 尝试分辨generator传来的真实的数据和捏造的数据。
- Discriminator loss 惩罚discriminator,因为其将一个正确的实例辨别为fake或者将fake的实例鉴定为正确的,discriminator通过back propagation更新 weights(权重)。
GAN中的Generator部分
- 通过吸收discriminator的反馈,GAN中的Generator尝试学习创建fake的数据,学习如何是的discriminator将他的输出鉴定为正确的。
- 相比较discriminator,Generator的训练需要Generator和discriminator 更紧密的结合(integration)。
GAN中为Generator 训练的部分包括:
- 随机的输入 random input
- Generator的网络,他将随机的输入转化为数据实例
- Discriminator的网络,尝试辨别由generator产生的数据
- Discriminator的输出
- Generator loss,如果其生成的数据未能骗过discriminator,则惩罚generator
Random Input
Gan 使用random noise作为input,接着Generator将其noise转变为有意义的输出。我们可以使用GAN来生成很多种类的数据,在其目标的分布中的各种位置。
实验表明输入的noise的在输入中的分布并没有过大的影响,所以我们可以选择一些容易取样的数据,比如uniform distribution. 为了便利,noise取样的空间常常比输出的空间要小。
使用discriminator来训练generator
为了训练神经网络,我们改变网络的权重以减少其输出的错误或损失。然而,在GAN 中,生成器与我们试图影响的Loss没有直接联系。 Generator向discriminator输入数据,discriminator产生我们尝试影响的输出。如果generator产生了discriminator鉴别为fake的sample,Generator的loss会惩罚Generator。
Backpropagation中必须包含一个额外的网络块。 Backpropagation通过计算weight对输出的影响,在正确的方向上调整每个weight——如果改变weight,输出将如何变化。 但是generator的weight的影响,取决于它输入数据的discriminator的权重的影响。 所以backpropagation从最终的输出开始,通过discriminator流回generator。
我们用以下过程训练生成器:
- 采样随机噪声。
- 从采样的随机噪声中产生生成器输出。
- discriminator对Generator的输出 判断其real或者fake。
- 计算discriminator分类的损失。
- 通过discriminator和generator反向传播以获得梯度。
- 使用梯度更改的generator的权重。
这是生成器训练的一次迭代。 在下一节中,我们将看到如何兼顾生成器和鉴别器的训练。
GAN 的训练
因为 GAN 包含两个单独训练的网络,所以它的训练算法必须解决两个复杂问题:
- GAN 必须兼顾两种不同的训练(Generator和Discriminator)。
- GAN 收敛(convergence)很难识别。
交替训练
Generator和Discriminator有不同的训练过程。 那么我们如何训练 GAN 作为一个整体呢?
GAN 的训练是交替进行的:
- Discriminator训练一个或多个epoch。
- Generator训练一个或多个epoch。
- 重复步骤 1 和 2 继续训练Generator和Discriminator网络。
我们在Discriminator训练阶段保持Generator不变。 由于Discriminator训练试图弄清楚如何区分真实数据和假数据,因此它必须学习如何识别Generator的缺陷。
同样,我们在Generator训练阶段保持Discriminator不变。 否则Generator将试图击中移动目标并且可能永远不会收敛(convergence)。
正是这种反复的训练让 GAN 能够解决其他棘手的生成问题。 我们从一个简单的分类问题开始,在困难的生成问题中立足。 相反,如果你不能训练一个分类器来区分真实数据和生成数据之间的差异,即使对于初始随机Generator输出,你也无法开始 GAN 训练。
收敛(convergence)
随着Generator通过训练得到改进,Discriminator的性能会变差,因为Discriminator无法轻易区分真假。 如果Generator的训练完全成功,则Discriminator的准确率为 50%。
这种进展对 GAN 的整体收敛(convergence)提出了一个问题:Discriminator反馈随着时间的推移变得不那么有意义。 如果 GAN 继续训练超过判别器给出完全随机反馈的点,那么Generator就会开始使用垃圾反馈进行训练,其自身的质量可能会崩溃。
对于 GAN,收敛(convergence)通常是一个短暂的状态,而不是稳定的状态。
Loss function 损失函数
GAN的损失函数主要有2种
- Minimax:
E x [ l o g ( D ( x ) ) ] + E z [ l o g ( 1 − D ( G ( z ) ) ) ] E_{x}[log(D(x))] + E_{z}[log(1-D(G(z)))] Ex[log(D(x))]+Ez[log(1−D(G(z)))]
在这个函数中: - D(x) 是discriminator对真实数据实例 x 为真实概率的估计。
- Ex 是所有真实数据实例的期望值。
- G(z) 是给定噪声 z 时generator的输出。
- D(G(z)) 是discriminator对假实例为真概率的估计。
-
E
z
E_z
Ez 是generator的所有随机输入的期望值(实际上,是所有生成的假实例 G(z) 的期望值)。
该公式源自真实分布和生成分布之间的交叉熵。