利用Tensorflow构建RNN并对序列数据进行建模

本文详细介绍了如何使用Tensorflow构建循环神经网络(RNN)来处理序列数据,特别关注了RNN的结构、LSTM单元以及在情感分析任务中的应用。首先,讨论了序列数据的特性,如顺序性和时间序列数据。接着,解释了RNN的循环机制,以及如何使用基于时间的反向传播(BPTT)进行训练。然后,提出了LSTM长短期记忆网络来解决梯度消失问题。在实验部分,利用IMDb电影评论数据集构建了一个RNN模型进行情感分析,展示了如何对数据进行预处理、构建RNN模型并进行训练。

利用Tensorflow构建RNN并对序列数据进行建模

文本处理处理任务的方法中,一般将TF-IDF向量作为特征输入。显然的缺陷是:这种方法丢失了输入的文本序列中每个单词的顺序

对一般的前馈神经网络,比如CNN,通常接受一个定长的向量作为输入

CNN对文本数据建模的时候,输入变长的字符串或者单词串,然后通过滑动窗口加上池化的方式将原先的输入转换成为一个固定长度的向量表示

这样做可以捕捉到原始文本中的一些局部特征,但是对于两个单词之间的依赖关系则很难被捕获学习到

循环神经网络RNN能很好地处理文本数据变长且有序的输入序列

RNN模拟了人类阅读文章的顺序,从前到后阅读文中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解后续文本。

本文包括以下方面的内容

  • 介绍序列数据(sequential data)

  • 介绍用于序列建模的RNN

  • 介绍长短时记忆网络LSTM

  • 介绍时间截断反向传播算法TBPTT

  • 使用Tensorflow构建多层RNN并用于序列建模

  • 实验1:基于IMDB电影评论数据集,利用RNN进行情感分析

  • 实验2:基于The mysterious island文本数据,利用RNN字符级语言建模与LSTM单元建模;

  • 使用梯度裁剪以应对梯度爆炸

  • 介绍Transformer模型以及自注意力机制

from IPython.display import Image
%matplotlib inline

1.介绍序列数据(sequential data)

序列数据有时候也称为序列,这里首先讨论序列数据的一些特性,然后了解序列数据的表示,此后研究序列数据的各种建模类型。

1.1序列数据的顺序因素(order matters)

序列的独特之处在于序列中的元素以一定的顺序出现,彼此之间不是独立的

而对于经典的机器学习模型而言

经典的监督学习、机器学习算法假设输入是独立和同分布(IID)数据,这意味着训练示例相互独立,具有相同的基础分布。在这方面,基于相互独立的假设,训练实例给出的顺序是无关的

处理序列数据的时候,此种假设就不成立了

因为,序列数据的顺序、或者次序很重要。比如对于预测某只股票的市场价值数据

例如,假设我们有n个训练示例,其中每个训练示例代表某一天某只股票的市场价值。如果我们的任务是预测未来三天的股票市场价值,那么以日期排序的顺序来考虑以前的股票价格来得出趋势是有意义的,而不是以随机的顺序利用这些训练例子。

序列数据与时间序列数据(time-series data)

时间序列数据是一种特殊类型的序列数据,其中每个样本示例都与时间维度直接相关

在时间序列数据中,数据的采样是针对连续的时间戳进行的,因此时间维度决定了数据点之间的顺序。

另一方面,并非所有的序列数据都具有时间维度,例如文本数据或DNA数据。此类数据的示例是有序的,但不具有时间先后关系。但RNN实际上可以用于处理时间序列数据

1.2序列数据的表示(Representing sequences)

前面提到序列数据的order非常重要,因此需要找到一种办法,在机器学习模型中利用到这种顺序信息。

这里记序列数据为 ⟨ x ( 1 ) , x ( 2 ) , … , x ( T ) ⟩ \left\langle\boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, \ldots, \boldsymbol{x}^{(T)}\right\rangle x(1),x(2),,x(T)。这里的上标表明了实例之间的顺序。同时,序列的长度为 T T T

对于时间序列数据, x ( t ) x^{(t)} x(t)始于特定时间段 t t t的样本点。

下图显示了一个时间序列数据的例子,其中输入特征与样本标签都遵循时间轴顺序,因此 x , y x,y x,y均为序列:

Image(filename='images/16_01.png', width=700)

在这里插入图片描述

正如已经提到的,迄今为止我们所涵盖的标准神经网络(NN)模型,如多层感知器(MLP)和用于图像数据的CNN,都假定训练示例彼此独立,故不包含顺序信息。

所以,这样的模型不具有对前面的训练示例的记忆。例如,样本经过前馈和反向传播步骤,并且权值的更新独立于训练样本的处理顺序。相比之下,RNN是

为序列建模而设计的,能够记住过去的信息并相应地处理新的事件,这在处理序列数据时是一个明显的优势

1.3序列建模(sequence modeling)的不同类型

参考链接

该文章总结了常见的序列建模任务,这些任务依赖于输入和输出数据的关系类型:

# 下图总结了最常见的序列建模任务
Image(filename='images/16_02.png', width=700)

在这里插入图片描述

many-to-one:

输入数据是一个序列,但输出是固定大小fixed-size向量或者标量,而非序列。例如:情感分析中,输入是文本,输出是标签;

One-to-many:

输入数据是标准格式的,而非序列,但输出是序列。例如:图像字幕image captioning,这里的输入为图像,输出为总结该图像内容的英语短语;

many-to-many:

输入和输出都是序列,这个类别可以根据输入和输出是否同步可以进一步划分为两类。同步的many-to-many建模任务的一个例子:视频分类,视频中的每一帧都被标记;

