0.背景

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

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

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

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

作者提出的Quasi RNN是结合了RNN和CNN的特性:

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


图0.1 LSTM,CNN,Quasi RNN结构图
如图0.1所示,其中就是通过结合LSTM和CNN的特性而构成的Quasi RNN。

1.Quasi RNN

Quasi RNN如CNN一样可以分解成2个子组件:

  • 卷积组件:在序列数据上,基于序列维度并行计算(CNN是基于minibatch维度和空间维度),如图1.1.
  • 池化组件:如CNN一样,该部分没有需要训练的参数,允许基于minibatch维度和特征维度上并行计算。

本人觉得图0.1略有些难以理解,自己画成如下图:

图1.1 基于序列数据的CNN卷积:假设\(t=3, k=2, x_i \in R^{n\times 1}, z_i \in R^{m\times 1}\)

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

1.1. 卷积

然后就是Quasi RNN模块的内部结构了,其遵循如下公式:
$ Z = tanh(W_z * X) $ (1)
$ F = \sigma(W_f * X) $ (2)
$ O = \sigma(W_o * X) $ (3)
其中\(W_z,W_f,W_o\)都是\(R^{k\times n\times m}\)的张量,\(*\)表示是以k为宽度的序列维度上的窗口滑动,如图1.1。假如\(k=2\),即卷积操作在序列维度上跨度为2,则上面式子如下所示:
$ z_t = tanh(W_z^1x_{t-1}+W_z^2x_t) $ (4)
$ f_t = \sigma(W_f^1x_{t-1}+W_f^2x_t) $ (5)
$ o_t = \sigma(W_o^1x_{t-1}+W_o^2x_t) $ (6)
如式子(4)(5)(6)所示,k的选取对于字符级别的任务还是很重要的。

1.2. 池化

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

  • f-pooling动态平均池化,其中只用了一个遗忘门,\(\bigodot\)表示逐元素相乘
    \(h_t=f_t\bigodot h_{t-1}+(1-f_t)\bigodot z_t\) (7)

    图1.2.1 f-pooling时候的QRNN结构图
  • fo-pooling:基于动态平均池化,增加一个输出门
    \(c_t=f_t\bigodot c_{t-1}+(1-f_t)\bigodot z_t\) (8)
    \(h_t = o_t\bigodot c_t\) (9)

    图1.2.2 fo-pooling时候的QRNN结构图
  • ifo-pooling:具有一个独立的输入门和遗忘门
    \(c_t=f_t\bigodot c_{t-1}+i_t\bigodot z_t\) (10)
    \(h_t = o_t\bigodot c_t\) (11)

    图1.2.3 ifo-pooling时候的QRNN结构图

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

参考文献:

  1. [CNN处理序列数据] - Xiang Zhang, Junbo Zhao, and Yann LeCun. Character-level convolutional networks for text classification.In NIPS, 2015.
  2. [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]的更多相关文章

  1. 循环神经网络(Recurrent Neural Network,RNN)

    为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...

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

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

  3. Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...

  4. Recurrent neural network (RNN) - Pytorch版

    import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms # ...

  5. 4.5 RNN循环神经网络(recurrent neural network)

     自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  RNN循环神经网络 ...

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

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

  7. Recurrent Neural Network(循环神经网络)

    Reference:   Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...

  8. Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM

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

  9. Recurrent Neural Network[Content]

    下面的RNN,LSTM,GRU模型图来自这里 简单的综述 1. RNN 图1.1 标准RNN模型的结构 2. BiRNN 3. LSTM 图3.1 LSTM模型的结构 4. Clockwork RNN ...

随机推荐

  1. 判断字符串a和b是否互为旋转词

    旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...

  2. concrrent类下ReentrantReadWriteLock类的原理以及使用

    1.ReentrantreadWriteLock 类的介绍 Lock接口下的子类存在 ReentrantLock子类,该子类是一个线程同步处理类:ReentrantLock类的介绍详见XXX: Loc ...

  3. (网页)jQuery判断checkbox是否选中的方法

    if($('#checkbox-id').is(':checked')) { // do something} if ($('#checkbox-id').attr('checked')) {    ...

  4. vue缓存页面

    vue如何和ionic的缓存机制一样,可以缓存页面,在A页面跳转至B页面后返回A页面时A页面的数据还在? 在app.vue中将router-view使用keep-alive包起来,使用v-if来判断使 ...

  5. html-edm(邮件营销)编写规则

    最近写了一个edm邮件 以前没有接触过  使用的是很老的html页面编写规则  只能用table标签  在此记录一下edm编写的一些规则 个人参考的是这两个网址,转载一下 http://www.zco ...

  6. python 数据驱动ddt使用,需要调用下面的代码,请挨个方法调试,把不用的注释掉

    #!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/12/15 15:27 # @Author : ChenAdong # @Em ...

  7. cve-2017-11882 poc分析

    目录 CVE-2017-11882 poc分析 0x00 工具&实验环境 0x01 分析行为 第一步:观察poc行为 第二步:找出计算器被弹出的地方 0x02 调试定位漏洞触发点 0x03 分 ...

  8. 安全之路 —— 利用APC队列实现跨进程注入

    简介 在之前的文章中笔者曾经为大家介绍过使用CreateRemoteThread函数来实现远程线程注入(链接),毫无疑问最经典的注入方式,但也因为如此,这种方式到今天已经几乎被所有安全软件所防御.所以 ...

  9. 内网ip/公网ip

    ip地址初识: 现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0.地址格式为:IP地址=网络地址+主机地址 或 IP地址=网络地址+子网地址+主机地址. IP地址类型 最初设计互 ...

  10. 将含有makefile文件的源码加入Eclipse工程

    转载自https://www.linuxidc.com/Linux/2011-02/32763.htm 很多软件在开发或者分析时需要一个像样的IDE,Eclipse是其中很优秀的一个,至少个人感觉很好 ...