从LSTM到Seq2Seq

http://x-algo.cn/index.php/2017/01/13/1609/

LSTM(Long Short Term Memory)

由于传统的RNN在进行几次链式法则求导后梯度会指数级缩小(如图),导致传播几层后出现梯度消失,无法处理“长期依赖”问题。国外学者刻意设计了一种RNN的变体来克服这个问题,即LSTM。

3

基本的LSTM结构如图:

4

(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+Wimmt1+Wicct1+bi)it=σ(Wixxt+Wimmt−1+Wicct−1+bi)    (1)

ft=σ(Wfxxt+Wfmmt1+Wfcct1+bf)ft=σ(Wfxxt+Wfmmt−1+Wfcct−1+bf)    (2)

ct=ftct1+itg(Wcxxt+Wcmmt1+bc)ct=ft⊙ct−1+it⊙g(Wcxxt+Wcmmt−1+bc)    (3)

ot=σ(Woxxt+Wommt1+Wocct+bo)ot=σ(Woxxt+Wommt−1+Wocct+bo)    (4)

mt=oth(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的基本结构如图所示:

QQ截图20170109101654

上图是一个已经在时间维度上展开(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,ht1)ht=f(xt,ht−1)

c=ϕ(h1,...,hT)c=ϕ(h1,...,hT)

其中f是非线性激活函数, ht1ht−1 是上一隐节点输出, xtxt 是当前时刻的输入。向量c通常为RNN中的最后一个隐节点(h, Hidden state),或者是多个隐节点的加权和。

(2) Decoder

该模型的decoder过程是使用另一个RNN通过当前隐状态 htht 来预测当前的输出符号 ytyt ,这里的 htht 和 ytyt 都与其前一个隐状态和输出有关:

ht=f(ht1,yt1,c)ht=f(ht−1,yt−1,c)

P(yt|yt1,...,y1,c)=g(ht,yt1,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的不同单词分配不同的概率,如下图所示:

2

此时目标单词生成过程如下:

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(si1,hj)eij=a(si−1,hj)

a是一种对齐模型, si1si−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


猜你喜欢

转载自blog.csdn.net/qfire/article/details/80963567