背景
在Attention机制引入前,自然语言处理里的深度学习模型有以下缺点:
- 长序列的推理存在信息损失/梯度消失:输入序列越长,模型越难保存初始输入信息。
- 运算量大并且不能并行:RNN的每一步推理都是基于上一个步的结果。
Attention的定义
在Attention Is All You Need 文章中,它的定义是这样的:
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors.
这么说有点抽象,我们用搜索引擎(信息检索)做个类比:
- 当你用上网查东西时,你会敲入一句关键词,这个就是query。
- 搜索系统会根据关键词这个去查找一系列相关的keys,比如文章标题,图片标题。
- 最后系统会将相应的 values 比如具体的文章图片 返回给你。
Attention机制做就是根据query找出(或者将注意力集中到)相关的keys 和它们对应的 values。
Attention的例子
这是Attention机制的一个实例,名字叫Scaled Dot-Product Attention。下面我们结合一个具体的应用例子来解释:
例子
请找出这个文本里跟 “计划” 这个词相关性最大的词语,及其特征向量。
今天 我 的 计划 是 买菜
预处理
- 先将文本切成n个词,并做Embedding,得到每个词所对应的向量。比如
- “今天”:
embedding_1
(下标 0) - “我”:
embedding_2
(下标 1) - 等等
- 然后初始化K以及V矩阵:
- K (keys)目的是:根据Q (query)找到文本中相关的一个或者多个词语
- V (values)目的是:根据上述计算出来一个或多个词语的权重来对这些词语的向量进行综合加权,并得到加权向量。
- 然后训练模型。
Attention 推理
- MatMul: 将Q (query)所对应的embedding与K矩阵相乘,得到一个长度为n = 6的向量。
- Scale: 使这个向量的方差为1(避免训练过程中模型的太小梯度消失)
- Mask: 这步是可选的,因为在批量训练中,为了使不同输入数据有相同的长度,我们会加padding,而Mask这部就是想padding给去除。同时在decoder过程中,为了避免decoder作弊用未来的输入数据当作输入输入,我们会Mask掉用于接收未来信息的神经元。
- SoftMax: 得到一个长度为n并且 总和 为1 的向量。这n个值里面最大的数对应的下标就是我们要找的相关性词语的下标。(“买菜”:
embedding_5
下标5) - MatMul: 这里我们将该向量与V (values)相乘,得到最后的一个特征向量加权。
至此,Attention模块推理结束。
参考文献
- https://stats.stackexchange.com/questions/421935/what-exactly-are-keys-queries-and-values-in-attention-mechanisms
- https://www.jianshu.com/p/9d5706fa582d
- https://arxiv.org/pdf/1706.03762.pdf
- https://stats.stackexchange.com/questions/430812/why-k-and-v-are-not-the-same-in-transformer-attention