投稿/爆料
厂商入驻

超网络

论智|2016-02-23 14:08

【编者按】机器学习开发者hardmaru撰写博客,介绍了他在2016-2017年度Google Brain Residency期间和同事合作发表的论文HyperNetworks(超网络)。

超网络示意图

介绍

超网络手写生成

用于手写生成的超网络,LSTM的权重矩阵随时间而改变

大部分现代的神经网络架构或者是一个深度卷积网络,或者是一个长长的循环神经网络,再不然就是两者组合。这两个架构看起来是光谱的两端。循环网络可以看成是一个非常深的前馈网络,网络每层使用同一套权重(这叫做权重系(weight-tying))。而深度卷积网络允许每层的权重不同。但是也许某种程度上这两者是相关联的。每年,ImageNet优胜模型变得越来越深。想想我们时常听到的那些110层的深度网络,甚至1001层的循环网络。这110层都需要各不相同吗?甚至,大多数层有用吗?

前馈网络和循环网络
上:前馈网络,不共享权重;下:循环网络,共享权重

人们已经考虑过迫使深度卷积网络更像循环神经网络的方案,也就是每层使用同一套权重。然而,如果我们强迫一个深度残差网络使用同一套权重,表现会令人尴尬。在我们的论文中,我们使用超网络探索中道——强制宽松版本的权重系。超网络仅仅是一个小型网络,该网络为一个大得多的网络生成权重,比如为一个深度残差网络生成权重,高效地设定残差网络每层的权重。我们可以使用超网络来探索模型的表达力和捆绑深度卷积网络权重的程度之间的权衡。这有些像压缩图像时可以调整压缩率,超网络不过是把图像换成深度卷积网络的权重。

尽管神经网络压缩是一个很不错的主题,如果你读过我以前的文章的话,你可能知道,我更想背道而驰。已经有很多算法接受一个完全训练好的网络,接着应用压缩方法到预训练网络的权重,以减少网络的体积。虽然这些方法很有用,我觉得从数目较少的参数开始,学习创建一个更大、更复杂的表示,会更有意思。在自然界中,一套简单的规则可以生成许多美丽复杂的模式。数字艺术家已经基于这个概念设计了美丽的生成式作品。我的机器学习研究打算探索这种复杂度抽象的概念。在我看来,神经网络解压缩是一个比压缩更有趣的问题。特别地,我也想探索解压缩一个已经压缩过的神经网络,例如,循环网络的权重。

更激动人心的部分是我们的论文的第二部分,我们将超网络应用到循环网络。循环网络的权重在每一时步是捆绑的,限制了它的表达力。如果我们找到一种允许循环神经网络的权重因每一时步和每个输入序列而不同的方法,那会怎么样?

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

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

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

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

这篇论文的主要成果是挑战循环网络的权重共享范式。我们在一个大型LSTM网络中嵌入了一个小型的超网络,因此,主LSTM网络可以根据超网络修改自己的权重。在这一例子中,超网络也是一个LSTM,只不过比主网络小,并且具有在每一时步和每一个输入序列修改主网络权重的能力。最终模型在Penn Treebank和维基百科数据库的字符层次语言建模任务中达到了当前最先进水平。更重要的,我们探索了用我们的模型生成生成式模型。

最终得到的HyperLSTM(超LSTM)模型感觉和一个普通的通用TensorFlow循环神经网络细胞差不多。就像我们中的某些人具有超能力一样,在HyperLSTM模型中,如果主LSTM网络是人脑的话,那么HyperLSTM是某种在人脑内进行操控的奇异智能生物。

Arquillian

我本人很欢迎我们的新Arquillian统治者

背景

