x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn在nlp任务中,可以分别代表一个token的向量,在rnn上接一个linear、softmax等其他结构,可用于情感分析、文本分类等。
下图是把输入当作每个时刻的输入: 这种结构可应用于应用于 Image Caption ,输入是图像的特征矩阵,输出是一段对图像的描述。
这种结构可应用于机器翻译等。
在机器翻译中,源语言和目标语言的句子序列都是不等长的,而原始的 n VS n 结构都是要求序列等长的。为此,有了 n VS m 结构,这种结构又被称为 Encoder-Decoder模型 。
seq2seq可以说是encoder-decoder框架的一种应用。Seq2seq简单来讲是用一个中间变量c连接左右两个RNN(也可以是RNN的变形,如LSTM、GRU,这里统称为RNN)。左边的RNN即encoder,右边的RNN为decoder。下面分别对encoder和decoder进行讲解。
seq2seq的encoder部分比较简单,就是普通RNN(或者其变形,如GRU、LSTM)的应用。这里的RNN一般指的是n VS n结构。对于输入语句 X = ( x 1 , x 2 , . . . x n ) X=(x_1, x_2,...x_n) X=(x1,x2,...xn)进行编码,可以得到中间语义向量 C ,C可以通过多种方式获得。以下图为例,C可以等于 h 5 h_5 h5,即最后一层的隐藏状态;C也可以等于 q ( h 5 ) q(h_5) q(h5),这里q是一个函数,如rnn,即最后一层的输出;C也可以等于 q ( h 1 , h 2 , h 3 , h 4 , h 5 ) q(h_1,h_2,h_3,h_4,h_5) q(h1,h2,h3,h4,h5),如所有输出求和之后再平均。 以上,无论是训练过程还是测试过程,输入都是 X = ( x 1 , x 2 , . . . x n ) X=(x_1, x_2,...x_n) X=(x1,x2,...xn),如"I am three years old"(以词向量的形式)
上述介绍了seq2seq的encoder部分及中间变量C。拿到C后,就需要进行decoder部分。decoder的方式主要有四大类,实际实现中又可以衍生。本篇先介绍传统的四大类,然后对衍生模型进行讲解。(此处的四大类及衍生类是参考许多知识后的愚见,如有不对,还请多多指教)。
方式一比较简单粗暴,即将中间变量C作为RNN of decoder每一时刻的输入。见下图。如果打个比方,encoder中的输入可以理解为语文课本,中间变量C为我们经过大脑处理后整理的笔记,decoder中的输入视情况可分为多种方式,RNN of decoder为大脑思考的过程(如考试中,即我们得到问题答案的思考过程),decoder的输出即我们思考过后得到的答案。方式一就好比一个普通的作弊学生,因为他每做一个题都要看一看自己的笔记C(decoder中每个时刻都要给一个输出即答案)。
方式二就好比一个大学霸,他们记忆力很好,能记住自己以前写了什么。结构如下图所示
方式三就好比一个学弱,他们每个时刻不仅要看下自己的笔记,还要看下自己上一时刻写了什么,如下图所示:
这种方式就好比是最差的学渣,他们翻看的笔记每次是不一样的,是根据问题特制的笔记,即在encoder阶段每个时刻会输出不一样的中间变量C,这种方式即后续后讲到的attention机制。attention机制知识很多,另写博客进行阐述。
这种方式可认为是一种大大的作弊行为。实际应用中,在训练模型时,我们其实是知道标签(正确答案)的,因此,decoder每个时刻的输入即答案,C作为初始状态h0。如下图所示: 图中大写的Yi即真实的标签,如“我 三 岁 了”。相关paper中的原始图如下(encoder-decoder) 但是,用这种方式会有一个问题,在训练中,看似没问题,但是测试的时候呢?测试集是没有标签的,那么decoder的输入是什么呢?见下文
上文方式五提到,测试集如何处理,个人认为可有以下方式
test时,decoder每个时刻的输入借用2.2.1的思想,将中间变量C作为每个时刻的输入
test时,decoder每个时刻的输入借用2.2.2的思想,将上一时刻的输出作为下一时刻的输入,对于时刻1的输入即C。
test时,decoder每个时刻的输入借用2.2.3的思想,将上一时刻的输出以及C作为下一时刻的输入
使用预处理中的P/UNK对应的词向量(nlp中常用P或者UNK表示未知词或者填充词)
train时,采用2.2.1,test时,也采用2.2.1
train时,采用2.2.2,test时,也采用2.2.2
train时,采用2.2.3,test时,也采用2.2.3
train时,采用2.2.5,test时,采用2.3.1
train时,采用2.2.5,test时,采用2.3.2
train时,采用2.2.5,test时,采用2.3.3,个人认为这种方式不常用
train时,采用2.2.5,test时,采用2.3.4
对于decoder,训练(train)和测试(test)有时的输入是不一样的,具体可见下表 参考链接:http://www.360doc.com/content/16/1102/21/13208159_603481044.shtml https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/