MultiHeadAttention 在版本之间给出非常不同的值(Pytorch/Tensorflow

MultiHeadAttention giving very different values between versions (Pytorch/Tensorflow

我正在尝试重新创建一个用 Pytorch 编写的转换器并使其成为 Tensorflow。一切都进行得很顺利,直到每个版本的 MultiHeadAttention 开始给出截然不同的输出。这两种方法都是论文“Attention is all you Need”中描述的多头注意力的实现,因此它们应该能够实现相同的输出。

我正在转换

self_attn = nn.MultiheadAttention(dModel, nheads, dropout=dropout)

self_attn = MultiHeadAttention(num_heads=nheads, key_dim=dModel, dropout=dropout)

对于我的测试,dropout 是 0。

我打电话给他们:

self_attn(x,x,x)

其中 x 是张量,形状为 (10, 128, 50)

正如 documentation 所预期的那样,Pytorch 版本 returns 一个元组,(目标序列长度,嵌入维度),维度均为 [10, 128, 50]。

我无法让 TensorFlow 版本执行相同的操作。使用 Tensorflow,我只得到一个张量(大小 [10, 128, 50]),它看起来既不像目标序列长度,也不像来自 pytorch 的嵌入维度张量。 基于 Tensorflow documentation 我应该得到类似的东西。

如何让它们以相同的方式运行?我猜我在使用 Tensorflow 时做错了什么,但我不知道是什么。

nn.MultiheadAttention 默认输出带有两个张量的元组:

  • attn_output -- self-attention 操作的结果

  • attn_output_weights -- 平均注意力权重()超过 heads

同时tf.keras.layers.MultiHeadAttention默认只输出一个张量attention_output(对应pytorch的attn_output)。如果参数return_attention_scores设置为True,也会返回所有头的注意力权重,如:

output, scores = self_attn(x, x, x, return_attention_scores=True)

Tensorscores也应该取平均以实现与pytorch的完全对应:

scores = tf.math.reduce_mean(scores, 1)

重写时请记住,默认情况下(如所讨论的片段)nn.MultiheadAttention 期望以 (seq_length, batch_size, embed_dim) 形式输入,但 tf.keras.layers.MultiHeadAttention 期望以 (batch_size, seq_length, embed_dim) 形式输入.