Pytorch 当目标是相同维度的向量时,选择word2vec向量上训练的lstm的损失函数

Pytorch 当目标是相同维度的向量时,选择word2vec向量上训练的lstm的损失函数,pytorch,lstm,word2vec,Pytorch,Lstm,Word2vec,我有一个lstm,我用它作为序列生成器,训练word2vec向量。以前的实现为所有不同的标签生成了一个概率分布。词汇表中的每个单词都有一个标签。此实现使用Pytorch的CrossEntropyLoss。我现在想改变这个,这样lstm输出一个向量,它的维数与用于训练的向量相同。通过这种方式,我可以使用欧几里得距离度量将wit与词汇表中邻近的向量相匹配。问题是为了做到这一点,我必须使用不同的损失函数,因为交叉熵适合分类器,而不适合回归问题 我尝试更改目标向量的格式,但torch的CrossEntr

我有一个lstm,我用它作为序列生成器,训练word2vec向量。以前的实现为所有不同的标签生成了一个概率分布。词汇表中的每个单词都有一个标签。此实现使用Pytorch的CrossEntropyLoss。我现在想改变这个,这样lstm输出一个向量,它的维数与用于训练的向量相同。通过这种方式,我可以使用欧几里得距离度量将wit与词汇表中邻近的向量相匹配。问题是为了做到这一点,我必须使用不同的损失函数,因为交叉熵适合分类器,而不适合回归问题

我尝试更改目标向量的格式,但torch的CrossEntropyLoss函数需要整数输入,我有一个字向量。在看了一些选项后,余弦嵌入损耗似乎是个好主意,但我不明白它是如何工作的,需要什么样的输入

我已经将完全连接的层更改为与用于培训的单词嵌入相同维度的输出向量:

nn.Linear(in_features=self.cfg.lstm.lstm_num_hidden,out_features=self.cfg.lstm.embedding_dim,bias=True)
任何建议和示例都将不胜感激。

如的文档所示:

在给定两个输入张量和一个值为1或-1的张量标签的情况下,创建一个度量损失的标准

在您的场景中,应该始终提供1作为张量标签

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作为张量标签

首先,您应该看到损失函数

在您的场景中,余弦相似性越高,损失应该越低。换句话说,您希望最大化余弦相似性。因此,您需要提供1作为标签


另一方面,如果你想最小化余弦相似性,你需要提供-1作为标签。

我已经看过文档,我不知道什么是“张量标签”,为什么我总是提供1。你能详细说明一下吗?x1和x2的值是否应该通过softmax进行标准化???