第八篇论文读后总结-使用合成梯度的解耦神经接口

来源:互联网 发布:java导入自己的package 编辑:程序博客网 时间:2024/05/15 05:18

Decoupled Neural Interfaces using Synthetic Gradients

使用合成梯度的解耦神经接口。

Max Jaderberg 1 Wojciech Marian Czarnecki 1 Simon Osindero 1 Oriol Vinyals 1 Alex Graves 1 David Silver 1 Koray Kavukcuoglu1

 

Proceedings of the 34 th InternationalConference on Machine

Learning, Sydney, Australia, PMLR 70, 2017. Copyright 2017

by the author(s).

本文讲了什么问题?

神经网络的误差拟传播算法(BP算法)是基于梯度下降策略,训练有向神经网络通常需要将数据前向传播通过整个图,然后再反向传播误差信号,从而生成权重更新。因此,网络中所有层或模块就会被锁定,他们必须等待该网络的剩余部分前向执行,然后反向传播误差之后才能实现更新。例如分布于多台机器的大型分布式网络,有时候需要网络中的所有模块等待网络中的其它所有模块都执行完成和反向传播梯度,这个过程非常耗时,而且甚至无法解决。如果我们解耦了这些模块之间的接口,那么我们就能让每一个模块都独立地更新,而不会受到网络中其它的部分的锁定。

解决办法

本文引入了合成梯度的概念,通常,神经网络将其预测与数据集进行比较,以决定如何更新其权重。然后使用反向传播来确定每个权重应该如何移动,以使预测更加准确。然而,对于合成梯度来说,数据的最佳预测由各层完成,然后基于这个预测更新权重。这个最佳预测被称为合成梯度。数据仅用于帮助更新每个层的合成梯度生成器。这使得(大部分情况下)单个层独立学习,提升了训练的速度。


如上图所示,与(a)相比,(b)(c)解耦了接口,分别用梯度生成器更新各层的梯度,这显然更快。

 

使用合成梯度


如上图所示,最左边的框显示了如何更新神经网络的第一层。第一层前向传播到合成梯度生成器(M i+1),然后返回梯度。使用此梯度而不是实际梯度(这将需要一个完整的正向传播和反向传播来计算)。然后,权重正常更新,并认为该合成梯度是真实的梯度值。

 

生成合成梯度

合成梯度生成器实际上就是一个合成神经网路,当进行全部的正反向传播时,实际上得到了正确的梯度。我们可以用比较神经网络的输出和数据集的方法,将正确梯度与合成梯度进行比较。因此,我们可以通过假设真实梯度来自于虚拟数据集来训练合成神经网络。


如上图第二部分。梯度(M i+2)是如何通过(f i+1)反向传播到达M(i+1),每一个合成梯度生成器实际上只使用了来自下一层的合成梯度进行训练。因此,只有最后一层实际上是在数据上训练的。其他所有层,包括,合成梯度生成器网络,均基于合成梯度训练。因此,网络只需等待来自下一层的合成梯度就可以训练每个层。

 

 

解耦神经接口应用

DNI 能适用任一通用的神经网络架构,而不只是前馈网络。例如循环神经网络(RNN)。一个 RNN 有一个展开的、反复使用的循环核心(recurrent core)来处理序列数据。训练 RNN 的理想情况是:我们能在整个序列(可能无限长)上展开该核心,使用沿时间的反向传播(BPTT)将误差梯度传播穿过整个图(graph)。然而在实践中,由于内存的约束以及需要频繁计算更新我们的核心模型,我们只能在有限的步上展开,这被称之为截断的沿时间的反向传播(truncated BPTT)。如果我们不在 BPTT 的边界之间使用反向传播,而是使用 DNI 和产生合成梯度,我们可以将一个合成梯度模型整合到核心中,以使得在每一个时间步骤,该 RNN 核都会在产生输出的同时产生合成梯度。


 

 

 

 

 

 

 

 

阅读全文
0 0
原创粉丝点击