所以,我对Attention 是你所需要的一切有疑问:
tensorflow官方文档中transformers的实现说:
每个多头注意力块获得三个输入;Q(查询),K(键),V(值)。这些通过线性(密集)层并分成多个头。
但是,该论文提到:
与使用 dmodel 维度的键、值和查询执行单个注意函数不同,我们发现将查询、键和值分别线性投影到 dk、dk 和 dv 维度上的不同学习线性投影是有益的。然后,在每个查询、键和值的投影版本上,我们并行执行注意功能,产生 dv 维输出值。
没有提到拆分Q、K 和 V 以获得正面。相反,论文说它们通过“h”个不同的密集层,以将 d-model 维向量分别转换为“h”个不同的 dk、dk 和 dv 维向量。所以基本上,据我所知,伪代码应该是这样的:
Q,K & V are d-model dimensional vectors.
for i in range(h):
Qi = Dense(dk)(Q)
Ki = Dense(dk)(K)
Vi = Dense(dv)(V)
Ai = Attention(Qi, Ki, Vi)
A0, A1, A2, ..., Ah are then concatenated.
这是正确的吗?还是我在这里遗漏了什么?