Seq2Seq模型结构
Seq2Seq(Sequence to Sequence) 是一个处理序列问题的模型,传统的 RNN 或 LSTM 只能处理 输入及输出是定长即 一对一或多对多的问题,而 Seq2Seq 则能处理一对多的问题,它也是 RNN 最重要的一个变种:N vs M(输入与输出序列长度不同),
如:输入(你是谁),输出(我是某某某)。因此 Seq2Seq 在很多方面也得到应用:机器翻译、QA 系统、文档摘要、图片描述问题
基本结构
上图为最常见的 Seq2Seq 模型,又叫做 编码-解码 模型,主要的思想就是二个 RNN,一个 RNN 作为 Encoder,另一个 RNN 作为 Decoder
Encoder 主要负责将输入序列压缩成指定长度向量,这个向量可以看成是这个序列的语义,这个过程叫做编码
获取词向量的方式分为多种:
- 一种是直接将最后一个输出的隐状态作为语义词向量 C,假设网络单元为 f , 那么 hidden state为
- 第二种是对最后一个隐状态作一次变换得到语义词向量,如取平均等方法
Decoder 主要负责将语义词向量分成指定的序列,这个过程叫解码
-
最简单的方式是将 语义词向量作为初始状态输入到 RNN 中,得到输出序列,语义词向量 C 只作为初始状态参与运算,与后面的运算无关
-
另一种将语义词向量参与所有时刻的运算,上一时刻的输出仍然作为当前时刻的输入参与运算
Attention 机制
在上面的 decoder 步骤中我们可以看到,各个时刻使用的都是相同的 content vector(词语义向量),而 Attention 是一种让模型在解码过程中学习集中关注输入序列特定部分的模型
以 英-中 翻译为例,给定 "Cat chase mouse ", 输出 “猫捉老鼠”,在翻译 “mouse” 时,我们发现 “cat”、“chase”、“mouse” 对 “老鼠” 的关注度都是一样的,但实际上 “mouse” 才是对 “猫” 影响最大的,因此我们需要在解码时,对输入序列在不同时刻分配不同的注意力,这就是注意力机制的由来
在 encoder 中我们使用的都是同一个语义向量 C,我们想使用不同的向量来表示不同时刻的 C,那么可以写成 、、 …
用 来表示 i 时刻的语义向量,我们之前用过最后一个值或者平均值,很容易的想到可以用加权求和来表示 ,其中 表示 encoder 中的隐层状态, 表示的是一个分布概率,即 softmax 值
既然是一个 softmax 值,那么可以写成 ,其中 表示的是当前时刻 encoder 的隐层状态 与 上一时刻 decoder 的隐层状态 的相似程度
既然表示的是 h1~ht 之间的相似程度,那么我们可以用一个 score 函数来表示 ,score 函数可以是多样的,后面会介绍
为了方便理解,我们可以结合下面的示意图来更清楚的了解其中的步骤:
Encoder 输出状态 表示,Decoder 输出状态 表示
- 首先,我们用一个 score 函数来表示 与 之间的相似度,用 来表示:
- 通过 softmax 作归一化操作方便计算:
- 再对归一化的值进行一个加权求和即可得到每个时刻的 content vector:
- 最终我们根据每个时刻的 可以计算 Decoder 的输出 :
至此,attention 机制的结构与运行方式就很清晰了,在上面我们使用了一个 score 函数来表示 与 之间的相似度,一般来说常用的也就下面的几种:
总结
此处介绍的是最基础的 attention 结构,具体细节仍然需要在代码中仔细理解,还有 self-attention 机制及针对不同 score 函数的选取而得到的不同的注意力机制,留在以后的文章中再学习