博客已迁至知乎,本文链接:https://zhuanlan.zhihu.com/p/70880679
前言
我们通常使用RNN来对序列到序列问题建模,但是使用RNN建模,输出序列的长度必须和输入序列的长度相等。seq2seq框架很好地解决了这个问题。本文介绍了两种最常见的seq2seq框架。若对RNN不熟悉,请参考我前两篇文章:RNN详解、LSTM详解。
seq2seq介绍:
seq2seq模型,全称Sequence to sequence,由Encoder和Decoder两个部分组成,每部分都是一个RNNCell(RNN、LSTM、GRU等)结构。Encoder将一个序列编码为一个固定长度的语义向量,Decoder将该语义向量解码为另一个序列。
特点:输入序列和输出序列的长度是可变的,输出序列长度可以不等于输入序列长度。
训练:对Encoder和Decoder进行联合训练,使给定输入序列的目标序列的条件概率最大化。
应用:seq2seq模型可以在给定输入序列的情况下生成目标序列,也可以对一对序列进行评分(以条件概率表示)。比如机器翻译、文本摘要生成、对话生成等。
框架1:
该框架由这篇论文提出:Cho et al.(2014) Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation。结构图如下:
这篇论文另一大贡献是提出了GRU,论文中Encoder和Decoder都是GRU。为了表达方便,这里我们假设Encoder和Decoder都为RNN,来看一下seq2seq的公式,注意: c {\color{Red} c} c 与 c c c 不是一个参数。
Encoder
h t = t a n h ( W [ h t − 1 , x t ] + b ) o t = s o f t m a x ( V h t + c ) \begin{aligned} h_t &=tanh(W[h_{t-1},x_t]+b)\\ o_t &=softmax(Vh_t+c) \\ \end{aligned} htot=tanh(W[ht−1,xt]+b)=softmax(Vht+c)
其中 h t h_t ht是隐藏状态, o t o_t ot是输出。
Encoder输出的语义向量:
c = t a n h ( U h T ) {\color{Red} c}=tanh(Uh_T) c=tanh(UhT)
其中 U U U为权重矩阵, h T h_T hT