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自定义损失函数最小化向量之间的角度的主要内容,如果未能解决你的问题,请参考以下文章