问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【Attention机制详解】注意力机制/自注意力/多头注意力 构件详解

创作时间:
作者:
@小白创作中心

【Attention机制详解】注意力机制/自注意力/多头注意力 构件详解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_54607024/article/details/144777593

一、注意力机制

什么是attention?即QKV 模型,transformer 是采用的这种建模方式。

可以这么理解:k 是 question,v 是 answer,Memory 中以(k,v)形式存储需要的上下文,q 是新来的 question。假设输入为 q,看看历史 memory 中 q 和哪个 k 更相似,然后依葫芦画瓢,根据相似 k 对应的 v,合成当前 question 的 answer。

二、自注意力机制

注意力机制Q,K,V来源不同,当注意力的query和key、value全部来自于同一堆东西时,就称自注意力。

那么Q、K、V本质上是什么呢?首先Q、K、V都源于输入特征本身,是根据输入特征产生的向量,从同样的输入矩阵X线性变换而来的:

其中,

是三个可训练的参数矩阵。输入矩阵X分别与

相乘,生成Q,K,V,相当于经历了一次线性变换。

为什么不直接使用X,而要转换成源于X的,使用经过矩阵乘法生成的这三个矩阵Q,K,V?

因为使用三个可训练的参数矩阵,这些线性变换将输入数据 X 投影到不同的特征空间 (Q, K, V),这使得模型能够学习到输入数据中更复杂的模式和关系,从而提高模型的表达能力。转换为Q,K,V,及之后进行的一系列操作,就是该模型的机制和亮点!

Attention is all you need中用到的attention叫做“Scaled Dot-Product Attention”,具体过程如下图所示:

在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的。

Attention function :输入是query和key-value对,query,key和value都是向量。注意力机制首先计算query与每个key的关联性(compatibility),每个关联性作为每个value的权重(weight),各个权重与value的乘积相加得到输出。

公式解释:公式中计算矩阵QK每一行向量的内积,为了防止内积过大,因此除以

的平方根(

K的维度大小)。Q乘以K的转置后,得到的矩阵行列数都为 n(n 为句子单词数),这个矩阵可以表示单词之间的 attention 强度。下图1234 表示的是句子中的单词。

使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1.

得到 Softmax 矩阵之后可以和V相乘,得到最终的输出Z

上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 等于所有单词 i 的值 根据 attention 系数的比例加在一起得到,如下图所示:

三、多头注意力

多头注意力(Multi-Head Attention)是一种在Transformer模型中被广泛采用的注意力机制扩展形式,它通过并行地运行多个独立的注意力模块(称为“头”)来获取输入序列的不同子空间的注意力分布,从而更全面地捕获序列中潜在的多种语义关联。

头的定义:

  • 头(Head):在多头注意力中,每个头都是一个独立的注意力机制。每个头都有自己的查询(Q)、键(K)和值(V)矩阵,每个头可以关注输入序列中的不同部分或特征。

不同头部的output就是从不同层面(representation subspace)考虑关联性而得到的输出。

在多头注意力中,输入序列首先通过三个不同的线性变换层分别得到Query、Key和Value。然后,这些变换后的向量被划分为若干个“头”,怎么划分的呢?

假设输入的特征矩阵为 X,其维度为 (N,D),其中 N 是序列长度,D 是特征维度。假设我们有h 个头,每个头的维度为 dk(通常 dk =D/h)

将 Q、K和 V分成多个头的过程如下:

  • 将 Q、K和 V 的维度从 (N,D)转换为 (N,h,dk ),其中 dk=D/h。
  • 具体来说,可以通过重塑(reshape)操作实现:
    Q=reshape(Q,(N,h,dk))
    K=reshape(K,(N,h,dk))
    V=reshape(V,(N,h,dk))

*reshape
常用于调整输入数据的形状,以便适应模型的要求

每个头都有自己独立的Query、Key和Value矩阵。对于每个头,都执行一次Scaled Dot-Product Attention(缩放点积注意力)运算,即:

最后,所有头的输出会被拼接(concatenate)在一起,

Output=concat(head1 ,head2 ,…,headh )

然后再通过一个线性变换将其映射回原始维度

具体流程可视化:

从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z

得到 8 个输出矩阵 到 之后,Multi-Head Attention 将它们拼接在一起(Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z

参考:

【NLP】多头注意力(Multi-Head Attention)的概念解析_多头注意力层-CSDN博客

注意力,多头注意力,自注意力及Pytorch实现 - 知乎

论文精读-Transformer(Attention is All You Need)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号