Encoder-Decoder

383 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

Encoder-Decoder

我们在之前的学习模型当中默认我们输入序列与输出序列是等长的,但是实际中也存在着输入与输出并不等长的情况,例如:机器翻译,语音识别等,Encoder-Decoder 框架就是来解决映射可变长序列至另一个可变长序列的RNN网络结构的问题。

介绍

Encoder-Decoder 被称作编码器-解码器,是深度学习中常见的模型框架。

  • 编码(encode):将一些文字,图片,音频等作为输入,进行编码,输出一个向量,以现实角度将物质转化成数学向量表示。
  • 解码(decode):数学向量进入解码器,输出文字,图片等,数学向量转化成具体的物质。

Encoder-Decoder 并不是一个具体的模型,而是一个通用的框架,并不是特指某一个具体的算法。Encoder 和 Decoder 部分可以是任意文字,语音,图像,视频数据,模型可以是 CNN,RNN,LSTM,GRU,Attention 等等。所以,基于 Encoder-Decoder,我们可以设计出各种各样的模型。

image.png

Encoder-Decoder框架有一个最显著的特征就是它是一个 End-to-End 学习的算法。

非端到端:在一个机器学习过程中,整体流程是由多个独立模块构成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果。

端到端:从输入端(输入数据)到输出端得到一个预测结果,该结果与真实结果相比较会得到一个误差,这个误差将用于模型每一层的调整(比如反向传播),这种训练直到模型收敛或达到预期的效果才结束,

优点:端到端的训练就能减少误差传播的途径,不会发生误差累积情况,实现更好的优化。

解决问题

Encoder-Decoder 往往会用于 Sequence to Sequence (Seq2Seq)任务中。

Seq2Seq 任务主要是泛指一些 Sequence 到 Sequence 的映射问题,Sequence 在这里可以理解为一个字符串序列,当我们在给定一个字符串序列后,希望得到与之对应的另一个字符串序列(如 翻译后的、如语义上对应的)时,这个任务就可以称为 Seq2Seq 了。

以 RNN 模型来实现:

假设有两个句子 X,YX,Y,我们的目标是给定输入句子 XX,期待通过 Encoder-Decoder 框架来生成目标句子 YY

实现过程如下:

  • 根据语句顺序,将 XX 的每个词 经过一个 embeding层进行编码(例如构建词袋,形成一个向量)得到 word embeding,将其输入 RNN ,得到对应的输出 hth_t
  • 输入完 XX ,获取各个时间点的隐藏状态值,将信息汇总,生成最后的语义向量CC
  • cc 作为 Decoder 的初始隐藏层,输入 [EOL] 生成第一个输出词向量。
  • 如此反复,将上一词输出的词作为下一次的输入,经过 embedding,softmax,得到本次预测输出的词向量概率,并且用于下一次输入,同时更新 RNN 隐层。
  • 在完成某一段输出后,输出一个结束标号后,进行截断。

image.png

参考