4 建议和技巧
实践者们会使用一些提升 GANs 性能的技巧。我们很难去判断这些技巧会发挥什么样的作用了;很多技巧会在一些环境中有帮助但在另外一些环境中却又起到反作用。
NIPS 2016 同样包含一个关于对抗训练的 workshop,由 Soumith Chintala 给了称为“How to train a GAN”的邀请报告。这个报告和本文部分内容的目标类似,不过两者内容选择上有一定差异。想要了解本课程中没有的建议和技巧,请参考 GitHub 相关项目:https://github.com/soumith/ganhacks
4.1 带标签训练
以任意方式使用标签,形状或者形式总会给模型生成样本的主观判断的质量带来显著提升。这个首先由 Denton et al. (2015) 发现,他构建了一个 class-conditional GANs 相比自由生成任意类别的 GANs 能够生成更加好的样本。后来,Salimans et al. (2016) 发现即使生成器没有显式地利用类别信息也能让样本质量有所提升;训练这个判别器来识别真实对象的特定类别就足够了。
当然对这个技巧工作原理大家还不是完全清楚。可能是类别信息的引入给于训练过程有用的线索可以帮助优化。同时也可能是该技巧在样本质量上没有客观的提升,但是产生了一些样本在人类视觉系统关注的性质上的偏差。如果是后面这个情况,那么这个技巧并不会带来更好的数据产生分布模型,但是仍然对创造人类观众更享受的媒体有帮助,也可能帮助 RL 智能体执行依赖对环境的跟人类更相关的某些方面的知识的任务。
我们在比较不同结果时确保所有的情况都是在用这个技巧下进行的是非常重要的,利用标签训练的模型必须和同样使用标签训练的其他模型一起比较,class-conditional 模型也是要和其他 class-conditional 模型放在一起比较。否则就是不公平和没意思的 benchmark,因为这就像在图像任务上用一个卷积模型通常会超过非卷积模型一样。
4.2 单边标签平滑
GANs 在判别器估计两个密度的比例时工作,但是深度神经网络更易会产生高置信度的输出,输出的是正确的类别但是太极端的概率。这情况尤其在输入是对抗构造出来的时候格外常见;分类器倾向于线性 推断 extrapolate 并产生置信度特别高的预测(Goodfellow et al., 2014a)。
为了鼓励判别器估计出软一些的概率,我们可以采取一种称为单边标签平滑(Salimans et al., 2016)。
通常我们使用(8)公式来训练判别器。我们可以将其用 TensorFlow (Abadi et al., 2015)代码写出来:
d_on_data = discriminator_logits(data_minibatch)
d_on_samples = discriminator_logits(samples_minibatch)
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, 1.) + tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
单边标签平滑的想法是将真实样本的目标用一个稍微小于 1 的值代替,比如说 .9:
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, .9) + \ tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
这样会防止判别器的极端推断行为;如果它学会预测特别大的 logits 对应于一个达到 1 的概率,这样的方式能进行惩罚并鼓励将 logits 拉回到稍小的值。
不过对伪造样本的标签不需要平滑。假设我们对真实数据用一个 1-α 目标函数而伪造数据是 0+β 。那么最优的判别器函数就是
当 β 为 0 时,按照 α 去平滑并不会有什么影响,同时还降低了判别器的最优值的尺度。当 β 非 0 时,最优判别器函数的形状会变化。特别在 pdata(x) 非常小且 pmodel(x) 大一些的时候,D*(x) 会在 pmodel(x) 的伪造众数处有一个峰值。判别器将会在生成器中强化不正确的行为;生成器将会被训练成或者产生样本类似数据或者产生和其产生过的样本类似的样本。
单边标签平滑是一个更早的平滑标签技术的简单变化,可以追溯到 1980 年代。Szegedy et al. 2015 展示了标签平滑是一个在用于对象识别的卷积网络很好的正则化子 regularizer。这样的原因是它不会鼓励模型在训练集上选择不正确的类别,而仅会降低在正确类别的置信度。其他的正则化子如权重下降如果参数设置得过高通常会导致一些误分类的情况出现。Warde-Farley 和 Goodfellow (2016)揭示了标签平滑可以帮助降低对抗样本的影响,这表明标签平滑应该能帮助判别器更加有效地学会抵挡生成器的“进攻”。
4.3 虚拟批规范化 Virtual batch Normalisation
因为 DCGAN 的引入,大多数 GAN 架构包含了某种形式的 BN。BN 的主要作用是提升模型的优化,通过重参数化模型使得每个特征的均值和方差由和那个特征关联的单个均值参数和单个方差参数控制,而不是有一个复杂的由所有抽取特征的层的所有权重来确定。这个重参数化通过在一个 minibatch 上减去那个特征的均值并除上其标准差实现。规范化操作其实是模型的一部分,所有反向传播计算那些被定义为总是被规范化的特征的梯度。用这个方法,如果没有将规范化作为模型的一部分定义的话,特征频繁重规范化会降低效率。
BN 是很有用的,但是对 GANs 其实有一些不好的副作用。使用数据的不同的 minibatch 在每个训练步中计算规范化统计量会产生这些规范化常量的波动。当 minibatch 很小时(通常在尝试用有限的 GPU 内存来拟合大生成式模型的时候)这些波动会变得过大使得能够对生成的图像产生比输入 z 更大影响。参考图 21。
Salimans et al., (2016) 引入了技术来减轻这个问题。引用BN(Reference Batch Normalisation)运行网络两次:第一次在一个在训练开始时采样且不会被替换的 reference examples 的 minibatch 上,还有一个在当前要用来训练的 minibatch 上。每个特征的均值和标准差使用引用batch进行计算。每个 batch 的特征然后使用这些计算得到的统计量进行规范化。引用 BN 的缺点就是这个模型会对这个引用 batch 过匹配。为了稍微降低这个问题的影响,大家可以使用 virtual batch Normalisation,其中对每个样本的规范化统计量使用那个样本和引用 batch 的并集来计算。引用BN 和虚拟BN 独立处理,由生成器产生所有样本都是独立同分布的(除了那些定义了引用batch)。
4.4 我们能够保持 G 和 D 的平衡么?
很多人有一种直觉就是很有必要来平衡这两个参与人使得一方不要过强。如果这样的平衡是值得的并且易解,那么还没有一种有说服力的形式出现。
作者本人现在的相信 GANs 通过估计数据密度和模型密度的比例工作。这个比例仅会在判别器最优的时候被正确估计,所以对判别器来说超过生成器其实是很好的。
有时候生成器的梯度会在判别器太准确的时候消失。解决这个问题的正确方式是不去限制判别器的力量,但是可以使用参数化博弈使得梯度不会消失(参见 3.2.3 节)
有时候如果判别器置信度太高时生成器的梯度过大。与其让判别器准确度降低,更好的方式是使用单边标签平滑(4.2节)。
判别器应该总是最优来最好地估计比例意味着生成器训练每步则以 k > 1 步骤来训练判别器。实践中这种方式不一定有明显提升。
我们同样还能够通过选择模型大小来平衡生成器和判别器。实践中,判别器通常会更深,有时候有更多的过滤器。这个可能是因为对判别器来说正确估计两个密度之间的比值更加重要,但是也可能是众数坍缩问题——因为生成器在现在的训练方法下不能使出所有能力,实践者们也没看到提升生成器容量得到的好处。如果众数坍缩问题可以被解决,生成器的大小会增大。我们也不知道判别器的大小是否会按照比例同样增长。