基于CPPN与GAN+VAE生成高分辨率图像

来源:otoro

编译:weakish

在之前的文章中,hardmaru讨论了一种生成算法,可以在诸如MNIST或CIFAR-10这样的低分辨率图像上训练,以任意高的分辨率生成数字图像。这篇文章探索了之前模型的一些变化,以生成更有趣的结果。

具体来说,我们删除了在变分自编码器中使用的像素到像素的重构损失函数。我们用一个分类网络取代了用于检测虚假图像的判别网络。之前使用的生成网络是一个相对较大的网络,包含由128个全连接节点组成的4层网络,我们尝试用一个更深的网络来取代之前的生成网络,新网络有96层,但每层只有6个节点。最后,我们探索了相对普通神经网络权重初始化方法要大很多的初始化值,该初始化以生成艺术为目的。我们也讨论了网络训练不足的益处。

动机

直到最近,机器学习研究的大部分内容都是针对某些量化指标和基准测试评估一个模型。某些机器学习任务中的度量标准非常清晰,例如分类精确度、预测误差或从雅达利游戏中取得的分数。

研究生成式算法的研究人员同样需要设计一组量化分数来评估算法的表现。当一句英文翻译成中文时,我们通常使用似然损失或BLEU之类的方法将生成的句子与测试数据集进行比较。这同样适用于文本数据、音乐或图像的生成。

虽然我认为标准对于衡量机器学习算法的表现是有用的,但是当我们将它们用于不太好测量的东西时,我们必须更加小心。例如,我相信一旦机器学习算法被用来创造一些被认为是艺术的东西,我们应该更仔细地考虑如何定义指标来评估我们的算法。当机器正在训练你的艺术生成模型时,它究竟是为了什么目的而优化呢?

你会在起居室里挂上哪幅画呢?

下面是从之前的文章使用的生成网络抽取的样本图像。将numpy.random生成的随机高斯潜向量传入生成网络得到了这些图像。

下面是本文修改的模型生成的样本:

我觉得新样本比之前的模型生成的样本要生动很多,也更有个性。

模型

我们的生成模型要达成两个目标。第一个目标是训练我们的生成网络,生成与28x28像素分辨率下的实际MNIST数字高度相似以至于无法区分的图像。第二个目标是使用相同的网络以更高的分辨率(1080x1080或3240x3240)生成数字的图像,并且让人类真的觉得这些更大的图像看起来有意思(好吧,至少让我觉得有意思)。

我们已经看到一个生成网络从纯粹的随机权重中创建出相当有趣的图像,所以我们的打算是首先训练网络生成过的去的28x28 MNIST图像,然后在同一个网络上生成一个可能可以满足我们的两个目标的更大图像。

之前的文章描述了整个模型是如何工作的。但不像以前的模型,这次我们将利用MNIST数字的分类标签。一开始,一个batch的训练图像将通过一个分类网络,这个网络将学习识别每个MNIST图像的实际数字标签(这是使用神经网络进行分类的第一课)。然后,就像之前的模型一样,同一batch的图像进入一个编码器,转换成一束高斯随机变量,也就是潜向量Z,然后传入生成网络以生成另一组图像。

然而,与之前的模型不同的是,生成的图像不一定需要和训练图像集非常相似。生成网络的工作是创建一组和训练图像集使用相同的分类标签的新图像。换句话说,生成网络的工作就是愚弄分类网络,让分类网络以为生成的图像与原始batch的标签具有相同的类别。

除了对数字进行分类学习之外,分类网络同时学习检测早先生成的欺骗性图像,并且学习将这些假图像归入一个专门的类别(因此Softmax将有排在0-9之后的第11个类别)。

替换判别网络为分类网络

经典的GAN模型使用二元判别网络来判断生成的图像是否来自真实训练图像集合。判别函数是一个相对容易的机器学习任务,而且很容易训练。

我们遇到的问题是,纯粹的GAN模型将倾向于仅产生MNIST数字的一个子集,以通过判别网络的测试,不能保证覆盖所有10个数字。如果网络真的能很好地生成数字4和6,它不会产生7。这就是为什么我在之前的模型中添加了一个VAE组件来迫使它通过VAE训练过程生成所有数字。但是,这不是迫使网络生成多样化图像的唯一方法。

在本文的模型中,为了使网络生成全部十个数字,我们将判别网络转换成分类网络。softmax用于指定属于某个数字类别的给定图像的分类器的输出概率。生成网络的工作就是基于给定的属于某一数字类别的潜变量尝试生成图像,即最大化该类别的分类器的softmax输出概率。它不仅需要生成一个真实可信的MNIST数字,还必须生成一个看起来像某个类的图像。除了学习将训练集中的图像分类0-9之外,分类器还需要学习检测伪造的图像,并把它们放在第11类。增加这个条件之后,我们的GAN模型将别无选择,必须生成全部10个数字,因为我们将持续测试模型是否满足这个条件。这一概念类似Style GAN将额外的标签信息与网络生成图像相结合的做法。

判别网络的目标是最大化以下两个条件:

生成网络的目标是最大化:

同时最小化潜误差。

变分自动编码器损失函数

原本的VAE有两个目的:将来自MNIST数据集的样本图像编码成由实数组成的小向量,该向量类似单位高斯变量(在我们的模型中为由32个实数组成的潜向量),并生成与训练图像看起来相似的图像。

潜向量的高斯性(Gaussian-ness)与真实高斯的差别称为潜损失(latent loss)或KL散度(KL divergence)误差。这个错误可以很容易地通过反向传播使用贝叶斯之神告诉我们的黑魔法来端到端地计算。