使用神经网络生成大得多的神经网络的权重的概念源于神经演化。尽管演化算法使用起来很方便、很有趣,但通过演化算法直接寻找一个巨大的模型参数集合却很困难。Ken Stanley想出了一个天才的方法来解决这个问题——HyperNEAT(超NEAT)。他在尝试使用NEAT算法创建美丽的神经网络生成艺术时想出了这个方法。NEAT是一个演化神经网络,接受每个像素的位置作为输入,然后输出每个像素的颜色,因而,它可用于生成艺术作品。如果我们使用NEAT来绘制权重矩阵的权重,那会怎么样?HyperNEAT试图做这个。它使用一个小型NEAT网络生成大型神经网络的所有权重参数。小型NEAT网络通常包括不到几千个参数,给定一个包含每个权重连接的虚拟坐标的集合,它的架构逐渐演化以产生大型网络的权重。

尽管通过数量较少的参数设定大型权重集合的概念在神经演化中非常有用,另一些研究者认为HyperNEAT多少有点“杀鸡焉用牛刀”的感觉。编写和调试NEAT需要耗费很多精力,而在研究中,选择性懒惰很有市场。Schmidhuber团队决定尝试另一种方法,直接使用离散余弦变换压缩大型权重矩阵,通过一个较小的系数集合来逼近原本的权重矩阵(JPEG压缩正是这么做的)。接着他们使用遗传算法来解决寻找最优参数集合的问题,从而使循环网络的权重好到可以在TORCS模拟中驾驶一辆虚拟汽车沿着轨道前进。基本上,他们是把JPEG压缩技术应用到了自动驾驶的权重矩阵上。

包括我在Deepmind的同事在内的一些人,也尝试使用HyperNEAT来演化一个小型的权重生成网络,但使用反向传播代替了遗传算法来求解小型网络的权重。他们关于DPPN的论文总结了一些很酷的成果。

我个人对神经网络权重生成的另一方面更感兴趣。我喜欢把神经网络看成一种强大的计算设备,神经网络的权重某种程度上像是计算机的机器指令。神经元的数目越多,神经网络的表达力变得越强。但和普通计算机的机器指令不同,神经网络的权重是强韧的,所以如果我们给网络的一些部分加上一些噪声,某种程度上它仍然能工作。基于这一原因,我发现使用少量参数表达一大组权重的概念很吸引人。这种形式的权重抽象有点像美丽的高级抽象语言(LISP或Python)编译为原始的机器代码(神经网络权重)。或者,从生物学的视角而言,它像是在基因层面表达大型的复杂生物学结构。

静态超网络

在这篇论文中,我使用了一个与HyperNEAT、DPPN略微不同的方法。如前所述,这些方法接受一组虚拟坐标作为小型网络的输入,然后生成大型网络的输出。我就这一概念做了大量试验(见论文附件A),但在深度卷积网络和LSTM这样的现代架构上,它没有效果。尽管HyperNEAT和DCT可以生成看起来不错的权重矩阵(由于正弦之类的平滑函数强制应用的先验),在很多实际应用中,这样的人造平滑性也是局限。看起来不错的权重矩阵如果不工作,那也是毫无帮助。下面的图像展示了一个典型的深度残差网络的矩阵:

深度残差网络矩阵

在CIFAR-10上训练的典型的残差网络的16x16x3x3和32x32x3x3的权重核

尽管我不会把这样的残差网络权重图片挂在自己的起居室里,它们的效果真不错,我想通过更少的参数生成这些权重的图像。我采用了一个更简单的方法,一个更类似VAE或者GAN的方法。像GAN和VAE这样更现代的生成式模型接受一个短小的嵌入向量Z,比如说,包含64个数字的向量,然后基于这64个值,尝试生成逼真的猫咪图像或其它有趣的图像。为何不尝试生成残差网络的权重矩阵呢?所以我们使用的方法是训练一个简单的双层网络,以通过由64个数字组成的嵌入向量生成16x16x3x3权重核。更大的权重核将通过堆叠较小的版本创建(也就是说,右面的那个需要256个数字来生成)。我们将使用同样的双层网络来生成深度残差网络的每个核。当我们训练残差网络进行图像分类的时候,我们并没有直接训练残差网络的权重,而将训练Z的集合与双层网络的参数。

