一、seq2seq是一中端对端。序列到序列的模型,常用于机器翻译、自动问答等领域,接下来我们来分析下该算法的逻辑原理
二、图解
我们从零到无来理解下:(encoder和decoder这里我们都用lstm)
首先这里我先盘点下算是已知的信息(以翻译场景为例:A语言-B语言):
1、待翻译的句子对应的词向量:A语言句子中各个词的词向量
2、翻译结果句子对应的词向量: B语言句子中各词的词向量
已知的以上两点:
算法流程:
1、对待翻译的句子中的词转化成向量之后,输入LSTM中, 获取到每个时间点的hidden states vecter
2、对翻译结果的句子也转化成词向量,
3、将待翻译句子经过lstm的最后时间点的hidden states vecter作为翻译结果的初始的转态向量和翻译结果的第一个词的词向量输入到LSTM中,
4、将翻译结果的第一个时间点的hidden states和待翻译句子所有时段的hidden states vecter进行点乘,并将结果进行softmax归一, 得到的向量分别代表翻译结果的第一个词和待翻译句子的各个词的相关性大小,
5、使用得到的相关性向量和待翻译句子的hidden states进行相乘并求和,得到Attention之后的hidden states,
开始进入decode部分,(这里需要注意的一点是: 我们在训练词向量的时候会在句首和句尾添加标识符,并且要对着标识符也进行向量化)
6、进入decode部分, 将Attention之后的hidden states和我们训练好的句首向量进行拼接, 之后经过全连接层之后进行softmax多分类, 计算词典中所以词的概率, 加入词典中有10000个词, softmax之后的结果就会有10000个对应每个词的概率值,因为我们目标词是已知的,所以就可以和第一次计算出的概率求损失,并反向迭代优化
相信大家在看过算法流程之后再次看算法框架图相必就很清楚了
3、以上是训练部分, 这里我们要说下一个容易忽略的点, 那就是使用训练好的模型的时候,我们仍然要盘点下已知的信息,然后通过已知的信息怎么得到结果
已知的信息:
(1)、待翻译的句子中所有词的词向量
(2)、翻译结果的句子所有词向量包含句首尾标识符的向量
(3)、训练好的decoder模型的参数
应用的时候的图解
使用的过程中和训练的过程(1-5)都是相同的,不同的地方在第六步操作
应用的第6步、在encode编码完成之后就代表着decode的开始, 此时我们会将句首标识符的向量作为decode的context的第一个词向量输入,和encode的最后时间点的hidden encoder进行拼接,经过全连接之后进行softmax多分类, 此时的decode模型参数是训练好的,直接就可以取出概率最大的词, 此时开始翻译第二个词,我们通过翻译得到的第一个词取出对应的词向量,然后和decode第一个时刻的hidden states作为新的输入,经过同样的操作就可以得到出现在第二位置的最大可能的第二个词,依次进行, 直到最大概率的词是句尾标识符,就算是翻译结束
三、Attention机制
以下的这部分描述就是Attention:
4、将decode的第一个时间点的hidden states和encode所有时段的hidden states vecter进行点乘,并将结果进行softmax归一, 得到的向量分别代表翻译结果的第一个词和待翻译句子的各个词的相关性大小,
5、使用得到的相关性向量和decode部分所有的hidden states进行相乘并求和,得到Attention之后的hidden states,
最简单的计算相关性的方法就是:将decode的第一个时间点的hidden states和encode所有时段的hidden states vecter计算余弦相识度,正式应用的时候不是这种方法
计算想关性的方法我们有三种:
第一种: 将decode的第一个时间点的hidden states和encode所有时段的hidden states vecter,进行点乘,之后softmax得到相似度向量
第二种:encode所有时段的hidden states vecter * 权重矩阵W * 将decode的第一个时间点的hidden states,对求出的值进行softmax得到相似度向量
第三种:将decode的第一个时间点的hidden states和encode所有时段的hidden states vecter隐藏层拼接起来之后乘以权重矩阵,最后通过softmax归一成相似度向量
第一种点乘:
第二种: 参数映射的方式