MultiHeadAttention多头注意力机制的原理

MultiHeadAttention多头注意力作为Transformer的核心组件,其主要由多组自注意力组合构成。

1. self-Attention自注意力机制

在NLP任务中,自注意力能够根据上下文词来重新构建目标词的表示,其之所以被称之为注意力,在于从上下文词中去筛选目标词更需要关注的部分,比如"他叫小明","他"这个词更应该关注"小明"这个上下文。

上图提示了一个输入为两个单词[Thinking, Matchines]的序列在经过自注意力构建后的变换过程:

  • 通过Embeding层,两个单词的one-hot向量转换为embedding向量X=[x1, x2]
  • 通过三组矩阵运算得到query、key、value值,这三组矩阵的输入都是原来同一个输入向量[x1,x2],这也是被称之为自注意力的原因。

       \\ Q=\begin{bmatrix} q_1\\ q_2 \end{bmatrix}_{2\times d_q}=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}_{2\times d_x} *W^Q_{d_x \times d_q}\\ K=\begin{bmatrix} k_1\\ k_2 \end{bmatrix}_{2\times d_k}=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}_{2\times d_x} *W^K_{d_x \times d_k}\\ V=\begin{bmatrix} v_1\\ v_2 \end{bmatrix}_{2\times d_v}=\begin{bmatrix} x_1\\ x_2 \end{bmatrix}_{2\times d_x} *W^K_{d_x \times d_v}

  • 计算query、key间的相似度得分,为了提升计算效率,此处采用缩放点积注意力,其需要query、key向量的维度是相等的,并且都满足零均值和单位方差,此时得分表示:

       \\ score(q, k)=\frac{q\cdot k }{\sqrt{d_k}}\\ Score(Q, K)_{2\times 2}=\begin{bmatrix} s_{11} & s_{12}\\ s_{21} & s_{22}\end{bmatrix}_{2 \times 2}=\frac{1}{\sqrt{d_k}}\begin{bmatrix} q1 && q1\\ q2 && q2 \end{bmatrix}_{2\times d_q}\begin{bmatrix} k1 & k2 \\ k1 & k2 \end{bmatrix}_{d_q \times 2}

  • 对相似度得分矩阵求softmax进行归一化(按axis=1维进行),在实际中由于进行transformer中的输入序列要求是定长的,因此会有补余向量,此时这里softmax会有一个掩蔽操作,将补余部分都置为0。

       

### 多头注意力机制的工作原理 多头注意力机制是 Transformer 架构中的核心组件之一,旨在增强模型的表达能力和捕捉复杂模式的能力。以下是对其工作原理的具体解释: #### 1. 核心思想 多头注意力机制是对单一注意力机制的扩展,其主要目标是通过多个“头”并行地学习输入数据的不同子空间的相关性[^1]。这种设计使得模型能够捕获更丰富的特征表示。 #### 2. 数学描述 假设输入序列为 \(X\),维度为 \((n, d)\),其中 \(n\) 是序列长度,\(d\) 是嵌入向量的维度。在多头注意力机制中,输入会被线性变换为查询矩阵 (\(Q\))、键矩阵 (\(K\)) 和值矩阵 (\(V\))。具体计算如下: \[ Q = XW_Q,\ K = XW_K,\ V = XW_V \] 这里 \(W_Q\)、\(W_K\) 和 \(W_V\) 是可训练参数矩阵[^4]。 接着,每个“头”独立执行缩放点积注意力 (Scaled Dot-Product Attention) 计算: \[ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \] 最终,所有“头”的输出被拼接在一起并通过另一个线性层进行转换: \[ \text{MultiHead}(Q,K,V) = [\text{head}_1; \text{head}_2; ... ; \text{head}_h] W_O \] 其中 \(h\) 表示“头”的数量,\(W_O\) 是用于融合各“头”输出的权重矩阵。 #### 3. 解决自注意力机制的局限性 相比于单头的自注意力机制,多头注意力机制可以缓解模型过度关注当前位置本身的问题。这是因为多头结构允许多个视角同时作用于同一组输入数据,从而提升有效信息抓取能力[^2]。 #### 4. 实际意义 多头注意力机制不仅提高了模型对不同上下文关系的理解能力,还增强了其灵活性和鲁棒性。这使其成为自然语言处理以及其他序列建模任务中的重要工具[^3]。 ```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 class MultiHeadAttention(torch.nn.Module): def __init__(self, num_heads, embed_dim): super(MultiHeadAttention, self).__init__() self.num_heads = num_heads self.embed_dim = embed_dim assert embed_dim % num_heads == 0, "Embedding dimension must be divisible by number of heads." self.head_dim = embed_dim // num_heads self.q_linear = torch.nn.Linear(embed_dim, embed_dim) self.k_linear = torch.nn.Linear(embed_dim, embed_dim) self.v_linear = torch.nn.Linear(embed_dim, embed_dim) self.fc_out = torch.nn.Linear(embed_dim, embed_dim) def forward(self, query, key, value): batch_size = query.shape[0] q = self.q_linear(query).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) k = self.k_linear(key).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) v = self.v_linear(value).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) energy = torch.matmul(q, k.permute(0, 1, 3, 2)) / math.sqrt(self.head_dim) attention = torch.softmax(energy, dim=-1) x = torch.matmul(attention, v) x = x.transpose(1, 2).contiguous().view(batch_size, -1, self.embed_dim) out = self.fc_out(x) return out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值