NLP学习笔记(九)自我注意力机制(Self-Attention)

2,626 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

自我注意力机制(Self-Attention)

这节课我们学习自我注意力机制(Attention)。

Self-Attention(自我注意力机制)

在这里插入图片描述

Attention的第一篇论文发表于2015年,用于改进Seq2seq模型对长句子的遗忘问题。其实Attention并不局限于Seq2seq模型,而是可以用在所有的RNN上。接下来我们介绍Self-attention,文章发表在2016年EMNLP上。

Self-attention原始论文把Attention用在LSTM上,本节课我们把论文内容进行简化,把LSTM换成Simple RNN,这样更容易理解。

初始时,状态向量hh和Context vector cc都是全零向量。RNN读入第一个输入x1x_1,需要更新状态hh,把x1x_1的信息压缩到新的状态向量hh里面。标准的Simple RNN在计算h1h_1时依赖输入x1x_1和旧的状态h0h_0,计算公式如下图所示:

在这里插入图片描述 而使用Self-attention后,计算公式变为这样:

在这里插入图片描述 即用c0c_0代替h0h_0。也可以用其他方法来更新,比如把x1x_1c0c_0h0h_0做concatenation。算出新状态h1h_1,下一步就是计算新的Context vector c1c_1。新的Context vector c1c_1是已有状态hh的加权平均。 在这里插入图片描述

由于初始状态h0h_0是全零,我们忽略掉h0h_0,那么已有状态的加权平均就等于h1h_1,所以新的Context vector c1c_1就是h1h_1

然后计算h2h_2,公式如下: 在这里插入图片描述 接下来计算新的Context vector c2c_2。想要计算cc,首先需要计算权重α\alpha。拿当前状态和已有的两个状态向量hh作对比(包括h2h_2自己)。然后用权重进行加权平均计算c2c_2

在这里插入图片描述

以此类推,计算c3c_3,……cnc_n。通过这些步骤的计算,我们可以获得各个位置上的Context vector。经过这样的计算,Self-attention获取了自身输入序列中各个token之间的重要性,可以分析序列中每个token相较于同序列其他token之间的“联系紧密程度”,从而更好的帮助模型进行建模分析。

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Summary(总结)

在这里插入图片描述

  • RNN都有遗忘的问题,使用Self-attention后就可以解决遗忘的问题。每次在更新cc之前,都会再重新看一遍之前的各个状态信息。

  • Self-attention与Attention的道理是一样的,但Self-attention不局限于Seq2seq模型,可以用在所有的RNN上。除了避免遗忘,Self-attention还能帮助RNN关注相关的信息。

  • 上图为论文中的插图,RNN从左往右读一句话,红色的是当前输入,高亮标出的权重α\alpha很大的位置,这些权重α\alpha说明前文中最相关的词是哪几个。可以看到,一般来说,每个单词都会跟他前面这个单词有着不小的权重。同时,诸如is a的权重值也很大,这也符合英语中相关的语法逻辑。