0%

【RNN系列】SRU

RNN、LSTM、GRU都存在一个严重的问题: 前后两个时刻 t1t 的计算存在完全的依赖性。这种自回归结构无法并行,不能充分利用GPU计算资源。

the sequential dependencies that are central to recurrent architectures limit parallelization potential

GRU对LSTM进行了简化,详见GRU

注意观察ct1ht1的流向。很容易发现,这两个信息几乎影响每一个节点,因此LSTM和GRU是严重的autoregressive,严重的时序依赖。

如何加速?一个自然的思路: 能否尽量减少t1时刻的影响,剥离出时序无关的计算,类似以下的架构:

具体怎么做呢?比如我们大开脑洞,把LSTM中的ht1直接去掉,豁然开朗,下面的都能并行了。(当然脑洞太大往往不靠谱,也许把孩子和洗脚水一起丢了)

如何既能并行,又尽量少的损失时序信息?SRU是这样做的。

SRU

SRU(Simple Recurrent Unit)则提出更激进的架构,去掉了前后时刻计算的依赖。

  • 核心一: 门f不再依赖t1
  • 核心二: 门
  • input gate和forget gate的合并 (借鉴自GRU)
  • c和h的合并,(并未采用)
  • 宏观上,类似window_size=1的QRNN

效果

实现细节(trick)

SRU实现:增加highway连接和变分dropout

首先,他们在循环层之间增加了highway连接,因为此前的研究已经证明,像highway连接这样的skip connections,在训练深度网络时非常有效;

其次,在将RNN正则化时,SRU在标准的dropout外,增加了变分dropout,变分dropout在时间步长t与dropout使用相同的mask。

什么是

CUDA级的优化

。。。待看

吐槽环节

关于架构

  1. SRU就是QRNN的window_size=1的特例 - Richard Socher (是哎,我也跟着起哄)
  2. autoregressive CNNs with gated incremental pooling perform comparably to RNNs

关于gate

  1. gate的开关只取决于当前输入,不靠谱吧?

疑问环节

问题一

图三中,既然要剥离出时序无关的计算,为什么不把时序无关的计算剥离出RNN作为独立的layer?

可以

SRU等价于: x -> fork layer -> RNN

fork layer: 同时映射(W)和分流(分到不同的gate,不同的作用)。
(类似transformer中的multi-head)。
具体实现: x=Wx,然后split,然后分工,不同的gate,可以group gate。

LSTM自身也可以视为 x -> fork layer -> 时序依赖。详见cudnnLSTM。

问题二

。。

源码

好复杂,看着头疼

扩展阅读

未找到相关的 Issues 进行评论

请联系 @ESblog 初始化创建