Sequence to Sequence模型笔记

  • 2019-01-04
  • 294
  • 0

背景介绍

Sequence to Sequence模型最早是由google工程师在2014年Sequence to Sequence Learning with Neural Networks论文中提出。

之后广泛应用于机器翻译中,该论文提出了一种新的Encoder-Decoder模型。之后在该模型结构上又发展出Sequence to Sequence with Attention模型也在NLP领域中得到广泛使用。

模型优点

在之前的序列模型中,通常使用RNN结构来对序列进行处理,每个cell使用上一个hidden state来输出对应的hidden state + output,然后使用每个时刻的output或者最后时刻的hidden state来输出结果。这使得模型的输入和输出的比例只能是t:t或者是t:1t表示序列长度。
使用Encoder-Decoder结构能够让输出序列通过Encoder得到一个语义编码,该编码代表了输入序列的语义表示,再使用Decoder对其进行解码,得到的长度由解码器和语义编码决定,这在机器翻译任务中有着天然的优势。

模型结构

论文中的模型结构如图:
seq2seq
该模型读取输入序列“ABC”,得到输出序列“WXYZ”。<EOS>代表输入结束或者停止预测的标识。个人习惯使用<S><E>来代表开始解码和停止解码的标识,更加方便理解。

该模型包含EncoderDecoder两部分。

encoder

用于对输入序列进行编码得到一个语义表示供解码器使用。
encoder cell

encoder通常使用LSTM cell,也有使用CNN的。
这里以LSTM来解释模型的输入输出。
模型以上一时刻的hidden state ht-1和当前时刻的输入Xt作为输入, 得到的outputOt直接舍弃,ht作为下一时刻的输入。h0为初始输入,通常用0代替。

decoder

decoder cell

deocder也是一样,通常用LSTM
模型以上一时刻ct-1yt-1作为输入,直到yt<E>结束。
<S>为初始输入,表示解码器开始解码。

训练阶段

一共有三个输入:

  • encoder_input
    • 原始序列作为输入
  • decoder_input
    • 解码器的输入,训练时将decoder_target往后移一位,第一位是<S>,例如原序列为“ABC”,输出序列为“WXYZ”,那么训练时decoder_input<S>WXYZ
  • decoder_target
    • 原序列的输出序列
预测阶段

一共两个输入:

  • encoder_input
    • 预测序列
  • decoder_input
    • 第一位输入使用<S>,其后使用上一时刻的输出作为输入

实际应用

实际应用中,语义编码可以作为decoder的初始输入也可以是所有decoder的输入。


或者

tips

在论文中有提到,实际应用中,如果将原始序列顺序颠倒后输入,比如原序列为“ABC”,训练时将“CBA”作为输入,效果会有提升,但是具体原因,原作者也不知道,这就是深度学习magic的地方。

上面我只讲了单层的模型,也可以使用多层模型来做,结构大致一样。后续还会写Sequence to Sequence with Attention的模型结构。

链接:https://www.ioiogoo.cn/2019/01/04/sequence-to-sequence模型笔记/
本站所有文章除特殊说明外均为原创,转载请注明出处!

评论

还没有任何评论,你来说两句吧