共计 1265 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
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:1
,t
表示序列长度。
使用Encoder-Decoder
结构能够让输出序列通过Encoder
得到一个语义编码,该编码代表了输入序列的语义表示,再使用Decoder
对其进行解码,得到的长度由解码器和语义编码决定,这在机器翻译任务中有着天然的优势。
模型结构
论文中的模型结构如图:
该模型读取输入序列“ABC”,得到输出序列“WXYZ”。<EOS>
代表输入结束或者停止预测的标识。个人习惯使用<S>
和<E>
来代表开始解码和停止解码的标识,更加方便理解。
该模型包含Encoder
和Decoder
两部分。
encoder
用于对输入序列进行编码得到一个语义表示供解码器使用。
encoder
通常使用LSTM cell
,也有使用CNN
的。
这里以LSTM
来解释模型的输入输出。
模型以上一时刻的hidden state
ht-1和当前时刻的输入Xt作为输入, 得到的output
Ot直接舍弃,ht作为下一时刻的输入。h0为初始输入,通常用0
代替。
decoder
deocder
也是一样,通常用LSTM
。
模型以上一时刻ct-1
和yt-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
的模型结构。