Как применить функцию потери косинусного сходства в обучении без учителя? - PullRequest
0 голосов
/ 24 марта 2020

На рисунке ниже показана простая архитектура глубокого обучения, способная изучать вложения для предложений. Обучающий набор состоит из пар предложений [[sentence_a],[sentence_b]], имеющих одинаковую семантику.

enter image description here

Цель состоит в том, чтобы точно настроить вложения предложений быть похожим (поскольку предложения в паре имеют одинаковую семантику). Следовательно, возможной функцией потерь будет CosineSimilarity потеря.

Encoder 1 и Encoder 2 имеют одно и то же определение:

from tensorflow.keras import layers


class LSTMEncoder(layers.Layer):

    def __init__(self,
                 units,  # dimensionality of the output space
                 input_dim,  # vocab of size
                 output_dim,  # embedding dimension
                 name='encoder',
                 **kwargs):
        super(Encoder, self).__init__(name=name, **kwargs)
        self.embedding = layers.Embedding(input_dim=input_dim, output_dim=output_dim)
        self.lstm = layers.LSTM(units=units)

    def call(self, inputs):
        emb = self.embedding(inputs)
        return self.lstm(emb)

И модель представлений SEntence (SERModel) выглядит следующим образом :

import tensorflow as tf

from source.layer.rnn_encoder import LSTMEncoder


class SERModel(tf.keras.Model):
    """
    Defines a SEntence Representations Model
    """

    def __init__(self,
                 units,  # dimensionality of the output space
                 input_dim,  # vocab of size
                 output_dim,  # embedding dimension
                 name='SEntence Representations Model',
                 **kwargs):
        super(SERModel, self).__init__(name=name, **kwargs)
        self.encoder = LSTMEncoder(units=units, input_dim=input_dim, output_dim=output_dim)

    def call(self, inputs):
        sentence_a, sentence_b = inputs
        return self.encoder(sentence_a), self.encoder(sentence_b)

Чтобы обучить модель, можно просто сделать, как показано ниже:

from source.model.SERModel import SERModel
import tensorflow as tf


def run_test():

    # load train data
    train_data = load_data()

    ser = SERModel(units=128, input_dim=10000, output_dim=64)

    optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)

    ser.compile(optimizer, loss=tf.keras.losses.CosineSimilarity())
    ser.fit(train_data, epochs=3, batch_size=64)


if __name__ == '__main__':
    run_test()

На данный момент мне нужна помощь. Потеря требует y_true и y_pred, но, как видно, это неконтролируемая тренировка и y_true нет. Итак, есть ли у вас подход, который позволил бы мне обучить вышеупомянутую архитектуру, используя CosineSimilarity убыток?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете преобразовать задачу в контролируемую настройку следующим образом.

В ваших данных обучения [[sentence_a],[sentence_b]] является парным и имеет ту же семантику. В этом случае косинусное сходство равно 1 , это ваше y_true.

Кроме того, вам также нужны непарные сэмплы, потому что их косинусное сходство равно 0 . Чтобы создать непарные образцы, есть простой способ сделать это. Сдвиг sentence_b на одно смещение. То есть

[
[sentence_a_1, sentence_b_2],
[sentence_a_2, sentence_b_3],
[sentence_a_3, sentence_b_4],
]

Итак, теперь у вас есть положительные выборки (ваши тренировочные данные) и сгенерированные вручную отрицательные выборки (сдвинутые). Вы можете тренировать свою модель под наблюдением.

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