超残差网络

在同样任务上训练的残差网络,16x16x3x3和32x32x3x3的权重核由超网络生成

我们尝试了一个现成的典型残差网络(这一使用“WRN-40-2”配置的出色的残差网络变体叫做广残差网络),其中36个网络层为这类权重核。写作本文时,CIFAR-10上最好的测试分类精确度大约为96%(使用了几千万参数)。而上面的广残差网络仅仅使用大约二百二十万参数就能在CIFAR-10上达到大约94%的精确度,我认为这相当不错了。我们的基于超网络生成权重的残差网络版本仅使用大约15万参数,达到了同级别的精确度(93%)。

广残差网络结构

广残差网络结构。我们的参数为N=6、k=2

这些结果让我怀疑,那些在ImageNet测试上表现非常好的超级深的1001层残差网络,大部分的权重也许不是那么有用,许多权重可能只是某种占位符,让大量的神经元参与运算,那才是为什么它们表现如此好的原因。

如果你想看下实现,请参考这个IPython Notebook,它展示了论文中的MNIST试验中概述的权重生成概念。它可以扩展,并与Tensor框架中的残差网络模型相结合。

动态超网络

正如“介绍”一节提到的,我们也尝试了将超网络应用到循环网络上,我觉得这是这项研究的主要贡献。通过在残差网络上应用超网络,我们得到的其中一个洞见是,尽管模型的参数数量大大减少了,作为代价,精确度也有所下降。所以如果我们尝试另一个方向会出现什么情况?如果我们使用一个可以放宽循环神经网络的权重分享限制的超网络,允许权重矩阵在每个展开的时步中改变,它会更像一个深度卷积网络,因此也许我们可以压榨出更好的表现?

超网络示意图

HyperRNN系统。黑色系统表示主RNN,橙色系统表示权重生成HyperRNN细胞

我们的方法是在一个大型LSTM细胞(主LSTM)内放置一个小型LSTM细胞(称为HyperLSTM细胞)。HyperLSTM细胞有它自己的隐藏状态和输入序列。HyperLSTM细胞的输入系列通过以下两个来源构建:连接主LSTM的前一个隐藏状态与主LSTM的实际输入序列。HyperLSTM细胞的输出将是嵌入向量Z,用于生成主LSTM的权重矩阵。

和静态超网络不同,权重生成嵌入向量不是保持不变的,而是由HyperLSTM细胞动态生成的。这允许我们的模型为每个时步和每个输入样本生成一组新的权重。在论文中我讨论了一些实践上的事情,包括更节省算力和内存的基于嵌入向量生成权重的方法,简化和降低了这一方法的计算限制。我得到的一个经验是,尽管在研究中想象新算法和新方法很重要,最终确保它们可行可用也很重要。此外,让其他人易于使用你的成果也很重要。

因此,我们实现动态超网络时,确保HyperLSTM细胞可以插入任何使用tf.nn.rnn_cell对象编写的TensorFlow代码,因为HyperLSTM继承自这一抽象类。这使得我们的研究代码可以很容易地插入为使用原始LSTM细胞而设计的现有代码。例如,当我在维基百科数据集上试验我们的HyperLSTM细胞时,我直接使用了char-rnn-tensorflow,直接插入研究模型以进行训练和推理。下面是在维基百科enwik8数据集训练后,配备了我们的HyperLSTM模型的char-rnn-tensorflow生成的一个段落:

生成的维基百科段落

生成文本,及相应的主LSTM权重矩阵的权重改变活动程度。HyperLSTM通过某种方式学习将苏维埃、法西斯、一家电脑公司和一种非常重要的机器放在一句话里

