0.背景

对于如机器翻译、语言模型、观点挖掘、问答系统等都依赖于RNN模型,而序列的前后依赖导致RNN并行化较为困难,所以其计算速度远没有CNN那么快。即使不管训练的耗时程度,部署时候只要模型稍微大点,实时性也会受到影响。

Tao Lei等人基于对LSTM、GRU等模型的研究,提出了SRU模型。在保证速度的前提下,准确度也是没有多少损失。

1.SRU

Tao Lei等人通过将每一时间步的主要计算部分,优化为不要去依赖之前时间步的完整计算,从而能够容易的并行化。其结果示意图如图1.1。

图1.1 普通的RNN结构和SRU结构
大多数RNN模型如LSTM,GRU等都是通过门来控制信息流的传输,从而缓解梯度消失和爆炸的问题。

ps:其中所谓的门就是将输入向量连接到一个门层(向量),然后以sigmoid激活函数来计算当前的可流通量(通俗点说,就是得到一个sigmoid的值向量,去与所需要的其他状态向量逐点相乘,即每个维度上都有门控制)

在前馈神经网络中,特别是矩阵相乘是最耗时的部分了,而如果是两个矩阵逐点相乘,那计算量倒是少了好多。所以SRU的主要设计原理就是:门计算只依赖于当前输入的循环。这样就使得模型只有逐点矩阵相乘的计算是依赖于之前的时间步的。从而能够让网络容易的进行并行化。

我们基于参考文献[1]来进行对应的结构展示:

图1.2基础组件

图1.3 标准RNN结构图

图1.4 LSTM结构图
现在主流的RNN结构都会在当前时间步上用到上一个时间步的隐藏层输出ht−1ht−1。例如在LSTM中,遗忘门的计算ft=σ(Wfxt+Rfht−1+bf)ft=σ(Wfxt+Rfht−1+bf)。其中涉及到的Rht−1Rht−1就破坏了独立性和并行性。这样相似性的设计在GRU和其他RNN变种中都能找到。而SRU的设计是完全丢弃了当前时间步门的计算会依赖之前时间步的ht−1ht−1,ct−1ct−1。所以现在的计算瓶颈是图1.5中式子1-3中的三个矩阵相乘了。在计算完xt˜,ft,rtxt~,ft,rt之后,剩下的就是逐点计算了,这时候就很快了。

SRU完整的公式如下:

图1.5 SRU结构公式

图1.6 SRU结构图(自己用visio画的)

2. SRU工程优化

优化SRU和在cuDNN LSTM中优化LSTM的套路差不多,其中主要涉及到2点:

  • 所有时间步的矩阵相乘可以批次处理,这可以明显提升计算效率和GPU的使用。如将图1.5中的式子1-3的三个权重矩阵合并成一个大矩阵。如下:

UT=⎛⎝⎜WWfWr⎞⎠⎟[x1,x2,...,xn]UT=(WWfWr)[x1,x2,...,xn]

其中n表示序列的长度,是将n个输入向量联合起来,即每个xixi都是一个向量,U∈Rn×3dU∈Rn×3d,d表示SRU模块中的隐藏层维度,当输入是一个mini-batch为k个序列的时候,U就是一个size为(n,k,3d)(n,k,3d)的张量;

  • 所有逐元素相乘的操作都可以放入一个kernel函数(cuda中的一个术语)中。如果不这么做。那么加法和sigmoid的激活函数就会分别需要调用各自独立的函数,并且增加额外的kernel运行延迟和数据移动的开销(这些都和gpu的计算有关,感兴趣的可以学习cuda)。

下面就是kernel函数的伪代码(CUDA的),其中省略了输入向量xixi本身的维度,只涉及到序列的长度,mini-batch的大小和SRU模块中隐藏层的维度

图2.1 kernel函数伪代码

#python形式的cuda伪代码,因为gpu编程的特性,所以都是基于标量进行具体的操作的
def kernel(xTensor, UTensor, bFVector, bRVector, c0Matrix):#xTensor:tensor for input, size is (n, k, d), means sequenceLength by minibatch by hiddenState#UTensor:tensor for weight, size is (n, k, 3d) means sequenceLength by minibatch by [W,Wf,Wr],3d#bFVector:vector for forget bias, size is (1,d)#bRVector:vector for reset bias, size is (1,d)#c0Matrix: matrix for SRU state,size is (k,d) means minibatch by hiddenStateh, c = np.zeros([n,k,d]), np.zeros([n,k,d])#one sample in minibatchfor i in range(1,k):#one dimension in for j in range(1,d):c = c0Matrix[i,j]for l in range(1,n):W, Wf, Wr = UTensor[l,i,j], UTensor[l,i,j+d], UTensor[l,i,j+2d]f = sigmoid(Wf+bFVector[j])r = sigmoid(Wr+bRVector[j])c = f*c+(1-f)*Wh = f*tanh(c)+(1-r)*xTensor[l,i,j]c[l,i,j] = ch[l,i,j] = hreturn h,c

