超级网络

时间:2022-04-27
本文章向大家介绍超级网络,主要内容包括介绍、静态超网络、动态超网络、生成生成模型、本地实施、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

在这篇文章中,我将介绍一下我们最近的文章[1609.09106] HyperNetworks。我作为Google Brain Resident工作在这篇论文上- 一个伟大的研究计划,我们可以从事一年的机器学习研究,并且享受工资和福利!Brain团队正在接受2017年计划的申请:请参阅g.co/brainresidency。

介绍

动态超网络生成手写体。 LSTM的权重矩阵随时间而变化。

大多数现代神经网络结构或者是深度卷积神经网路,或长条递归神经网络,或者两者的组合。这两个架构似乎是在一个频谱的两端。递归网络可以被看作是一个真正的深度前馈网络,在每一层都有相同的权重(这就是所谓的加权)。深度卷积神经网路允许每个层次不同。但也许这两者有某种关系。每年获奖的ImageNet模型都会越来越深入。想想我们一直听到的深度110层,甚至1001层剩余网络架构。所有110层都必须是独一无二的吗?甚至大多数图层是有用的吗?

图:前馈网络,没有权重分享(上图)。经常性网络,权重分享(底部)。

人们已经想到迫使一个深度卷积神经网路像一个递归神经网络一样,即在每一层都有相同的权重。但是,如果我们强迫一个深度残差网络固定其权重,其表现将会是令人尴尬的。在我们的论文中,我们使用超网络来探索一个中间立场 - 强化一个轻松的版本。超网络只是一个小网络,可以产生更大网络的权重,比如深度残差网络的权重,有效地参数化残差网络每层的权重。我们可以使用超网络来探索模型的表达性与权衡我们绑定一个深度残差网络多少的权重。这就像对图像应用进行压缩,并能够调整我们想要使用的压缩程度,除了图像是深度残差网络的权重之外。

虽然神经网络压缩是一个不错的话题,但是我更有兴趣去做一些对自己更有吸引力的事情,正如你阅读我以前的博客文章所知道的那样。有许多算法已经接受了完全训练的网络,然后将压缩方法应用于预先训练好的网络权重,以便可以用更少的比特存储。虽然这些方法是有用的,但我发现从少量的参数开始更有意思,并学习从它们开始构造更大更复杂的表示。自然界中许多美丽的复杂图案都可以用一小组简单的规则来构建。数字艺术家也设计了基于这个概念的美丽创作工作。这是我想在机器学习研究中探索的这种复杂抽象的概念。在我看来,神经网络解压缩是比压缩更有趣的问题。特别是,我也想探索解压缩已经压缩过的神经网络,即权重复网络。

更令人兴奋的工作是在我的论文的第二部分,我们将高速网络应用到复发网络。一个递归神经网络的权重在每个时间步都受到约束,限制了其表达性。如果我们能够让一个递归神经网络的权重在每个时间步骤(例如一个深度的转折点)和每个单独的输入序列中有所不同,那该怎么办呢?

图:静态超网络为前馈网络生成权重。

图:动态超网络为循环网络生成权重。

本文的主要结果是挑战循环网络的权重分配范式。我们通过在一个大的长短期记忆中嵌入一个小的超网络来实现这个功能,就像修改权重一样,主要的长短期记忆所使用的权重可以通过超网络进行相应的修改。在这种情况下,超网络也是另一个长短期记忆,只是一个较小的版本,我们将赋予它在每个时间步长以及每个输入序列上修改主长短期记忆权重的能力。在此过程中,我们为Penn Treebank和Wikipedia数据集的字符级语言建模任务实现了最先进的结果。更重要的是,我们探索当我们的模型能够生成生成模型时会发生什么。

由此产生的超级长短期记忆模型看起来和普通的TensorFlow递归神经网络单元类似。就像我们当中的一些人拥有超人类的力量一样,在超级长短期记忆模型中,如果主要的长短期记忆是一个人的大脑,那么超级长短期记忆就是一些控制大脑的怪异的智能生物。

