本文主要是介绍生成模型之生成器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
生成模 型中网络会被作为一个生成器(generator)来使用。具体来说,在模型输入时会将一个随机 变量z 与原始输入x一并输入到模型中,这个变量是从随机分布中采样得到。输入时可以采 用向量拼接的方式将x和z一并输入,或在x、z 长度一样时,将二者的加和作为输入。这 个变量z 特别之处在于其非固定性,即每一次我们使用网络时都会从一个随机分布中采样得 到一个新的z。通常,我们对于该随机分布的要求是其足够简单,可以较为容易地进行采样, 或者可以直接写出该随机分布的函数,例如高斯分布(Gaussian distribution)、均匀分布 (uniform distribution)等等。所以每次有一个输入 x 的同时,我们都从随机分布中采样得 到z,来得到最终的输出y。随着采样得到的z 的不同,我们得到的输出y 也会不一样。同 理,对于网络来说,其输出也不再固定,而变成了一个复杂的分布,我们也将这种可以输出一 个复杂分布的网络称为生成器,如图 1所示。
图1 生成器示意图
下面我们介绍如何训练这个生成器。首先,我们为什么要需要训练生成器,为什么需要输 出一个分布呢?下面介绍一个视频预测的例子,即给模型一段的视频短片,然后让它预测接下 来发生的事情。视频环境是小精灵游戏,预测下一帧的游戏画面,如图 2所示。
图2 视频预测例子——以小精灵游戏为例
要预测下一帧的游戏画面,我们只需要输入给网络过去几帧游戏画面。要得到这样的训 练数据很简单,只需要在玩小精灵的同时进行录制,就可以训练我们的网络,只要让网络的输 出y,与我们的真实图像越接近越好。当然在实践中,我们为了保证高效训练,我们会将每一 帧画面分割为很多块作为输入,并行分别进行预测。我们接下来为了简化,假设网络是一次性 输入的整个画面。如果我们使用前几章介绍的基于监督学习的训练方法,我们得到的结果可 能会是的十分模糊的甚至游戏中的角色消失、出现残影的,如图 3所示。
图3 基于监督学习的小精灵游戏的预测值
造成该问题的原因是,我们监督学习中的训练数据对于同样的转角同时存储有角色向左 转和向右转两种输出。当我们在训练的时候,对于一条向左转的训练数据,网络得到的指示就 是要学会游戏角色向左转的输出。同理,对于一条向右转的训练数据,网络得到的指示就是学 会角色向右转的输出。但是实际上这两种数据可能会被同时训练,所以网络就会学到的是“两 面讨好”。当这个输出同时距离向左转和向右转最近,网络就会得到一个错误的结果———— 向左转是对的,向右转也是对的。
所以我们应该如何解决这个问题呢?答案是让网络有概率的输出一切可能的结果,或者 说输出一个概率的分布,而不是原来的单一的输出,如图 4 所示。当我们给网络一个随机 分布时,网络的输入会加上是一个z,这时输出就变成了一个非固定的分布,其包含了向左转和向右转的可能。举例来说,假设我们选择的z服从一个二项分布,即就只有0和1并且各 占50%。那么我们的网络就可以学到z采样到1的时候就向左转,采样到0的时候就向右转, 这样就可以解决了。
图4 基于生成模型的小精灵游戏的预测结果
回到生成器的讨论中,我们什么需要这类的生成模型呢?答案是当我们的任务需要“创造 性”的输出,或者我们想知道一个可以输出多种可能的模型,且这些输出都是对的模型的时候。 这可以类比于,让很多人一起处理一个开放式的问题,或者是头脑风暴,大家的回答五花八门 可以各自发挥,但是回答都是正确的。所以生成模型也可以被理解为让模型自己拥有了创造 的能力。再举两个更具体的例子,对于画图,假设画一个红眼睛的角色,那每个人可能画出来 或者心中想的动画人物都不一样。对于聊天机器人,它也需要有创造力。比如我们对机器人 说,你知道有哪些童话故事吗?聊天机器人会回答安徒生童话、格林童话甚至其他的,没有一 个标准的答案。所以对于我们的生成模型来说,其需要能够输出一个分布,或者说多个答案。 当然在生成模型中,非常知名的就是生成式对抗网络(generative adversarial network), 我们通常缩写为GAN。这一节我们就讲介绍这个生成对抗网络。
我们通过让机器生成动画人物的面部来形象地介绍GAN,首先介绍的是无限制生成(un conditional generation),也就是我们不需要原始输入 x。其对应的就是需要原始输入 x 的条件型生成(conditional generation)。如图 5 所示,对于无限制的 GAN,它的唯一 输出就是z,这里假设为正态分布采样出的向量。其通常是一个低维的向量,例如50、100的 维度。
图5 基于无限制生成的GAN
我们首先从正态分布中采样得到一个向量z,并输入到生成器中,生成器会给我们一个对 应的输出——一个动漫人物的脸。我们聚焦一下生成器输出一个动漫人物面部的过程。其实 很简单,一张图片就是一个高维的向量,所以生成器实际上做的事情就是输出一个高维的向 量,比如是一个64×64 的图片(如果是彩色图片那么输出就是64×64×3)。当输入的向量z 不同的时候,生成器的输出就会跟着改变,所以我们从正态分布中采样出不同的z,得到的输 出y 也就会不同,动漫人脸照片也不同。当然,我们也可以选择其他的分布,但是根据经验,分布之间的差异可能并没有非常大。大家可以找到一些文献,并且尝试去探讨不同的分布之 间的差异。我们这里选择正态分布是因为其简单且常见,而且生成器自己会想方设法把这个 简单的分布对应到一个更复杂的分布。所以我们后续的讨论都以正态分布为前提。
这篇关于生成模型之生成器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!