程序员复现DeepMind图像生成神器 158行代码!

  • 时间:
  • 浏览:0

9月3日消息,谷歌 DeepMInd 发表论文提出了4个多用于图像生成的递归神经网络,该系统大大提高了 MNIST 上生成模型的质量。为更加深入了解 DRAW,本文作者基于 Eric Jang 用 158 行 Python 代码实现该系统的思路,删剪阐述了 DRAW 的概念、架构和优势等。

递归神经网络是一种用于图像生成的神经网络形态学 。Draw Networks 结合了一种新的空间注意机制,该机制模拟了人眼的中心位置,采用了4个多顺序变化的自动编码框架,使之对简化图像进行迭代构造。

该系统大大提高了 MNIST 上生成模型的质量,一阵一阵是当对街景房屋编号数据集进行训练时,肉眼竟然无法将它生成的图像与真实数据区别开来。

Draw 体系形态学 的核心是一对递归神经网络:4个多是压缩用于训练的真实图像的编码器,4个多是在接收到代码后重建图像的解码器。一种组合系统采用随机梯度下降的端到端训练,损失函数的最大值变分主要取决于对数似然函数的数据。

Draw 网络同类于一些变分自动编码器,它包含4个多编码器网络,该编码器网络决定着潜在代码上的 distribution(潜在代码主要捕获有关输入数据的显著信息),解码器网络接收来自 code distribution 的样本,并利用它们来调节其自身图像的 distribution 。

DRAW 与一些自动解码器的三大区别

编码器和解码器与非 DRAW 中的递归网络,解码器的输出依次打上去到 distribution 中以生成数据,而与非 一步一步地生成 distribution 。动态更新的注意机制用于限制由编码器负责的输入区域和由解码器更新的输出区域 。简单地说,一种网络在每个 time-step 都能决定“读到哪里”和“写到哪里”以及“写哪此”。

左:传统变分自动编码器

在生成过程中,从先前的 P(z)中提取4个多样本 z ,并通过前馈译码器网络来计算给定样本的输入 P(x_z)的概率。

在推理过程中,输入 x 被传递到编码器网络,在潜在变量上产生4个多近似的后验 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网络

在每4个多步骤中,时会将先前 P(z)中的4个多样本 z_t 传递给递归解码器网络,该网络随时会修改 canvas matrix 的一次责。最后4个多 canvas matrix cT 用于计算 P(x|z_1:t)。

在推理过程中,每个 time-step 时会读取输入,并将结果传递给编码器 RNN,因此从上一 time-step 中的 RNN 指定读取位置,编码器 RNN 的输出用于计算该 time-step 的潜在变量的近似后验值。

损失函数

最后4个多 canvas matrix cT 用于确定 输入数据的模型 D(X | cT) 的参数。可能输入是二进制的,D 的自然确定 呈伯努利分布,means 由 σ(cT) 给出。重建损失 Lx 定义为 D 下 x 的负对数概率:

The latent loss 潜在distributions序列  的潜在损失 被定义为源自   的潜在先验 P(Z_t)的简要 KL散度。

鉴于一种损失取决于由   绘制的潜在样本 z_t ,因此其反过来又决定了输入 x。可能潜在 distribution是4个多 4个多的 diagonal Gaussian ,P(Z_t) 便是4个多均值为 0,且具有标准离差的标准 Gaussian,一种请况下方程则变为  。

网络的总损失 L 是重建和潜在损失之和的期望值:

对于每个随机梯度下降,大家使用单个 z 样本进行优化。

L^Z 要能解释为4个多一天的序列向解码器传输潜在样本序列 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)中的潜在代码看作是表示整个图像的矢量,越来越绘图中的潜在代码就要能看作是表示笔画的矢量。最后,哪此向量的序列实现了原始图像的再现。

好吧,越来越它是咋样工作的呢?

在4个多递归的 VAE 模型中,编码器在每4个多 timestep 会接收整个输入图像。在 Draw 中,大家需用将焦点集中在它们之间的 attention gate 上,因此编码器只接收到网络认为在该 timestep 重要的图像次责。第4个多 attention gate 被称为“Read”attention。

“Read”attention分为两次责:

确定 图像的重要次责和裁剪图像

确定 图像的重要次责

为了确定 图像的哪一次责最重要,大家需用做些观察,并根据哪此观察做出决定。在 DRAW中,大家使用前4个多 timestep 的解码器隐藏请况。通过使用4个多简单的删剪连接的图层,大家要能将隐藏请况映射到4个多决定方形裁剪的参数:中心 X、中心 Y 和比例。

现在,大家不再对整个图像进行编码,本来 对其进行裁剪,只对图像的一小次责进行编码。因此,一种编码通过系统解码成4个多小补丁。

现在大家到达 attention gate 的第二次责, “write”attention,(与“read”次责的设置相同),本来 “write”attention 使用当前的解码器,而与非 前4个多 timestep 的解码器。

嘴笨 要能直观地将注意力机制描述为一种裁剪,但实践中使用了一种不同的土办法。在后边描述的模型形态学 仍然精确的前提下,使用了 gaussian filters 矩阵,越来越利用裁剪的土办法。大家在 DRAW 中取了一组每个 filter 的中心间距都均匀的 gaussian filters 矩阵 。