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

Deep learning 为什么torch.nn.MultiheadAttention中的W_q矩阵是二次的,deep-learning,nlp,pytorch,torch,attention-model,Deep Learning,Nlp,Pytorch,Torch,Attention Model,我正在尝试在我的网络中实现nn.MultiheadAttention。据报道, 嵌入尺寸–模型的总尺寸 但据报道, 嵌入维度必须可以被num头整除 及 self.q_proj_weight=参数(火炬张量(嵌入尺寸,嵌入尺寸)) 如果我理解正确,这意味着每个头部只接受每个查询的一部分特征,因为矩阵是二次的。这是一个认识上的缺陷还是我的理解有误?每个头部使用投影查询向量的不同部分。您可以想象,查询被拆分为num\u heads向量,这些向量分别用于计算缩放的点积注意力。所以,每个头部在查询中的特征

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

嵌入尺寸–模型的总尺寸

但据报道,

嵌入维度必须可以被num头整除

self.q_proj_weight=参数(火炬张量(嵌入尺寸,嵌入尺寸))


如果我理解正确,这意味着每个头部只接受每个查询的一部分特征,因为矩阵是二次的。这是一个认识上的缺陷还是我的理解有误?

每个头部使用投影查询向量的不同部分。您可以想象,查询被拆分为
num\u heads
向量,这些向量分别用于计算缩放的点积注意力。所以,每个头部在查询中的特征(以及键和值)的不同线性组合上进行操作。使用
self.q\u proj\u weight
矩阵进行线性投影,投影的查询被传递到
F.multi\u head\u attention\u forward
函数

在本文中,它是通过对查询向量进行整形和转置来实现的,这样就可以计算出单个头部的独立注意


注意头的尺寸是PyTorch的设计决定。理论上,您可以使用不同的头部大小,因此投影矩阵的形状将为
embedding\u dim
×
num\u heads*head\u dims
。一些transformers的实现(例如基于C++的机器翻译,或)允许这样做。

谢谢!不过,问题还是有些不同:在torch实现中,我只能看到形状矩阵的乘法(
embed\u dim x embed\u dim
),因此,当我输入Q时,每个头部都会使用矩阵Q的一个子集进行操作,这是真的吗;从技术上讲,说每个注意力头都是在特征的线性组合上运作是正确的。