我首先欢迎我们新的Arquillian霸主。

背景

使用神经网络来产生起源于神经元演化的更大的神经网络的权重的概念。虽然遗传算法使用起来简单而有趣,但我们很难让它们直接找到一组真正的模型参数。肯·斯坦利提出了一个称为HyperNEAT的杰出方法来解决这个问题。他想出了这个方法,试图使用一种名为NEAT的算法来创建漂亮的神经网络生成的艺术。NEAT是一个演化的神经网络,可以通过给出每个像素的位置并从其输出中读取该像素的颜色来生成艺术。尽管将大量权重参数化为少量参数的概念在神经革命中确实非常有用,但其他一些研究人员认为HyperNEAT可能有点矫枉过正。编写和调试NEAT可以做很多工作,选择性的懒惰可以长期研究。Schmidhuber的小组决定尝试一种替代方法,只是使用离散余弦变换来压缩一个大权重矩阵,以便它可以用一小组系数来近似(这就是JPEG压缩的工作原理)。然后,他们使用遗传算法来求解最好的一组系数,这样网络的权重足以在TORCS内的轨道上驾驶一辆虚拟汽车模拟。他们基本上对自驾车的重量矩阵进行JPEG压缩。

有些人,包括Deepmind的同事,也曾经尝试过使用HyperNEAT来发展一个小的权重生成网络,但是使用反向传播而不是遗传算法来解决小网络的权重问题。他们在他们关于DPPN的文章中总结了一些很酷的结果。

就我个人而言,我更感兴趣的是探索神经网络权重生成的另一个方面。我喜欢将神经网络看作是一种强大的计算设备类型,神经网络的权重就像这台计算机的机器级别的指令。神经元数量越多,神经网络的表现力越强。但是与普通计算机的机器指令不同的是,神经网络的权重也很强大,所以如果我们在神经网络的某些部分添加噪声,它仍然可以起作用。出于这个原因,我发现用少量参数来表示一大组权重的概念令人着迷。这种权重抽象的形式有点像一个美丽的抽象高级语言(如LISP或Python),它被编译成原始的机器级代码(神经网络权重)。

静态超网络

在这篇论文中,我决定探索通过一个网络来为更大的网络生成权重的概念,并试图将这个概念进一步发展。但是,我采取了与HyperNEAT和DPPN略有不同的方法。如上所述,这些方法将一组虚拟输入坐标作为输入到小型网络来生成大型网络的权重。我广泛地使用了这个概念(见附录A的论文),但是对于像ConvNets和LSTM这样的现代架构来说,它并不适用。虽然HyperNEAT和DCT可以生成好看的矩阵,但是由于先前通过平滑函数(如正弦曲线)执行,这种艺术的平滑性也是其在许多实际应用中的限制。一个好看的权重矩阵没有用,如果它不工作。看看这个典型的深度残留网络权重的图片:

图:在CIFAR-10上训练的典型残留网络中的16x16x3x3和32x32x3x3权重内核的图像。

虽然我不想在客厅墙上挂上ResNet的重量图片,但它们工作得很好,我想用较少的参数生成这些重量的图片。我采取了一种更简单,更符合VAE或GAN类型方法的方法。像GAN和VAE这样的更现代的生成模型采用了一个小的嵌入向量Z,例如64个数字,并且从这64个值中尝试生成猫的逼真图像或其他很酷的东西。为什么不尝试为深度残差网络生成权重矩阵?所以我们采取的方法也是训练一个简单的2层网络来生成16x16x3x3权重的内核,并且有64个数字的嵌入向量。更大的权重内核将通过将小版本拼凑在一起来构造(即,右边的将需要256个数字来生成)。我们将使用相同的2层网络来生成深度ResNet的每个内核。当训练ResNet进行图像分类时,不是直接训练ResNet权重,而是训练Z的集合和这个2层网络的参数。

