RNN(recurrent neural network)

1.为什么需要rnn

前馈神经网络不考虑数据之间的关联性,网络的输出只和当前时刻网络的输入相关。然而在解决很多实际问题的时候我们发现,现实问题中存在着很多序列型的数据(文本、语音以及视频等),现实场景如室外的温度是随着气候的变化而周期性的变化的,以及我们的语言也需要通过上下文的关系来确认所表达的含义。

这些序列型的数据往往都是具有时序上的关联性的,既某一时刻网络的输出除了与当前时刻的输入相关之外,还与之前某一时刻或某几个时刻的输出相关。而前馈神经网络并不能处理好这种关联性,因为它没有记忆能力,所以前面时刻的输出不能传递到后面的时刻。

        因此,就有了现在的循环神经网络,其本质是:拥有记忆的能力,并且会根据这些记忆的内容来进行推断。因此,它的输出就依赖于当前的输入和记忆。相比于前馈神经网络,该网络内部具有很强的记忆性,它可以利用内部的记忆来处理任意时序的输入序列。

CNN vs RNN

  1. CNN 需要固定长度的输入、输出,RNN 的输入和输出可以是不定长且不等长的
  2. CNN 只有 one-to-one 一种结构,而 RNN 有多种结构,如下图:

2.rnn的基本结构

RNN)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络。循环神经网络,是指在全连接神经网络的基础上增加了前后时序上的关系,可以更好地处理比如机器翻译等的与时序相关的问题。

        循环神经网络是一种对序列数据有较强的处理能力的网络。在网络模型中不同部分进行权值共享使得模型可以扩展到不同样式的样本,比如CNN网络中一个确定好的卷积核模板,几乎可以处理任何大小的图片。将图片中分成多个区域,使用同样的卷积核对每一个区域进行处理,最后可以获得非常好的处理结果。同样的,循环网络使用类似的模块(形式上相似)对整个序列进行处理,可以将很长的序列进行泛化,得到需要的结果。

        RNN的目的就是用来处理序列数据的。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题都无能无力。比如你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。

        相比于词袋模型和前馈神经网络模型,RNN可以考虑到词的先后顺序对预测的影响,RNN包括三个部分:输入层、隐藏层和输出层。相对于前馈神经网络,RNN可以接收上一个时间点的隐藏状态。

3.RNN数学原理

给出一个典型的RNN:

在图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNNs会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“Back Projections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连。(这实际上就是LSTM)

右侧为计算时便于理解记忆而产开的结构。简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为: 
                                                            st=f(U∗xt+W∗st−1)

实现当前输入结果与之前的计算挂钩的目的。

表达得更直观的图有: 

优点

  1. 可以处理变长数据
  2. 模型的大小不会随着输入而变大
  3. 同一个时间下的参数是共享的
  4. 计算i时刻时,理论上可以使用之前任何时刻的信息

缺点

  1. 循环计算太慢
  2. 在实践中,比较难获得任意时刻的信息
  3. 容易出现梯度爆炸、梯度消失

rnn的核心的单元,解决梯度消失的办法:优化单元,找一个更好更复杂的隐藏单元来计算。变体有GRU和LSTM。在计算当前单元的同时,也会对周围的单元数据进行处理。来捕捉长距离的依赖性。

4.为了解决缺点产生的变体

Encoder-Decoder

n-to-m

还有一种是 n-to-m,输入、输出为不等长的序列。

种结构是Encoder-Decoder,也叫Seq2Seq,是RNN的一个重要变种。原始的n-to-n的RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。为此,Encoder-Decoder结构先将输入数据编码成一个上下文语义向量c:

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

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

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

Encoder-Decoder 应用

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

  • 机器翻译:Encoder-Decoder的最经典应用,事实上这结构就是在机器翻译领域最先提出的。
  • 文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列。
  • 阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
  • 语音识别:输入是语音信号序列,输出是文字序列。

Encoder-Decoder 框架

Encoder-Decoder 不是一个具体的模型,是一种框架。

  • Encoder:将 input序列 →转成→ 固定长度的向量
  • Decoder:将 固定长度的向量 →转成→ output序列
  • Encoder 与 Decoder 可以彼此独立使用,实际上经常一起使用

因为最早出现的机器翻译领域,最早广泛使用的转码模型是RNN。其实模型可以是 CNN /RNN /BiRNN /LSTM /GRU /…

Encoder-Decoder 缺点

  • 最大的局限性:编码和解码之间的唯一联系是固定长度的语义向量c
  • 编码要把整个序列的信息压缩进一个固定长度的语义向量c
  • 语义向量c无法完全表达整个序列的信息
  • 先输入的内容携带的信息,会被后输入的信息稀释掉,或者被覆盖掉
  • 输入序列越长,这样的现象越严重,这样使得在Decoder解码时一开始就没有获得足够的输入序列信息,解码效果会打折扣

因此,为了弥补基础的 Encoder-Decoder 的局限性,提出了attention机制。

Attention 的优点:

  • 在机器翻译时,让生词不只是关注全局的语义向量c,增加了“注意力范围”。表示接下来输出的词要重点关注输入序列种的哪些部分。根据关注的区域来产生下一个输出。
  • 不要求编码器将所有信息全输入在一个固定长度的向量中。
  • 将输入编码成一个向量的序列,解码时,每一步选择性的从序列中挑一个子集进行处理。
  • 在每一个输出时,能够充分利用输入携带的信息,每个语义向量Ci不一样,注意力焦点不一样。

Attention 的缺点

  • 需要为每个输入输出组合分别计算attention。50个单词的输出输出序列需要计算2500个attention。
  • attention在决定专注于某个方面之前需要遍历一遍记忆再决定下一个输出是以什么。

Attention的另一种替代方法是强化学习,来预测关注点的大概位置。但强化学习不能用反向传播算法端到端的训练。

参考:

1.https://www.jiqizhixin.com/articles/2018-12-14-4

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值