NLP中的encoder和decoder
这⾥复习下Sequence2Sequence任务到底是什么,所谓的Sequence2Sequence任务主要是泛指⼀些Sequence到Sequence的映射问题,Sequence在这⾥可以理解为⼀个字符串序列,当我们在给定⼀个字符串序列后,希望得到与之对应的另⼀个字符串序列(如 翻译后的、如语义上对应的)时,这个任务就可以称为Sequence2Sequence了。
在现在的深度学习领域当中,通常的做法是将输⼊的源Sequence编码到⼀个中间的context当中,这个context是⼀个特定长度的编码(可以理解为⼀个向量),然后再通过这个context还原成⼀个输出的⽬标Sequence。
如果⽤⼈的思维来看,就是我们先看到源Sequence,将其读⼀遍,然后在我们⼤脑当中就记住了这个源Sequence,并且存在⼤脑的某⼀个位置上,形成我们⾃⼰的记忆(对应Context),然后我们再经过思考,将这个⼤脑⾥的东西转变成输出,然后写下来。
那么我们⼤脑读⼊的过程叫做Encoder,即将输⼊的东西变成我们⾃⼰的记忆,放在⼤脑当中,⽽这个记忆可以叫做Context,然后我们再根据这个Context,转化成答案写下来,这个写的过程叫做Decoder。其实就是编码-存储-解码的过程。
decoder
⽽对应的,⼤脑怎么读⼊(Encoder怎么⼯作)有⼀个特定的⽅式,怎么记忆(Context)有⼀种特定的形式,怎么转变成答案(Decoder 怎么⼯作)⼜有⼀种特定的⼯作⽅式。
好了,现在我们⼤体了解了⼀个⼯作的流程Encoder-Decoder后,我们来介绍⼀个深度学习当中,最经典的Encoder-Decoder实现⽅式,即⽤RNN来实现。
在今天介绍的Encoder-Decoder模型中,Encoder部分负责依次读⼊输⼊序列的每个单位,将其编码成⼀个模型的中间表⽰(⼀般为⼀个向量),在这⾥我们将其称为上下⽂向量c,Decoder部分负责在给定上下⽂向量c的情况下预测出输出序列。
并且在在⾃然语⾔处理应⽤中,Encoder和Decoder部分通常选择了RNN(LSTM)实现。
为什么我们要选择以RNN为基础的结构去实现Encoder-Decoder呢?:⾸先,RNN可以⽅便地处理可变长序列的数据。其次,由于RNN 中的隐层状态随着按时序读取的输⼊单元⽽不断发⽣变化,因此它具有对序列顺序的建模的能⼒,体现在⾃然语⾔处理任务中,即为对词序的建模能⼒。⽽词序也恰恰是⾃然语⾔处理任务中需要建模的重点。最后,RNN可以作为⼀个语⾔模型来预测出给定前⽂的基础上下⼀个字符出现的概率,这个特性使得其可以应⽤在各种⽂本⽣成任务中预测出语法正确的输出序列,从⽽实现Decoder的功能。