RNN存在的问题及其改进方法,并介绍更多复杂的RNN变体

电子说

1.3w人已加入

描述

主要内容

上节学习了语言模型和循环神经网络(RNN)。这一节主要讨论RNN存在的问题及其改进方法,并介绍更多复杂的RNN变体。

梯度问题梯度消失梯度爆炸梯度剪裁LSTMGRURNN变体双向RNN多层RNN梯度补充梯度向量化梯度推广:雅可比矩阵链式法则重要等式下节预告阅读更多

梯度问题

梯度消失

梯度

梯度消失

根据链式法则:

梯度

梯度可以分解成若干中间梯度的乘积。现在的问题是,如果梯度梯度梯度这三项数值量级都很小,那么反向传播越远,则梯度信号越弱!这就是梯度消失问题!

形式化表述:

由于:

梯度

所以:

梯度

考虑第i步损失梯度,对之前的某步j的隐层状态梯度求梯度。表示如下:

梯度

考虑矩阵的L2范数:

梯度

这里的关键是矩阵梯度。Pascanu等人证明,如果梯度的最大特征值小于1,经过多次自乘后,梯度会表现出指数级缩小。由于使用sigmoid非线性激活函数,上界恰好是1,所以会出现梯度消失。

如果梯度随距离明显减弱,则无法判断t步和t+n步数据之间的依赖关系。

举例:

When she tried to print her tickets, she found that the printer was out of toner. She went to the stationery store to buy more toner. It was very overpriced. After installing the toner into the printer, she finally printed her__

RNN语言模型需要学习第7步"tickets"和末尾"tickets"之间的依赖关系。但如果梯度过小,则模型无法学习这种依赖关系,进而在测试时也无法预测长距离的依赖关系。

再来看一个例子:

The writer of the books __

现在有两个选项:(is) (are)。正确的应该是is。语义上,"is"和"writer"的距离更近;但顺序上,"are"和"books"的距离更近。由于梯度消失的问题,RNN语言模型更善于学习顺序距离近的关系,这可能导致学习错误,从而导致预测错误。

梯度爆炸

同梯度消失相对的是梯度爆炸,这是由于矩阵最大特征值>1。如果梯度过大,则会导致SGD更新过大:梯度这不利于参数调整(损失较大)。

在极端情况下,如果步长过大,还会导致训练中出现Inf或NaN。

梯度剪裁

梯度爆炸的解决办法是,如果梯度范数超过某个阈值,则进行缩小,然后再SGD更新。相当于,方向不变,调小步子。

梯度

梯度剪裁示意

LSTM

RNN的主要问题是无法学会保存很多时间步前的信息。

1997年Hochreiter和Schmidhuber提出Long Short-Term Memory(LSTM),这也是一种RNN,用以解决梯度消失的问题。

与RNN只有一种状态相比,LSTM在第t步,共有两种状态:hidden state 梯度和 cell state  梯度

两者都是n维向量

cell用于存储长距离信息,亦称为记忆单元

LSTM可以擦除、写入和读取 cell信息

信息的擦/写/读由相应的门进行控制

gate也是n维向量

每一步t,gate各个元素可以是open(1), closed(0),或二者之间。如果门打开,则表示信息通过;如果门关闭,则表示信息不能通过

gate是动态的,其值根据当前语境计算

现根据t步输入梯度,计算hidden state 梯度和 cell state  梯度

遗忘门:决定保留或忘记之前cell state的哪些内容

梯度

输入门:决定当前cell的哪些内容写入cell

梯度

输出门:决定当前cell的哪些内容输出到hidden state

梯度

新cell内容:要写入cell的新内容

梯度

cell state:擦掉(忘记)上个cell state的部分内容,写入(输入)新cell内容

梯度

hidden state:读取(输出)cell的某些内容

梯度

具体如下图所示:

梯度

LSTM cell

LSTM结构让RNN更容易保存很多步以前的信息

LSTM并不保证不出现梯度消失/梯度爆炸

LSTM实际上是非常成功的

2013-2015年,LSTM取得了一流的效果

手写识别、语音识别、机器翻译、句法分析、看图说话

LSTM由于效果好,成为主流方法

2019年,在某些领域,其他方法(如Transformer)成为了主流方法

WMT 2016,总结报告出现RNN 44次

WMT 2018,总结报告出现 RNN 9次,Transformer 63次。

GRU

2014年Cho 等人提出GRU(Gated Recurrent Units),在保留LSTM优点的同时,去除其不必要的繁杂。在每一步t,只有输入梯度和hidden state 梯度,没有cell state:

update gate:决定更新hidden state的哪些部分内容,相当于LSTM中的遗忘门和输入门。

梯度

reset gate:决定前一hidden state哪些部分用于计算新hidden state的内容

梯度

新hidden state内容:reset gate选择前一hidden state的有用信息,并输入新的hidden state

梯度

