我们就做到了由一整个sequence得到b1。input vector(a)-------->SELF ATTENTION---------->output(b)那如果从矩阵乘法的角度去理解SELF-ATTENTION呢?
时间: 2025-05-16 13:02:07 浏览: 22
### 自注意力机制(Self-Attention)的矩阵乘法解释
#### 输入与输出
自注意力机制的核心在于其输入 \( I \) 和输出 \( O \),其中 \( I \) 是由一系列向量组成的矩阵,这些向量拼接成矩阵的列[^1]。而最终的输出 \( O \) 则是由经过加权处理后的值向量组成[^2]。
#### 参数矩阵的作用
为了实现这一过程,自注意力机制引入了三个可学习的参数矩阵:\( W_q \), \( W_k \), 和 \( W_v \)。这三个矩阵分别用于生成查询向量 (Query Vector)、键向量 (Key Vector) 和值向量 (Value Vector)。
#### 查询、键和值的计算
具体来说,给定输入矩阵 \( I \),可以通过以下方式计算 Query (\( Q \))、Key (\( K \)) 和 Value (\( V \)):
\[
Q = I \cdot W_q, \quad K = I \cdot W_k, \quad V = I \cdot W_v
\]
这里,\( W_q \), \( W_k \), 和 \( W_v \) 是权重矩阵,它们将原始输入转换为适合后续计算的形式[^3]。
#### Attention Score 的计算
接着,通过计算 Query 向量与 Key 向量之间的点积来获得 attention scores:
\[
S_{ij} = \text{softmax}\left(\frac{Q_i \cdot K_j}{\sqrt{d}}\right)
\]
这里的 \( d \) 表示向量维度,除以 \( \sqrt{d} \) 可以防止点积过大而导致 softmax 函数梯度消失。
#### 输出的生成
最后一步是利用上述 attention scores 对应地加权求和 Value 向量,从而得到输出矩阵中的每一行:
\[
O_i = S_i \cdot V
\]
值得注意的是,在实际操作中,所有的 \( b_1, b_2, b_3, ... \) 并不是逐一计算出来的,而是通过高效的矩阵运算一次性完成。
#### 效率比较
从效率角度来看,当数据规模增大时,基于矩阵运算的 self-attention 方法相较于传统的 CNN 或 RNN 更具优势[^4]。这是因为 self-attention 能够并行化处理序列中的每一个位置的信息,而不像 RNN 那样受限于顺序依赖关系。
```python
import numpy as np
def scaled_dot_product_attention(Q, K, V):
# 计算 dot product
scores = np.matmul(Q, K.T) / np.sqrt(K.shape[-1])
# 应用 softmax 得到 attention weights
attn_weights = np.softmax(scores, axis=-1)
# 加权求和 value vectors
output = np.matmul(attn_weights, V)
return output, attn_weights
```
阅读全文