上图不仅显示了生成文本,同时可视化了主LSTM的权重是如何被HyperLSTM细胞可视化的。我选择用4种颜色可视化了LSTM的hidden-to-gate权重矩阵随着时间的变化,以表示LSTM的输入门、候选门、遗忘门、输出门(这篇博客很好地解释了这些概念)。我们可以将高亮度区域解读为HyperLSTM细胞刚刚对主LSTM的权重做出了巨大的改动(在主LSTM生成每个字符之前)。低亮度区域意味着HyperLSTM细胞正稍事休息,因此主LSTM的权重没什么大变动。下面是另一个生成段落的样本:

生成的另一个段落

有一个有趣的地方值得注意,在HyperLSTM细胞不那么活跃的时候,单词的类别看起来更容易预测。例如,在第一个例子中,Microsoft Windows是在Micros之后的一个或多或少静止的网络上生成的。在第二个例子中,elections in the early 1980s(1980年代早期的大选)是由一个相对不变的主LSTM生成的,但就在1980s之后,HyperLSTM细胞突然苏醒了,决定在开始讨论savage employment concerns(残酷的就业问题)前给主LSTM模型一点震动。从某种意义上说,当生成式模型生成序列的时候,HyperLSTM细胞持续生成生成式模型。

这样动态生成生成式模型的元能力看起来非常强大,事实上,我们的HyperLSTM模型能够击败之前最先进的字符级别预测数据集基准,例如Character-Level Penn TreebankHutter Prize Wikipediaenwik8)。在未使用动态评估的前提下,我们的模型在两个数据集上分别取得了1.25 bpc和1.38 bpc的成绩(27-Sep-2016),超过了之前的记录1.27和1.40(10-Sep-2016)。

考虑到机器学习研究领域的发展速度,几周之后,其他人大概就会超过这些最先进的数字,更别提ICLR 2017的死线快到了。事实上,我并不真的认为在某个文本数据集上击败最先进的记录和探索这样的多层动态模型抽象下的动态模型同等重要。我觉得以后人们会更少关注架构设计,转而关注两个方向,或者是应用侧,或者是基础的构建模块侧。我喜欢我们的方法的地方是我们事实上创建了一个称为HyperLSTM的构建模块,在TensorFLow的用户看来,和普通的LSTM模块很像。HyperLSTM对现存的TensorFlow代码而言是即插即用的,就像替换RNN、GRU、LSTM细胞一样,因为我们将HyperLSTM实现为tf.nn.rnn_cell.RNNCell的一个实例,称为HyperLSTMCell(这包括整个系统,别和HyperLSTM细胞混淆了)。

生成生成式模型

我也在书写生成任务中尝试使用了HyperLSTM。在之前的文章中,我探索了使用Alex Grave的方法让LSTM生成随机手写序列。这一生成方法将笔的运动坐标Δx、Δy建模为2维混合高斯分布,并使用一个二元Bernoulli随机变量建模笔停留在纸上的概率。

LSTM生成随机手写序列

取样自基于原始LSTM模型生成的2维混合高斯分布与Bernoulli分布。高斯分布和Bernoulli分布均随时间改变

LSTM生成随机手写序列

在手写的过程中,两个分布的参数将随时间改变,同时互相依赖。例如,当书写完毕一个单词后,笔离开纸的概率增加了,同时,笔的下一个位置很可能会远离现在的位置,差异也更大。我们可以让LSTM输出混合高斯分布和Bernoulli分布的参数,然后基于时步根据LSTM的内部状态改变这些参数的值。上图中的红色气泡可视化了高斯分布的改变,红色气泡表明了下一笔的位置和尺寸。我们可以从这个随时间改变的分布中取样,从而通过连接取样点取样整个模拟手写的过程。在我看来,这种模型和动态超网络很像,因为LSTM随着时间的推移,动态地改变生成分布(高斯和Bernoulli)的参数。在手写数据集上训练整个网络后,它生成手写样本的能力令人惊叹。

