因为 Reduce 层和类似实现办法的 Tracker 都用 LSTM 进行工作,所以批处理和解批处理赞助函数在隐蔽状况和存储状况对(h,c)上运行。
- def batch(states):
- if states is None:
- return None
- states = tuple(states)
- if states[0] is None:
- return None
- # states is a list of B tensors of dimension (1, 2H)
- # this returns two tensors of dimension (B, H)
- return torch.cat(states, 0).chunk(2, 1)def unbatch(state):
- if state is None:
- return itertools.repeat(None)
- # state is a pair of tensors of dimension (B, H)
- # this returns a list of B tensors of dimension (1, 2H)
- return torch.split(torch.cat(state, 1), 1, 0)

这就是所有。其余的须要代码(包含 Tracker),在 spinn.py中,同时分类器层可以大年夜两个句子编铝闼槠算 SNLI 类别,并在给出最终损掉(loss)变量的情况下将此结不雅与目标进行比较,代码在 model.py中。SPINN 及其子模块的向前代码产生了异常复杂的计算图(图 3),最终计算出损掉函数,其细节在数据集中的每个批处理中都完全不合,然则每次只需很少的开销(overhead)即可主动反向传播,经由过程调用 loss.backward(),一个内置于 PyTorch 中的函数,它可以大年夜图中的任何一点履行反向传播。
完全代码中的模型和超参数可以与原始 SPINN 论文中申报的机能相匹配,然则充分应用了批处理加工和 PyTorch 的效力后,在 GPU 上练习的速度要快几倍。固然原始实现须要21 分钟来编译计算图(意味实在施过程中的调试周期至少要那么长),然后练习大年夜约 5 天时光,这琅绫氰述的版本没有编译步调,它的练习在 Tesla K40 的 GPU 上须要约 13 个小时,或者在 Quadro GP100 上约 9 小时。

图 3:具有批大年夜小为 2 的 SPINN 计算图的一小部分,它运行的是本文中供给的 Chainer 代码版本。
调用所有的强化进修
上述没有跟踪器(Tracker)的模型版本实际上异常合适 TensorFlow 的新 tf.fold 域特定说话,它针对动态图形的间谍作况,然则有跟踪器的版本将难以实现。这是因为添加跟踪器意味着大年夜递归(recursive)办法切换到基于客栈的办法。这(如膳绫擎的代码)是最直接地应用依附于输入值的前提分支(conditional branch)来实现的。然则 Fold 缺乏内置的前提分支操作,所以应用它构建的模型中的图形构造只能取决于输入的构造而不是其数值。此外,构建一个其跟踪器在攫取输入句子时就决定若何解析输入句子的 SPINN 的版本是完全没有可能的,因为一旦加载了一个输入样本 Fold 中的图构造必须完全固定(图构造依附于输入样本的构造)。
DeepMind 和谷歌大年夜脑的研究人员研究了一个如许的模型,他们应用强化进修来练习一个 SPINN 的跟踪器解析输入句子,而不应用任何外部解析数据。本质上,如许一个模型大年夜随机猜测开端,当它的解析在整体分类义务上正好产生优胜的精确性时,它产生一个自我嘉奖(reward)并经由过程嘉奖来进修。研究人员写道,他们「应用的批处理大年夜小为 1,因为在每次迭代上钩算图须要根据每个来自策略收集(policy network)的样本从新构建 [Tracker]」——但 PyTorch 使得在像如许一个复杂的、构造随机变更的收集长进行批处理练习成为可能。
推荐阅读
【义务编辑:wangxueyan TEL:(010)68476606】 >>>详细阅读
本文标题:如何用PyTorch实现递归神经网络?
地址:http://www.17bianji.com/lsqh/34965.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示