Transformer的Q、K、V和Mutil-Head Self-Attention(超详细解读)

本文介绍了Transformer中的Q、K、V概念,它们在自注意力机制中的作用以及多头注意力的原理。通过线性变换生成查询、关键和数值向量,多头注意力通过组合多个head增强模型的理解能力。

目录

一.什么是Q、K、V

二.Mutil-Head Self-Attention


Transformer大行其道,在众多领域取得了不可忽视的成就。如今大火的语言大模型LLM也都是基于Transformer,但是Transformer中的Q、K、V和多头注意力到底是什么呢?这里简单做个学习记录,进行再一次认识和掌握。

一.什么是Q、K、V

Transformer中的Q、K和V是指在自注意力机制(self-attention mechanism)中使用的三个输入表示向量。

Q表示查询向量,K表示关键向量,V表示数值向量。这三个向量是通过线性变换从原始输入向量(通常是词嵌入表示)得到的。

在自注意力机制中,以查询向量Q为基础,通过计算查询向量与所有关键向量K之间的相似度,得到一个权重分布,用于加权求和关联的数值向量V。

Q、K、V概念来源于检索系统,其中Q为Query、K为Key、V为Value。可以简单理解为Q与K进行相似度匹配,匹配后取得的结果就是V。举个例子我们在某宝上搜索东西,输入的搜索关键词就是Q,商品对应的描述就是K,Q与K匹配成功后搜索出来的商品就是V。

Transformer中,注意力的核心公式是

图片

,那Q、K、V是怎么来的呢?这里其实是通过对输入矩阵X进行线性变换得到的,用公式可以简单写成以下:

图片

用图片直观表示为:

图片

其中是三个可训练的参数矩阵,输入矩阵X分别与三个矩阵参数进行相乘,相当于进行一次线性变换,得到了Q、K、V。

然后使用Q、K、V计算注意力矩阵,公式如下:

图片

论文中给出的图如下:

图片

Q和经过MatMul,生成了相似度矩阵。对相似度矩阵每个元素除以的维度大小。这个除法被称为Scale。当很大时,的乘法结果方差变大,进行Scale可以使方差变小,训练时梯度更新更稳定。然后经过SoftMax,最后与V做一个MatMul操作得到结果。

二.Mutil-Head Self-Attention

上文理解了Q、K、V及其它们的由来,那多头注意力是什么呢?

Transformer论文中给出的多头注意力公式如下:

图片

从公式可以看出,多头注意力就是将多个head进行Concat然后与

相乘。其中每个head是由

图片

与Q、K、V做Attention操作得到。论文给出的图如下:

图片

Q、K、V经过Linear然后经过h个Self-Attention,得到h个输出,其中h指的是注意力的头数。h个输出进行Concat然后过Linear得到最终结果。

图片

那么就得到了多组Q、K、V,每一组就是一个head。


下面引用B站作者霹雳吧啦Wz的内容进行讲解。

先做个铺垫如下图

图片

图片

图片

同理也会得到不同输入的2个head中的head2。如下图

图片

左侧是x1、x2输入的head1,右侧是x1、x2输入的head2,b是偏置。

致此,就得到了每个

图片

对应的

图片

参数。接下来针对每个head使用和Self-Attention中相同的方法即可得到对应的结果。

图片

 接着将每个head得到的结果进行concat拼接,接着将拼接后的结果通过

图片

(可学习的参数)进行融合。

从上可以看出,每个head关注的子空间不一定是一样的,那么这个多头的机制能够联合来自不同head部分学习到的信息,这就使得模型具有更强的认识能力。

更多的头数意味着更强大的模型能力,比如LLM大模型Baichuan-13B中的head数目是40,而Baichuan-7B中的head数目是32。

### Transformer 架构详解 #### 一、整体结构概述 Transformer 是一种基于自注意力机制的序列到序列模型,摒弃了传统RNNCNN的设计思路,完全依赖于注意力机制来捕捉输入数据间的依赖关系[^3]。该模型由编码器(Encoder)解码器(Decoder)两部分组成。 - **编码器**:负责处理输入序列并将其转换成上下文表示; - **解码器**:接收来自编码器的信息,并逐步生成目标序列。 两者内部均采用堆叠的方式构建多个相同的子层,每层之间通过残差连接与归一化操作增强性能表现。 #### 二、单头自注意力机制解析 在单头自注意力计算过程中,对于给定的一组词向量X={x_1,x_2,...,x_n},首先定义三个矩阵W_Q,W_K,W_V用于线性变换得到查询Query(Q)、键Key(K) 值Value(V),即: \[ Q=XW_{Q}, K=XW_{K}, V=XW_{V}\] 接着利用softmax函数计算权重分布S: \[ S=\text{softmax}( \frac {QK^{T}}{\sqrt d_k})\] 其中\(d_k\)代表维度大小,最后加权求获得输出O: \[ O=S*V\] 此过程可以形象地理解为每个位置上的单词都会与其他所有位置上的词语建立联系,从而形成全局感知能力[^2]。 ```python import torch.nn as nn import math class SingleHeadAttention(nn.Module): def __init__(self, embed_size, heads=1): super(SingleHeadAttention, self).__init__() self.embed_size = embed_size # 定义 Wq, Wk, Wv 参数矩阵 self.W_q = nn.Linear(embed_size, embed_size) self.W_k = nn.Linear(embed_size, embed_size) self.W_v = nn.Linear(embed_size, embed_size) def forward(self, query, key, value): q = self.W_q(query) k = self.W_k(key) v = self.W_v(value) scores = torch.matmul(q, k.transpose(-2, -1)) / (math.sqrt(self.embed_size)) attention_weights = F.softmax(scores, dim=-1) output = torch.matmul(attention_weights, v) return output ``` #### 三、多头自注意力机制对比分析 相比于单头设计,在实际应用中更常使用的是多头版本。其核心思想是在同一时间点上创建h个独立的小型自注意力建模单元,这些单元共享相同的空间但各自拥有不同的参数集(W^i_Q ,W^i_K ,W^i_V ) ,最终将它们的结果拼接起来再经过一层全连接投影回原始特征空间尺寸[^1]。 这种做法不仅能够增加模型表达多样性,而且有助于捕获不同粒度下的语义信息。具体来说就是让各个头部专注于特定类型的关联模式,比如局部相邻词汇间的关系或是远距离长程依存等特性。 ```python class MultiHeadAttention(nn.Module): def __init__(self, embed_size, num_heads): super(MultiHeadAttention, self).__init__() assert embed_size % num_heads == 0, "Embedding size must be divisible by number of heads" head_dim = embed_size // num_heads self.heads = nn.ModuleList([ SingleHeadAttention(head_dim) for _ in range(num_heads)]) self.fc_out = nn.Linear(embed_size, embed_size) def forward(self, queries, keys, values): attn_outputs = [] for i in range(len(self.heads)): attn_output = self.heads[i](queries[:, :, i::len(self.heads)], keys[:, :, i::len(self.heads)], values[:, :, i::len(self.heads)]) attn_outputs.append(attn_output) concat_attn = torch.cat(attn_outputs, dim=-1) out = self.fc_out(concat_attn) return out ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈子迩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值