В чем разница между двумя разными кодами сообщения Bahdanau's Attention, приведенными в официальных руководствах по Tensorflow?

Я читал и кодировал для задачи машинного перевода и наткнулся на два разных руководства.

Одним из них является бумажная реализация создания подписей с использованием визуального внимания, в которой они использовали функции изображения [64,2048] таким образом, что каждое изображение представляет собой предложение из 64 слов, а каждое слово в предложении имеет вложение длиной 2048. Я полностью понимаю эту реализацию, и вот код для Bahdanau's Additive style Attention ниже:

class BahdanauAttention(tf.keras.Model):
  def __init__(self, units):
    super(BahdanauAttention, self).__init__()
    self.W1 = tf.keras.layers.Dense(units)
    self.W2 = tf.keras.layers.Dense(units)
    self.V = tf.keras.layers.Dense(1)

  def call(self, features, hidden):
    hidden_with_time_axis = tf.expand_dims(hidden, 1)
    attention_hidden_layer = (tf.nn.tanh(self.W1(features) + self.W2(hidden_with_time_axis)))
  
    score = self.V(attention_hidden_layer)

    attention_weights = tf.nn.softmax(score, axis=1)

    context_vector = attention_weights * features
    context_vector = tf.reduce_sum(context_vector, axis=1)
    
    return context_vector, attention_weights

Но когда я перешел к Задаче перевода нейронного машинного языка, я обнаружил там этот комплекс, который я я не могу понять, что здесь происходит:

class BahdanauAttention(tf.keras.layers.Layer):
  def __init__(self, units):
    super().__init__()
    self.W1 = tf.keras.layers.Dense(units, use_bias=False)
    self.W2 = tf.keras.layers.Dense(units, use_bias=False)
    
    self.attention = tf.keras.layers.AdditiveAttention()

  def call(self, query, value, mask):
    w1_query = self.W1(query)
    w2_key = self.W2(value)

    query_mask = tf.ones(tf.shape(query)[:-1], dtype=bool)
    value_mask = mask

    context_vector, attention_weights = self.attention(inputs = [w1_query, value, w2_key],mask=[query_mask, value_mask],return_attention_scores = True,)
    return context_vector, attention_weights

Я хочу спросить

  1. В чем разница между ними?
  2. Почему мы не можем использовать код для создания титров во втором или наоборот?

person Deshwal    schedule 27.05.2021    source источник
comment
Отвечает ли это на ваш вопрос? Формы вывода слоя Keras AdditiveAttention   -  person M.Innat    schedule 27.05.2021
comment
Значит, вы хотите сказать, что мы можем использовать обе вещи в обеих задачах взаимозаменяемо, если я могу передать свои входящие и исходящие параметры одинаковой формы?   -  person Deshwal    schedule 27.05.2021
comment
Они выглядят как две разные реализации одного и того же, с небольшими различиями между ними. Глядя на код, я не думаю, что они будут иметь практическую разницу в производительности. Однако, чтобы получить правильную точную реализацию, вам придется ознакомиться с бумагой, которая представила Bahdanau Attention.   -  person Susmit Agrawal    schedule 27.05.2021
comment
@SusmitAgrawal Создают ли они decoder_state_t из оценок, текущего слова и hidden_decoder state_t-1. А потом снова использовать это слово, очки и это new_decoder_state_t для создания векторов? Я думаю, они делают это на втором коде. Вы можете прокомментировать?   -  person Deshwal    schedule 28.05.2021