-欢迎加入AI技术专家社群>>
由于传统的RNN在进行几次链式法则求导后梯度会指数级缩小(如图),导致传播几层后出现梯度消失,无法处理“长期依赖”问题。国外学者刻意设计了一种RNN的变体来克服这个问题,即LSTM。
基本的LSTM结构如图:
(1) 输入门 :控制当前输入和前一步输出进入新的cell的信息量;
(2) 忘记门 :决定哪些信息需要舍弃;
(3) cell状态更新 :计算下一个时间戳的状态使用经过们处理的前一状态和输入;
(4) 输出门 :计算cell的输出;
(5) 最终LSTM的输出 :使用一个对当前状态的softmax变换进行重变换。
根据上图,设输入序列 x=(x1,...,xT) ,输出序列 y=(y1,...,yT) ,我们可以得到以上每步的计算公式:
其中 代表各个权重矩阵,如 是输入门到输出的权重矩阵,
代表偏置向量,如 是输入门的偏置向量,是sigmoid函数,i,f,o,c分别代表输入门,忘记门,输出门以及cell状态更新向量,m是与i,f,o,c具有相同大小的输出向量,☉代表点乘,g和h分别为cell的输入输出激活函数,一般为tanh,Φ代表最终的LSTM输出激活函数,一般为softmax。
以上是标准LSTM结构的表达式,图3的结构中还有一层“recurrent projection layer”,则公式(6)可由公式(7)和公式(8)替代:(参考:Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling)
Encoder-Decoder
对于一些NLP任务,比如聊天机器人、机器翻译、自动文摘等,传统的方法都是从候选集中选出答案,这对候选集的完善程度要求很高。随着近年来深度学习的发展,国内外学者将深度学习技术应用于NLG(Nature Language Generation,自然语言生成)和NLU(Nature Language Understanding, 自然语言理解),并取得了一些成果。Encoer-Decoder是近两年来在NLG和NLU方面应用较多的方法。然而,由于语言本身的复杂性,目前还没有一种模型能真正解决NLG和NLU问题。
Encoder-Decoder的基本结构如图所示:
上图是一个已经在时间维度上展开(unroll)的Encoder-Decoder模型,其输入序列是”ABC”,输出序列是”WXYZ”,其中”<EOS>”是句子结束符。该模型由两个RNN组成:第1个RNN接受输入序列”ABC”并在读取到<EOS>时终止接受输入,并输出一个向量作为”ABC”这个输入项链的语义表示向量,此过程称为”Encoder”;第二个RNN接受第一个RNN产生的输入序列的语义向量,并且每个时刻t输出词的概率都与前t-1时刻的输出有关。
其中v是encoder过程产生的语义向量。
(1) Encoder
Encoder过程很简单,直接使用RNN(一般用LSTM)进行语义向量生成:
其中f是非线性激活函数,
是上一隐节点输出, 是当前时刻的输入。向量c通常为RNN中的最后一个隐节点(h, Hidden state),或者是多个隐节点的加权和。
(2) Decoder
该模型的decoder过程是使用另一个RNN通过当前隐状态 来预测当前的输出符号 ,这里的 和 都与其前一个隐状态和输出有关:
Attention Mechanism
Encoder-Decoder模型对于目标句子Y中每个单词的生成过程如下:
其中f是decoder的非线性变换函数,由此可知,不论生成哪个单词,使用的语义向量都是c,而语义向量c是由句子X的每个单词经过Encoder编码而成的,也就意味着句子X中的单词对生成任意目标单词的影响力是相同的。Attention Model会对输入序列X的不同单词分配不同的概率,如下图所示:
此时目标单词生成过程如下:
其中c(i)对应输入序列X不同单词的概率分布,其计算公式为:
其中n为输入序列的长度, 是第j时刻的隐状态,而权重 用如下公式计算:
a是一种对齐模型, 是decoder过程的前一个隐状态的输出, 是encoder过程的当前第j个隐状态。
原文:http://x-algo.cn/index.php/2017/01/13/1609/
↓ 点击阅读原文,进入学院