【新智元导读】DeepMind 今天开源了最新的深度学习框架 Sonnet。Sonnet 被专门设计用于与 TensorFlow 协同工作,能够更方便、直接地构建复杂神经网络模型。Sonnet 开源可以使 DeepMind 创建的其他模型轻松地与社区共享。Sonnet 将定期更新。
DeepMind 决定把整个研究架构转为使用 TensorFlow(TF)已经快一年了。这被证明是一个不错的选择——我们的许多模型学习速度明显更快,内置的分布式训练功能极大地简化了我们的代码。
我们发现TF 的灵活性和适应性适合于为特定目的构建更高级别的框架,并且我们已经写了一个这样的框架,可以用 TF 快速构建神经网络模块。我们正在积极开发这个代码库,但是迄今为止它是如此契合我们的研究需求,所以我们兴奋地宣布,今天我们要将这一框架开源。我们把它称为 Sonnet 框架。
自2015 年11 月首次发布以来,更高级别库的多样化生态系统在 TensorFlow 周围不断涌现,使得一般性任务能够更快实现。Sonnet 与其中一些现有的神经网络库具有许多相似之处,但同时具有一些为我们的研究要求专门设计的特性。在此前的 Learning to learn paper(详见下文)中,我们用了一些代码,其中就包括了 Sonnet 的初步版本,其他即将发布的代码版本将建立在我们今天发布的完整库中。
开源 Sonnet,可以使 DeepMind 创建的其他模型轻松地与社区共享,我们同时希望社区能够使用 Sonnet 进行自己的研究。近几个月来,我们还开源了我们的 DeepMind Lab 旗舰平台,目前正在与 Blizzard 合作开发支持星际争霸II 中 AI 研究的开源 API。将来还会推出更多的版本,它们都将在我们的新的开源页面上共享。
该库使用面向对象的方法,类似于 Torch / NN,允许定义了一些计算前传的模块的创建。模块被一些 Tensor 输入“调用”,为 Graph 添加操作并返回 Tensor 输出。其中一个设计选择是确保通过在后续调用同一模块时自动重用变量来透明地处理变量共享。
文中的许多模型当然会很自然地被视为层次结构,例如:可微分神经计算机包含可能是LSTM 的控制器,可被当做包含一个标准线性层植入。我们发现,编写详尽表述子模块的代码可以实现代码的更易重复使用及更快应用于实验 – Sonnet 提倡编写可以在内部同时表述其他子模块的模块或者在构建过程中可被其他模块传递的模块。
我们发现非常有用的最后一个技术是让特定模块在任意嵌套的 Tensor 组中进行操作。 通常一组可微分神经计算机可以对可微分神经计算的状态进行最佳表述, 而以平行列表的方式表述是容易出错的。Sonnet 提供实用程序来应对这些任意层次结构,以便将实验更改为使用不同类型的 RNN 不需要繁琐的代码更改。我们也已经对核心 TF 进行了更改以更好地支持这种使用案例。
Sonnet 被专门设计用于与 TensorFlow 协同工作,因此不会阻止访问底层细节,如 Tensors 和可变范围等。Sonnet 编写的模型可以与原始的 TF 代码以及其他高级库中的模型自由混合。
这不是一次性发布 - 我们将定期更新 Github repository 以与我们的内部版本吻合。我们对很多新功能还有很多想法,这些功能将在准备就绪时提供。我们对来自社区的贡献感到非常兴奋。要了解更多关于 Sonnet 的信息,请访问我们的 GitHub repository。
GitHub 库:https://www.github.com/deepmind/sonnet
再来一个新的 TF 库意义何在?
在 Sonnet 的Github页面,研究人员给出了一些常见问题的回答,从中我们能更好的了解 DeepMind 构建并开源 Sonnet 的初心,以及如何更好地利用这个工具。
问:为什么又搞了个 TF 库出来?
答:现有的 TF 库对于 DeepMind 来说使用起来非常不灵活,因为我们有大量的使用案例是需要做权重共享的(weight sharing)。现在,所有的东西用 tf.make_template,从一开始就能支持权重共享,由此带来的好处显而易见是超出开发成本的。不仅如此,将配置与连接分离开来的 paradigm 也更方便模块组合。
问:在同一个build()的后续调用中可以访问不同的变量吗?
答:不行。tf.make_template 不允许这样做,它会把后续调用中访问不同的变量当成错误。
问:如果错误地把两个模块做了同样的命名会怎么样?
答:似乎以相同名称构造的模块将具有不同的名称和可变 scope。在内部,Sonnet 使用tf.make_template,它基本上是与一些 tf.VariableScope 一起包装了一个python函数,来确保对该函数的每次调用都发生在同一个 scope 内,并且第一个调用之后的所有调用都设置为重用变量。模板的一个特点是,如果已经在同一 scope 内输入了任何名称,它将使其唯一化。例如:
问:我必须给我的模块命名吗?
答:不。模块有默认名,应该是snake_case中的class name,如果必要的话,它也会被用作唯一化的名称(见上)。然而,我们推荐大家为模块起一个包含变量的名称,因为这一名称也会成为内部 scope 的名称,由此也定义了变量的名称。大多数模块的名称带有“w”(weights)和“b”(bias),来显示内部权重。大家都喜欢这么命名:
你选的名称会出现在 TensorBoard 中。
问:我怎么知道一个模块 declare 了什么变量?
答:你可以对一个模块用 get_variables() 的方法,来查询 scope 内的所有变量。注意如果模块没有连到 graph 上,就会显示错误,因为变量此时不存在,所以相关的 scope 是空的。
问:Sonnet中的所有内容都应该作为模块实现吗?
答:不,不创建tf.Variables并且不存储内部配置的计算可以在常规TF Op样式中实现,即接收输入张量,关键字参数和返回张量输出的python函数。
如果一个op要创建变量(即在内部的任何地方调用tf.get_variable,包括间接的)它必须被作为snt.AbstractModule的一个子类,这样才能正确地处理变量共享。
需要注意,如果一个计算没有创建任何变量,可能仍然需要使用一个Module而不是Op来实现它。
除了可变共享之外,在我们希望将配置参数附加到操作系统的情况下,使用Sonnet模块可以很方便。一个例子是[content addressing](可微分神经计算机中的模块),这些模块接收多个配置参数(内存中的每个单词的大小,读写头的数量),这些输入的一些功能定义了有效输入。我们在这个模块之前使用正确输出大小的snt.Linear来提供正确的维度。由于是一个模块,实现起来很容易——在构建时提供configuration,然后提供一个method.param_size(),它给出所需输入的维数。然后我们就能得到正确的输入张量大小并进行连接。
如果上面的操作是作为op cosine_weights(memory, cos_params, word_size, num_heads) 实现的,那么指示cos_params所需大小的逻辑必须存储在一个单独的函数中。将相关功能封装到一个模块中会让代码更清晰。
问:可以将其与其他高级TF API(如TF Slim)混合使用吗?
答:Sonnet模块一旦构建出来,就遵循Tensor-In-Tensor-Out的原理,因此可以与TF-Slim等的功能混合。不过需要注意的是,这可能会导致意外行为的发生——TF-Slim控制共享是通过传递明确的scope =和 reuse = kwargs到层函数中——如果在Sonnet模块的_build()方法中使用TF-Slim层,多次调用的话就不太可能正常工作。
问:使用Sonnet与其他库与原始TF的开销(overhead)是多少?
答:没有。只有在构造计算图时才会涉及Sonnet。一旦你到了使用Session.run()的阶段,只需执行Ops就行了,不用考虑将该图合在一起用了什么库。
Hacker News 评论:窥见 DeepMind 内部研究
获得了最高支持的 HN 用户 gcr 评论称:
作为机器学习环境来说,TensorFlow 非常复杂,不同的研究小组必须定义自己的最佳 practice。使用 TF 就像学 C ++一样,每个人都学习一个稍微不同的,相互不相容的,但是广泛重叠的语言子集。
Sonnet 开源后,我们看到了DeepMind的专用工具(虽然只有一点点),以及他们在工作中使用的操作的参考实现。
对于那些想要搞透 DeepMind 工作的研究院人来说,这次开源非常有用。
不过,Sonnet 并不是彻底全新的神经网络库。目前还没有人宣称这次发布带来了什么范式上的改变,作为业内人还是很欣慰的。
研究论文:通过梯度下降学习通过梯度下降学习
下面就是文章在一开始提到的“Learning to learn paper”。这篇论文2016年底上传到arXiv,当时论文中使用的一些代码就包括了 Sonnet 的初步版本。
今天,DeepMind 已经更完整的代码放在了Github上面。
这篇文章的题目非常有意思,叫做《通过梯度下降学习通过梯度下降学习》,将优化算法作为学习问题,让算法学会自动探索需要的结构。作者包括牛津大学教授、DeepMind 研究员 Nando de Feritas。
摘要
在机器学习里,从手工设计的特征到机器学习的特征这个过程已经非常成功了。但是,优化算法仍然是手工设计的。在本文中,我们展示了如何将优化算法的设计转化为学习问题,让算法学会自动探索需要的结构。最终学出来的算法(由 LSTM 实施),在训练过的任务上表现超越了通用的手工设计的算法,并且在具有相似结构的新的任务中表现也很好(泛化能力很高)。我们在许多任务测试了这种新的算法,包括简单的凸问题、训练神经网络和用神经艺术对图像增加风格(styling images with neural art)。
论文地址:https://arxiv.org/pdf/1606.04474.pdf
原文地址:https://deepmind.com/blog/open-sourcing-sonnet/?from=groupmessage&isappinstalled=1