【Natural Language Processing】seq2seq学习笔记

来源:互联网 发布:linux dump 函数乱码 编辑:程序博客网 时间:2024/05/22 11:44

         seq2seq可以看成是一个翻译模型,即通过一个sequence转换为另一个sequence,也可以看做是对联的生成,即通过上联来产生下联,其主要是使用两个RNN(其实是LSTM,具体可看:LSTM(Long Short-Term Memory)学习),一个进行Encoder,另一个进行Decoder,即Encoder-Decoder,其可用在NLG(Nature Language Generation,自然语言生成)和NLU(Nature Language Understanding, 自然语言理解)等方面

一、Encoder-Decoder

        Encoder-Decoder的结构如下图:


        在上图中,输入序列是”ABC”,输出序列是”WXYZ”,其中”<EOS>”是句子结束符,我们通过在时间维度上进行展开Encoder-Decoder模型,如前面所说该模型是由两个RNN组成的:

        ①Encoder,第一个RNN接受输入序列”ABC”进行Encoder,并在读取到<EOS>时终止接受输入,通过这样我们可以得到一个向量来表示输入序列“ABC”的语,具体为:


        其中f是非线性激活函数,ht−1是上一隐节点输出, xt是当前时刻的输入。向量c即为我们想通过Encoder获得的语义向量,通常为RNN中的最后一个隐节点(h,Hidden state)输出值,或者是多个隐节点的加权和,这就是整个Encoder的过程。

        ②Decoder,第二个RNN接受第一个RNN产生的语义向量,通过当前隐状态 ht来预测当前的输出符号 yt ,这里的 ht和yt都与其前一个时刻的隐状态和输出有关,最终目的就是在每个时刻t输出与上一时刻t-1相关的输出词的概率,具体为:


二、Attention Mechanism

        通过上面知道在Encoder-Decoder模型中,对于目标句子Y中每个单词的生成过程如下(其中c为Encoder生成的语义向量):


        可以发现对于目标词汇y,不论生成哪个单词,都是使用Encoder过程生成的语义向量c,即句子X中的单词对生成每一个目标单词的影响力是相同的,显然这是不合理的,Attention Model会对输入序列X的不同单词分配不同的概率,具体如下图:


        这个时候每一个目标词就可以根据不同的语义向量ci来生成了,即:


       c(i)对应输入序列X不同单词的概率分布,其计算公式为:

  

 

        其中n为输入序列的长度,第一行公式中的 hj 是Encoder第j时刻的隐状态,对于第二行的公式中aij是对应的权重, a是一种对齐模型, si−1 是Decoder过程的前一个隐状态的输出,hj 是Decoder过程的当前第j个隐状态。至此,seq2seq完成。

参考:

Sequence to Sequence Learning with Neural Networks

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



阅读全文
0 0