从潜在向量生成大图像 - 第二部分

时间:2022-04-26
本文章向大家介绍从潜在向量生成大图像 - 第二部分,主要内容包括动机、模型描述、用分类器网络代替判别器、变分自编码器损失函数、生成器网络描述、结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

更多分辨率为1080x1080的MNIST数字

深度残差生成网络

GitHub

之前的文章中,我们研究了一种生成算法,该算法在对一组低分辨率图像进行训练的时候,例如MNIST或CIFAR-10,可以在任意高分辨率下生成数字图像。这篇文章探讨了对先前模型的一些改进,以产生更有趣的结果。

具体来说,我们在变分自编码器中删除了像素重构损失的使用。用于识别伪造图像的判别器网络被分类器网络所取代。之前使用的生成器网络是由4层128个全连接节点组成的相对较大的网络,我们试图用一个更深的96层但每层只有6个节点的网络来代替这个网络。最后,我们探讨了比正常的神经网络权重初始化方法要大得多的权重的初始化,并讨论了网络训练不足的好处。

动机

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

研究生成算法的研究人员还需要设计一组量化分数来评估算法的执行情况。当一个英语句子被翻译成中文时,通常将生成的句子与测试数据集使用似然损失或者诸如BLEU分数的一些人工指标进行比较。文本数据、音乐或图像的生成也是如此。

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

你会在客厅挂上哪些东西?

下面是从先前的博客文章的生成网络中抽取的数字图像。从numpy.random生成随机高斯潜在向量,并将其馈入生成网络来获得这些图像。

下面是从我们将在这篇文章中描述的修改过的模型中生成的样本:

我觉得这些新样本比之前的模型生成的样本更加生动活泼,并且表现出更多的特征。

模型描述

我们的生成模型有两个目标要实现。第一个目标是训练我们的生成网络,以产生与28x28像素分辨率下的真正的MNIST数字难以区分的MNIST数字的图像。第二个目标是使用相同的网络以更高的分辨率(即1080x1080或3240x3240)生成数字图像,并且让更大的图像对人类来说看起来是真正有趣的(至少对我来说)。

我们已经看到一个生成网络从完全随机的权重中创建出相当有趣的图像,所以这个思想就是首先训练一个能产生合格的28x28 MNIST图像这样的网络,然后在同一个网络上产生一个能够满足我们的两个目标的分辨率更大的图像。

我们的生成器可以使用随机高斯向量作为输入来生成分辨率更大的随机数字图像。

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

然而,与之前的模型不同的是,生成的图像不必看起来非常像训练集里的图像。所有的生成器必须做的是创建一组新的图像,这些图像共享图像训练集的相同的分类标签。换句话说,生成器网络的工作就是欺骗分类器网络,使其认为生成的图像与原始的标签具有相同的类别。

除了对数字进行分类学习之外,分类器网络还学习检测早先生成的欺骗性图像,并且必须学会将这些伪造图像放在其它的类别中(所以在0-9标签之后,Softmax中将有第11个类别,伪造图像类别)。

用分类器网络代替判别器

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

我们遇到的问题是,纯粹的GAN模型生成的MNIST数字集合,往往只有一个子集可以很好地通过判别器测试。不能保证所有10个数字都会生成。如果这个网络真的擅长生成数字4和6,那它在生成数字7的图像时将会有困难。这就是为什么我在前面的模型中添加一个VAE组件来让它通过VAE训练过程可以生成整组数字。但是,让网络产生多样化的图像,这不是唯一的方法。

在这个模型中,为了使网络产生全部十位数,判别器网络被转换成分类器网络。Softmax用于根据分类器的输出来对给定图像属于某个数字类别分配概率。生成器的工作就是尝试对给定的属于某一类数字的潜在变量,生成一个图像,即,使分类器的softmax的输出为该类的概率最大化。它不仅需要生成一个真实的MNIST数字,还必须生成一个看起来像某个类的图像。除了学习将训练集中的图像分类成0-> 9个标签,分类器还必须学习检测伪造的图像,并把它们放在第11个类别。通过增加这个条件,我们的GAN模型将别无选择,只能生成全部十个数字,因为这是被不断地测试的。将额外的信息标签结合到网络要生成的图像中,这和Style GANs是一个类似的概念。

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

P(Classifier Output = Training Label | Training Image)

P(Classifier Output = Class 11 | Generated Image)

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

P(Classifier Output = Training Label | Generated Image)

同时尽量减少潜在误差。

变分自编码器损失函数

原本VAE有两个用途:将来自MNIST数据集的样本图像编码成近似单位高斯变量(在我们的模型中,一个潜在矢量由32个数值组成)的小的实数矢量,并且生成与训练图像看起来很像的图像。

潜在矢量的 高斯性 相对真的高斯性的向量的差别称为 潜在损失KL散度 误差。这个误差可以很容易地通过反向传播来进行端对端计算。

