作家
登录

如何用PyTorch实现递归神经网络?

作者: 来源: 2017-04-26 13:03:04 阅读 我要评论

  1. WORDS:  The church   has cracks in the ceiling         . 
  2. PARSES: S   S      R S   S      S  S   S       R R R R S R R 

我还想保存句子的语境,以便在对句子的后半部分应用 Reduce 层时推敲体系已经攫取的句子部分的信息。所以我将用一个三参数函数调换双参数的 Reduce 函数,该函数的输入值为一个左子句、一个右子句和当前句的高低文状况。该状况由神经收集的第二层(称为轮回跟踪器(Tracker)的单位)创建。Tracker 在给定当前句子高低文状况、缓冲区中的顶部条目 b 和客栈中前两个条目 s1\s2 时,在客栈操作的每个步调(即,攫取每个单词或闭括号)后生成一个新状况:

轻易假想用你最爱好的编程说话来编写代码做这些工作。对于要处理的每个句子,它将大年夜缓冲区加载下一?悼?船运行跟踪器,检查是否将单词推送入客栈或履行 Reduce 函数,履行该操作;然后反复,直到半数个句子完成处理。经由过程对单个句子的应用,该过程构成了一个大年夜而复杂的深度神经收集,经由过程客栈操作的方法一遍又一遍地应用它的两个可练习层。然则,如不雅你熟悉 TensorFlow 或 Theano 等传统的深度进修框架,就知道它们很难实现如许的动态过程。你值得花点时光回想一下,摸索为什么 PyTorch 能有所不合。

图 1:一个函数的图构造表示

深度神经收集本质上是有大年夜量参数的复杂函数。深度进修的目标是经由过程计算以损掉函数(loss)度量的偏导数(梯度)来竽暌古化这些参数。如不雅函数表示为计算图构造(图 1),则向后遍历该图可实现这些梯度的计算,而无需冗余工作。每个现代深度进修框架都是基于此反向传播(backpropagation)的概念,是以每个框架都须要一个表示计算图的方法。

  1. # TensorFlow 
  2. # (this code runs once, during model initialization) 
  3. # “words” is not a real list (it’s a placeholder variable) so 
  4. # I can’t use “len” 
  5. cond = lambda i, h: i < tf.shape(words)[0] 
  6. cell = lambda i, h: rnn_unit(words[i], h) 
  7. i = 0 
  8. _, h = tf.while_loop(cond, cell, (i, h0)) 

在很多风行的框架中,包含 TensorFlow、Theano 和 Keras 以及 Torch7 的 nngraph 库,计算图是一个提前构建的静态对象。该图是用像数学表达式的代码定义的,但其变量实际上是榭龃保存任何数值的┞芳位符(placeholder)。图中的┞芳位符变量被编译进函数,然后可以在练习集的批处理上反复运行该函数来产生输出和梯度值。

这种静态计算图(static computation graph)办法对于固定构造的卷积神经收集效不雅很好。然则在很多其它应用中,有效的做法是令神经收集的图构造根据数据而有所不合。在天然说话处理中,研究人员平日欲望经由过程每个时光步调中输入的单词来展开(肯定)轮回神经收集。上述 SPINN 模型中的客栈操作很大年夜程度上依附于控制流程(如 for 和 if 语句)来定义特定句子的计算图构造。在更复杂的情况下,你可能须要构建构造依附于模型自身的子收集输出的模型。

这些设法主意中的一些(固然不是全部)可以被生搬硬套到静态图体系中,但几乎老是以降低透明度和增长代码的困惑度为价值。该框架必须在其计算图中添加特别的节点,这些节点代表如轮回和前提的编程原语(programming primitive),而用户必须进修和应用这些节点,而不仅仅是编程代码说话中的 for 和 if 语句。这是因为法度榜样员应用的任何控制流程语句将仅运行一次,当构建图时法度榜样员须要硬编码(hard coding)单个计算路径。

例如,经由过程词向量(大年夜初始状况 h0 开端)运行轮回神经收集单位(rnn_unit)须要 TensorFlow 中的特别控制流节点 tf.while_loop。须要一个额外的特别节点来获取运行时的词长度,因为在运行代码时它只是一个占位符。

基于动态计算图(dynamic computation graph)的办法与之前的办法有根本性不合,它有几十年的学术研究汗青,个中包含了哈佛的 Kayak、主动微分库(autograd)以及以研究为中间的框架 Chainer和 DyNet。在如许的框架(也称为运行时定义(define-by-run))中,计算图在运行时被建立和重建,应用雷同的代码为前向经由过程(forward pass)履行计算,同时也为反向传播(backpropagation)建立所需的数据构造。这种办法能产生更直接的代码,因为控制流程的编写可以应用标准的 for 和 if。它还使调试更轻易,因为运行时断点(run-time breakpoint)或客栈跟踪(stack trace)将追踪到实际编写的代码,而不是履行引擎中的编译函数。可以在动态框架中应用简单的 Python 的 for 轮回来实现有雷同变量长度的轮回神经收集。


  推荐阅读

  未来的人们,将会如何看待我们现在的机器人?

【义务编辑:wangxueyan TEL:(010)68476606】 >>>详细阅读


本文标题:如何用PyTorch实现递归神经网络?

地址:http://www.17bianji.com/lsqh/34965.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)