图:在同一任务中训练的ResNet生成的16x16x3x3和32x32x3x3权重内核的图像。

我们用一个典型的现成的深度残差网络(这个叫做Wide Residual Networks的 深度残差网络变种的“WRN-40-2”配置)进行了实验,其中36层是这些类型的重量核。使用上千万个参数时,CIFAR-10的最佳测试分类精度为〜96%。这个深度残差网络只使用了约220万个参数,可以在CIFAR-10上训练达到〜94%的精度,我认为这是相当不错的。我们使用超网生成的权重的深度残差网络版本只使用了大约150k个参数,而精度仍然是可以接受的。我们的模型有93%的测试精度。

这些结果让我思考这些超深度的1001层深度残差网络在ImageNet竞赛中的表现非常好。也许他们的大部分权重并不是那么有用,但实际上却有权重,作为一种占位符,所以大量的神经元可以计算出它们为什么这么好。

如果你想看到一个实现,请看这个IPython笔记本准备展示这篇文章中 MNIST实验中概述的这个重量生成概念。笔记本可以扩展并与TensorFlow中的剩余网络模型相结合。

动态超网络

正如引言中所提到的,我们也尝试将循环网络应用于高速网络,我认为这是本研究的主要贡献。在深度残差网络上使用超网络的一个见解是,虽然我们在模型中使用的参数少得多,但是我们看到降低了准确性。那么如果我们换个方向呢?如果我们可以使用超网络让我们放松递归神经网络的权重共享约束条件,并允许权重矩阵在每个展开的时间步长上改变,它就会像一个深度的卷积神经网路一样看起来更接近,所以也许我们可以从中获得更好的结果。

图:超级递归神经网络系统。黑色系统代表主要的递归神经网络,而橙色系统代表产生重量的超级递归神经网络主体

我们的方法是在一个大的长短期记忆单元(主长短期记忆)内放一个小的长短期记忆单元(称为超级长短期记忆单元)。超级长短期记忆单元将拥有自己的隐藏单元和自己的输入序列。超级长短期记忆单元的输入序列将由2个源构成:主长短期记忆的先前隐藏状态与主长短期记忆的实际输入序列连接。超级长短期记忆单元的输出将是嵌入矢量Z,然后将被用于生成主长短期记忆的权重矩阵。

与静态超网络不同,权重生成嵌入向量不会保持不变,而是由超级长短期记忆单元动态生成。这允许我们的模型在每个时间步和每个输入示例中生成一组新的权重。在本文中,我讨论了许多实用性和计算上和记忆效率更高的从嵌入向量生成权重的方法,以简化和减少这种方法的计算约束。我学到的一件事就是,尽管研究新型算法和新方法是很重要的,但是最后还是要保持一些实用性并使其工作起来。让别人轻松使用你的工作也很重要。

对于我们的动态超网络的实现,我们做了这样的工作,使得我们可以将超级长短期记忆单元插入任何写入使用tf.nn.rnn_cell对象的TensorFlow代码中,因为超级长短期记忆从这个抽象类继承而来。这使得我的研究代码可以很容易地被用来设计使用香草长短期记忆单元的现有代码。例如,当我在维基百科数据集上使用我们的超级长短期记忆单元格时,我刚刚使用char-rnn-tensorflow并插入了用于训练和推理的研究模型。以下是char-rnn-tensorflow在维基百科enwik8数据集上进行培训后,使用我们的超级长短期记忆模型生成的一段文字:

图:生成的文本,以及主要长短期记忆权重矩阵的权重改变活动的级别。不知何故,超级长短期记忆学会了把苏联,Facism,一家电脑公司和一台重要的机器放在一个句子里。

