一段时间以来一直试图解决这个问题。我发现了这个类似的问题,但我认为提议的答案实际上并没有解决这个问题。
在编码器/解码器 Transformer 的推理模式下,我的理解是我们不会预先填充解码器输入序列以匹配编码器序列长度(即传入[start_id,]
而不传入[start_id, pad_id, pad_id, ...]
)
我可能会遗漏一些东西,但是当我不预填充时,注意机制无法正确计算矩阵乘法,因为解码器输入的 seq_length = 1,而编码器 seq_length > 1 ( T
)。作为参考(参见附图),我在每个步骤中识别了张量形状,您可以看到在给定不兼容的张量形状的情况下无法执行最后一个 matmul 步骤的位置。
我缺少什么?我应该预填充解码器输入吗?或者我是否截断编码器输出以匹配解码器长度?还有别的事吗?
你把顺序弄混了。对于编码器/解码器变压器中的交叉注意力,
query
和 来自key
解码value
器。您可以在原始的《Attention Is All You Need》论文中查看这一点。在第 3.2.3 节中:
假设我们的解码器
query
的大小为(bs, sl_d, n)
,编码器的key
/value
的大小为(bs, sl_e, n)
。当我们计算注意力时,我们的注意力图的大小
query
将为。然后,我们将注意力图与size 相乘,给出 size 的结果,该结果与解码器的初始查询大小匹配。key
(bs, sl_d, sl_e)
value
(bs, sl_e, n)
(bs, sl_d, n)
为了简洁起见,我省略了多头方面,但同样适用于那里,只是有一个额外的轴和尺寸的重塑
d_model
。