目录
前言
自然语言处理中我们大多数针对的都是时间序列数据,即在不同时间点上收集到的数据。这类数据反映了某一事物、现象等随时间的变化状态或程度,有一个特点前后数据之间具有某种关系。因此,根据“人的认知是基于过往的经验和记忆”这一观点,提出了RNN(循环神经网络),用于处理这一类序列数据的神经网络。
一、RNN模型的必要性
1.RNN概述
深度学习是处理数据的一门技术,针对不同的数据类型需要采取不同的方法,比如对于时间序列数据,我们需要捕获动态的变化,需要使用能够做到这一点的模型。当然,对于时间序列数据也可以采用像SVM等静态的模型,比如先做特征抽取,同时确保有些特征是关于数据动态变化的特征,但即便这样,并不是最理想的方法。
于是提出了RNN——循环神经网络,用于处理序列数据。之所以称其为循环神经网络,是因为其具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中。比如,当前单词是“很”,前一个单词是“大海”,那么下一个单词很大概率是“蓝”。循环神经网络的来源就是为了刻画一个序列当前的输出与之前信息的关系。从网络结果上来说,RNN会记忆之前的信息,并利用之前的信息影响后面的输出。
其之所以称为循环神经网络,是因为其具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,如下所示:
2.RNN的应用
RNN 有多种结构,如上图所示,因此也具有多种应用,比如情感分类、评判文章流畅度,除了这些应用之外,RNN有很多很多有趣的应用,如生成剧本、生成代码等等。基本上对于文本类的应用,RNN均可以作为最经典的基石(backbone)。同时,RNN也可以配合其他的模型来解决一些更复杂的模型如image captioning。
RNN的应用领域有很多, 可以说只要考虑时间先后顺序的问题都可以使用RNN来解决.这里主要说一下几个常见的应用领域:
- 自然语言处理: 主要有视频处理, 文本生成, 语言模型, 图像处理
- 机器翻译, 机器写小说
- 语音识别
- 图像描述生成
- 文本相似度计算
- 音乐推荐、抖音视频推荐推荐等新的应用领域.
二、RNN详解
RNN是一种特殊的神经网络结构, 它是根据“人的认知是基于过往的经验和记忆”这一观点提出的。它与其他网络不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种'记忆'功能。那么它是怎么实现所谓的"记忆"的呢?
1.RNN模型结构
RNN 是包含循环的网络,允许信息的持久化。具体的网络结构为会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,如下所示:
它主要有输入层,隐藏层,输出层组成,并且在隐藏层有一个箭头表示数据的循环更新, 这个就是实现时间记忆功能的方法。
将这个循环展开,可以很清晰地看到信息在隐藏层之间的传递:
如上图所示为隐藏层的层级展开图。,
,
表示时间序列,
表示输入的样本,
表示样本在时间
处的的记忆:
表示输入的权重,
表示此刻输入的样本的权重,
表示输出的样本权重。
所以RNN具有两个特性:
- 权重共享
- 隐藏状态可以理解为: S=f(现有的输入+过去记忆总结)
2.RNN的梯度问题
RNN算法处理时间序列的问题的效果很好,其关键点之一就是可以用来连接先前的信息到当前的任务上,例如使用过去的视频帧来推测对当前视频的理解。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “今天的天空很___” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是“蓝”。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。假设我们试着去预测“我在中国出生长大,我会讲____”最后的词语。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的“中国”的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。
然而随着在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。简单来说,理解文本时需要知道单词和单词之间的依赖关系,但由于梯度问题,RNN模型很难捕获两个离得比较远的单词的关系。
在理论上,RNN 绝对可以处理这样的长期依赖问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。其中较为严重的是容易出现梯度消失或者梯度爆炸的问题(BP算法和长时间依赖造成的)。注意: 这里的梯度消失和BP的不一样,这里主要指由于时间过长而造成记忆值较小的现象。
对于梯度爆炸来说,可以使用gradient clipping技术来解决。相比梯度爆炸,梯度消失问题其实更具有挑战。那么,梯度消失问题应该如何解决呢?因此, 就出现了一系列的改进的算法, 这里介绍主要的两种算法:LSTM 和 GRU。
三、RNN系列改进算法
1.LSTM
LSTM算法全称为Long short-term memory,是一种特殊的 RNN 类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并被Alex Graves进行了改良和推广。在很多任务中,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
所有 RNN 都具有一种重复神经网络模块的链式形式,在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。而LSTM 同样是这样的结构,但是重复的模块拥有不同的结构。不同于单一神经网络层,以一种非常特殊的方式进行交互。LSTM是一种拥有三个“门”结构的特殊网络结构,包括遗忘门、信息增强门以及输出门,如下图所示:
LSTM 靠“门”的结构让信息有选择性地影响RNN中每个时刻的状态。
所谓“门”结构就是使用sigmod神经网络和按位做乘法的操作,这两个操作合在一起就是一个“门”结构。之所以该结构叫做门是因为使用sigmod作为激活函数的全连接神经网络层会输出一个0到1之间的值,描述当前输入有多少信息量可以通过这个结构,于是这个结构的功能就类似于一扇门,当门打开时(sigmod输出为1时),全部信息都可以通过;当门关上时(sigmod输出为0),任何信息都无法通过。
LSTM循环体的结构组成,具体公式如下所示:
输入门:
遗忘门:
信息增强门:
- 候选记忆单元:
- 当前时刻记忆单元:
输出门:
输出:
2.GRU
GRU可以看成是LSTM的变种,GRU把LSTM中的遗忘门和输入门用更新门来替代。 把cell state和隐状态进行合并,在计算当前时刻新信息的方法和LSTM有所不同。 GRU更新
的过程如下图诉所示:
重置门:
更新门:
候选记忆单元:
当前时刻记忆单元:
GRU相比LSTM,由于减少门的个数,所以耗费的计算资源更少,提高计算效率。
3.双向RNN
在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向RNN(BiRNN)来解决这类问题。例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。
双向RNN是由两个RNN上下叠加在一起组成的。输出由这两个RNN的状态共同决定。
从上图可以看出,双向RNN的主题结构就是两个单向RNN的结合。在每一个时刻t,输入会同时提供给这两个方向相反的RNN,而输出则是由这两个单向RNN共同决定(可以拼接或者求和等)。
同样地,将双向RNN中的RNN替换成LSTM或者GRU结构,则组成了BiLSTM和BiGRU。
总结
本章主要介绍了RNN,以及其变种LSTM和GRU。
一般地,RNN包含如下三个特性:
- 循环神经网络能够在每个时间节点产生一个输出,且隐单元间的连接是循环的;
- 循环神经网络能够在每个时间节点产生一个输出,且该时间节点上的输出仅与下一时间节点的隐单元有循环连接;
- 循环神经网络包含带有循环连接的隐单元,且能够处理序列数据并输出单一的预测。
LSTM简单来说:
- LSTM是用来解决RNN的梯度问题,起到了有效缓解作用
- LSTM比RNN多出了几个门,用来控制信息的流动
- LSTM的效率要比RNN低,毕竟计算上多出了更多步骤
- LSTM能比RNN捕获更长的依赖关系
实际上,任何的深度学习模型均存在梯度问题,这也是需要从优化的角度解决的一个比较棘手的问题。
LSTM 和 GRU对于梯度消失或者梯度爆炸的问题处理方法主要是:
对于梯度消失: 由于它们都有特殊的方式存储”记忆”,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除,因此可以一定程度上克服梯度消失问题。
对于梯度爆炸:用来克服梯度爆炸的问题就是gradient clipping,也就是当计算的梯度超过阈值或者小于阈值
的时候,便把此时的梯度设置成
或
。
本文是从零开始学NLP系列文章第十一篇,希望小伙伴们多多支持,互相交流。
参考:
贪心学院nlp