不同步(也称为delayed)的many-to-many建模任务的一个例子:将一种语言翻译成另一种语言,例如将应为通过机器阅读和处理,得到另一种语言;

2.用于sequences建模的RNN

首先介绍RNN的典型结构,其中包括建模序列数据的递归或循环组件。然后,再介绍经典的RNN中神经元激活是如何计算的。

2.1理解RNN的循环机制(looping mechanism)

下图将对比标准前馈网络和RNN的网络结构:

# 标准前馈网络结构与循环网络结构对比
Image(filename='images/16_03.png', width=700)

在这里插入图片描述

上图中各层次的神经单元都没有显示,整体的假设:输入层input layer ( x ) \boldsymbol{(x)} (x),隐藏层hidden layer ( h ) \boldsymbol{(h)} (h),输出层output layer ( o ) \boldsymbol{(o)} (o),它们都是矩阵,且均包含很多的神经单元。

2.2确定RNN的输出类型

这种通用的RNN体系结构可以对应于上述输入为序列的两种建模类型:many-to-many、many-to-one;

在Tensorflow Keras API中,通过将参数return_sequences设置为True or False,就可以实现指定循环层关于返回一个序列作为输出或者仅使用最后一个输出。

在标准的前馈网络中:信息从输入层流向隐含层,再从隐含层流向输出层。

在RNN中:隐藏层接收当前时间步长输入层的输入,且接收前一个时间步长的输入层的输入。因此隐藏层中相邻时间步长的信息流动使得网络对过去的事件信息具有了记忆。

这种信息流通常以循环的形式显示,在图符号中也被称为递归边recurrent edge,这就是这种通用RNN体系结构得名的原因。

类似于多层感知机,RNN可以由多个隐藏层组成。通常将带有一个隐藏层的RNN称为单层RNN。

# 带有一个隐藏层的RNN与具有两个隐藏层的RNN几何表示
Image(filename='images/16_04.png', width=700)

在这里插入图片描述

  • 标准NN中的每个隐藏单元只接收一个输入:与输入层相关的网络净活性值preactivation

  • RNN中的每个隐藏单元接收两组输入:当前时间步长的输入 X t \boldsymbol{X}^t Xt,上一时间步长的隐层单元激活 h ( t − 1 ) \boldsymbol{h}^{(t-1)} h(t1).

注意,在第一个时间步长 t = 0 t=0 t=0隐藏单元被初始化为0,或者是被初始化为较小的随机值

结合上述多层RNN,信息流动情况总结如下:

layer = 1: 隐藏层表示为 h 1 ( t ) \boldsymbol{h}_{1}^{(t)} h1(t),它从输入数据点 x ( t ) \boldsymbol{x}^{(t)} x(t),以及同一层中的隐藏层,且是在前面的时间步长,接收输入 h 1 ( t − 1 ) \boldsymbol{h}_1^{(t-1)} h1(t1)

layer = 2: 隐藏层表示为 h 2 ( t ) \boldsymbol{h}_{2}^{(t)} h2(t), 它从下面一层当前时间步长 o 1 ( t ) \boldsymbol{o}_1^{(t)} o1(t)的输出接收其输入,并从上一个时间步长 h 2 ( t − 1 ) \boldsymbol{h}_2^{(t-1)} h2(t1)接收其自身的隐层值;

2.3RNN网络中activations的计算

RNN网络结构中的每个有向边都和一个权重矩阵相关联。这些权重不依赖于时间t, 在时间轴上是共享的。单隐层RNN中的权重矩阵如下:

W x h \boldsymbol{W}_{x h} Wxh : 也就是输入, x ( t ) \boldsymbol{x}^{(t)} x(t), 和隐藏层, h \boldsymbol{h} h 之间的权重矩阵;

W h h \boldsymbol{W}_{h h} Whh : 循环边之间的权重矩阵;

W h o \boldsymbol{W}_{h o} Who : 隐层和输出层之间的权重矩阵;

# 上述权重矩阵几何表示如下
Image(filename='images/16_05.png', width=700)

在这里插入图片描述

在一些实现中,矩阵 W x h \boldsymbol{W}_{x h} Wxh 和矩阵 W h h \boldsymbol{W}_{h h} Whh会被组合连接到一起,形成一个整体。表示形式如下;

W h = [ W x h ; W h h ] \boldsymbol{W}_{h}=\left[\boldsymbol{W}_{x h} ; \boldsymbol{W}_{h h}\right] Wh=[Wxh;Whh]

计算网络的激活类似于其他标准多层感知机和其他类型的前馈神经网络。

对于隐含层,网络的输入(净活性值), Z h \boldsymbol{Z}_h Zh的计算是通过输入特征与权值的线性组合计算得来的:

z h ( t ) = W x h x ( t ) + W h h h ( t − 1 ) + b h \mathbf{z}_{h}^{(t)}=\boldsymbol{W}_{x h} \boldsymbol{x}^{(t)}+\boldsymbol{W}_{h h} \boldsymbol{h}^{(t-1)}+\boldsymbol{b}_{h} zh(t)=Wxhx(t)+Whhh(t1)+bh

则隐层在时间步长 t t t处的活性值计算如下:

h ( t ) = ϕ h ( z h ( t ) ) = ϕ h ( W x h x ( t ) + W h h h ( t − 1 ) + b h ) \boldsymbol{h}^{(t)}=\phi_{h}\left(\mathbf{z}_{h}^{(t)}\right)=\phi_{h}\left(\boldsymbol{W}_{x h} \boldsymbol{x}^{(t)}+\boldsymbol{W}_{h h} \boldsymbol{h}^{(t-1)}+\boldsymbol{b}_{h}\right) h(t)=ϕh(zh(t))=ϕh(Wxhx(t)+Whhh(t1)+b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值