pytorch自定义损失函数最小化向量之间的角度

Posted

技术标签:

【中文标题】pytorch自定义损失函数最小化向量之间的角度【英文标题】:pytorch custom loss function on minimizing the angle between vectors 【发布时间】:2021-04-03 04:17:12 【问题描述】:

目标是在神经网络设置中最小化实际向量和预测向量之间的角度。有人可以检查以下执行是否正确?

criterion = nn.CosineSimilarity() 
loss = torch.mean(torch.abs(criterion(actual_vectors,predicted_vectors)))

#back-propagation on the above *loss* will try cos(angle) = 0. But I want angle between the vectors to be 0 or cos(angle) = 1.

loss = 1 - loss

#To me, the above does not seem right. Isn't back-propagation on the above 'loss' similar to minimizing the negative of 'loss' from line 2?
#Does '1' have no role to play here when back-propagation is applied?

loss.backward()

【问题讨论】:

【参考方案1】:

理论上这是有道理的。反向传播的目标是最小化损失。如果损失是1 - cos(A)(其中A是两者之间的角度差),那么这相当于说目标是最大化cos(A),这反过来又相当于最小化两个向量之间的角度。

一个简单的例子是最小化X^2 + 4 的目标,该优化问题的答案与最大化-(X^2 + 4) 的目标的答案相同。在整个等式上加上一个减号并将 min 与 max 交换将使语句等效。因此,如果您有一个想要 MAXIMIZE 的函数,而您的优化模型只能 MINIMIZE,那么只需在您的函数上加一个减号,就可以结束了。

您可能会问的另一个问题是“1 有什么重要意义?我们可以说loss = -loss”吗?答案是……这取决于。理论上是的,这是等效的,并且在反向传播中不起作用(因为它随着导数消失)。但是,一旦我们开始讨论具有数值错误和复杂优化器/更新规则的实际优化,那么常量 1 可能会起作用。

使用 1 的另一个原因是,您的损失可以很好地定义在 0 和 1 之间,这是一个很好的属性。

所以是的,通过反向传播最小化1 - cos(A) 的损失相当于最小化向量之间的角度。

【讨论】:

这很有帮助!此外,“您可能会问的另一个问题是“1 有什么意义?” - 这是我真正想到的另一个问题。感谢您对此的意见。 嗨@AjayA 如果这个或任何答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。 嗨@A Kareem,当然。将等待一两天来听取其他人的意见(如果有),并确保接受答复

以上是关于pytorch自定义损失函数最小化向量之间的角度的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 运行自定义损失函数

pytorch 自定义损失函数 nn.CrossEntropyLoss

Pyotorch自定义损失函数

如何在 PyTorch 中添加自定义定位损失函数?

pytorch自定义多分类损失函数怎么反向传播

PyTorch 中自定义后向函数的损失 - 简单 MSE 示例中的爆炸损失