注意力机制汇总----self-Attention
Self-Attention
前期回归: 注意力机制汇总----(1)
Tips: Transformer算法就是由self-Attention构成,此外还使用了多头注意力机制
简介
本章我们重点研究自注意力机制,首先一个重要的概念即query、key和value。这三个词翻译成中文就是查询、键、值,看到这中文的意思,还是迷迷糊糊的。我们来举个例子:小明想在b站搜索深度学习,他把深度学习四个字输入到搜索栏,按下搜索键。搜索引擎就会将他的查询query映射到数据库中相关的标签key,如吴恩达、神经网络等等,然后向小明展示最匹配的结果value。
注意力的本质是权重分配,是一种从一系列输入中选择性地提取信息的结构。
**问:**attention机制最初解决了什么问题?
答:seq2seq任务(机器翻译–典型任务)中,输入的句子经过编码器获得一个总结向量(包含全部输入信息的向量),随后经过解码器逐步获得输出。编码过程是有损的,中间的总结向量易过载。
引入Attention机制,就可以加强编码与解码之间的联系,减少编码时候的信息丢失
公式
注意力机制公式:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
/
d
k
1
/
2
)
V
Attention(Q,K,V) = softmax(QK^T/d_k^{1/2})V
Attention(Q,K,V)=softmax(QKT/dk1/2)V
还是以上面搜索的案例来做分析.
- 首先计算“深度学习(Query)”与“数据库(Key)”的线性关系;向量点乘代表向量间的线性关系;
- 然后除以dk,dk表示词向量的维度,此举是为了防止QK过大,导致softmax计算溢出(overflow);
- 然后进行softmax计算与Value相乘得到输出,此举相当于将得到的系数与输入x相乘,得到经过注意力机制加权求和后的表示。
图解
将输入的词经过embedding,在经过一些列操作得到输入X,X和三个可训练的矩阵相乘,得到Q,K,V。这三个参数本质上X的线性变换,是为了提高模型的拟合能力
我们可以这样来:
-
计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。
-
从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。
代码
self-Attention
import torch.nn as nn
import torch
class Self_Attention(nn.Module):
def __init__(self, dim, dk, dv):
super(Self_Attention, self).__init__()
self.scale = dk ** -0.5
self.q = nn.Linear(dim, dk)
self.k = nn.Linear(dim, dk)
self.v = nn.Linear(dim, dv)
def forward(self, x):
q = self.q(x)
k = self.k(x)
v = self.v(x)
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.softmax(dim=-1)
x = attn @ v
return x
att = Self_Attention(dim=2, dk=2, dv=3)
x = torch.rand((1, 4, 2))
output = att(x)
下一章描述多头注意力机制。