资讯专栏INFORMATION COLUMN

RNN&Attention机制&LSTM 入门了解

hover_lew / 3332人阅读

摘要:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。之遗忘门遗忘门顾名思义,是控制是否遗忘的,在中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态。

RNN 经典的RNN结构:

在实际应用中,我们还会遇到很多序列形的数据,如:

自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。

语音处理。此时,x1、x2、x3……是每帧的声音信号。

时间序列问题。例如每天的股票价格等等

序列形的数据就不太好用原始的神经网络处理了。为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:


图示中记号的含义是:

圆圈或方块表示的是向量。

一个箭头就表示对该向量做一次变换。如上图中h0和x1分别有一个箭头连接,就表示对h0和x1各做了一次变换。

在很多论文中也会出现类似的记号,初学的时候很容易搞乱,但只要把握住以上两点,就可以比较轻松地理解图示背后的含义。

h2的计算和h1类似。要注意的是,在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记。


我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。
我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算:


正如之前所说,一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。

剩下的输出类似进行(使用和y1同样的参数V和c):


这就是最经典的RNN结构,我们像搭积木一样把它搭好了。它的输入是x1, x2, .....xn,输出为y1, y2, ...yn,也就是说,输入和输出序列必须要是等长的。

由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:

计算视频中每一帧的分类标签。因为要对每一帧进行计算,因此输入和输出序列等长。

输入为字符,输出为下一个字符的概率。这就是著名的Char RNN,可以用来生成文章,诗歌,甚至是代码,非常有意思。

N VS 1结构:

有的时候,我们要处理的问题输入是一个序列,输出是一个多带带的值而不是序列,只在最后一个h上进行输出变换就可以了:


这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

1 VS N结构:

输入不是序列而输出为序列的情况,我们可以只在序列开始进行输入计算:


还有一种结构是把输入信息X作为每个阶段的输入:


这种1 VS N的结构可以处理的问题有:

从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子

从类别生成语音或音乐等

N vs M结构

下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c:


得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:


还有一种做法是将c当做每一步的输入:


由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的

文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。

阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。

语音识别。输入是语音信号序列,输出是文字序列。

…………

Attention机制

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈,不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差),如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。
Attention机制通过在每个时间输入不同的c来解决这个问题,下图是带有Attention机制的Decoder:


相当于之前将原始输入信息压缩到一个c中,attention后是将信息按照不同特征分别储存到多个c中,并且每一个c会自动去选取与当前所要输出的y最合适的上下文信息。具体来说,我们用 a_{ij} 衡量Encoder中第j阶段的hj和解码时第i阶段的相关性,最终Decoder中第i阶段的输入的上下文信息 c_i 就来自于所有 h_j 对 a_{ij} 的加权和。
我们从输出端,即decoder部分,倒过来一步一步看公式。

(1)


是指decoder在t时刻的状态输出,
是指decoder在t-1时刻的状态输出,
是t-1时刻的label(注意是label,不是我们输出的y)看下一个公式,是一个RNN。

(2)


是指第j个输入在encoder里的输出,
是一个权重

(3)

这个公式跟softmax是何其相似,道理是一样的,是为了得到条件概率,这个的意义是当前这一步decoder对齐第j个输入的程度。最后一个公式,
(4)

这个可以用一个小型的神经网络来逼近。好了,把四个公式串起来看,这个attention机制可以总结为一句话,“当前一步输出应该对齐哪一步输入,主要取决于前一步输出和这一步输入的encoder结果”。

LSTM

由于RNN也有梯度消失的问题,因此很难处理长序列的数据,大牛们对RNN做了改进,得到了RNN的特例LSTM(Long Short-Term Memory),它可以避免常规RNN的梯度消失。
在RNN模型里,每个序列索引位置t都有一个隐藏状态h(t),如果我们略去每层都有的o(t),L(t),y(t),则RNN的模型可以简化成如下图的形式:


中可以很清晰看出在隐藏状态h(t)由x(t)和h(t−1)得到。得到h(t)后一方面用于当前层的模型损失计算,另一方面用于计算下一层的h(t+1)。

    由于RNN梯度消失的问题,大牛们对于序列索引位置t的隐藏结构做了改进,可以说通过一些技巧让隐藏结构复杂了起来,来避免梯度消失的问题,这样的特殊RNN就是我们的LSTM。由于LSTM可以理解为修改隐藏层的RNN,这里我们以最常见的RNN结构为例讲述。LSTM的结构如下图:
    

LSTM模型结构剖析:

上面我们给出了LSTM的模型结构,下面我们就一点点的剖析LSTM模型在每个序列索引位置t时刻的内部结构。

    从上图中可以看出,在每个序列索引位置t时刻向前传播的除了和RNN一样的隐藏状态h(t),还多了另一个隐藏状态,如图中上面的长横线。这个隐藏状态我们一般称为细胞状态(Cell State),记为C(t)。如下图所示:
    

除了细胞状态,LSTM图中还有了很多奇怪的结构,这些结构一般称之为门控结构(Gate)。LSTM在在每个序列索引位置t的门一般包括遗忘门,输入门和输出门三种。下面我们就来研究上图中LSTM的遗忘门,输入门和输出门以及细胞状态。

