SRU算法在文献Training RNNs as Fast as CNNs中提出.目的是针对RNN中当前step t的输出 ht 依赖于前一时刻 ht−1 的输出,而导致无法进行并行计算,计算速度过慢.SRU通过有对LSTM循环单元进行简单化计算,使得计算过程可以并行,具体SRU计算公式如下:
对于输入 xt ,公式3,4,5可以并行计算.计算 x˜t、ft和rt 后,公式 6 和 7 能够非常迅速和简洁的执行计算,因为它们的运算都是对应元素之间的操作。 SRU 实现相比于简单的 LSTM 实现可快 5 倍。
算法流程:
分类精度对比:
问答效果:
由此可将,在保证精度不下降的情况下,SRU比LSTM速度快了6倍以上.
pytorch代码:https://github.com/taolei87/sru
src调用方法:
import torch
from torch.autograd import Variable
from cuda_functional import SRU, SRUCell
# input has length 20, batch size 32 and dimension 128
x = Variable(torch.FloatTensor(20, 32, 128).cuda())
input_size, hidden_size = 128, 128
rnn = SRU(input_size, hidden_size,
num_layers = 2, # number of stacking RNN layers
dropout = 0.0, # dropout applied between RNN layers
rnn_dropout = 0.0, # variational dropout applied on linear transformation
use_tanh = 1, # use tanh or identity activation
bidirectional = False # bidirectional RNN ?
)
rnn.cuda()
output, hidden = rnn(x)