Attention机制及代码实现

什么是Attention机制?

本质上是目标语单词源语单词之间的一种单词对齐机制。在NLP中最先出现的文章为:《Neural Machine Translation by Jointly Learning to Align and Translate》

从概念上理解,即把Attention理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。这种思路仍然成立。

从数学角度讲,Attention用来形容是一个变量Query到一系列Key-Value对的映射,从公式上描述是根据Query和Key计算Values的加权求和的机制

Attention计算主要分为三步:
第一步,是将Query和每个Key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
第二步,使用一个softmax函数对这些权重进行归一化;
第三 步,将获得的权重和相应的键值Value进行加权求和得到最后的attention。

代码实现:

输入Q,K,V
Q       [ batch_size * seq_len * emb ]     例如。16 * 28 * 300

K=V     [ batch_size * seq_len * emb ]     例如。16 * 28 * 300 

Attention代码:

import torch
import torch.nn.functional as F

Q = torch.randn(16,28,300)
K = torch.randn(16,28,300)
V = K

# 获得注意力权重
alpha_mat = torch.matmul(Q, K.transpose(1,2))              #. [16,28,28]
# 归一化注意力权重,alpha把第一求和,softmax把第二位归一化
alpha = F.softmax(alpha_mat.sum(1, keepdim=True), dim=2)   # [16,1,28]
# 进行加权和
x = torch.matmul(alpha, V).squeeze(1)                     # [16,300]
Attention机制及代码实现_第1张图片
attention

什么是Self-attention?

对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入。


Attention机制及代码实现_第2张图片
self-attention

(1)因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
(2)Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征
(3)引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征

更详细的内容请见

NLP中的Attention机制

你可能感兴趣的:(Attention机制及代码实现)