Quasi Recurrent Neural Network (qrnn) (git待更新...)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014665013/article/details/81911850

工程化的时候总会考虑到性能和效率,今天的主角也是基于这个根源,最终目的是在准确率保证的前提下,能够实现并行化,let’s go!show time~

1. Introduction

RNN模型,特别是包含着门控制的如LSTM等模型,近年来成了深度学习解决序列任务的标准结构。RNN层不但可以解决变长输入的问题,还能通过多层堆叠来增加网络的深度,提升表征能力和提升准确度。然而,标准的RNN(包括LSTM)受限于无法处理那些具有非常长的序列问题,例如文档分类或者字符级别的机器翻译;同样的,其也无法并行化的计算特征或者说,也无法同时针对文档不同部分状态进行计算。

CNN模型,特别适合处理图片数据,可是近年来也用在处理序列编码任务了(如文献1)。通过应用时间不变性的过滤器函数来并行的计算输入序列。CNN不同与循环模型的优点有:

  • 增强并行化;
  • 更好的处理更长的序列,如字符级别的语言数据。

而将CNN模型结合了RNN层生成的混合结构,能更好的处理序列数据(如文献2)。因为传统的最大池化和平均池化可以看成是:基于假设时间不变性前提下,在时间维度上结合卷积特征的一种方法。也就是说其本身是无法完全处理大规模序列有序信息的。
作者提出的Quasi RNN是结合了RNN和CNN的特性:

  • 像CNN一样,基于时间步维度和minibatch维度上进行并行计算,确保对序列数据有高吞吐量和良好的长度缩放性;
  • 像RNN一样,允许输出是依赖于序列中之前的有序元素基础上得到的,即RNN本身的过去时间依赖性

    这里我想说一下,最近见过好几个模型都是融合RNN和CNN,其主要目的和主要思想就像上面两条说的一样,就是为了融合RNN和CNN的特点,比如前段时间比赛用的文本分类问题里面就有RCNN或者CRNN模型,在某些问题上问题上效果不错(虽然在比赛里面没有textcnn效果好)


模型概述: ![这里写图片描述](https://img-blog.csdn.net/20180821174325841?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ2NjUwMTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) **如图所示,其中就是通过结合LSTM和CNN的特性而构成的Quasi RNN。**

2.模型详解

Quasi RNN如CNN一样可以分解成2个子组件:
  • 卷积组件:在序列数据上,基于序列维度并行计算(CNN是基于minibatch维度和空间维度),如图1.1.
  • 池化组件:如CNN一样,该部分没有需要训练的参数,允许基于minibatch维度和特征维度上并行计算。(我认为这里的池化操作就是RNN的部分,因为卷积完之后的池化操作和RNN的序列操作极为相似)(原文:Suitable functions for the pooling subcomponent can be constructed from the familiar elementwise gates of the traditional LSTM cell)
    基本模型:
    这里写图片描述
    图2.1 基于序列数据的CNN卷积:假设 t = 3 , k = 2 , x i R n × 1 , z i R m × 1

图2.1详解:
1. 假定输入为 X R T × n ,是一个长度为T的序列,其中每个向量维度为n。
2. QRNN如图1.1部分,假定卷积组件的通道是m(即滤波器个数是m),通过卷积操作得到 Z R T × m ,是一个长度为T的序列,其中每个向量维度为m。
3. 如果假定当前时间步为t,那么卷积的范围为 x t k + 1 x t

2.1. 卷积

然后就是Quasi RNN模块的内部结构了,其遵循如下公式:

Z = t a n h ( W z X ) ( 1 )

F = σ ( W f X ) ( 2 )

O = σ ( W o X ) ( 3 )

其中 W z , W f , W o 都是 R k × n × m 的张量,*表示是以k为宽度的序列维度上的窗口滑动,如图1.1。假如k=2,即卷积操作在序列维度上跨度为2,则上面式子如下所示:

z t = t a n h ( W z 1 x t 1 + W z 2 x t ) ( 4 )

f t = σ ( W f 1 x t 1 + W f 2 x t ) ( 5 )

o t = σ ( W o 1 x t 1 + W o 2 x t ) ( 6 )

如式子(4)(5)(6)所示,k的选取对于字符级别的任务还是很重要的。

2.2. 池化

在池化部分,作者建议了3种:

  • f-pooling:动态平均池化,其中只用了一个遗忘门, 表示逐元素相乘
    h t = f t h t 1 + ( 1 f t ) z t ( 7 )
    这里写图片描述
    图2.2 f-pooling时候的QRNN结构图
  • fo-pooling:基于动态平均池化,增加一个输出门
    c t = f t c t 1 + ( 1 f t ) z t ( 8 )

    h t = o t c t ( 9 )

    这里写图片描述
    图2.3 fo-pooling时候的QRNN结构图

  • ifo-pooling:具有一个独立的输入门和遗忘门
    c t = f t c t 1 + i t z t ( 10 )

    h t = o t c t ( 11 )

    这里写图片描述
    图1.2.3 ifo-pooling时候的QRNN结构图

    上述中h,c的状态都初始化为0,虽然对序列中每个时间步来说,这些函数的循环部分都需要计算,不过他们够简单,而且可以随着特征维度进行并行化。也就是对于实际操作中,对于即使很长的序列来说,增加的时间都是可以忽略不计的。一个QRNN层就是执行一个输入依赖的池化,后面跟着一个基于卷积特征和门控制的线性组合。正如CNN一样,随着QRNN层数增加,可以创建一个逼近更复杂函数的模型。

相关代码

详见git

参考文献

  • [CNN处理序列数据] - Xiang Zhang, Junbo Zhao, and Yann LeCun. Character-level convolutional networks for text classification.In NIPS, 2015.
  • [CNN+RNN] - Jason Lee, Kyunghyun Cho, and Thomas Hofmann. Fully character-level neural machine translation without explicit segmentation. arXiv preprint arXiv:1610.03017, 2016.
  • Recurrent Neural Network[Quasi RNN]
  • paper links:QUASI-RECURRENT NEURAL NETWORKS

猜你喜欢

转载自blog.csdn.net/u014665013/article/details/81911850