循环神经网络(二)
——GRU、LSTM、BRNN、deep RNN
(原创内容,转载请注明来源,谢谢)
一、概述
本文主要讲述RNN的其他结构,这些结构比RNN更常用,而且对于自然语言处理,有更高效、更好的处理方式。
二、语言模型和序列生成
1、语言模型
语言模型,大体上来说,即一句话的若干个单词,建立单词之间的关联性,进而确定每个位置的正确单词。对于同音词等,具有更大的难度,如下图所示:
利用计算概率的方式,确定一句话正确的词语表示。
2、RNN语言模型的工作
训练集:需要大量的语料库作为训练集。这里的语料库,不只是词汇表,而且需要大量的正确的句子和文章,作为训练集。
为了便于训练,用标记一句话的结尾,用表示一个单词不在词汇表中。y~表示单词出现在句子第一个单词的位置的概率,y~表示在第一个单词确定是某个词的情况下第二个单词的概率,即条件概率。
例如y~=p(cats),表示第一个单词是cat的概率;y~=p(average|cats)表示第一个单词是cats的情况下,第二个单词是average的概率。
句子中出现的没有在词汇表中的单词,都标记为,如下面的Mau。
3、RNN模型
RNN模型如下图所示。其中每一层的y都是经过softmax的输出,这个输出基于前面一层的输出和本层的输入进行判断。
损失函数L即和logistic回归的计算方式一致。
4、新序列采样
当需要了解网络当前的学习情况,可以用序列采样的方式,把前一个序列的输出y,引入到下一个序列作为输入,结合激活函数进行输出。
5、基于字符的采样
除了基于单词的,也有基于字符的词汇表。
基于字符的词汇表,则把大小写字母、空格、标点符号、数字等引入,这样的好处是不会出现的情况。但是最大的缺点是序列过长,容易存在性能问题以及梯度爆炸与梯度消失。
6、训练不同风格的句子
要让网络学习出不同风格的句子,主要在语料库上进行筛选。因为RNN造句都是基于语料库的学习,判断每个单词出现在下一个单词的概率,因此只要语料库的风格是某一类的,训练出来的语句也就是某种类型的了。
三、梯度消失问题
1、梯度消失
对于RNN,由于把样本细分到序列的维度,因此很容易出现梯度消失的情况。例如下面的例子,句子的主语问题,cat对应的动词是was,cats对应的动词是were。
但是由于这个是定语从句,中间有很长的which子句,导致很有可能到出现动词的时候,已经无法直接受到主语的反馈了。
2、梯度爆炸
与梯度消失相对,也有梯度爆炸的情况。但是,梯度爆炸,可以通过检验参数是否超过阈值,对超过阈值的情况进行梯度修剪(clipping),即缩减参数值的方式,实现消除梯度爆炸。
因此主要的问题还在于梯度消失。
3、解决方案
解决方案就是下面要介绍的两种网络,GRU、LSTM。这两种网络旨在让网络带有“记忆性”,以便把前面序列的内容准确的传递给后面的序列。
四、GRU
门控循环单元(Gated Recurrent Unit),简称GRU,是一种让网络带有记忆性的解决方案。
1、普通的RNN单元
对照普通的RNN单元来学习GRU,这里先看普通的RNN单元,是通过上一个序列的激活函数值a,以及本序列的输入值x,经过tanh函数,计算得到本序列的激活函数a,并且经过softmax,得到本序列的输出y~。
2、GRU
GRU引入了门的概念以及记忆单元C。
记忆单元C,即序列的激活函数,它是否需要被记忆,取决于门。整体的计算公式如下图所示。
通过公式可以看出,本序列的激活函数a,是否需要被记忆,取决于本序列的门Γu,见下面c的公式。如果门Γu的值为1,则表示需要记忆本序列的值,会往后面传,且表示不使用从前面传过来的记忆单元。
反之,如果Γu等于,则完全使用前面传过来的记忆单元的值。
这样就保证了参数可以在序列中往后传播。
完整的GRU公式如下图所示,一共有两个门,Γu称为视觉门,Γr称为相关门。
另外,记忆单元c可以是向量,门的维度和记忆单元的维度一样,这样可以在不同维度记忆不同序列的关键内容,保证一句话的多个关键内容可以往后传递。
五、LSTM
长短时记忆网络(Long Short Term Memory),简称LSTM,是另一种网络模型,也可以保证记忆单元可以往后传递。
1、对照GRU和LSTM
LSTM引入了三个门,比GRU多一个门,主要在于计算记忆单元c的时候,不是使用Γu和1-Γu,而是使用Γu(更新门)和Γf(遗忘门),另外引入了Γo(输出门)的概念。
区别即不是用本序列的激活函数a作为记忆函数c,而是将激活函数a乘以输出门Γo作为激活函数c。
2、LSTM结构图
结构图如下所示。
需要说明的是,计算三个门的时候,除了考虑上一序列的激活函数a、本序列的输入x,通常还需要考虑上一序列的记忆单元c(称为窥视孔连接,peephole connection,保证门第i个元素只影响后面门的第i个元素,而不影响其他元素)。
3、优缺点
GRU只有两个门,因此结构简单,计算速度快,可以进行大规模的运算。
LSTM有三个门,因此可以更为灵活的设计整个结构,功能更加强大。通常设计网络的时候使用LSTM的更多。
六、BRNN
双向循环神经网络(Bidirectional RNN),主要解决的问题是前面序列的元素无法感知后面序列输出的问题。
前面的RNN网络,序列都受到前面序列的计算结果a以及本序列的输入x,却对后面序列的计算结果a无感知。而实际的句子,前后的关联性非常强,因此需要BRNN来解决这个问题。
BRNN解决的方式很简单,即正向和方向序列一起计算,正向序列从前往后计算,反向序列从后往前计算,对于每个序列分别得到一个激活函数,最终计算输出值y的时候综合了两个激活函数的结果,公式如下图所示:
BRNN有一大缺点,即计算的时候需要整个序列都出现才可以进行处理,而无法边接收序列边处理。即必须等一句话说完才可以开始处理,无法在说话过程中进行处理。
七、深层RNN
前面的RNN都是单层计算就得到结果,实际上,也可以经过多层次的运算,如下图所示:
但是实际上,三层左右对于RNN已经很多,因为其将输入拆成了序列单独处理,已经处理的非常详细了。
有些结构中,会将某些序列单独进行多层的处理,而不再和其他序列连接,如上图的y和y的第三层之后的层。
深层RNN中的RNN,可以是普通RNN、GRU、LSTM等,也可以结合BRNN。
——written by linhxx 2018.03.19
领取专属 10元无门槛券
私享最新 技术干货