Self-attention的公式及参数量?为什么用多头?为什么要除以根号d?
时间: 2025-06-27 21:01:03 浏览: 27
### Self-Attention Mechanism 的数学公式
Self-attention 机制的核心在于通过查询 (Query)、键 (Key) 和值 (Value) 来计算加权平均值。具体来说,给定输入序列 \( X \in \mathbb{R}^{n \times d_{\text{model}}} \),其中 \( n \) 是序列长度,\( d_{\text{model}} \) 是模型的隐藏层维度,self-attention 可以表示为:
\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]
这里,
- 查询矩阵 \( Q \in \mathbb{R}^{n \times d_k} \),
- 键矩阵 \( K \in \mathbb{R}^{n \times d_k} \),
- 值矩阵 \( V \in \mathbb{R}^{n \times d_v} \).
这些矩阵由线性变换得到:
\[ Q = XW_Q,\quad K = XW_K,\quad V = XW_V \]
其中 \( W_Q, W_K, W_V \) 分别是权重矩阵。
对于单个头部注意力机制而言,参数数量主要来源于这三个投影矩阵 \( W_Q, W_K, W_V \):
\[ \text{Parameter Count per Head} = d_{\text{model}} \cdot d_k + d_{\text{model}} \cdot d_k + d_{\text{model}} \cdot d_v \]
如果考虑多头注意力,则总参数量会乘上头的数量 \( h \)[^1]。
### 多头注意力的作用
多头注意力允许模型在同一位置关注不同子空间的信息。这有助于捕获更丰富的特征组合,并且可以看作是对单一注意力头的一种扩展形式。相比仅使用一个较大的注意力头来完成所有工作,多个较小规模但独立运作的小型注意力头能够更好地捕捉复杂模式并减少过拟合风险。
### 缩放因子原因
在原始实现中引入了缩放因子即除以根号下键向量维数 (\( \sqrt{d_k} \)) ,主要是为了避免点积结果过大而导致 softmax 函数梯度消失问题 。当两个高斯分布随机变量相乘时其方差增大至原方差平方倍;因此,在实际应用过程中如果不加以控制可能会造成数值不稳定现象发生 .
```python
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.softmax(scores, dim=-1)
output = torch.matmul(attn_weights, value)
return output, attn_weights
```
阅读全文
相关推荐

















