python - 为什么在 Transformer 模型中嵌入向量乘以常数?
问题描述
我正在学习应用tensorflow 官方文档Transformer model for language understanding中Attention Is All You Need提出的Transform 模型。
正如位置编码部分所说:
由于该模型不包含任何递归或卷积,因此添加了位置编码以向模型提供有关句子中单词相对位置的一些信息。
位置编码向量被添加到嵌入向量中。
我的理解是positional encoding vector
直接添加到embedding vector
. 但是当我查看代码时,我发现embedding vector
乘以一个常数。
编码器部分的代码如下:
class Encoder(tf.keras.layers.Layer):
def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size,
rate=0.1):
super(Encoder, self).__init__()
self.d_model = d_model
self.num_layers = num_layers
self.embedding = tf.keras.layers.Embedding(input_vocab_size, d_model)
self.pos_encoding = positional_encoding(input_vocab_size, self.d_model)
self.enc_layers = [EncoderLayer(d_model, num_heads, dff, rate)
for _ in range(num_layers)]
self.dropout = tf.keras.layers.Dropout(rate)
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)
我们可以看到x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32))
之前x += self.pos_encoding[:, :seq_len, :]
。
那么为什么在 Transformer 模型中添加位置编码之前,嵌入向量乘以一个常数呢?
解决方案
环顾四周,我发现了这个论点1:
我们在相加之前增加嵌入值的原因是为了使位置编码相对更小。这意味着当我们将它们相加时,嵌入向量中的原始含义不会丢失。
推荐阅读
- python - pylint 报告 pycurl.Curl() 的错误,这是不正确的
- matrix - PyTorch - nn.Linear 权重的形状
- javascript - 使用 cookie 隐藏 div 块并在菜单上显示扩展按钮
- spring - Spring Cloud Gateway:如何将参数传递给自定义过滤器
- laravel - laravel 图表没有从控制器获取数据
- javascript - 从 forEach 循环中获取返回值
- php - 如何使用 Responsive Filemananger 在 Ckeditor 中制作响应式图像
- java - 如何让 EditText 显示我的文本输入?
- couchbase-java-api - 如何在一次操作中将 Java 对象放入 Couchbase 的 JsonObject 中
- python - pandas - 检索使用 unstack 函数提取的数据的问题用 0 填充空值