深度学习之循环神经网络

简介

循环神经网络(RNN)是一类用于处理序列数据的神经网络。每一个神经元除了当前信息的输入外还接受上一个隐藏神经元的输入(这就是所谓的记忆信息),保留序列依赖型。

基本原理

循环神经网络结构如下图,其中左边为循环图,右边为展开图。

对于如上图所示的RNN网络,每个时间步都有输出,并且隐藏单元之间有循环连接的网络结构。且有以下特性:

  1. 权值共享,图中的W全是相同的,U和V也一样。
  2. 每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。

所谓循环,即指隐层h的循环连接,隐层神经元除了接受输入X,还需要接受上一个隐层的输出,因此对第t个隐层神经元有:
$$
h^{(t)}=f(h^{(t-1)},x;\theta)
$$

sequence-to-sequence

上图所示的结构只是RNN网络中的一种,从图中可以看出,网络输入一个序列X,就会输出一个序列Y,因此此类网络为sequence-to-sequence ,可以用于股票价格预测等。

还有其他RNN类别,可以参考RNN学习

双向RNN

前面提到的RNN只有一个因果结构,即时刻t的状态可以从过去获取信息,状态的传输是从前往后单向的 。而使用双向RNN,则可以从过去与将来同时获取信息,例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。

双向RNN结构如下图,双向RNN可以看作是一个正向的RNN与一个逆向的RNN的组合。

编码解码模型

所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。 这种架构可以使输入输出序列的长度彼此不同。

局限性

局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量C。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了

LSTM

长期依赖(Long-Term Dependencies)问题

RNN面临的最大挑战就是无法解决长期依赖问题。 当上文信息与当前词相距较远时,在经过许多阶段梯度传播后,梯度倾向于消失(多数)或者爆炸(少数)。循环神经网络涉及到多次相同函数的组合,这些组合导致极短的非线性。

解决长期依赖的方法可采用:

  1. 跳跃连接:从过去某个层输出,直接链接到未来层。引入d延时循环链接保证单元能够被前d个单元影响,减轻梯度爆炸和消失问题。
  2. 渗透单元:
  3. 删除连接:主动删除长度为一的连接并用更长的连接替换它们。
  4. 基于长短期记忆(long short-term memory)和门控RNN

LSTM

LSTM 是一种特殊的 RNN 类型,可以学习长期依赖信息。 在标准的 RNN 中,循环的模块只有一个非常简单的结构,例如一个 tanh 层。 而 LSTM 重复的模块拥有一个不同的结构。LSTM 循环网络除了外部的 RNN 循环外,还具有内部的 “LSTM 细胞’’ 循环(自环),因此 LSTM 不是简单地向输入和循环单元的仿射变换之后施加一个逐元素的非线性。与普通的循环网络类似,每个单元有相同的输入和输出,但也有更多的参数和控制信息流动的门控单元系统(所谓门单元,因为使用sigmod作为激活函数,可以将输出压缩到[0,1]之间,于是这个结构的功能就类似于一扇门, 当门打开时(sigmod输出为1时),全部信息都可以通过;当门关上时(sigmod输出为0),任何信息都无法通过。 )。最重要的组成部分是状态单元 $s _ i^{(t)}$,与前一节讨论的渗漏单元有类似的线性自环。

有关LSTM细胞状态更新可以参考:

  1. https://www.cnblogs.com/pinard/p/6519110.html
  2. https://www.jianshu.com/p/9dc9f41f0b29
  3. https://blog.csdn.net/zhaojc1995/article/details/80572098

本文标题:深度学习之循环神经网络

文章作者:微石

发布时间:2018年08月03日 - 17:08

最后更新:2018年08月20日 - 14:08

原始链接:akihoo.github.io/posts/f1626718.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。