VAE计算的相似性度量是基于生成图像与原始图像之间像素到像素的差异。计算这个像素到像素的重构损失,可以使用L2损失或逻辑回归损失,同时,通过端到端的反向传播训练可以极小化这个误差。VAE的总损失是重建损失和潜损失两者之和。

像素到像素重建错误不是我的菜,因为这不符合人类看待世界的方式。当我们看到一张狗的照片时,我们不会像素到像素地与我们大脑中的记忆比较,以确定照片是否确实是一张关于我们的宠物狗的照片。相反,我们比较从照片中提取的高层抽象特征和概念。

如果用于分类图像为前述正确数字的卷积网络分类器也同时学习从图像中提取高层概念和特征,那么使用这个卷积网络来告诉我们图像有多好会比使用像素到像素的重建损失更有意思。因此在这个模型中,我们将用前文提到的分类器的损失函数来代替重建损失,以最小化softmax误差。

作为奖励,我们可以一次性训练生成模型和VAE潜误差!不需要像之前的模型那样分两步完成。我发现这个过程简化了生成模型的训练,同时给判别分类网络分配了更多的工作。判别网络在辨别真假之外,还需承担学习分类数字的额外任务。让GAN好好训练是一个大问题,因为我们总是需要减缓识别网络的训练,给生成网络一点机会。缩小一点两者之间的难度差距,可以使GAN系统更容易训练。

生成网络

先前模型中使用的生成网络用了4个大型的包含128个节点的全连接层。这使得网络相对容易适应各种训练数据,但我发现较大的网络不一定会产生更有趣的图像。

更薄但更深的网络

我发现,如果权重设置得当的话,相比较大的浅度网络,具备较深架构的小型网络看起来更有趣。也许这是因为与浅度网络相比,深度网络具有更强的计算能力。但是深度网络更难训练。最近的一些发现,比如残差网络,使训练非常深的网络变得容易一点。

残差组件

我选择使用残差网络架构来训练一个非常深但较薄的生成网络。网络的残差特性使梯度更容易在许多网络层之间反向传递误差。在生成网络中使用这种架构的想法受到DRAW模型的启发,DRAW模型使用相同的网络块的十几次循环来渐进地生成图像。我想我可能试试残差网络,并使每个块的权重可以灵活配置。

残差网络架构

单残差块的架构

最后,我使用了24个残差网络块,每个块包含5层(4个Relu层和1个Tanh层),如上图所示。 较粗的线条表明最初的权重会很大,而细线与之相反。窍门是初始化这些块,使它们能够生成有趣的图像。

较大的初始权重

通常在神经网络训练中,经验法则是选择一组较小的权重,与节点数量的平方根成反比,以避免过拟合数据。开始的时候,权重被初始化为接近于零的数字,而优化器将惩罚来自正则化的大权重。我认为这是一个明智的训练分类或回归类型问题网络的方法。

由64节点组成的8层网络生成的图像,随机选择不同初始权重

但是,对于图像生成而言,较小并不总是意味着更好。在上图中我们可以看到,即使在标准偏差为0.30的情况下(可能远大于典型的神经网络训练所使用的初始权重),所得到的图像看起来也不太有趣。用一组较大的随机权重生成的图像看起来更有趣。如果初始权重接近于零,我发现它们只会增大到足以解决手头的任务,但不会变得更大。我决定使用比通常所用的值大得多的值来初始化每个子块内的Relu层的权重,这样这些块将分别产生更有趣的子图像。然而,每个块最后的tanh层将被初始化为非常接近零的权重。由于tanh(0)为0,因此最初,残差网络的每个块将像恒等(identity)函数一样直接通过。优化器将增加每个子块最后的tanh门的权重的大小,使其渐渐地得以利用24个随机初始化的块中每一块的有趣的随机属性。

如果我想生成不乏味的图像,这一点非常重要。我通过阅读远古时期的神经网络研究(例如回声状态网络(echo state networks),储存池计算(reservoir computing)和evolino LSTM训练方法)得到了这个想法。当时训练大型神经网络很困难,我们可以做的是定义一个非常大的神经网络(可以是前馈,也可以是rnn/lstm),该网络具有完全随机的权重(或者基于神经演化得到的权重)。事实证明,基于完全随机权重的神经网络仍然可以具备有趣而强大的计算能力。一个很薄的最终网络层被附加到神经网络激活的小子集来完成一些任务(例如预测复杂的信号),只有这个最后的薄层通过反向传播训练。对于许多任务来说,这种混合随机网络+训练好的层的模型相当强大。

我们的图像生成可以训练每个初始权重非常小的tanh层允许来自配置了高权重的relu层的信息通过,从而允许初始权重设置中的一些随机性出现在最终图像中。

结果

下图是之前使用配备重建损失组件的VAE的模型生成的数字:

下图是新的基于残差生成网络的GAN模型在6 epoch训练之后得到的结果。

我也试过使用每层只有4个节点的生成网络。我们可以看到,它在试图生成所有10个数字时的困难和挣扎:

我还进行了超过6 epoch的训练,我发现经过24 epoch训练之后,网络能产生更好的MNIST数字,但是这样做的代价是膨胀到高分辨率后图像看起来不那么有趣了。也许一些大的初始权重随着时间的推移在降低,以满足模型的第一个目标,牺牲了第二个生成更有趣的东西的目标。我想这是一个尚不容易量化的东西。

原文地址:http://blog.otoro.net/2016/06/02/generating-large-images-from-latent-vectors-part-two/

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171228G0UIDN00?refer=cp_1026

扫码关注云+社区