【问题标题】:Tensorflow: Incredibly Huge Sparse Categorical Cross EntropyTensorflow:令人难以置信的巨大稀疏分类交叉熵
【发布时间】:2019-05-20 13:05:33
【问题描述】:

我正在 Tensorflow 中执行文本分类任务(使用 tf.keras)。之前我只是使用文本特征,我的loss是sparse_categorical_crossentropy,训练是这样的:

这完全在意料之中,损失约为 7。

现在,我添加了 2 个介于 0 到 100,000 之间的随机浮点特征。我更新了我的 tf.data.Dataset 对象,现在它们看起来像:

dataset = tf.data.Dataset.from_tensor_slices(({"review": x_rev_train, "structured": x_structured_train}, labels_train))

并创建了一个新的Input 对象,将其连接到我的图表。看起来很正常。

我现在训练并看到这个:

所以我的损失现在大约是几百万(从 100 毫米以上开始)。我对此感到非常困惑。考虑到分类交叉熵是如何定义的,这显然是错误的......

所以我开始调试,并将两个浮点特性设置为 0.0 的常量值。当我这样做时,损失会恢复到第一张图片中的样子。

然后我将两个浮点功能都设置为 100000.0 的常量值,然后问题又出现了。所以我认为这与这两个浮动功能的大小有关。

对我可能做错了什么有什么想法吗?我知道我还没有扩展这两个浮动功能,但为什么我的损失会这样爆炸?

感谢您提供的任何帮助!

编辑:

似乎这种巨大的损失只发生在第一个纪元以某种方式?它在随后的时期恢复正常。有什么想法吗?

【问题讨论】:

  • 你有几节课?您能否提供有关您的模型的更多详细信息?

标签: python tensorflow keras


【解决方案1】:

这正是您需要对模型中的数值特征进行归一化的原因。这在几乎所有具有不同取值范围的特征的人工神经网络中都是必要的。在第一步之后,权重可以进行巨大的跳跃以尝试对那些大规模特征进行建模,并且您的损失将恢复正常,但在开始时权重是随机的并且可能以零为中心,具体取决于您如何初始化它们。如果你在一开始就想到那些小特征权重的输出预测是什么,然后看到那些非标准化特征值的差异将达到数百万,这就是损失值爆炸的原因。

教训是,如果没有先对它们进行归一化(减去均值并除以标准差),您不应该将这些特征放入网络中。尝试这样做,您会发现行为会恢复正常。

【讨论】:

  • 感谢您的帮助!是否预计损失恢复到正常水平后准确性仍然会下降?使用 2 个非常大的特征,我通常看到的准确度大约是我现在看到的 6 倍(并且在第一个 epoch 之后它没有提高)。
猜你喜欢
  • 2019-05-23
  • 2016-09-18
  • 2019-12-18
  • 2021-02-15
  • 2021-03-19
  • 2022-10-04
  • 1970-01-01
  • 2020-10-12
  • 2020-09-10
相关资源
最近更新 更多