Transformers:如何获取编码器的输出(键和值)?

人工智能 自然语言处理 变压器 伯特 注意力
2021-10-20 04:20:37

我正在阅读论文Attention Is All You Need

编码器的最后一步似乎是 LayerNorm(relu(WX + B) + X),即添加 + 归一化。这应该会导致nXdmodel矩阵,其中n是编码器输入的长度。

我们如何转换这个nXdmodel矩阵成键K和价值观V输入解码器的编码器-解码器注意步骤?

请注意,如果h是模型中注意力头的数量,维度KV都应该是nXdmodelh. 为了h=8,这意味着我们需要一个nXdmodel4矩阵。

我们是否只是简单地添加一个额外的线性层来学习dmodelXdmodel4权重矩阵?

还是我们使用最后的 Add & Norm 层的输出,并且简单地使用第一个dmodel4矩阵的列并丢弃其余部分?

1个回答

我已经阅读了 OpenNMT 源代码(https://github.com/OpenNMT/OpenNMT-py/blob/cd29c1dbfb35f4a2701ff52a1bf4e5bdcf02802e/onmt/modules/multi_headed_attn.py)。

似乎有一个额外的线性层学习了权重WkeyWvalue(加上偏差),因此要获得输出(键和值),您将编码器的最终添加 + 范数层的输出乘以Wkey得到钥匙,然后通过Wvalue获取值。

此外,这些权重和偏差似乎在每个解码层中都是独立的。因此,您输入相同的编码器输出(添加 + 范数层输出),但乘以不同的WkeyWvalue矩阵并为每个解码层添加不同的偏差,从而为每个层生成不同的键和值