注意力机制,自注意力机制,多头注意力机制
时间: 2025-05-17 11:13:20 浏览: 55
### 注意力机制概述
注意力机制是一种模仿人类视觉注意过程的技术,在处理输入数据时能够动态分配权重给不同的部分,从而突出重要信息并忽略无关细节[^3]。它最早被广泛应用于序列到序列的任务中,例如机器翻译。
#### 实现原理
在深度学习领域,注意力机制通常通过计算查询向量(Query)、键向量(Key)和值向量(Value)之间的关系来实现。具体来说,对于每一个位置上的 Query 向量,都会与所有的 Key 向量进行相似度比较,并基于此得到一组加权系数,这些系数用于对 Value 向量进行线性组合,最终形成上下文表示[^1]。
---
### 自注意力机制 (Self-Attention)
自注意力机制是注意力机制的一个变体,其核心特点是允许模型在同一序列的不同位置之间建立联系。换句话说,它是通过对同一组输入序列执行多次自我对比操作来捕获全局依赖关系。
#### 实现原理
假设有一个长度为 \( n \) 的输入序列 \( X = [x_1, x_2, ..., x_n] \),其中每个 \( x_i \in R^{d} \) 表示维度为 \( d \) 的嵌入向量。为了应用自注意力机制:
1. 首先定义三个可训练矩阵:\( W_Q \), \( W_K \), 和 \( W_V \),分别对应于 Query、Key 和 Value 转换;
2. 对原始输入序列 \( X \) 进行线性变换以获得对应的 Q、K 和 V 矩阵:
\[
Q = XW_Q,\ K = XW_K,\ V = XW_V
\]
3. 计算注意力分数并通过 softmax 函数规范化它们,最后乘上 Value 矩阵完成输出计算:
\[
\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
\]
这里除以 \( \sqrt{d_k} \) 是为了避免点积过大而导致梯度消失问题[^2]。
```python
import torch
import math
def scaled_dot_product_attention(query, key, value):
dk = query.size(-1)
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(dk) # 缩放因子
attention_weights = torch.softmax(scores, dim=-1) # 权重分布
output = torch.matmul(attention_weights, value) # 加权求和
return output, attention_weights
```
---
### 多头注意力机制 (Multi-Head Attention)
多头注意力机制是对单头注意力的一种扩展形式,目的是让模型能够在不同子空间内同时提取多种类型的特征信息。相比于单一头部的设计,这种方法可以显著提升表达能力。
#### 实现原理
多头注意力的核心思想是在同一个输入序列上运行多个平行的注意力层(即“头”),并将各头的结果拼接在一起作为最终输出。具体流程如下:
1. 将输入分成若干个独立的部分,每部分单独经过一次标准的缩放点积注意力运算;
2. 把所有头产生的结果按顺序连接成一个新的张量;
3. 使用额外的一次全连接层对该联合表征进一步加工优化。
公式化描述为:
\[
\text{MultiHead}(Q,K,V) = [\text{head}_1;...;\text{head}_h]\cdot W_O
\]
其中,
\[
\text{head}_i=\text{Attention}(QW_{Qi},KW_{Ki},VW_{Vi})
\]
以下是 Python 中一个多头注意力模块的具体实现方式:
```python
class MultiHeadAttention(torch.nn.Module):
def __init__(self, embed_dim, num_heads):
super(MultiHeadAttention, self).__init__()
self.embed_dim = embed_dim
self.num_heads = num_heads
assert embed_dim % num_heads == 0
self.head_dim = embed_dim // num_heads
self.qkv_proj = torch.nn.Linear(embed_dim, 3 * embed_dim)
self.o_proj = torch.nn.Linear(embed_dim, embed_dim)
def forward(self, x):
batch_size, seq_len, _ = x.shape
qkv = self.qkv_proj(x).reshape(batch_size, seq_len, 3, self.num_heads, self.head_dim)
q, k, v = qkv.permute(2, 0, 3, 1, 4).unbind(dim=0)
attn_output, _ = scaled_dot_product_attention(q, k, v)
concat_attn = attn_output.transpose(1, 2).contiguous().view(batch_size, seq_len, self.embed_dim)
out = self.o_proj(concat_attn)
return out
```
---
### 总结
以上介绍了三种主要的注意力机制及其背后的理论基础和技术细节。从基本概念出发逐步深入探讨了如何利用这些技术改进神经网络架构性能的方法^。
阅读全文
相关推荐


















