Размер позиционного кодирования в учебнике по тензорному потоку - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь понять и поиграть с этим уроком тензорного потока об архитектуре трансформатора, и я нахожу что-то, чего я не понимаю, в Class Decoder.Почему self.pos_encoding = positional_encoding (target_vocab_size, self.d_model) вызывается с target_vocab_size вместо максимальной длины последовательностей?Смотрите эту ссылку и код для класса ниже.Любая идея?https://github.com/tensorflow/docs/blob/master/site/en/r2/tutorials/text/transformer.ipynb

class Decoder(tf.keras.layers.Layer):
  def __init__(self, num_layers, d_model, num_heads, dff, target_vocab_size, 
               rate=0.1):
    super(Decoder, self).__init__()

    self.d_model = d_model
    self.num_layers = num_layers

    self.embedding = tf.keras.layers.Embedding(target_vocab_size, d_model)
    self.pos_encoding = positional_encoding(target_vocab_size, self.d_model)

    self.dec_layers = [DecoderLayer(d_model, num_heads, dff, rate) 
                       for _ in range(num_layers)]
    self.dropout = tf.keras.layers.Dropout(rate)
    def call(self, x, enc_output, training, 
           look_ahead_mask, padding_mask):

    seq_len = tf.shape(x)[1]
    attention_weights = {}

    x = self.embedding(x)  # (batch_size, target_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, block1, block2 = self.dec_layers[i](x, enc_output, training,
                                             look_ahead_mask, padding_mask)

      attention_weights['decoder_layer{}_block1'.format(i+1)] = block1
      attention_weights['decoder_layer{}_block2'.format(i+1)] = block2

    # x.shape == (batch_size, target_seq_len, d_model)
    return x, attention_weights

1 Ответ

0 голосов
/ 10 мая 2019

ОК, думаю, я убедил себя, что в учебнике есть ошибка. При создании позиционных вложений self.pos_encoding = positional_encoding(target_vocab_size, self.d_model) вы должны использовать MAX_LENGTH вместо target_vocab_size. Это устраняет ряд проблем, которые возникали у меня при использовании меньшего словарного запаса и более длинных предложений. Пример в учебнике не ломается, так как в их примере target_vocab_size > MAX_LENGTH, поэтому нет проблем с их настройкой.

...