VAE计算的相似性度量是基于生成的与原始的图像之间的像素上的差异。为了计算这个像素重构损失,可以使用L2损失或logistic回归损失,并且通过端到端的反向传播训练也可以使这个误差最小化。VAE的总损失是重构损失和潜在损失两者的总和。

我不崇拜像素重构损失这个概念,因为这不是人类看待世界的方式。当我们看到一张狗的照片时,我们并不是和我们大脑中的记忆进行逐像素地比较,以确定照片是否确实是我们的宠物狗的照片,而是比较抽象的高阶特征和从照片中提取的概念。

如果之前描述的用于将图像分类为正确数字标签的卷积网络分类器也正在学习从图像中提取更高阶的概念和特征,那么使用这个卷积网络而不是像素重构损失来告诉我们的图像有多 应该也很有趣。所以在这个模型中,我们将用前面章节中使用的分类器的损失函数代替像素重构损失,来最小化softmax的误差。

而且,我们可以用一步同时训练生成模型和VAE潜在误差!不需要像以前的模型那样在两个步骤中完成。我发现这个过程简化了生成模型的训练,并且同时给判别分类器更多的工作去做。除了判别真伪,判别器还有额外的任务,就是学习分类数字。让GAN训练好是一个很大的问题,因为我们总是需要放慢判别器的训练,给生成器一个机会。难度差距也缩小了一点,使GAN系统更容易训练。

生成器网络描述

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

更薄更深的网络

我发现与较大的浅层网络相比,具有更深结构的较小网络(如果权重设置恰当)看起来更有趣。或许这与深层网络相对于浅层网络来说具有更强的计算能力有关。但是深度网络更难以训练。最近有一些发现,如残差网络,它使得训练非常深的网络变得容易些。

残差部分

我选择使用残差网络结构来训练一个非常深的但是很薄的生成网络。网络的残差属性使得对于梯度在多个网络层上反向传递误差变得更加容易。在生成网络中使用这种结构的思想是受到了DRAW模型的启发,DRAW模型经常使用相同的网络块十几次循环地生成图像。我想我可能会尝试使用残差网络,并让每个块的权重有不同的灵活性。

生成器网络的结构:

单个残差块结构:

最后,我使用了24个残差网络块,每个块包含5层(4层 relu和1层 tanh),如上图所示。较粗的线条表示初始权重会比较大,而细线则相反。初始化这些块,以便它们可以生成有趣的图像。

较大权重的初始化

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

图像生成了8层64个节点。权重随机初始化如下:

但是,对于图像的生成,并不是越小越好。在上图中我们可以看到,即使在标准差为0.30的情况下,这可能远大于典型的神经网络训练所使用的初始权重,所得到的图像看起来并不太有趣。用一组大的随机权重生成的图像比小的权重看起来更有趣,而且我发现如果权重开始的时候接近零,它们只会大到足以解决手头的任务,但不会超过这个。我决定初始化每个子块内relu层的权重,使其比通常的要大得多(即标准差为1.0),这样这些块将分别产生更多有趣的子图像。然而,残差网络每个块最后的tanh层,权重将被初始化为非常接近零。因为tanh(0)是0,所以残差网络的每一块的信息都会像恒等函数一样通过。优化器将增加每个子块tanh层的权重,逐渐地让它能够访问24个随机初始化块中的每一个有趣的随机属性。

如果我想生成有趣的图像,结果是非常重要的。通过阅读很早之前的神经网络的相关研究,例如回波状态网络,储层计算和evolino LSTM训练方法,我想到了这个思想。该理论认为,自那时以来,大型神经网络难以训练,我们可以做的是定义一个非常大的神经网络(可以是前向反馈,亦或甚至是rnn/lstm),并且具有完全随机的权重(或者从神经进化中产生的权重)。事实证明,具有完全随机权重的神经网络仍然可以具有有趣而强大的计算能力。一个薄的网络层被附加到神经网络的激活部分以完成一些任务(例如预测一个复杂的信号),并且只有这个最后的薄层被反向传播训练。这种随机加训练层的混合对于许多任务来说都相当管用。

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

结果

以下是由先前使用VAE中重构损失的模型生成的数字:

这里是在带有残差生成网络的新的GAN模型中经过6个训练阶段后的数字。如果您单击单个图像,与以前的模型相比会发现在细节上有明显的差异。

我也使用每层只有4个节点的生成网络进行了实验。当它试图生成全部10个数字时,我们可以看到一些限制和挣扎:

我还训练了比6个阶段更长的模型,并且我发现在24个训练阶段之后,网络在生成更好的MNIST数字方面做得更好,但是这样做是以图像看起来有趣的程度为代价来提高的分辨率。也许一些大的初始权重随着时间的推移而降低,以满足模型的第一个目标,而牺牲第二个的目标(产生一些看起来更有趣的东西) - 我想这是一个不容易量化的东西。

先前的模型: 视频地址

当前模型 - 6个阶段: 视频地址

当前模型 - 24个阶段: 视频地址

你最喜欢哪一个?