自注意力机制(Self-Attention)是一种在自然语言处理(NLP)和计算机视觉领域广泛使用的机制。它能够让模型关注输入序列中不同位置的信息,以捕获潜在的长期依赖关系。在这篇文章中,我们将介绍自注意力机制的基本流程,并给出Python代码实现示例。
自注意力机制的基本流程
自注意力机制的关键步骤可以概括为以下几个部分:
-
输入表示:将输入序列转换为一个向量表示,常用的表示方式是使用词嵌入(Word Embedding)。
-
计算 Q、K、V:对于输入序列,生成查询(Query)、键(Key)和值(Value)向量。这一步通过对输入向量进行线性变换实现。
-
计算注意力权重:通过将查询向量与所有键向量进行点积,然后应用softmax函数来得到注意力权重。这些权重用来表示序列中不同位置的重要性。
-
加权求和:计算注意力权重与对应的值向量(Value)之间的加权和,以获取最终的输出。
代码实现示例
下面是一个简单的自注意力机制的Python实现:
import numpy as np
class SelfAttention:
def __init__(self, input_dim, output_dim):
# 输入和输出维度
self.input_dim = input_dim
self.output_dim = output_dim
# 权重矩阵初始化
self.W_Q = np.random.rand(input_dim, output_dim) # 查询权重
self.W_K = np.random.rand(input_dim, output_dim) # 键权重
self.W_V = np.random.rand(input_dim, output_dim) # 值权重
def softmax(self, x):
exp_x = np.exp(x - np.max(x)) # 防止溢出
return exp_x / exp_x.sum(axis=1, keepdims=True)
def forward(self, X):
# 生成 Q、K、V
Q = X @ self.W_Q # 查询
K = X @ self.W_K # 键
V = X @ self.W_V # 值
# 计算注意力权重
attention_scores = Q @ K.T / np.sqrt(self.output_dim) # 缩放点积
attention_weights = self.softmax(attention_scores) # 归一化注意力权重
# 加权求和
output = attention_weights @ V
return output, attention_weights
# 示例使用
if __name__ == "__main__":
# 假设输入序列有5个词,词向量维度为4
input_data = np.random.rand(5, 4) # 随机初始化输入数据
self_attention = SelfAttention(input_dim=4, output_dim=4) # 实例化自注意力
output, weights = self_attention.forward(input_data)
print("输出结果:\n", output)
print("注意力权重:\n", weights)
代码解析
-
类初始化:
SelfAttention
类接受输入维度和输出维度,并初始化三个权重矩阵W_Q
、W_K
、W_V
。 -
Softmax函数:实现了softmax函数,以确保注意力权重可以归一化。
-
前向传播:
forward
函数首先计算查询Q、键K和值V向量,然后计算缩放的点积注意力分数,接着应用softmax函数得到归一化的注意力权重,最后计算加权和得到输出。 -
测试:在主程序部分,我们随机生成一个5个词,每个词4维的输入数据,并通过自注意力层计算输出和注意力权重。
总结
自注意力机制是一种强大的工具,使得模型能够更灵活地处理输入序列间的关系。通过上述的代码示例,我们可以直观地理解其工作原理及实现方式。这种机制在Transformer架构中得到了广泛应用,并推动了NLP和计算机视觉领域的发展。希望这篇文章能够帮助你理解自注意力机制的基本流程。