torch.nn.MultiheadAttention 中的查询 Q、键 K 和值 V vectors/matrics 应该是什么?

What should be the Query Q, Key K and Value V vectors/matrics in torch.nn.MultiheadAttention?

关注精彩 blog, I implemented my own self-attention module. However, I found PyTorch has already implemented a multi-head attention moduleMultiheadAttention 模块前向传递的输入包括 Q(查询向量)、K(键向量)和 V(值向量)。奇怪的是,PyTorch 不会只获取输入嵌入并计算内部的 QKV 向量。在我实现的自注意力模块中,我从输入嵌入乘以 QKKV 向量计算得到V 权重。此时,我不确定 MultiheadAttention 模块需要什么 QKV 矢量输入。它们应该是 QKV 权重或向量,它们应该是法向量,还是应该是参数?

如果你看看 pytorch 中 Multihead attention 的实现。 Q、K和V是在训练过程中学习的。在大多数情况下应该小于嵌入向量。所以你只需要定义它们的维度,其他一切都由模块获取。你有两个选择:

    kdim: total number of features in key. Default: None.
    vdim: total number of features in value. Default: None. 

查询向量具有嵌入的大小。 注意:如果 kdim 和 vdim 是 None,它们将被设置为 embed_dim,这样查询、键和值具有相同数量的特征。

更多细节请查看源代码:https://pytorch.org/docs/master/_modules/torch/nn/modules/activation.html#MultiheadAttention

特别是这个 class : class MultiheadAttention(Module):

Q、K 和 V 作为 pytorch MultiheadAttention 的输入是相同的——它们都是嵌入。几乎。 但是为什么MultiheadAttention的forward pass有3个参数呢?那是针对transformer的Decoder——在解码器Q的MultiHeadAttention中来自后续的decoder,K和V来自encoder。这就是前向传播中有 3 个不同参数的原因。如果你看一下原始论文中的图 1,你会看得更清楚。