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

问题描述 投票:0回答:1

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

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

pytorch lstm word2vec
1个回答
0
投票

正如CosineEmbeddingLoss的文档所述:

创建给定两个输入张量和带有值1或-1的Tensor标签的损耗的度量标准。

在您的情况下,应始终提供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的输出,然后进行一些转换。

© www.soinside.com 2019 - 2024. All rights reserved.