Я учусь применять Модель преобразования , предложенная Внимание - это все, что вам нужно из официального документа tenorflow Модель трансформера для понимания языка .
Как раздел Позиционное кодирование говорит:
Поскольку эта модель не содержит повторений или сверток,
добавлено позиционное кодирование, чтобы дать модели некоторую информацию о
Относительное положение слов в предложении.
Вектор позиционного кодирования добавляется к вектору внедрения .
Насколько я понимаю, нужно добавить 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?