RNN、LSTM、GRU都存在一个严重的问题: 前后两个时刻
the sequential dependencies that are central to recurrent architectures limit parallelization potential
GRU对LSTM进行了简化,详见GRU。
注意观察
如何加速?一个自然的思路: 能否尽量减少

左图: 传统RNN的全部计算量(灰色块)完全依赖上一时刻,这极大阻碍计算的并行化;右图: 对大量计算取消了时序依赖(大灰块),仅保留了轻量级的时序依赖(小灰块)
具体怎么做呢?比如我们大开脑洞,把LSTM中的
如何既能并行,又尽量少的损失时序信息?SRU是这样做的。
SRU
SRU(Simple Recurrent Unit)则提出更激进的架构,去掉了前后时刻计算的依赖。

SRU结构,来自知乎XXYY
- 核心一: 门
不再依赖 了 - 核心二: 门
- 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级的优化
。。。待看
吐槽环节
关于架构
- SRU就是QRNN的window_size=1的特例 - Richard Socher (是哎,我也跟着起哄)
- autoregressive CNNs with gated incremental pooling perform comparably to RNNs
关于gate
- gate的开关只取决于当前输入,不靠谱吧?
疑问环节
问题一
图三中,既然要剥离出时序无关的计算,为什么不把时序无关的计算剥离出RNN作为独立的layer?
可以
SRU等价于: x -> fork layer
-> RNN
fork layer
: 同时映射(W)和分流(分到不同的gate,不同的作用)。
(类似transformer中的multi-head)。
具体实现:
LSTM自身也可以视为 x -> fork layer
-> 时序依赖。详见cudnnLSTM。
问题二
。。
源码
好复杂,看着头疼
扩展阅读
- Training RNNs as Fast as CNNs. pdf
- 神仙打架: SRU引发的争议. openreview | facebook | reddit
未找到相关的 Issues 进行评论
请联系 @ESblog 初始化创建