Механизм внимательного внимания для представления ответа - Keras Layer - PullRequest
1 голос
/ 13 февраля 2020

Со ссылкой на статью «Нейронная сеть BiLSTM с накоплением на основе механизма Coattention для ответа на вопрос» (https://www.hindawi.com/journals/cin/2019/9543490/) я пытаюсь написать собственный слой keras для реализации приведенного ниже набора уравнений .

Мои векторные контекстные формы для вопроса и ответа приведены ниже.

Форма вектора контекста вопроса (CQ): (512, 256)

Вектор формы контекста ответа (CA): (512, 256)

Ожидаемый результат: Оценка косинуса с учетом двух вышеупомянутых векторов контекста в качестве входных данных.

enter image description here

enter image description here

Это мой код для того же.

class score(tf.keras.layers.Layer):

    def __init__(self, units):
        super(score, self).__init__()
        # Initializing the weights
        self.Wam = tf.keras.layers.Dense(units) # Attention matrix of CA at time t.
        self.Wqm = tf.keras.layers.Dense(units) # Attention matrix of OQ
        self.Wms = tf.keras.layers.Dense(units) # Attention weight vector

    def call (self, CQ, CA):

        OQ = tf.keras.layers.GlobalMaxPool1D()(CQ)
        print(OQ.shape)
        CA = tf.expand_dims(CA,1)
        #Maq = tf.nn.tanh(tf.matmul(self.Wam, CA) + tf.matmul(self.Wqm, OQ))
        Maq = tf.nn.tanh(self.Wam(CA) + self.Wqm(OQ))
        Saq  = tf.exp(tf.linalg.matmul(Wms, Maq, transpose_a = True, transpose_b = False))
        OA = CA * Saq
        OA = tf.reduce_sum(OA, axis = 1)

        # Calcutate Cosine similarity of vectors OQ and OA
        dot_product = tf.tensordot(OQ, OA, axes=0)
        # Normalize input
        norm_OQ = tf.nn.l2_normalize(OQ)
        norm_OA = tf.nn.l2_normalize(OA)
        scoreCosine = dot_product / (norm_OQ * norm_OA)

        #Normalize the cosine similarity to the [0, 1] interval 
        scoreCosine = 0.5 * (scoreCosine) + 0.5

        return scoreCosine

score_layer = score(10)
scoreCosine = score_layer(CQ, CA)

Я сталкиваюсь с проблемами с матричными формами на каждом шаге , Я попытался разбить шаги и выполнить каждый в отдельности.

Проблемы, с которыми я сталкиваюсь:

1) Входные матрицы имеют форму 2D, но ожидается слой GlobalMaxPool1D (1-е уравнение) 3D-ввод и получение 2D-вывода.

2) Я инициализировал матрицы внимания (Wam, Wqm) и вектор веса внимания (Wms) в виде плотного слоя с 10 единицами (эталонный слой внимания Bahdanau здесь -> https://www.tensorflow.org/tutorials/text/nmt_with_attention). Это правильно? Это не работает для уравнения 3 (транспонирование Wms), так как это не тензор, а плотный слой.

Пожалуйста, сообщите, если это был правильный подход или где я делаю неправильно. Любая помощь с благодарностью.

...