Как слой внимания реализован в керасе? - PullRequest
0 голосов
/ 11 июля 2019

Я изучаю модели внимания и их реализации в керасе. При поиске я наткнулся на эти два метода first и second , с помощью которых мы можем создать слой внимания в keras

# First method

class Attention(tf.keras.Model):
    def __init__(self, units):
        super(Attention, 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)
        score = tf.nn.tanh(self.W1(features) + self.W2(hidden_with_time_axis))
        attention_weights = tf.nn.softmax(self.V(score), axis=1)
        context_vector = attention_weights * features
        context_vector = tf.reduce_sum(context_vector, axis=1)

        return context_vector, attention_weights

# Second method

activations = LSTM(units, return_sequences=True)(embedded)

# compute importance for each step
attention = Dense(1, activation='tanh')(activations)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)

sent_representation = merge([activations, attention], mode='mul')

* * * * * * Математическая модель * * * * * * * * * *

enter image description here

Если мы посмотрим на первый метод, то это была прямая реализация математики внимания, тогда как второй метод, который имеет большее количество посещений в интернете, - нет.

Мое настоящее сомнение в этих строках во втором методе

attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)
sent_representation = merge([activations, attention], mode='mul')
  • Какая правильная реализация для внимания?
  • Что такое интуиция за слоем RepeatVector и Permute во втором методе?
  • В первом методе W1, W2 - веса; почему плотный слой считается здесь весом?
  • Почему значение V считается плотным слоем из одной единицы?
  • Что такое V(score) делать?

1 Ответ

2 голосов
/ 11 июля 2019

Какая правильная реализация для внимания?

Я бы порекомендовал следующее:

https://github.com/tensorflow/models/blob/master/official/transformer/model/attention_layer.py#L24

Многолистовой заголовок ВниманиеУровень выше реализует изящный трюк: он изменяет форму матрицы так, чтобы вместо того, чтобы она была в форме (batch_size, time_steps, features), она имела форму (batch_size ,heads, time_steps, features /head) и затем выполняла вычисление для "блок "Features / Heads".

Что такое интуиция за слоем RepeatVector и Permute во втором методе?

Ваш код неполон ... отсутствует умножение матрицв вашем коде (вы не показываете используемый уровень внимания).Это, вероятно, изменило форму результата, и этот код пытается каким-то образом восстановить правильную форму.Это, вероятно, не лучший подход.

В первом методе W1, W2 - веса;почему плотный слой здесь рассматривается как вес?

Плотный слой - это набор весов ... Ваш вопрос немного расплывчат.

ПочемуЗначение V считается плотным слоем, состоящим из одной единицы?

Это очень странный выбор, который не совпадает ни с моим чтением статьи, ни с реализациями, которые я видел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...