外观
简化的自注意力
约 379 字大约 1 分钟
2025-05-23
# 导入PyTorch深度学习框架
import torch
# 定义输入矩阵(包含6个词的3维向量表示)
# 每个向量代表一个词的嵌入表示,例如第一个向量[0.43,0.15,0.89]对应"Your"的编码
inputs = torch.tensor(
[[0.43, 0.15, 0.89], # Your (x^1)
[0.55, 0.87, 0.66], # journey (x^2)
[0.57, 0.85, 0.64], # starts (x^3)
[0.22, 0.58, 0.33], # with (x^4)
[0.77, 0.25, 0.10], # one (x^5)
[0.05, 0.80, 0.55]] # step (x^6)
)
# 选取第2个词向量作为查询向量(索引从0开始)
query = inputs[1]
# 初始化注意力分数容器(存储每个词与查询向量的相关度)
attn_scores_2 = torch.empty(inputs.shape[0])
# 遍历所有词向量计算注意力分数
for i, x_i in enumerate(inputs):
# 通过点积计算相似度(查询向量与每个词向量的关联强度)
attn_scores_2[i] = torch.dot(x_i, query)
print(attn_scores_2)
# 应用Softmax函数将分数转换为概率分布(总和为1)
attn_weights_2 = torch.softmax(attn_scores_2, dim=0)
print("Attention weights:", attn_weights_2)
print("Sum:", attn_weights_2.sum()) # 验证概率分布性质
# 通过矩阵乘法并行计算所有词的注意力分数(输入矩阵与其转置相乘)
attn_scores = inputs @ inputs.T # 等价于torch.matmul(inputs, inputs.T)
print(attn_scores)
# 对每行应用Softmax得到注意力权重矩阵(每个词对所有词的关注度)
attn_weights = torch.softmax(attn_scores, dim=-1)
print(attn_weights)
print("All row sums:", attn_weights.sum(dim=-1)) # 每行概率和应为1
# 计算最终上下文向量(每个词的加权组合表示)
all_context_vecs = attn_weights @ inputs # 权重矩阵与输入矩阵相乘
print(all_context_vecs)
版权所有
版权归属:NateHHX