transformer qkv
时间: 2025-07-04 16:21:33 浏览: 12
在Transformer模型中,Query(查询)、Key(键)和Value(值)是实现注意力机制(尤其是自注意力机制)的核心组件。它们的作用是捕捉输入序列中不同位置之间的依赖关系,从而使得模型能够动态地关注与当前任务最相关的部分。
### Query、Key 和 Value 的作用
- **Query** 代表当前需要处理的位置的特征信息,用于寻找与之相关的内容。
- **Key** 是所有位置的特征表示,通过与Query进行相似度计算,来确定哪些位置的信息对当前Query更重要。
- **Value** 是每个位置的实际内容表示,最终通过加权求和的方式被选择性地传递给下一个模块。
这种机制的核心思想是:对于每一个Query,都会计算它与其他所有Key之间的匹配程度,进而得到一组权重,并将这些权重应用于对应的Values上,从而生成一个加权后的输出。
### 实现机制
#### 1. 线性变换
在标准的Transformer架构中,输入的嵌入向量会分别通过三个可学习的线性变换矩阵 $ W_Q $、$ W_K $ 和 $ W_V $ 来生成Query、Key和Value。这一步可以表示为:
$$ Q = XW_Q $$
$$ K = XW_K $$
$$ V = XW_V $$
其中 $ X $ 是输入的嵌入向量,而 $ W_Q $、$ W_K $ 和 $ W_V $ 是训练过程中优化的参数。
#### 2. 注意力得分计算
接下来,使用Query和Key计算注意力得分(Attention Score)。通常采用点积方式,并经过缩放以防止梯度消失:
$$ \text{Attention Score} = \frac{QK^T}{\sqrt{d_k}} $$
这里 $ d_k $ 是Query和Key的维度,用于缩放以稳定梯度。
#### 3. Softmax 归一化
为了将注意力得分转化为概率分布,会对结果应用Softmax函数,从而获得各个位置的归一化权重:
$$ \text{Weights} = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) $$
#### 4. 加权求和
最后,使用上述权重对Value进行加权求和,得到最终的输出:
$$ \text{Output} = \text{Weights} \cdot V $$
### 示例代码
以下是一个简单的PyTorch实现示例,展示了如何构建Query、Key和Value,并计算注意力得分:
```python
import torch
import torch.nn as nn
class SelfAttention(nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
assert (
self.head_dim * heads == embed_size
), "Embedding size needs to be divisible by heads"
# 定义线性变换层
self.values = nn.Linear(self.head_dim, embed_size)
self.keys = nn.Linear(self.head_dim, embed_size)
self.queries = nn.Linear(self.head_dim, embed_size)
def forward(self, x):
batch_size, seq_len, embed_dim = x.shape
# 将输入分割成多个头
values = self.values(x).view(batch_size, seq_len, self.heads, self.head_dim)
keys = self.keys(x).view(batch_size, seq_len, self.heads, self.head_dim)
queries = self.queries(x).view(batch_size, seq_len, self.heads, self.head_dim)
# 调整维度以便于计算注意力得分
values = values.transpose(1, 2)
keys = keys.transpose(1, 2)
queries = queries.transpose(1, 2)
# 计算注意力得分
energy = torch.matmul(queries, keys.transpose(-2, -1)) / (self.embed_size ** (1/2))
# 应用Softmax函数
attention = torch.nn.functional.softmax(energy, dim=-1)
# 计算加权输出
out = torch.matmul(attention, values).transpose(1, 2).contiguous()
out = out.view(batch_size, seq_len, embed_dim)
return out
```
### 多头注意力机制
在实际的Transformer模型中,多头注意力机制(Multi-Head Attention)被广泛使用。其核心思想是将Query、Key和Value分成多个“头”并行处理,然后将各个头的结果拼接起来并通过一个额外的线性层进行整合。这种方法可以增强模型捕捉不同特征的能力。
---
阅读全文
相关推荐



















