何实现注意力机制?在自注意力机制中,通过
时间: 2025-01-26 09:02:39 浏览: 22
自注意力机制的实现
自注意力机制的核心在于计算输入序列中各个位置之间的相互关系,并基于这些关系重新加权表示。具体来说,通过查询(Query)、键(Key)和值(Value)三个矩阵来捕捉不同位置间的关系。
查询、键和值的定义
为了实现这一点,在给定输入张量的情况下,通常会创建三个线性变换函数分别对应于Q, K 和 V 的映射[^1]:
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
# 定义 QKV 变换矩阵
self.values = nn.Linear(self.embed_size, self.embed_size, bias=False)
self.keys = nn.Linear(self.embed_size, self.embed_size, bias=False)
self.queries = nn.Linear(self.embed_size, self.embed_size, bias=False)
self.fc_out = nn.Linear(embed_size, embed_size)
多头注意力机制
多头设计允许模型在同一层内关注来自不同表征子空间的信息流。每个头部独立运作并最终聚合结果以形成更丰富的上下文感知向量:
def forward(self, values, keys, query, mask):
N = query.shape[0]
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
# 将嵌入维度分割成多个head
values = self.values(values).view(N, value_len, self.heads, self.embed_size // self.heads)
keys = self.keys(keys).view(N, key_len, self.heads, self.embed_size // self.heads)
queries = self.queries(query).view(N, query_len, self.heads, self.embed_size // self.heads)
# 调整形状以便后续操作
values = values.transpose(1, 2)
keys = keys.transpose(1, 2)
queries = queries.transpose(1, 2)
energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
if mask is not None:
energy = energy.masked_fill(mask == 0, float("-1e20"))
attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3)
out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(
N, query_len, self.embed_size
)
out = self.fc_out(out)
return out
此代码片段展示了如何构建一个多头自注意单元,其中包含了对输入数据进行处理的过程,包括但不限于线性投影、缩放点积相似度计算以及Softmax激活等步骤。
相关推荐



















