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

pytorch custom loss function on minimizing the angle between vectors

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

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 - cos(A)(其中A是两者之间的角度差)那么那相当于说目标是最大化cos(A),这又相当于最小化两者之间的角度向量。

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

您可能会问的另一个问题是“1 有什么重要意义?我们可以直接说 loss = -loss”吗?答案是……视情况而定。理论上是的,这是等价的,并且 one 在反向传播中不起作用(因为它随着导数消失)。然而,一旦我们开始讨论带有数值错误和复杂 optimizers/update 规则的实际优化,那么常量 1 可能会发挥作用。

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

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