导读
本文讨论了最新爆款论文(Training RNNs as Fast as CNNs)提出的LSTM变种SRU(Simple Recurrent Unit),以及基于pytorch实现了SRU,并且在四个句子分类的数据集上测试了准确性以及与LSTM、CNN的速度对比。
一.为什么要提出SRU?
二.SRU实现及其优化
熟悉LSTM和GRU的人都知道,它们是根据神经门来控制信息流来缓解梯度消失与梯度爆炸问题,所以,接下来我们看一下典型的SRU实现。 我们首先对输入的x进行简单的线性变换:
接下来计算遗忘门(forget gate)和 输入门,他们两个都是Sigmoid门:
接下来我们计算c,在计算c的过程中,我们使用了共轭表达式 it = 1 - ft 来简化运算:
最后,我们把c传递给激活函数g来计算最终的输出h:
以上就是SRU的经典实现,熟悉LSTM的人一定能够看出来,这样的SRU与LSTM一样都是依赖于前一时刻的计算,这样的做法没有什么意义,接下来我们我们在对其进一步的改进。
SRU的实现中添加了两个附加的特征:
然后利用Skip Connection,ht’ 就是最后的输出:
在后文的测试中,为什单层的SRU很难达到与LSTM相同的效果,而堆叠起来的多层SRU能够达到与LSTM相差无几甚至更好的效果,这里起到了很大的作用。
根据上文中的公式看出 ft 、 rt 都与 ht-1 有关,也就是要想计算 ht 必须等到前一时刻ht-1计算完成,这样就破换了并行性和独立性,无法实现并行化处理,针对此问题,提出了完全drop连接,就是去除了 ht-1 的依赖,以下是SRU的公式:
从上述(8)、(9)、(10)三个公式中可以看出,已经解除了ht-1 的依赖,这样依赖就可以实现程序的并行化处理,而公式(11),(12)能够非常迅速和简洁的执行计算,因为它们的运算都是对应元素之间的操作。
在上述公式8 — 10中,虽然解除了前一时刻的依赖,但是仍然存在一定的瓶颈,就是三个矩阵乘法的运算,在这里提供了更深的优化策略。
三.基于pytorch实现SRU Networks
熟悉LSTM的人很容易理解SRU的网络结构图,下图是SRU的网络结构图: xt 代表 t 时刻的输入; W、b 代表权重和偏置; ft 代表 t 时刻的遗忘门(forget gate); rt 代表 t 时刻的重置门(reset gate); ct 和 ht 分别代表 t 时刻的状态和最终的输出; σ 和 g 分别代表Sigmoid函数和激活函数(tanh、relu); 公式中的 ⊙ 代表矩阵对应元素间的操作;
pytorch搭建神经网络一般需要继承nn.Module
这个类,然后实现里面的forward()
函数,现在搭建SRU Networks需要另外写一个SRU Cell
类,Cell 里面实现SRU的全部运算,具体代码如下:
SRU_Formula
类:
SRU Cell
类:
在这里我实现了多层的SRU搭建,对于维度不等的经过线性转换(Linear
),以下是这部分的代码:
calculate one layer
函数实现了SRU的计算:
以上是SRU的公式实现,由于代码没有进行CUDA
优化也没有进行并行化处理
,所以速度上并没有明显的改变。
Github链接:https://github.com/bamtercelboo/pytorch_SRU
由于论文封装的代码比较不错,可以像LSTM一样简单调用:
其中cuda_functional
是论文中已经封装好的SRU,在这里SRU实现了CUDA
的优化,并对程序进行了并行化处理
,所以速度上有了明显的提升,下文的测试也是基于此SRU与pytorch优化过的LSTM、CNN进行对比,测试结果参考下文。具体的使用可以参考论文的Github,以下是链接:
Github链接:https://github.com/bamtercelboo/pytorch_SRU
Paper Github链接:https://github.com/taolei87/sru/tree/master/classification
四.实验结果
本次实验任务是情感分类任务(二分类),数据来源于MR(电影评论数据集)、CR(客户对各种产品评价的数据集)、Subj(主观性数据集)以及Twitter情感分类数据集,以下是各个数据集的详细信息:
下图是MR、CR、Subj数据集的详细信息,测试采用十折交叉验证,下载数据从 Github:https://github.com/harvardnlp/sent-conv-torch/tree/master/data
下图是Twitter情感分类数据集的详细信息:
以下实验结果是在CR、Subj、MR、Twitter四个句子分类数据集上测试的结果:
实验结果:在四个数据集上SRU与LSTM的准确率相差不大,有的数据集(像CR、Subj)一层的SRU效果就能达到一层LSTM的效果,但是在MR、Twitter数据集上一层的效果反而不是很好,需要叠加多层SRU才能达到LSTM一层的效果,这与上文提及的Highway Connection有很大的关系。
以下实验结果是在Twitter数据集上对forward和backward测试的平均运行时间,其中SRU、LSTM、CNN都是经过CUDA优化的,CNN的kernel-size=3,SRU和LSTM的隐层维度是300,三个模型的batch size是16,以毫秒为单位计算,图中SRU-1代表一层的SRU模型:
实验结果:从上述实验结果能够说明在句子分类任务上,单层的SRU能够达到与CNN相同的速度,比LSTM快2 — 3倍;上文测试需要4层SRU才能达到一层LSTM效果的情况下,4层SRU能与一层LSTM的达到相同的速度。
References
[1] Tao Lei and Yu Zhang. Training RNNs as Fast as CNNs. arXiv:1709.02755, 2017. [2] James Bradbury, Stephen Merity, Caiming Xiong, and Richard Socher. Quasi-recurrent neural networks. In ICLR, 2017. [3] Yarin Gal and Zoubin Ghahramani. A theoretically grounded application of dropout in recurrent neural networks. In Advances in Neural Information Processing Systems 29 (NIPS), 2016. [4] Jeremy Appleyard, Tomas Kocisky, and Phil Blunsom. Optimizing performance of recurrent neural networks on gpus. arXiv preprint arXiv:1604.01946, 2016.