seq2seq +attention
1.seq2seq
1.1背景
seq2seq全称是sequence to sequence,被提出于2014年,最早由两篇文章独立地阐述了它主要思想,分别是GoogleBrain团队的《SequencetoSequenceLearningwithNeuralNetworks》和YoshuaBengio团队的《LearningPhraseRepresentationusing RNNEncoder-DecoderforStatisticalMachineTranslation》。这两篇文章不谋而合地提出了相似的解决思路,Seq2Seq由此产生。
seq2seq是利用encoder-decoder的架构,在encoder阶段一个字/词(实际是字/词的向量)的输入,输入句子结束,产生中间语义向量C,然后利用C来一步步的decoder,得出最终输出。decoder阶段的每一步或者只是第一部应用中间语义向量C(对应着不同的模式)
encoder和decoder阶段一般都用Rnncell( lstm/gru等),
EncoderCell最后一个时刻的状态就是上面说的中间语义向量c,它将作为DecoderCell的初始状态。然后在DecoderCell中,每个时刻的输出将会作为下一个时刻的输入。以此类推,直到DecoderCell某个时刻预测输出特殊符号<END>结束。
其中有个tricks: lstm要求输入和输出是定长的,所以可以用bucket机制,对输入和输出进行处理,比如输入 输出分别是(5,8)(10,12),(15,18),(20,23)的不同长度的pair。先将输入进行排序,分成不同batch,对应着不同长度的输入输出对,就会变成定长。如果实际输入或输出小于设定的长度,就padding 0,如果长度超过设定值,则进行截断。(排序后分成不同batch的好处是,每个批次长度接近,选择更接近的设置长度,可以padding更少的0,减少噪音)
1.2应用场景
机器翻译/自动对话机器人/文档摘要自动生成/看图说话/歌词生成/自动代码补全/故事风格改写等等
1.3结构及原理
(1) 基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编码成一个固定大小的状态向量c,继而将c传给Decoder,Decoder再通过对状态向量c的学习来进行输出。
(2) 举例:利用Encoder-Decoder自动生成对联,且已知上联,机器自动生成下联。
假设我们已经拿到了上联,例如:“风云三尺剑”,如何让机器自动生成下联?
这个问题可由Encoder-Decoder框架来进行下联自动生成。这种场景是典型的Encoder-Decoder框架应用问题。我们所需要做的就是配置好Encoder-Decoder框架的具体模型,比如Encoder和Decoder都采用RNN模型来做,下图用Encoder-Decoder框架做对联下联自动生成的架构图(图1)
需要找到大量的对联数据对这个模型进行训练,那么即可利用这个模型,输入上联,机器自动产生下联了。
(图1待补)
(3) 公式
(公式待补)
1.4 四种模式(以考试作弊比喻)
编码端得出的语义向量C 可以理解成书本笔记,解码端的隐藏层可理解成人的大脑,接那端的输出可理解成 写在试卷上的答案。
(1)普通作弊模式
根据编码端的输入向量得出中间语义向量C,在解码输出时,每一步都看一下C,相当于自己给自己开卷考试了(抄书本笔记)
(2) 学霸模式
开始进考场前看一下C(书本笔记),之后解码的每一步都只看自己写在试卷上的答案
(3) 学弱模式
解码端 每一步都需要翻书本笔记(C),并且还得看看自己前一步写了什么答案
(4)学渣模式
比学弱还差,每一步翻书本笔记 翻之前的答案,还得要求 书本笔记是可老师划过重点的,哪些知识是答这道题目,哪些知识是答下道题目,有个attention。
2. seq2seq with attention
3. attention is all you need(transformer)