自注意力机制和多头注意力机制讲解
时间: 2025-04-27 11:28:27 浏览: 35
### 自注意力机制与多头注意力机制
#### 自注意力机制 (Self-Attention Mechanism)
自注意力机制的核心在于决定预测下一个词时应该关注哪些先前的词语[^2]。这种机制允许模型在处理序列数据时,不仅考虑当前输入的位置信息,还能够动态地加权不同位置的信息。具体来说,在自然语言处理中,这意味着可以更灵活地捕捉句子内部的关系。
该过程通过计算查询(Query)、键(Key)以及值(Value)三者之间的相似度来实现。对于给定的一个时间步上的token,会与其他所有tokens分别计算其对应的Q-K乘积作为权重,并以此为依据对V进行加权求和得到最终输出向量。
```python
import torch.nn.functional as F
def scaled_dot_product_attention(query, key, value):
d_k = query.size(-1)
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k) # 计算得分矩阵
p_attn = F.softmax(scores, dim=-1) # 归一化分数
output = torch.matmul(p_attn, value) # 加权求和值得到输出
return output, p_attn
```
#### 多头注意力机制 (Multi-Head Attention Mechanism)
为了进一步增强表达能力,引入了多头注意力机制。这一方法本质上是在同一层内运行多个独立的自注意单元,即创建若干组不同的线性变换参数W_q、W_k 和 W_v 来映射原始特征空间中的query、key 及value 向量[^1]。这样做使得网络可以在不同子空间上学习多样化的表示模式,从而更好地建模复杂关系。
每个头部都执行一次完整的self-attention操作,之后将各个head的结果拼接起来并通过一个全连接层投影回初始维度:
```python
class MultiHeadedAttention(nn.Module):
def __init__(self, h, d_model, dropout=0.1):
super().__init__()
assert d_model % h == 0
self.d_k = d_model // h
self.h = h
self.linears = clones(nn.Linear(d_model, d_model), 4)
self.attn = None
self.dropout = nn.Dropout(p=dropout)
def forward(self, query, key, value, mask=None):
nbatches = query.size(0)
query, key, value = \
[l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2)
for l, x in zip(self.linears, (query, key, value))]
x, self.attn = attention(query, key, value, mask=mask,
dropout=self.dropout)
x = x.transpose(1, 2).contiguous() \
.view(nbatches, -1, self.h * self.d_k)
del query, key, value
return self.linears[-1](x)
```
阅读全文
相关推荐


















