提问人:Alvaro Ciudad 提问时间:7/15/2022 更新时间:7/15/2022 访问量:1122
Pytorch:为什么改变损失函数的尺度会提高某些模型的收敛性?
Pytorch: Why does altering the scale of the loss functions improve the convergence in some models?
问:
我有一个关于我所拥有的非常复杂的损失函数的问题。
这是一个变分自编码器损失函数,它相当复杂。
它由两个重建损失组成,KL 散度和一个作为正则化器的判别器。所有这些损失都处于相同的规模上,但我发现,将其中一个重建损失增加 20 倍(同时将其余损失保留在先前的规模上)会大大提高我的模型的性能。
由于我对 DL 还是相当陌生的,我不完全理解为什么会发生这种情况,或者我如何在连续模型上识别这种事情。
任何建议/解释都非常感谢。
答:
2赞
claudiusG
7/15/2022
#1
首先总结一下您的设置:
loss = alpha1 * loss1 + alpha2 * loss2
在计算反向传播的梯度时,我们通过这个公式进行计算。通过误差函数反向传播,我们得到梯度:
dError/dLoss
为了继续向下传播,我们现在要计算 和 。dError/dLoss1
dError/dLoss2
dError/dLoss1
可以通过该隐规则(https://en.wikipedia.org/wiki/Chain_rule)扩展为。
我们已经计算过了,所以我们只需要计算相对于 的推导,即dError/dLoss * dLoss/dLoss1
dError/dLoss
dLoss
dLoss1
dLoss/dLoss1 = alpha1
反向传播现在一直持续到我们达到权重 ()。我们的体重接受的梯度是:dLoss1/dWeight
dError/dWeight = dError/dLoss * dLoss/dLoss1 * dLoss1/dWeight = dError/dLoss * alpha1 * dLoss1/dWeight
正如你所看到的,用于更新我们权重的梯度现在取决于 ,我们用来缩放的因子。
如果我们在不改变梯度的情况下增加梯度,则与梯度产生更大的不同影响,从而改变我们模型的优化。alpha1
Loss1
alpha1
alpha2
Loss1
Loss2
评论
0赞
Alvaro Ciudad
7/15/2022
因此,因为我以这种方式更改梯度,我可能避免了一些可能导致我的 NN 卡住的局部最小值,对吧?但我不太明白的是,如果我删除 alpha 1,损失 1 无论如何都会收敛(尽管速度较慢),而损失 2 则保持在局部最小值。另外,有没有能够在损失函数中检测到这种行为?
0赞
claudiusG
7/16/2022
对于“删除 alpha1”,您的意思是将公式更改为 ?这相当于设置为 1。在这种情况下,您仍将针对损失进行优化1。如果删除 alpha1 意味着您将公式更改为 则不应优化损失 1。因此,优化损耗2可能会使网络形成较小的损耗1,当然,损耗1的减少也可能是偶然发生的。loss = loss1 + alpha2 * loss2
alpha1
loss = alpha2 * loss2
0赞
claudiusG
7/16/2022
最后,权重的梯度为 。通过更改 alpha1 和 alpha2,您可以控制哪个损失函数在梯度上“具有更高的份额”。选择最佳 alpha1 和 alpha2 称为超参数优化。这可能值得一读;)towardsdatascience.com/......dError/dWeight = dError/dLoss * (alpha1 * dLoss1/dWeight + alpha2 * dLoss2/dWeight)
0赞
Alvaro Ciudad
7/17/2022
这些都是公平的评论,只是在我的特定情况下,当您将 alpha1 设置为 1 时,模型会卡在其中一个任务(这是重建之一)上,而另一个重建会改进。在某种程度上,损失 1 卡在局部最小值中,而损失 2 则不会。感谢您的链接,我将深入阅读:)
评论