在上图中,除了显示生成的文本之外,我们还可以看到超级长短期记忆单元如何修改主长短期记忆的权重。我选择可视化长短期记忆随着时间的四个隐藏到栅极权重矩阵的变化在四个不同的颜色,来表示每个四个输入,候选的,被遗忘的和长短期记忆的输出门(更好的解释请见本博客帖子)。我们可以把高强度区域解释为在主长短期记忆被用来产生每个字符之前,长短期记忆单元刚刚对主长短期记忆的权重做出大的改变的情况。低强度意味着超级长短期记忆单元正在休息,所以在这些休息期间主长短期记忆的权重没有被改变那么多。下面是另一个例子:

有趣的是,在超级长短期记忆单元较不活跃的时期,单词的类型似乎更具可预测性。例如,从第一个例子来说,Microsoft Windows是由一个或多或少的静态网络产生的 Micros。在第二个例子中,elections in the early 1980s 是由一个相对稳定的主长短期记忆产生的,但是到了20世纪80年代之后,超级长短期记忆单元突然醒来,并决定给主长短期记忆模型一些动摇,然后讨论野蛮的就业问题。在某种程度上,随着生成模型生成序列,超级长短期记忆单元正在生成生成模型。

这种动态生成生成模型的元功能似乎非常强大,实际上,我们的超级长短期记忆模型能够击败先前的最先进的字符级预测数据集基准,如Character-Level Penn Treebank和Hutter Prize Wikipedia(enwik8)我们的模型在不使用动态评估的情况下分别获得了1.25 bpc和1.38 bpc(截至2016年9月27日),超过了之前的1.27和1.40(截至2016年9月10日)记录。

考虑到机器学习研究领域的快速发展,其他人可能会在几周内击败这些最新的数据,而且ICLR 2017的最后期限即将到来。事实上,我并不认为在某个文本数据集上击败最新的技术与在动态模型抽象中探索这个多层次动态模型的概念一样重要。我想在未来,人们可能会把重点放在建筑设计上,重点将会朝着两个方向发展,无论是向应用方面还是向着基础构建块侧。我喜欢我们的方法是我们有效地创建了一个名为超级长短期记忆的构建块,从TensorFlow用户的角度来看,外观和感觉就像一个正常的长短期记忆单元。将超级长短期记忆插入现有的TensorFlow代码,就像在递归神经网络,GRU和长短期记忆单元之间切换一样简单,因为我们使得超级长短期记忆只是一个tf.nn.rnn_cell.RNNCell被称为HyperLSTMCell(包含完整系统的实例,而不是与HyperLSTM Cell混淆)。

生成生成模型

我还尝试了超级长短期记忆来执行手写生成任务。在之前的文章中,我探索了Alex Graves的LSTM生成随机手写序列的方法。这一代人工作的方式是模拟这个世界dX Delta xΔ XDelta x和d和Δ和Δ ÿDelta y的笔划作为2D混合物高斯分布的坐标,用二进制伯努利随机变量沿于所述笔保持在纸张上的概率模型。

图:使用香草长短期记忆模型从二维混合高斯分布和伯努利分布采样的笔迹。高斯和伯努利概率分布随时间变化。

在手写过程中,这两个分布的参数会随着时间的推移而变化,也会相互依赖。例如,当你写完一个单词的时候,你的钢笔离开纸的可能性就会增加,钢笔的下一个位置可能会离现在的距离更远,并且方差更大。我们可以得到一个长短期记忆来输出参数对于混合高斯分布和伯努利分布,并且具有取决于长短期记忆的内部状态的这些参数的值在每个时间步骤处改变。您可以通过查看上图中的红色气泡来显示高斯分布随时间变化的情况,这些红色气泡指示下一笔笔划的高斯分布的位置和大小。我们可以从这个时间变化的分布中抽样,从而通过连接采样点来对整个假手写通道进行采样。我认为这种类型的模型类似于动态超网络,因为长短期记忆随着时间的推移动态地改变生成分布的参数(高斯和伯努利),并且通过在手写数据集上训练整个模型它可以执行生成手写样本的艰巨工作。

