在查看 Transformer 模型的 Tensorflow 教程时,我意识到他们的编码器层(和解码器)的实现在添加位置编码之前通过嵌入维度的 sqrt 来缩放词嵌入。请注意,这与缩放点积注意力不同。
我在这里指的是 Encoder 类的调用方法的第 3 行:https ://www.tensorflow.org/tutorials/text/transformer#encoder
def call(self, x, training, mask):
seq_len = tf.shape(x)[1]
# adding embedding and position encoding.
x = self.embedding(x) # (batch_size, input_seq_len, d_model)
x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32))
x += self.pos_encoding[:, :seq_len, :]
x = self.dropout(x, training=training)
for i in range(self.num_layers):
x = self.enc_layers[i](x, training, mask)
return x # (batch_size, input_seq_len, d_model)
到目前为止,我在阅读的论文中找不到任何关于这种缩放的提及。人们总是将编码器的输入显示为 WE + PE,即词嵌入加位置编码。但是这个实现似乎使用了 sqrt(d_model) * WE + PE。
我的问题:
- 你见过论文中提到的这个额外的缩放步骤吗?我没有在“Attention is all you need”(Vaswani 等人)中找到它。
- 这种额外的缩放试图实现什么?