LSTM之遗忘门

遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:

    图中输入的有上一序列的隐藏状态h(t−1)和本序列数据x(t),通过一个激活函数,一般是sigmoid,得到遗忘门的输出f(t)。由于sigmoid的输出f(t)在[0,1]之间,因此这里的输出f^{(t)}代表了遗忘上一层隐藏细胞状态的概率。用数学表达式即为:
    
    f(t)=σ(Wfh(t−1)+Ufx(t)+bf)
    
其中Wf,Uf,bf为线性关系的系数和偏倚,和RNN中的类似。σ为sigmoid激活函数。

LSTM之输入门

输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:

    从图中可以看到输入门由两部分组成,第一部分使用了sigmoid激活函数,输出为i(t),第二部分使用了tanh激活函数,输出为a(t), 两者的结果后面会相乘再去更新细胞状态。用数学表达式即为:
    
i(t)=σ(Wih(t−1)+Uix(t)+bi)
a(t)=tanh(Wah(t−1)+Uax(t)+ba)

其中Wi,Ui,bi,Wa,Ua,ba,为线性关系的系数和偏倚,和RNN中的类似。σ为sigmoid激活函数。

LSTM之细胞状态更新

在研究LSTM输出门之前,我们要先看看LSTM之细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态C(t)。我们来看看从细胞状态C(t−1)如何得到C(t)。如下图所示:

    细胞状态C(t)由两部分组成,第一部分是C(t−1)和遗忘门输出f(t)的乘积,第二部分是输入门的i(t)和a(t)的乘积,即:
    
C(t)=C(t−1)⊙f(t)+i(t)⊙a(t)

其中,⊙为Hadamard积,在DNN中也用到过。

LSTM之输出门

有了新的隐藏细胞状态C(t),我们就可以来看输出门了,子结构如下:

    从图中可以看出,隐藏状态h(t)的更新由两部分组成,第一部分是o(t), 它由上一序列的隐藏状态h(t−1)和本序列数据x(t),以及激活函数sigmoid得到,第二部分由隐藏状态C(t)和tanh激活函数组成, 即:
    
o(t)=σ(Woh(t−1)+Uox(t)+bo)
h(t)=o(t)⊙tanh(C(t))

参考资料:
https://zhuanlan.zhihu.com/p/...
http://www.cnblogs.com/pinard...
https://www.zhihu.com/collect...
http://www.cnblogs.com/pinard...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20284.html

相关文章

  • RNN&Attention机制&LSTM 入门了解

    摘要:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。之遗忘门遗忘门顾名思义,是控制是否遗忘的,在中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态。 RNN 经典的RNN结构: 在实际应用中,我们还会遇到很多序列形的数据,如: 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。 语音处理。此时,x1、x2...

    pubdreamcc 评论0 收藏0
  • 深度神经网络(DNN)是否模拟了人类大脑皮层结构?

    摘要:深度神经网络里面,大部分节点都是等同的,但是在人类神经网络里面,并不是这样。神经网络的结构目前的深度神经网络主要是三种结构,全连接的卷积,循环。总结一下,就是深度神经网络和大脑皮层有共通的地方,但是并不能算是模拟。 神经元在深度学习领域,神经元是最底层的单元,如果用感知机的模型, wx + b, 加上一个激活函数构成了全部,输入和输出都是数字,研究的比较清楚。别的不说,在参数已知的情况下,有...

    Juven 评论0 收藏0
  • RNNLSTM,性能良好的神经网络到底是如何工作的?

    摘要:摘要在年率先发布上线了机器翻译系统后,神经网络表现出的优异性能让人工智能专家趋之若鹜。目前在阿里翻译平台组担任,主持上线了阿里神经网络翻译系统,为阿里巴巴国际化战略提供丰富的语言支持。 摘要: 在2016年Google率先发布上线了机器翻译系统后,神经网络表现出的优异性能让人工智能专家趋之若鹜。本文将借助多个案例,来带领大家一同探究RNN和以LSTM为首的各类变种算法背后的工作原理。 ...

    sihai 评论0 收藏0
  • Python实现双向RNN与堆叠的双向RNN的示例代码

      小编写这篇文章的一个主要目的,主要是给大家做一个详细的介绍,介绍的内容主要是利用Python知识,利用Python去实现RNN与堆叠的RNN,具体的实例代码,下面就给大家详细的去做一个解答。  1、双向RNN  双向RNN(Bidirectional RNN)的结构如下图所示。   双向的RNN是同时考虑过去和未来的信息。上图是一个序列长度为4的双向RNN结构。  双向RNN就像是我们做阅...

    89542767 评论0 收藏0
  • 一文读懂深度学习:从神经元到BERT

    摘要:今天,蚂蚁金服财富对话算法团队整理对比了深度学习模型在自然语言处理领域的发展历程。深度学习网络相对于浅层网络结构,有两层三层及以上隐藏层的我们就可以称为深度网络。 阿里妹导读:自然语言处理领域的殿堂标志 BERT 并非横空出世,背后有它的发展原理。今天,蚂蚁金服财富对话算法团队整理对比了深度学习模型在自然语言处理领域的发展历程。从简易的神经元到当前最复杂的BERT模型,深入浅出地介绍了...

    xialong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<