У меня есть 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)
Будем очень признательны за любые советы и примеры.
В документации по CosineEmbeddingLoss говорит:
В вашем сценарии вы всегда должны указывать 1 в качестве метки Tensor.
Здесь я предполагаю, что
x1
— это слово «вложения»,x2
— это результат LSTM, за которым следует некоторое преобразование.Сначала вы должны увидеть функцию потерь.
В вашем сценарии, чем выше косинусное сходство, тем меньше должны быть потери. Другими словами, вы хотите максимизировать косинусное сходство. Итак, вам нужно указать 1 в качестве метки.
С другой стороны, если вы хотите минимизировать косинусное сходство, вам нужно предоставить -1 в качестве метки.
Я просмотрел документацию и не могу понять, что такое тензорная метка, и почему я всегда должен указывать 1. Не могли бы вы уточнить? — person Boris; 25.09.2019
должны ли значения x1 и x2 быть нормализованы, проходя через softmax ??? — person Boris; 03.02.2020