查看原文
其他

如何教机器绘画?

2017-05-04 DevRel 谷歌开发者

文 | Google Brain 学员 David Ha


抽象的形象沟通对于人们交流思想发挥了重要的作用。孩子们很小的时候就发展出用简单的线条来描绘事物甚至表达自己情感的能力。这些简单的绘画可能没有照片来得真实,但它确实可以让我们从另一个角度了解人们是如何描绘和重建周围的世界的。


▲ sketch-rnn 生成的矢量图


在最新论文《简笔画绘图的神经表征》(A Neural Representation of Sketch Drawings) 中,我们提出了一个能够生成常见物体简笔画的生成式循环神经网络,其目标是以类似于人类的方式训练机器绘画和概括抽象概念。我们利用一个手绘简笔画的数据集训练我们的模型,其中每张简笔画表示握笔动作的一个序列:往哪个方向移动,什么时候提笔以及停笔。这样我们就可以创建一个具有广泛应用潜力的模型,从协助艺术家进行创作到帮助教学生如何绘画。


对于使用神经网络的生成式建模方面,目前已做了大量工作,其中大部分工作的重心是以 2D 像素网格来表示光栅图像。尽管这些模型目前能够生成逼真的图像,但由于 2D 像素网格的高维度,其面临的一个关键挑战是生成具有连贯结构的图像。这些模型有时产生的图像很有趣,例如,有三只乃至更多眼睛的猫,或有多个头的狗。


▲ 上图展示了生成的身体部位数量错误的动物,这些是使用 128x128 ImageNet 数据集训练的先前 GAN 模型生成的。上图是 Ian Goodfellow 的 NIPS 2016 教程《生成对抗网络》(Generative Adversarial Networks) 中的第 29 图。


在这项工作中,我们受到人类绘画方式的启发,对更低维度的基于向量的表征进行了研究。我们的模型 sketch-rnn 以 sequence-to-sequence (seq2seq) 自编码器框架为基础。它融入了变分推理,并将超网络用作循环神经网络细胞。seq2seq 自编码器的目标是训练网络将输入序列编码成一个被称作隐向量的浮点数向量,并通过一个解码器尽可能接近地再现输入序列,从这一隐向量中重建输出序列。


▲ sketch-rnn 的原理图


在我们的模型中,我们刻意向隐向量添加噪音。在我们的论文中,我们展示了通过将噪声引入编码器和解码器之间的通信通道中,让模型无法再准确地再现草图,而是必须学会以噪音隐向量的形式捕捉草图的本质。我们的解码器将使用这个隐向量生成用于构建新简笔画的一系列动作。在下图中,我们将几个表现真实的猫的样子的简笔画输入编码器中,以使用解码器生成重建的简笔画。


▲ 受过猫简笔画训练的模型重建的简笔画


需要强调的是,重建的猫简笔画并不是对输入的简笔画的复制,而是与输入的简笔画具有相似特征的全新草图。为证明模型不是简单地复制输入顺序,而是确实学会了人类画猫的一些技巧,我们可以尝试将非标准简笔画输入编码器中:

当我们输入一个三眼猫的简笔画后,模型将生成一个具有类似轮廓的猫,但它只有两只眼睛,这就表明我们的模型已经知道猫只有两只眼睛。为证明我们的模型并不是简单地从大量储存的猫简笔画中选择最接近正常的猫的简笔画,我们可以尝试输入一些完全不同于猫的物体,如一只牙刷的简笔画。我们看到网络仍然努力生成了一只猫的形象,拥有长长的胡须,同时尽量遵循牙刷的形状。这表明网络已经学会了将输入简笔画编码成一组抽象的猫的概念,并嵌入到隐向量中,同时还能基于这个隐向量重建一个全新的简笔画。


还是不太相信?我们再用一个受过小猪简笔画训练的模型来重复此实验,看看能不能得出相似结论。如果输入一只有八条腿的猪,该模型生成的形状将与猪相似,并且只有四条腿。如果向画猪的模型输入一辆卡车的简笔画,那么它就会画出一头长得像卡车的猪。


▲ 受过小猪简笔画训练的模型重建的简笔画


为了研究这些隐向量是如何编码动物形态特征的,在下图中,我们首先从两张迥然不同的小猪简笔画中获得隐向量,在此案例中是一个猪头(绿色框中)和猪的全身(橙色框中)。我们希望了解我们的模型是如何学会表现猪的形象的,一种方法是在两个不同的隐向量之间进行内插,并将内插的隐向量生成的每个简笔画进行可视化。如下图所示,我们展示了猪头的简笔画是如何慢慢变成整头猪的,以及模型是如何理解猪的简笔画这个概念的。我们可以看到隐向量控制着简笔画中鼻子相对于头的位置和尺寸,然后又添加了身体和腿。


▲ 从一个受过猪简笔画训练的模型生成的隐空间插值


我们还想知道如果模型学会了表现多种动物,那它们将会是什么样子?在下图中,我们通过在猫头和整头猪之间内插隐向量生成简笔画。我们可以看到表征是如何慢慢地从猫头过渡到具有尾巴的猫,再过渡到一个有肥胖身体的猫,最后变成一头完整的猪。就像儿童学习绘画一样,我们的模型通过将动物的头、腿、尾巴添加到身体上来画出自己想要的动物。我们看到,模型还可以绘制与猪头完全不同的猫头。


▲ 受过猫和猪简笔画绘制训练的模型的隐空间插值


以上这些插值示例表明隐向量确实对简笔画的概念特征进行了编码。但是,我们是否可以使用这些特征来填充没有此类特征的其他简笔画,比如为一个猫头加上身体?


▲ 探索使用隐向量算法学习抽象概念之间的联系


确实,我们发现受过猫和猪绘制训练的模型可以进行简笔画绘制类比。例如,我们可以从整头猪的隐向量减去已编码的猪头的隐向量,从而得到一个表现身体概念的向量。将这一区别添加到猫头的隐向量中,从而得到一只完整的猫(即,猫头+身体=整只猫)。这些绘图类比让我们可以探索模型是如何组织其隐空间以在生成的众多简笔画中体现不同概念。


了解 sketch-rnn 如何应用到日常?以及更多论文信息,请点击文末“阅读原文”


推荐阅读:

Google研究 | 使用机器学习预测分子性质

Google研究 | 联合学习:无需集中存储训练数据的协同机器学习

Google研究 | 使用一致的哈希算法分配临界负载

Google在ICLR 2017上展示了哪些机器学习领域的研究成果?


点击「阅读原文」,了解更多内容

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存