如上面所示,通过GPU的网格等多线程操作,在外面2个for可以实现并行操作,最内部的for是基于序列顺序的,也就是在实现的时候,只有这个维度上是需要前后关联的,而在minibatch这个维度和hiddenState这个维度都可以分开,也就是都可以并行,只有sequence维度需要前后管理啊,那么这个维度放入寄存器中保持先后关系即可,而minibatch和hiddenState这两个维度可以看成是网格的x,y轴。
这就是矩阵逐元素相乘比矩阵相乘块的好处:gpu特喜欢这种逐元素相乘的;对矩阵相乘的,如果矩阵大了,还需要做分块处理。

通过如图2.2的结构设计,在实验上,可以发现速度还是有很可观的提升的。

图2.2 SRU与其他模型的结果对比

参考文献:

  1. 理解LSTM

Recurrent Neural Network[SRU]相关推荐

  1. (zhuan) Recurrent Neural Network

    Recurrent Neural Network 2016年07月01日 Deep learning Deep learning 字数:24235 this blog from: http://jxg ...

  2. Recurrent Neural Network系列2--利用Python,Theano实现RNN

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  3. How to Visualize Your Recurrent Neural Network with Attention in Keras

    Neural networks are taking over every part of our lives. In particular - thanks to deep learning - S ...

  4. 深度学习之递归神经网络(Recurrent Neural Network,RNN)

    为什么有bp神经网络.CNN.还需要RNN? BP神经网络和CNN的输入输出都是互相独立的:但是实际应用中有些场景输出内容和之前的内 容是有关联的. RNN引入"记忆"的概念:递归 ...

  5. 论文学习15-Table Filling Multi-Task Recurrent Neural Network(联合实体关系抽取模型)

    文章目录 abstract 1 introduction 2.方 法 2.1实体关系表(Figure-2) 2.2 The Table Filling Multi-Task RNN Model 2.3 ...

  6. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  7. 【李宏毅机器学习】Recurrent Neural Network Part1 循环神经网络(p20) 学习笔记

    李宏毅机器学习学习笔记汇总 课程链接 文章目录 Example Application Slot Filling 把词用向量来表示的方法 1-of-N encoding / one-hot Beyon ...

  8. 2021李宏毅机器学习课程笔记——Recurrent Neural Network

    注:这个是笔者用于期末复习的一个简单笔记,因此难以做到全面详细,有疑问欢迎大家在评论区讨论 I. Basic Idea 首先引入一个例子,槽填充(Slot Filling)问题: Input: I w ...

  9. Quasi Recurrent Neural Network (QRNNs) (git待更新...)

    文章目录 1. Introduction 2.模型详解 2.1. 卷积 2.2. 池化 相关代码 参考文献 工程化的时候总会考虑到性能和效率,今天的主角也是基于这个根源,最终目的是在准确率保证的前提下 ...

最新文章

  1. go的各种import
  2. 2019胡润女企业家榜公布:碧桂园杨惠妍继续领跑
  3. 路由器信号总是无法与手机连接服务器,手机无法搜到路由器信号怎么办? | 192路由网...
  4. 八年程序员被裁了后,打脸上家公司,连斩六个offer
  5. android设置自动开关机,Android开发之设置开机自动启动的几种方法
  6. React.js 小书 阅读笔记3
  7. 页面滚动到指定位置的方法
  8. 对话独角兽得物(毒)App CTO 陈思淼:组建技术团队的十件事
  9. 哈夫曼树及哈夫曼编码(10分)
  10. android自动夜间模式,Android实现日夜间模式的深入理解
  11. 微信跳转,wxtz,跳转微信关注公众号
  12. python取json数组中的值
  13. java外包恒大,JAVA开发工程师
  14. Loadrunner各种类型脚本实例
  15. 如何求出两个整数的最大公约数
  16. Linux下Oracle 11g 单实例静默安装
  17. CEC13BenchMark测试
  18. 一群黑客决定互相出题难死对方,争夺10万美元奖金,结果却是他赢了
  19. 某华为外包功能测试花四个月时间学习自动化测试成功拿下25k15薪offer
  20. tiny4412 开发板

热门文章

  1. java虚拟机规范(se8)——class文件格式(一)
  2. C语言——分别用递归和迭代的方法实现字符串逆序
  3. 四川省地方税务局数据复制分发软件项目招标
  4. 轻取软考45分之软考信息系统项目管理师项目成本管理​章节学习笔记
  5. 网站电脑商城项目笔记
  6. python问题随手记录20210313
  7. resip协议栈下的TLS使用
  8. BOSS直聘向港交所递交双重主要上市申请
  9. HDMI,VGA,DVI,DP,MINI DP,AV等影音设备接口规参数
  10. nginx根据域名转发不同ip端口