我有一个lstm用作在word2vec向量上训练的序列生成器。先前的实现为所有不同的标签生成了概率分布。词汇表中的每个单词都有一个标签。此实现使用了Pytorch的CrossEntropyLoss。我现在要更改此设置,以便lstm输出一个向量,该向量具有与用于训练的向量相同的尺寸。这样,我可以使用欧氏距离度量将机智与词汇表中的附近向量匹配。问题在于,为此,我必须使用其他损失函数,因为CrossEntropyLoss适用于分类器,而不适用于回归问题。
我尝试更改目标矢量的格式,但是割炬的CrossEntropyLoss函数需要整数输入,并且我有一个单词矢量。看了几个选项之后,余弦嵌入损耗似乎是一个好主意,但我不知道它是如何工作的以及需要什么样的输入。
我已经将我的完全连接层更改为输出矢量,该矢量的尺寸与用于训练的单词嵌入相同:
nn.Linear(in_features=self.cfg.lstm.lstm_num_hidden,out_features=self.cfg.lstm.embedding_dim,bias=True)
任何建议和示例都将不胜感激。
答案 0 :(得分:2)
CosineEmbeddingLoss的文档中说:
创建一个标准,该标准在给定两个输入张量和一个张量标签为值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作为张量标签?
首先,您应该看到损失函数。
在您的情况下,余弦相似度越高,损失应该越小。换句话说,您想最大化余弦相似度。因此,您需要提供1作为标签。
另一方面,如果要最小化余弦相似度,则需要提供-1作为标签。