在我们的论文中,我们应用动态超网络来扩展这种方法。我们将用BasicLSTMCell我的代码替换HyperLSTMCell。在这种方法中,长短期记忆的权重矩阵和偏差将随着时间由较小的LSTM进行修改。通过做这个简单的改变,我们将这个模型生成模型方法扩展到另一个层次,通过在每个时间步长上有一个小的长短期记忆动态生成一个更大的长短期记忆模型,并且生成的大型长短期记忆模型生成高斯和伯努利的参数分布也在每个时间步骤。所以模型生成模型成为模型生成模型生成模型。

与之前的文本类似,这种新的方法与正常甚至是多层长短期记忆相比获得了更好的分数,并具有相似数量的训练参数。我修改了write-rnn-tensorflow来复制Graves 论文第4.2节中所做的确切实验,并检查了使用Log Loss结果BasicLSTMCell与以前发表的结果相似程度。与之前的历史成绩结合后,我们可以切换BasicLSTMCellHyperLSTMCell并重新运行实验。但在此之前,我们首先尝试改进我们的基准方法。基线技术有一定的尊重和重要性,因为它们引导了我们的研究。我们发现,应用黑魔法技术,如数据增加和丢失,我们已经可以将基线1层的分数BasicLSTMCell从-1026 nats提高到-1055 nats。打开我们的模型后,HyperLSTMCellLog Loss得分一路下降到-1162 nats,这是一个很大的有意义的改进。定量结果是各种实际生成的样本,可以在论文中查看(见附录)。

为了结束这篇文章,我做了一个小的演示,展示手写生成过程如何与超级长短期记忆一起工作。我想说明在这个演示中超级长短期记忆单元如何修改主长短期记忆的权重。与字符生成不同,时间轴并不完全对应于手写的x轴,所以我发现将这个过程可视化为网络演示更容易,因为您不能真正为.pdf文件做动画提交给arXiv。未来,更多的科学将更多地转向网站,而不是静态的.pdf文件,用于期刊和会议。

您可以看到正在生成的笔迹以及对长短期记忆的4个隐藏到门的权重矩阵所做的更改。我选择只显示所做的WhiW_{hi}W​hi​​W_{hi}, WhgW_{hg}W​hg​​W_{hg}, WhfW_{hf}W​hf​​W_{hf}, WhoW_{ho}W​ho​​W_{ho} of the main LSTM in the four different colours, although in principle WxiW_{xi}W​xi​​W_{xi}, WxgW_{xg}W​xg​​W_{xg}, WxfW_{xf}W​xf​​W_{xf}, WxoW_{xo}W​xo​​W_{xo} 所有偏差都可以可视化。更高的强度意味着超级长短期记忆单元正在对主长短期记忆的权重进行更大的修改。你可以看到,字符和单词之间通常会发生很大的变化,尽管网络并没有被明确地告知书写字符的概念,更不用说书面字了。长短期记忆和超级长短期记忆都必须一起工作,自己弄清楚这些概念。

本地实施

我从阅读开源代码和教程中学到了很多东西,并且在TensorFlow中实际的Recurrent Networks中,我强烈推荐Denny Britz的博客,神秘的r2rt超级博客,这个关于复发批量标准的博客文章,以及最新发表的TensorFlow。

这地方执行的HyperLSTMCell是基于第二层规范实施LeavesBreathe和批处理规范代码由OlavHN。你也可以尝试插入HyperLSTMCellchar-rnn-tensorflow,或其他有趣的任务使用。它可以工作,但目前速度不及香草长短期记忆,但是随着时间的推移,我期望在核心TensorFlow中看到许多改进,可以更快速地进行优化。

图:字符PTB验证集的张量结果(BPC与训练步骤)。

HyperLSTMCell

https://github.com/hardmaru/supercell/上的 TensorFlow实现。