导航

Encoder-Decoder模型框架

Posted on 2023-02-24 22:03  蝈蝈俊  阅读(2457)  评论(1编辑  收藏  举报

Seq2Seq(Sequence-to-Sequence,序列到序列)问题是一类特殊的序列建模问题,其中的Encoder和Decoder都是一个序列。

Encoder-Decoder模型框架(编码器-解码器模型框架)最早在2014年提出,当时是为了解决机器翻译的问题(机器翻译就是一个典型的Seq2Seq问题)而构建的,随后变成了深度学习中常见的模型框架。

Encoder-Decoder模型的结构包括一个编码器和一个解码器,编码器(Encoder)会先对输入的序列进行处理,然后将处理后的向量发送给解码器(Decoder),转化成我们想要的输出。

举例来说,如果使用Encoder-Decoder模型将中文翻译成英文,其过程就是输入一个中文句子(欢迎来北京),编码成包含一系列数值的向量发送给解码器,再用解码器将向量转化成对应的英文句子(welcome to BeiJing),翻译也就完成了,如下图。

Encoder-Decoder模型输出的长度跟输入的可以不一致,如上图例子,输入的中文长度为5,输出的英文长度为3。

整个过程如下:

  • 在Encoder中,“欢迎/来/北京”这些词转换成词向量,Encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码。

  • 这个Decoder过程是根据语义向量生成指定的序列,这个过程也称为解码。整个过程从输入“_GO”的词向量开始预测,然后逐词预测,直到解出“_EOS”,结束解码。

多层编码解码结构

Transformer 的论文中使用了6层编码器(这里的层数6并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分也是由多层的解码器组成(论文里也使用了6层的解码器)。

如何理解这里的多层呢?这就要求我们理解它们有啥用?而不是受名字误解。

  • 编码器是用来做数据特征抽取的,编码器把输入数据的特征抽取出来(一般是压缩的,但应该也可以是扩张的)。
  • 解码器,只是在编码器训练过程中的一个反向的组件,用来协助编码器做训练的。同时它也可以做新东西的生成,因为,编码器把重要特征抽出来了,那么,我们可以把这些特征自由的组合,就生成一个新的原始样本中没有的样本。

我们可以看看视觉是如何工作的?就可以理解这里的多层。

当我们看到一只猫,是如何认定它是一只猫的呢? 会经过下图这么多层,每层都是对上层的特征提取。

视觉信息传递过程:

  1. Retina(视网膜) 看到一只猫;
  2. LGN(外膝体) ;
  3. V1(初级视皮层);
  4. V2(纹外皮层,视觉第二区域) ;
  5. V3(纹外皮层,视觉第三区域) ;
  6. LOC(枕叶复合体)认知到是一个猫;

这部分来自中国科学院上海生命科学研究院神经科学研究所的这篇文章:http://www.shb.cas.cn/kjjz2016/201607/t20160712_4639424.html

其中的第一层的视网膜部分,视网膜平行通道信息处理模型如下,这部分可以理解成这一层的不同的特征提取。

Seq2Seq模型应用场景

常见的Seq2Seq模型应用场景:

文字 - 文字

  • 机器翻译,中文翻译英文,法文翻译德文,参看Google 发表的用Seq2Seq做机器翻译的论文《Sequence to Sequence Learning with Neural Networks》https://arxiv.org/pdf/1409.3215.pdf
  • 聊天问答,输入一个问题序列,输出一个回答序列。最近超火的 ChatGPT就是。
  • 内容续写,输入一个段落序列,输出后续内容的段落序列。
  • 摘要/标题生成,输入一个文章序列,输出一个摘要/标题序列。

音频 - 文字

  • 文本转语音,输入一个文本序列,输出一个语音序列。
  • 语音识别,比如会议语音记录转文字。Google 发表的使用Seq2Seq做语音识别的论文《A Comparison of Sequence-to-Sequence Models for Speech Recognition》

图片 - 文字

Encoder-Decoder 的缺陷

Encoder(编码器)和 Decoder(解码器)之间只有一个「向量 c」来传递信息,且 c 的长度固定。当输入信息太长时,会丢失掉一些信息。就类似于大图片压缩后的变模糊。

对应的解决思路就是抓重点,也就是我们后面文章要说的注意力模型。

总结

Encoder-Decoder模型的结构包括一个编码器和一个解码器,编码器会先对输入的序列进行处理,完成特征提取,然后将处理后的结果向量发送给解码器,转化成我们想要的输出。