GAN 中的生成器是如何训练的?

机器算法验证 机器学习 神经网络
2022-02-27 20:07:07

关于 GAN的论文说判别器使用以下梯度进行训练:

θd1mi=1m[logD(x(i))+log(1D(G(z(i))))]

值被采样,通过生成器生成数据样本,然后判别器使用生成的数据样本进行反向传播。一旦生成器生成数据,它就不再在鉴别器的训练中发挥作用。换句话说,生成器可以完全从度量中移除,方法是让它生成数据样本,然后只处理样本。z

不过,我对如何训练生成器有点困惑。它使用以下渐变:

θg1mi=1m[log(1D(G(z(i))))]

在这种情况下,鉴别器是度量的一部分它不能像以前的情况一样被删除。常规判别模型中的最小二乘或对数似然之类的东西很容易区分,因为它们有一个很好的、紧密的定义。但是,当指标依赖于另一个神经网络时,我对如何反向传播感到有点困惑。您是否本质上将生成器的输出附加到鉴别器的输入,然后将整个事物视为一个巨大的网络,其中鉴别器部分的权重是恒定的?

4个回答

用伪代码来思考这个过程会有所帮助。generator(z)成为一个函数,它采用均匀采样的噪声向量z并返回与输入向量相同大小的向量X让我们称之为长度ddiscriminator(x)成为一个函数,它接受一个维度向量并返回一个属于真实数据分布d的标量概率。x为了训练:

G_sample = generator(Z)
D_real = discriminator(X)
D_fake = discriminator(G_sample)

D_loss = maximize mean of (log(D_real) + log(1 - D_fake))
G_loss = maximize mean of log(D_fake)

# Only update D(X)'s parameters
D_solver = Optimizer().minimize(D_loss, theta_D)
# Only update G(X)'s parameters
G_solver = Optimizer().minimize(G_loss, theta_G)

# theta_D and theta_G are the weights and biases of D and G respectively
Repeat the above for a number of epochs

所以,是的,你是对的,我们本质上认为生成器和鉴别器是一个巨大的网络,用于在我们使用假数据时交替小批量。生成器的损失函数负责这一半的梯度。如果您孤立地考虑这种网络训练,那么它的训练方式就像您通常训练 MLP 一样,其输入是生成器网络的最后一层输出。

您可以在此处(在许多地方)使用 Tensorflow 中的代码进行详细说明: http ://wiseodd.github.io/techblog/2016/09/17/gan-tensorflow/

看代码后应该很容易理解。

您是否本质上将生成器的输出附加到鉴别器的输入?>然后将整个事物视为一个巨大的网络,其中 >鉴别器部分的权重是恒定的?

很快:是的。(我挖掘了一些 GAN 的资源来仔细检查这一点)

GAN 训练还有很多其他内容,例如:我们应该每次更新 D 和 G,还是在奇数迭代时更新 D,在偶数迭代时更新 G,等等。还有一篇关于这个主题的非常好的论文:

“训练 GAN 的改进技术”

Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, Xi Chen

https://arxiv.org/abs/1606.03498

我发现了这个很棒的资源: https ://developers.google.com/machine-learning/gan/training

这是其中的一部分所以我们使用以下程序训练生成器: 1- 采样随机噪声。2- 从采样的随机噪声中产生发生器输出。3-获取发生器输出的鉴别器“真实”或“假”分类。4-计算鉴别器分类的损失。5- 通过鉴别器和生成器反向传播以获得梯度。6- 使用梯度只改变生成器的权重。

最近我在 github repo 上上传了各种 GAN 模型的集合。它基于torch7,并且非常容易运行。代码很简单,可以通过实验结果来理解。希望这会有所帮助

https://github.com/nashory/gans-collection.torch