deep-learning - 为什么 torch.nn.MultiheadAttention 中的 W_q 矩阵是二次的

标签 deep-learning nlp pytorch torch attention-model

我正在尝试在我的网络中实现 nn.MultiheadAttention。根据docs ,

embed_dim  – total dimension of the model.

但是,根据 source file ,

embed_dim must be divisible by num_heads

self.q_proj_weight = Parameter(torch.Tensor(embed_dim, embed_dim))

如果我理解正确,这意味着每个头仅采用每个查询的一部分特征,因为矩阵是二次的。是实现的bug还是我的理解有误?

最佳答案

每个头使用投影查询向量的不同部分。您可以将其想象为查询被拆分为 num_heads 向量,这些向量独立用于计算缩放后的点积注意力。因此,每个头对查询中的特征(以及键和值)的不同线性组合进行操作。此线性投影是使用 self.q_proj_weight 矩阵完成的,并将投影的查询传递给 F.multi_head_attention_forward 函数。

F.multi_head_attention_forward ,它是通过 reshape 和转置查询向量来实现的,以便可以计算各个头的独立注意力 efficiently by matrix multiplication .

注意力头的大小是 PyTorch 的设计决定。理论上,您可以有不同的头部尺寸,因此投影矩阵的形状为 embedding_dim × num_heads * head_dims。转换器的某些实现(例如用于机器翻译的基于 C++ 的 MarianHuggingface's Transformers )允许这样做。

关于deep-learning - 为什么 torch.nn.MultiheadAttention 中的 W_q 矩阵是二次的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63657679/

相关文章:

python - 查找并替换为以小写字母开头的正确句子案例句子。正则表达式或崇高

python - 连接两个池化层的特征

python - 为什么我在简单的 Keras 功能 API 中收到输入错误?

java - 如何在java中查找文本中的名称实体

python - Pytorch:如何找到 2D 张量的每一行中第一个非零元素的索引?

pytorch - 在 Pytorch 中裁剪一小批图像——每个图像都不同

python - 逐渐衰减损失函数的权重

python - 输出Keras中add_loss添加的多重loss

python - TensorFlow 无法识别 feed_dict 输入

nlp - 查找相似/相关文本算法