多头注意力机制和自注意机制分别公式
时间: 2023-12-03 09:25:05 浏览: 175
多头注意力机制公式:
$$\text{MultiHead}(Q, K, V) = \text{Concat}(head_1, head_2, ..., head_h)W^O$$
其中,$h$ 表示头的数量,$head_i$ 为第 $i$ 个头的注意力计算结果,$W^O$ 是输出矩阵,$\text{Concat}$ 表示将所有头的注意力结果拼接在一起。
每个头的注意力计算公式为:
$$head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)$$
其中,$W_i^Q$,$W_i^K$,$W_i^V$ 是将输入 $Q$,$K$,$V$ 投影到第 $i$ 个头的 $Q$,$K$,$V$ 投影矩阵,$\text{Attention}$ 表示单独计算每个头的注意力。
自注意力机制公式:
$$\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$$
其中,$Q$,$K$,$V$ 分别表示查询(query)、键(key)、值(value)的输入向量,$d_k$ 是键向量的维度,$\text{softmax}$ 表示对注意力权重进行归一化处理。
相关问题
多头注意力机制 公式
多头注意力机制(Multi-head Attention Mechanism)是一种在注意力机制中引入多个注意力头(attention head)的方法,用于提升模型的表达能力和学习能力。公式如下:
首先,给定一个查询向量(query)Q、一个键向量(key)K和一个数值向量(value)V,我们可以计算注意力分数(attention score)A:
A = softmax(QK^T / √d_k)
其中,softmax表示对注意力分数进行归一化,d_k表示查询和键的维度。
然后,我们可以根据注意力分数对值向量进行加权求和,得到注意力输出(attention output)O:
O = AV
在多头注意力机制中,我们引入了多个注意力头,每个头都有自己的查询、键和值向量。然后,将每个头的注意力输出拼接在一起,并通过一个线性变换进行维度变换,得到最终的多头注意力输出。
具体而言,假设有h个注意力头,每个头的维度为d_k:
Q_i = QW_{Qi}
K_i = KW_{Ki}
V_i = VW_{Vi}
其中,W_{Qi}、W_{Ki}和W_{Vi}分别是线性变换的权重矩阵。
对于每个头i,可以根据上述公式计算注意力分数A_i和注意力输出O_i。最后,将所有头的注意力输出拼接在一起,并通过一个线性变换进行维度变换,得到最终的多头注意力输出。
O = Concat(O_1, O_2, ..., O_h)W_O
其中,Concat表示拼接操作,W_O是最终的线性变换的权重矩阵。
通过引入多个注意力头,多头注意力机制可以同时关注不同的语义信息,从而提升模型的表达能力和学习能力。
多头注意力机制公式
### 多头注意力机制的数学公式
多头注意力机制的核心在于通过多个不同的线性变换来计算输入序列的不同表示形式,并将这些不同头部的结果连接起来形成最终输出。以下是其具体实现过程:
#### 查询、键和值的定义
给定查询 \( Q \),键 \( K \) 和值 \( V \),它们分别经过线性变换得到各自对应的矩阵表示[^2]。
\[
Q = XW_Q,\quad K = XW_K,\quad V = XW_V
\]
其中,\( W_Q, W_K, W_V \) 是可学习参数矩阵,用于映射原始特征到新的空间。
#### 单头自注意力计算
单头自注意力可以通过缩放点积注意(Scaled Dot-Product Attention)来计算:
\[
\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
\]
这里 \( d_k \) 表示键向量维度大小,用来防止点积过大而导致梯度消失或爆炸问题。
#### 多头注意力组合
为了捕获更丰富的信息,在多头注意力中会并行执行多次上述操作,每次使用独立的学习权重集。最后将各头结果拼接并通过另一个投影层汇总成单一输出:
\[
\text{MultiHead}(Q,K,V) = [\text{head}_1,...,\text{head}_h]\cdot W_O,
\]
其中,
\[
\text{head}_i=\text{Attention}(QW_i^Q ,KW_i^K ,VW_i^V )
\]
这里的 \( h \) 表示头的数量;\( W_I^{Q}, W_I^{K}, W_I^{V} \) 对应第 i 个头中的转换矩阵;而 \( W_O \) 则是用来融合所有头输出的一个额外全连接网络参数矩阵。
```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)
attn_weights = torch.nn.functional.softmax(scores,dim=-1)
context_vector = torch.matmul(attn_weights,value)
return context_vector,attn_weights
class MultiHeadedSelfAttention(torch.nn.Module):
def __init__(self,d_model,num_heads):
super(MultiHeadedSelfAttention,self).__init__()
assert d_model % num_heads ==0,"Model dimension must be divisible by number of heads."
self.d_head = int(d_model/num_heads)
self.num_heads=num_heads
self.query_projection=torch.nn.Linear(d_model,d_model,bias=False)
self.key_projection=torch.nn.Linear(d_model,d_model,bias=False)
self.value_projection=torch.nn.Linear(d_model,d_model,bias=False)
self.final_linear_layer=torch.nn.Linear(d_model,d_model,bias=False)
def forward(self,x):
batch_size=x.shape[0]
q=self.query_projection(x).view(batch_size,-1,self.num_heads,self.d_head).transpose(1,2)
k=self.key_projection(x).view(batch_size,-1,self.num_heads,self.d_head).transpose(1,2)
v=self.value_projection(x).view(batch_size,-1,self.num_heads,self.d_head).transpose(1,2)
outputs,_=scaled_dot_product_attention(q,k,v)
concatenated_outputs=outputs.transpose(1,2).contiguous().view(batch_size,-1,self.num_heads*self.d_head)
final_output=self.final_linear_layer(concatenated_outputs)
return final_output
```
阅读全文
相关推荐
