我们的论文应用动态超网络扩展了这一方法。我们将代码中的BasicLSTMCell替换为HyperLSTMCell。因此,随着时间的推移,LSTM的权重矩阵和偏置将由一个较小的LSTM网络修改。作了这一简单的改动之后,我们将这一模型生成模型方法提升至另一层,每一时步,较小的LSTM动态生成较大的LSTM模型,相应地,生成的较大的LSTM模型也在每一时步为高斯和Bernoulli分布生成参数。所以模型生成模型变成了模型生成模型生成模型。

和之前的文本生成任务类似,和普通乃至多层LSTM相比,这一新方法在使用数目类似的训练参数的前提下,达到了更优的表现。我修改了write-rnn-tensorflow代码以精确复现Grave论文的4.2小节中的试验,并验证了使用BasicLSTMCell的Log损失结果和之前发表的结果足够相似。在试验了历史结果后,我们将BasicLSTMCell切换为HyperLSTMCell,然后重新运行了试验。不过,在此之前,我们首先尝试了改进基线方法。对基线技术表达一些敬意、给它们面子很重要,因为它们为我们开辟了道路。我们发现,应用数据增强和dropout之类的黑魔法技术,我们已经可以改善基线单层BasicLSTMCell的分数(从-1026奈特到-1055奈特)。在切换到我们的模型之后,HyperLSTMCell将Log损失评分推进到-1162奈特,这是很大、很有意义的一个改进。除了定量结果,论文的附录也展示了不同模型实际生成的许多样本。

我制作了一个小的demo,展示手写生成过程是如何通过HyperLSTM工作的,作为本文的结尾。我希望通过这个demo显示HyperLSTM单元是如何修改主LSTM权重的。和字符生成的例子不同,时间轴并不严格对应手写的x轴,所以我发现使用web demo的形式可视化这一过程更容易,因为提交到arXiv的.pdf论文并不能添加动画。未来,更多的科学研究将从期刊和会议的静态.pdf文件转移到网页文章。我的同事@ch402@shancarter最近也创建了一个叫做distill.pub的平台,以鼓励研究结果以更现代的基于web的格式发表。我未来会开始使用这一平台。

demo截屏

demo截屏

我只可视化了主LSTM的4个权重矩阵Whi、Whg、Whf、Who的改变(使用4种不同的颜色),虽然理论上Wxi、Wxg、Wxf、Wxo及所有偏重也能可视化。较高的亮度意味着HyperLSTM细胞正对主LSTM的权重做较大的改动。你可以看到,较大的改动通常出现在字符和单词之间,尽管没有人显式地告知网络书写字符这一概念,更别说单词了。LSTM和HyperLSTM需要互相配合,自行摸索出这些概念。

本地实现

我通过阅读开源代码和教程学到了很多东西,基于TensorFlow实现循环网络,我推荐Denny Britz的博客,以及神秘的r2rt超博客,这篇Recurrent Batch Norm,以及TensorFlow With The Latest Papers Implemented(基于TensorFlow实现最新论文)。

HyperLSTMCell的本地实现基于LeavesBreathe实现的Layer Norm和OlavHN实现的Batch Norm代码。你也可以尝试在char-rnn-tensorflow中插入HyperLSTMCell,或在其他有趣的任务中使用它。它可以工作,但目前没有原始LSTM那么快,但随着时间的推移,我预期TensorFlow核心中的许多改进能够允许更快速的优化实现。

TensorBoard

Character PTB验证集上的TensorBoard结果

HyperLSTMCell

TensorFlow实现:https://github.com/hardmaru/supercell/

原文 超网络
感谢原作者hardmaru授权论智编译,未经授权禁止转载。详情见转载须知

本文来自机器人之家,如若转载,请注明出处:https://www.jqr.com/article/000037
爆料投稿,欢迎投递至邮箱:service@jqr.com
机器学习人工智能深度学习 LSTM
推荐阅读

0 条回复

评论

游客
robot
发布需求
联系客服联系客服
robot
联系客服