当目标是相同尺寸的向量时,为在word2vec向量上训练的lstm选择损失函数

时间:2019-09-25 14:45:38

标签: pytorch lstm word2vec

我有一个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)

任何建议和示例都将不胜感激。

1 个答案:

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

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

enter image description here

在您的情况下,余弦相似度越高,损失应该越小。换句话说,您想最大化余弦相似度。因此,您需要提供1作为标签。

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