hidden state:综合了前一hidden state和当前hidden state的内容,并在两者之间寻找平衡点

梯度

和LSTM一样,GRU也更容易保存长期信息。

除此之外,研究人员提出了很多门控RNN,但LSTM和GRU使用最为广泛。

LSTM和GRU的最大区别是,后者计算速度更快,参数更少。但并没有严格证据表明孰优孰劣。所以在实践中,可以先使用LSTM,然后再试试GRU。

RNN变体

梯度爆炸/消失不仅仅是RNN存在的问题。由于链式法则和非线性激活函数,所有神经网络(包括前向和卷积神经网络),尤其是深度神经网络,都会出现梯度消失/爆炸问题。这导致低层网络训练非常缓慢。那么解决办法就是在神经网络之间添加直接连接,使梯度传播更顺畅。

例如:

残差连接,亦称ResNet。它直接将输入信息原封不动地加在其他隐层上。

梯度

残差网络构件

稠密连接,亦称DenseNet,把所有层都连接起来。效果更好。

梯度

稠密连接:每一层以之前所有层feature-maps为输入

高速连接,亦称HighwayNet,类似于残差连接,但identity连接和transformation层由动态门控制

结论:虽然梯度消失/爆炸是个普遍存在的问题,但由于相同矩阵连续相乘导致RNN尤其不稳定。

双向RNN

在情绪分类任务中,假如输入是某个影评,我们希望了解是好评还是差评。一般可以使用简单RNN进行情绪分类。RNN可以编码句子。RNN的隐层状态就是句子表示。

下图蓝色方框的隐藏状态可以看作词"terribly"的语境表示。

梯度

情绪分析任务

但是这些语境表示仅仅考虑了词的左侧语境。很明显,"terribly"右侧的"exciting"修改了"terribly"的词义,将整个句子的负面情绪扭转为正面情绪。右侧语境同样重要!这导致了双向RNN的出现。

双向RNN由两个RNN组成:正向RNN和反向RNN。反向RNN和正向RNN一样,只不过它从右到左开始编码。在隐层状态,则将两个RNN输出进行拼接。

梯度

双向RNN

在第t步:

正向RNN:梯度

反向RNN:梯度

隐层状态拼接:梯度

通常正向RNN和反向RNN权重不同。

下面是双向RNN简化图。

梯度

双向RNN简化图

注意:只有当输入序列完整时,才适用双向RNN。例如语言模型就不能使用双向RNN,因为在语言模型中,只能使用左侧语境。

最近很火的BERT(BidirectionalEncoder Representations from Transformers)就使用了双向信息。后面还会谈到BERT。

多层RNN

虽然RNN展开后在一个维度已经很深了,我们还可以在另外一个维度增加深度,这就是多层RNN。

多层RNN可以实现更加复杂的表示。低层RNN计算低层特征;高层RNN计算高层特征。

梯度

多层RNN

在实践中,高性能RNN通常都是多层RNN(但一般达不到前向网络或卷积网络的深度)。

例如,在2017年的论文中,Britz 等人发现,在神经机器翻译中,encoder RNN 最好使用2-4层,decoder RNN 最好使用4层。要训练更深的RNN,则需要跨层连接或稠密连接。

基于Transformer的神经网络(如BERT)则高达24层。

总结:

LSTM效果很好,GRU速度很快

梯度剪裁可以避免NaN

如果有完整信息,尽量使用双向RNN

如果有计算资源,尽量使用多层RNN,层数过多时,则需要跨层/稠密连接。

梯度补充

以下作为CS224N-2019-3的补充。梯度计算是神经网络训练的核心。逐个推导神经网络各个参数的梯度冗长复杂,因此有必要使用矩阵/向量形式进行计算。

梯度向量化

给定1个输出和n个输入的函数:梯度其梯度就是每个输入的偏导的向量:

梯度

梯度推广:雅可比矩阵

给定m个输出和n个输入的函数:梯度其偏导数就是mxn矩阵,即雅可比梯度矩阵。:

梯度

其中单个元素就是普通的标量梯度:梯度雅可比矩阵非常有用。

链式法则

一元函数:导数相乘梯度

多元函数:雅可比矩阵相乘

梯度

重要等式

矩阵乘以列向量,对列向量求梯度(梯度梯度?)

梯度

行向量乘以矩阵,对行向量求梯度(梯度梯度?)

梯度

对向量本身求梯度

(梯度梯度?)梯度使用链式法则时,该项会消掉,因为矩阵或向量乘以单位矩阵,还是原矩阵或向量。

对向量各个元素施加同一函数后,对向量求梯度

(梯度梯度?)梯度

矩阵乘以列向量,对矩阵求梯度(梯度梯度梯度?)

梯度

行向量乘以矩阵,对矩阵求梯度(梯度梯度梯度?)

梯度

交叉熵损失,对logits求梯度

(梯度梯度梯度?)梯度

这些等式可用于快速计算很多神经网络的梯度。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分