嘈杂的训练损失

Noisy training loss

我正在训练基于编码器-解码器注意力的模型,批量大小为 8。我不怀疑数据集中有太多噪音,但是示例来自几个不同的分布。

我可以在火车损失曲线中看到很多噪音。平均后 (.99),趋势很好。模型的准确性也不错。

我想了解造成这种损失曲线形状的原因是什么

嘈杂的训练损失但良好的准确性可能是由于以下原因:

局部最小值:

该函数可以有局部最小值,因此每次梯度下降收敛到局部最小值时,lost/cost 都会减小。但是有了好的学习率,模型就会学会从这些点跳转,梯度下降将收敛到全局最小值,即解决方案。这就是为什么训练损失非常嘈杂的原因。

您正在使用小批量梯度下降,它仅针对小批量中的示例计算损失函数的梯度。但是,您正在测量的损失是针对所有训练示例的。整体损失应该有下降趋势,但它经常会走向错误的方向,因为你的小批量梯度对总损失的估计不够准确。

此外,您在每一步都将梯度乘以学习率,以尝试降低损失函数。这是一个局部近似值,通常会超过目标最小值并最终在损失表面的较高点结束,尤其是在您的学习率很高的情况下。

Image Source

将此图像视为只有一个参数的模型的损失函数。我们取点处的梯度,乘以学习率以在梯度方向上投影一条线段(未图示)。然后我们将这条线段末端的 x 值作为我们更新的参数,最后我们计算这个新参数设置的损失。

如果我们的学习率太高,那么我们将超过梯度指向的最小值,并可能最终导致更高的损失,如图所示。

我自己找到了答案。

我认为其他答案不正确,因为它们是基于更简单的 models/architectures 的经验。困扰我的要点是损失中的噪音通常更对称(你可以绘制平均值,噪音随机地高于和低于平均值)。在这里,我们看到更多类似 low-tendency 的路径和突如其来的高峰。

如我所写,我使用的架构 encoder-decoder 受到关注。可以很容易地得出结论,输入和输出可以有不同的长度。损失是对所有 time-steps 求和的,不需要除以 time-steps 的数量。

https://www.tensorflow.org/tutorials/seq2seq

Important note: It's worth pointing out that we divide the loss by batch_size, so our hyperparameters are "invariant" to batch_size. Some people divide the loss by (batch_size * num_time_steps), which plays down the errors made on short sentences. More subtly, our hyperparameters (applied to the former way) can't be used for the latter way. For example, if both approaches use SGD with a learning of 1.0, the latter approach effectively uses a much smaller learning rate of 1 / num_time_steps.

我没有对损失进行平均,这就是为什么可以观察到噪声的原因。

P.S。类似地,例如 8 的批量大小可以有几百个输入和目标,所以实际上你不能说它是小还是大不知道示例的平均长度。