【发布时间】:2021-06-27 09:54:29
【问题描述】:
我正在尝试训练一个使用多重损失的模型。我注意到在某些实现中,单个损失函数被声明为 loss_fct = nn.LossFunction() 并多次用于计算单独的损失,这些损失被求和并反向传播。例如:
loss_fct = nn.LossFunction()
loss1 = loss_fct(pred1, labels1)
loss2 = loss_fct(pred2, labels2)
total_loss = loss1 + loss2
total_loss.backward()
optimizer.step()
这样可以吗,还是我应该为每个损失声明单独的损失函数对象?如果这没问题,为什么没问题?这对我来说似乎违反直觉,因为它们是我们根据不同目的优化的单独损失。一次求和和反向传播有点道理,但我无法使用单个损失对象来解决问题。
【问题讨论】:
-
不确定我是否理解这个问题,但这比
nn.LossFunction()(pred1, labels1)更简洁 -
我想我在阅读评论后可能会有更好的想法。我最初认为损失函数本身就是我们正在优化的东西,但将其简单地视为一个函数是否正确?所以只要我们提供不同的输入,我们是否重用同一个对象并不重要?
-
没错。 Python 函数可以像其他任何东西一样保存为变量,并且(理想情况下)是无状态的,因此使用来自它们的不同输入就可以了。
-
特别是损失函数是具有自定义
__call__方法的类。它们以这种方式实现(而不仅仅是一个普通函数),因为它们可以通过各种方式进行参数化。