Выбор функции потерь для lstm, обученного на векторах word2vec, когда целью является вектор тех же размеров

У меня есть lstm, который я использую как генератор последовательности, обученный векторам word2vec. Предыдущая реализация произвела распределение вероятностей для всех различных меток. Для каждого слова в словаре был свой ярлык. Эта реализация использовала CrossEntropyLoss Pytorch. Теперь я хочу изменить это, чтобы lstm выводил вектор, который имеет те же размеры, что и векторы, используемые для обучения. Таким образом, я мог использовать меру эвклидовых расстояний, чтобы сопоставить остроумие с близлежащими векторами в словаре. Проблема в том, что для этого мне нужно использовать другую функцию потерь, потому что CrossEntropyLoss подходит для классификаторов, а не для задач регрессии.

Я попытался изменить формат целевого вектора, но функция CrossEntropyLoss torch требует ввода целых чисел, а у меня есть вектор слов. Посмотрев на несколько вариантов, кажется, что Cosine Embedding Loss может быть хорошей идеей, но я не понимаю, как это работает и какой ввод требуется.

Я уже изменил свой полностью подключенный слой на выходные векторы тех же размеров, что и вложения Word, используемые для обучения:

nn.Linear(in_features=self.cfg.lstm.lstm_num_hidden,out_features=self.cfg.lstm.embedding_dim,bias=True)

Будем очень признательны за любые советы и примеры.

См. также:  Подсказка amCharts отображается только на DateAxis, но не на ValueAxis
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Boris

    В документации по CosineEmbeddingLoss говорит:

    Создает критерий, который измеряет потери при двух входных тензорах и метке Tensor со значениями 1 или -1.

    В вашем сценарии вы всегда должны указывать 1 в качестве метки Tensor.

    batch_size, seq_len, w2v_dim = 32, 100, 200
    x1 = torch.randn(batch_size, seq_len, w2v_dim)
    x2 = torch.randn(batch_size, seq_len, w2v_dim)
    y = torch.ones(batch_size, seq_len)
    loss_fn = torch.nn.CosineEmbeddingLoss(reduction='none')
    loss = loss_fn(x1.view(-1, w2v_dim), 
                   x2.view(-1, w2v_dim),  
                   y.view(-1))
    loss = loss.view(batch_size, seq_len)
    

    Здесь я предполагаю, что x1 — это слово «вложения», x2 — это результат LSTM, за которым следует некоторое преобразование.

    Почему я всегда должен указывать 1 в качестве метки Tensor?

    Сначала вы должны увидеть функцию потерь.

    введите здесь описание изображения

    В вашем сценарии, чем выше косинусное сходство, тем меньше должны быть потери. Другими словами, вы хотите максимизировать косинусное сходство. Итак, вам нужно указать 1 в качестве метки.

    С другой стороны, если вы хотите минимизировать косинусное сходство, вам нужно предоставить -1 в качестве метки.

    Я просмотрел документацию и не могу понять, что такое тензорная метка, и почему я всегда должен указывать 1. Не могли бы вы уточнить? person Boris; 25.09.2019

    должны ли значения x1 и x2 быть нормализованы, проходя через softmax ??? person Boris; 03.02.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: