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)
形式输入.
我正在尝试重新创建一个用 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)
形式输入.