【发布时间】:2021-03-08 21:37:34
【问题描述】:
我想问一个关于使用两个损失来训练一个模型的问题。
我将生成一些特定类型的疑问句。
为了实现它,我使用
(1) 一个正常的 GAN 来生成正常的问题空间。然后
(2) 一个辅助分类器,让生成器专注于生成这类问题。
通过预实验,当我在 Generator-Discriminator 损失 (loss_G_D) 上使用 BCELoss() 时,损失值约为 3。
当我在 Generator-Classifier loss (loss_G_C) 上使用 -Entropy 时,损失值总是负数,而且非常大,例如-300.
为了不让他们相互影响训练过程,我采用了这种训练方式。
optimizer.zero_grad()
loss_G_D = BCELoss(discriminator(generated_data))
loss_G_D.backward()
optimizer.step()
optimizer.zero_grad()
loss_G_C = -Entropy(classifier(generated_data))
loss_G_C.backward()
optimizer.step()
但是,此训练过程有点慢,似乎他们将网络训练“来回”。 所以一个朋友建议我这个方法:
optimizer.zero_grad()
loss_G_D = BCELoss(discriminator(generated_data))
loss_G_C = -Entropy(classifier(generated_data))
loss = loss_G_D+loss_G_C
# if you worry about the scale, give some weight, like
# loss = loss_G_D+0.01*loss_G_C
loss.backward()
optimizer.step()
我认为这是有道理的。但是,就像loss_G_D是3,loss_G_C是-300,加起来不会导致梯度消失吗?使用 loss = loss_G_D+0.01*loss_G_C=0 ?
或者我可以说因为它们是不同类型的损失,考虑到总是正面和负面的,我们不应该把它们加起来吗?
(PS。我想也许将 -Entropy 损失映射到一个始终为正的激活函数中,然后将两个损失相加就可以了?)
【问题讨论】:
标签: machine-learning deep-learning pytorch