从Seq2Seq到Attention

Seq2Seq模型是RNN最重要的一个变种:N vs M(输入与输出序列长度不同)。

这种结构又叫Encoder-Decoder模型。

原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c:

得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

还有一种做法是将c当做每一步的输入:

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的

文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。

阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。

seq2seq的局限性:

Encoder-Decoder 框架虽然应用广泛,但是其存在的局限性也比较大。其最大的局限性就是 Encoder 和 Decoder 之间只通过一个固定长度的语义向量 CC 来唯一联系。也就是说,Encoder 必须要将输入的整个序列的信息都压缩进一个固定长度的向量中,存在两个弊端:一是语义向量 C 可能无法完全表示整个序列的信息;二是先输入到网络的内容携带的信息会被后输入的信息覆盖掉,输入的序列越长,该现象就越严重。这两个弊端使得 Decoder 在解码时一开始就无法获得输入序列最够多的信息,因此导致解码的精确度不够准确


在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。

Attention机制通过在每个时间输入不同的c来解决这个问题,下图是带有Attention机制的Decoder:

以机器翻译为例(将中文翻译成英文):

a2j的计算:

a3j的计算:

以上就是带有Attention的Encoder-Decoder模型计算的全过程。


深入理解: https://www.cnblogs.com/ydcode/p/11038064.html

发布了504 篇原创文章 · 获赞 610 · 访问量 114万+

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/96857301