新智元引荐
收拾修正:张佳
【新智元导读】最近,谷歌 DeepMInd 宣布论文提出了一个用于图画生成的递归神经网络,该体系大大提高了 MNIST 上生成模型的质量。为愈加深化了解 DRAW,本文作者依据 Eric Jang 用 158 行 Python 代码完结该体系的思路,具体论述了 DRAW 的概念、架构和优势等。
递归神经网络是一种用于图画生成的神经网络结构。Draw Networks 结合了一种新的空间留意机制,该机制模拟了人眼的中心方位,选用了一个次序改变的主动编码结构,使之对杂乱图画进行迭代结构。
该体系大大提高了 MNIST 上生成模型的质量,特别是当对街景房子编号数据集进行练习时,肉眼居然无法将它生成的图画与实在数据差异开来。
Draw 体系结构的中心是一对递归神经网络:一个是紧缩用于练习的实在图画的编码器,另一个是在接纳到代码后重建图画的解码器。这一组合体系选用随机梯度下降的端到端练习,丢失函数的最大值变分首要取决于对数似然函数的数据。
Draw 网络类似于其他变分主动编码器,它包括一个编码器网络,该编码器网络决议着潜在代码上的 distribution(潜在代码首要捕获有关输入数据的明显信息),解码器网络接纳来自 code distribution 的样本,并运用它们来调理其本身图画的 distribution 。
DRAW 与其他主动解码器的三大差异
编码器和解码器都是 DRAW 中的递归网络,解码器的输出顺次增加到 distribution 中以生成数据,而不是一步一步地生成 distribution 。动态更新的留意机制用于约束由编码器担任的输入区域和由解码器更新的输出区域 。简略地说,这一网络在每个 time-step 都能决议“读到哪里”和“写到哪里”以及“写什么”。
左:传统变分主动编码器
在生成过程中,从从前的 P(z)中提取一个样本 z ,并经过前馈译码器网络来核算给定样本的输入 P(x_z)的概率。
在推理过程中,输入 x 被传递到编码器网络,在潜在变量上发生一个近似的后验 Q(z|x) 。在练习过程中,从 Q(z|x) 中抽取 z,然后用它核算总描绘长度 KL ( Q (Z|x)∣∣ P(Z) log(P(x|z)),该长度随随机梯度的下降(https://en.wikipedia.org/wiki/Stochastic_gradient_descent)而减小至最小值。
右:DRAW网络
在每一个过程中,都会将从前 P(z)中的一个样本 z_t 传递给递归解码器网络,该网络随后会修正 canvas matrix 的一部分。最终一个 canvas matrix cT 用于核算 P(x|z_1:t)。
在推理过程中,每个 time-step 都会读取输入,并将成果传递给编码器 RNN,然后从上一 time-step 中的 RNN 指定读取方位,编码器 RNN 的输出用于核算该 time-step 的潜在变量的近似后验值。
丢失函数
最终一个 canvas matrix cT 用于确认输入数据的模型 D(X | cT) 的参数。假如输入是二进制的,D 的自然挑选呈伯努利散布,means 由 σ(cT) 给出。重建丢失 Lx 界说为 D 下 x 的负对数概率:
The latent loss 潜在distributions序列
的潜在丢失被界说为源自
的潜在先验 P(Z_t)的扼要 KL散度。
鉴于这一丢失取决于由
制作的潜在样本 z_t ,因而其反过来又决议了输入 x。假如潜在 distribution是一个这样的 diagonal Gaussian ,P(Z_t) 便是一个均值为 0,且具有规范离差的规范 Gaussian,这种情况下方程则变为
。
网络的总丢失 L 是重建和潜在丢失之和的期望值:
关于每个随机梯度下降,咱们运用单个 z 样本进行优化。
L^Z 能够解释为从之前的序列向解码器传输潜在样本序列 z_1:T 所需的 NAT 数量,而且(假如 x 是离散的)L^x 是解码器重建给定 z_1:T 的 x 所需的 NAT 数量。因而,总丢失等于解码器和之前数据的预期紧缩量。
改善图片
正如 EricJang 在他的文章中说到的,让咱们的神经网络仅仅“改善图画”而不是“一次完结图画”会更简略些。正如人类艺术家在画布上涂涂画画,并从绘画过程中推断出要修正什么,以及下一步要制作什么。
改善图画或逐渐细化仅仅一次又一次地损坏咱们的联合 distribution P(C) ,导致潜在变量链 C1,C2,…CT 1 出现新的变量散布 P(CT) 。
窍门是屡次从迭代细化散布 P(Ct|Ct 1)中取样,而不是直接从 P(C) 中取样。
在 DRAW 模型中, P(Ct|Ct 1) 是一切 t 的同一 distribution,因而咱们能够将其表明为以下递归联系(假如不是,那么便是Markov Chain而不是递归网络了)。
DRAW模型的实践运用
假定你正在测验对数字 8 的图画进行编码。每个手写数字的制作办法都不同,有的样本 8 或许看起来宽一些,有的或许长一些。假如不留意,编码器将被逼一同捕获一切这些小的差异。
可是……假如编码器能够在每一帧上挑选一小段图画并一次查看数字 8 的每一部分呢?这会使作业更简略,对吧?
相同的逻辑也适用于生成数字。留意力单元将决议在哪里制作数字 8 的下一部分-或任何其他部分-而传递的潜在矢量将决议解码器生成多大的区域。
基本上,假如咱们把变分的主动编码器(VAE)中的潜在代码看作是表明整个图画的矢量,那么绘图中的潜在代码就能够看作是表明笔画的矢量。最终,这些向量的序列完结了原始图画的再现。
好吧,那么它是怎么作业的呢?
在一个递归的 VAE 模型中,编码器在每一个 timestep 会接纳整个输入图画。在 Draw 中,咱们需求将焦点会集在它们之间的 attention gate 上,因而编码器只接纳到网络以为在该 timestep 重要的图画部分。第一个 attention gate 被称为“Read”attention。
“Read”attention分为两部分:
挑选图画的重要部分和裁剪图画
挑选图画的重要部分
为了确认图画的哪一部分最重要,咱们需求做些调查,并依据这些调查做出决议。在 DRAW中,咱们运用前一个 timestep 的解码器躲藏状况。经过运用一个简略的彻底衔接的图层,咱们能够将躲藏状况映射到三个决议方形裁剪的参数:中心 X、中心 Y 和份额。
裁剪图画
现在,咱们不再对整个图画进行编码,而是对其进行裁剪,只对图画的一小部分进行编码。然后,这个编码经过体系解码成一个小补丁。
现在咱们抵达 attention gate 的第二部分, “write”attention,(与“read”部分的设置相同),仅仅“write”attention 运用当时的解码器,而不是前一个 timestep 的解码器。
尽管能够直观地将留意力机制描绘为一种裁剪,但实践中运用了一种不同的办法。在上面描绘的模型结构依然准确的前提下,运用了gaussian filters矩阵,没有运用裁剪的办法。咱们在DRAW 中取了一组每个 filter 的中心距离都均匀的gaussian filters 矩阵 。
代码一览
咱们在 Eric Jang 的代码的基础上,对其进行一些整理和注释,以便于了解.
Eric 为咱们供给了一些巨大的功用,能够协助咱们构建 “read” 和 “write” 留意门径,还有过滤咱们将运用的初始状况功用,可是首要,咱们需求增加新的功用,来使咱们能创立一个密布层并兼并图画。并将它们保存到本地核算机中,以获取更新的代码。
现在让咱们把代码放在一同以便完结。