http://x-algo.cn/index.php/2017/01/13/1609/
LSTM(Long Short Term Memory)
由于传统的RNN在进行几次链式法则求导后梯度会指数级缩小(如图),导致传播几层后出现梯度消失,无法处理“长期依赖”问题。国外学者刻意设计了一种RNN的变体来克服这个问题,即LSTM。
基本的LSTM结构如图:
(1) 输入门 itit :控制当前输入和前一步输出进入新的cell的信息量;
(2) 忘记门 ftft :决定哪些信息需要舍弃;
(3) cell状态更新 ctct :计算下一个时间戳的状态使用经过们处理的前一状态和输入;
(4) 输出门 otot :计算cell的输出;
(5) 最终LSTM的输出 ytyt :使用一个对当前状态的softmax变换进行重变换。
根据上图,设输入序列 x=(x1,...,xT)x=(x1,...,xT) ,输出序列 y=(y1,...,yT)y=(y1,...,yT) ,我们可以得到以上每步的计算公式:
it=σ(Wixxt+Wimmt−1+Wicct−1+bi)it=σ(Wixxt+Wimmt−1+Wicct−1+bi) (1)
ft=σ(Wfxxt+Wfmmt−1+Wfcct−1+bf)ft=σ(Wfxxt+Wfmmt−1+Wfcct−1+bf) (2)
ct=ft⊙ct−1+it⊙g(Wcxxt+Wcmmt−1+bc)ct=ft⊙ct−1+it⊙g(Wcxxt+Wcmmt−1+bc) (3)
ot=σ(Woxxt+Wommt−1+Wocct+bo)ot=σ(Woxxt+Wommt−1+Wocct+bo) (4)
mt=ot⊙h(ct)mt=ot⊙h(ct) (5)
yt=ϕ(Wymmt+by)yt=ϕ(Wymmt+by) (6)
其中 WW 代表各个权重矩阵,如 WixWix 是输入门到输出的权重矩阵, bb 代表偏置向量,如 bibi 是输入门的偏置向量, σσ 是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)
rt=Wrmmtrt=Wrmmt (7)
yt=ϕ(Wyrrt+by)yt=ϕ(Wyrrt+by) (8)
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)进行语义向量生成:
ht=f(xt,ht−1)ht=f(xt,ht−1)
c=ϕ(h1,...,hT)c=ϕ(h1,...,hT)
其中f是非线性激活函数, ht−1ht−1 是上一隐节点输出, xtxt 是当前时刻的输入。向量c通常为RNN中的最后一个隐节点(h, Hidden state),或者是多个隐节点的加权和。
(2) Decoder
该模型的decoder过程是使用另一个RNN通过当前隐状态 htht 来预测当前的输出符号 ytyt ,这里的 htht 和 ytyt 都与其前一个隐状态和输出有关:
ht=f(ht−1,yt−1,c)ht=f(ht−1,yt−1,c)
P(yt|yt−1,...,y1,c)=g(ht,yt−1,c)P(yt|yt−1,...,y1,c)=g(ht,yt−1,c)
Attention Mechanism
Encoder-Decoder模型对于目标句子Y中每个单词的生成过程如下:
y1=f(c)y1=f(c)
y2=f(c,y1)y2=f(c,y1)
y3=f(c,y1,y2)y3=f(c,y1,y2)
其中f是decoder的非线性变换函数,由此可知,不论生成哪个单词,使用的语义向量都是c,而语义向量c是由句子X的每个单词经过Encoder编码而成的,也就意味着句子X中的单词对生成任意目标单词的影响力是相同的。Attention Model会对输入序列X的不同单词分配不同的概率,如下图所示:
此时目标单词生成过程如下:
y1=f(c1)y1=f(c1)
y2=f(c2,y1)y2=f(c2,y1)
y3=f(c3,y1,y2)y3=f(c3,y1,y2)
其中c(i)对应输入序列X不同单词的概率分布,其计算公式为:
ci=∑ni=1αijhjci=∑i=1nαijhj
其中n为输入序列的长度, hjhj 是第j时刻的隐状态,而权重 αijαij 用如下公式计算:
αij=exp(eij)∑nk=1exp(eik)αij=exp(eij)∑k=1nexp(eik)
这里:
eij=a(si−1,hj)eij=a(si−1,hj)
a是一种对齐模型, si−1si−1 是decoder过程的前一个隐状态的输出, hjhj 是encoder过程的当前第j个隐状态。
参考文献:
Sequence to Sequence Learning with Neural Networks
A Neural Conversational Model
Neural Machine Translation by Jointly Learning to Align and Translate
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
http://suriyadeepan.github.io/2016-06-28-easy-seq2seq/
http://blog.csdn.net/malefactor/article/details/50550211
http://blog.csdn.net/malefactor/article/details/50583474