【问题标题】:Calculate loss in train epoch function计算训练时期函数中的损失
【发布时间】:2020-10-06 07:34:32
【问题描述】:

in train_epoch function

我们有三种损失

  1. 损失
  2. batch_loss
  3. train_loss

据我了解 loss 是一个张量,batch loss 是 tensor 的值,train_loss 是 batch_loss 的累积值,这对我来说没问题。

我的问题是为什么 AllenNLP 考虑了 batch_loss 并没有计算 batch_group 的累积损失?

我也不明白 epoch 内需要 batch_group,batch_group 内需要批处理

这是我的理解 我们里面有 epoch 我们在 batch_group 里面有 batch_group 我们有批处理 batch_loss 是为 batch 而不是为 batch_group 计算的,为什么?

【问题讨论】:

  • 在这一行github.com/allenai/allennlp/blob/… 我认为有一个错误我们不应该先累积批量损失,然后在完成 for 循环后将 batch_reg_loss 添加到总 train_reg 损失中,就像使用 batch_loss 所做的那样?跨度>

标签: allennlp


【解决方案1】:

我的问题是为什么 AllenNLP 考虑了 batch_loss 并没有计算 batch_group 的累积损失?

这实际上是一个错误,所以感谢您指出这一点!现在有一个 PR 可以修复它:https://github.com/allenai/allennlp/pull/4706

我也不明白在 epoch 中需要 batch_group,并且 batch_group 中的批处理

batch_group 始终只包含一个 batch,除非您使用大于 1 的 num_gradient_accumulation_steps,即您正在使用梯度累积,这是一种获得更大有效批量大小的方法。

例如,请参阅https://medium.com/ai2-blog/tutorial-training-on-larger-batches-with-less-memory-in-allennlp-1cd2047d92ad

【讨论】:

  • 现在我有另一个与向后有关的问题。对这三种损失中的哪一种损失做后向比较好,为什么?用batch_loss.backward()可以吗
  • 请问我们为什么要划分 len(batch_group)?
  • batch_loss 只是跟踪一个批次组的损失,但它不是张量,它只是一个浮点数,所以我们不能在上面调用.backwards()。相反,我们在每个批次的 loss 张量上调用 .backwards(),累积批次组中的梯度,直到我们用完批次组,此时我们可以在优化器上调用 step()。我们将loss 除以len(batch_group),因为我们希望在批处理组中平均loss
  • 是的,batch_loss 是一个浮点数,我们可以以任何方式将其作为张量并计算后向,这就是我问的原因
猜你喜欢
  • 2018-11-11
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2019-06-20
  • 1970-01-01
  • 2021-12-28
  • 2021-12-27
相关资源
最近更新 更多