Tensorflow:巨大的稀疏分类交叉熵

时间:2018-12-20 01:36:18

标签: python tensorflow keras

我正在Tensorflow(使用tf.keras)中执行文本分类任务。以前,我只是在使用文本功能,我的损失是sparse_categorical_crossentropy,培训看起来像这样:

enter image description here

这是完全可以预期的,损失约为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对象,并将其连接到我的图形。看起来很正常。

我现在训练并看到以下内容: enter image description here

所以我的损失现在达到了几千万美元(从100毫米以上开始)。我对此很困惑。鉴于如何定义分类交叉熵,这显然是错误的...

因此,我开始进行调试,并使两个浮点数的常量值为0.0。当我这样做时,损失又回到了第一个图像中。

然后,我将两个float功能都设置为100000.0的恒定值,然后问题再次出现。因此,我认为这与这两个浮动功能的大小有关。

关于我可能做错了什么的任何想法?我知道我还没有缩放这两个浮动功能,但是为什么我的亏损会像这样爆炸?

感谢您提供的任何帮助!

编辑:

看来这种巨大的损失只发生在第一个时期?在随后的时期它恢复正常。有什么想法吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

这正是您需要对模型中的数字特征进行归一化的原因。实际上,在具有可以采用不同取值范围的特征的所有ANN中,这都是必需的。第一步之后,权重可能会大大跳升,以尝试对那些大型特征进行建模,并且您的损失将恢复正常,但是一开始,权重是随机的,可能集中在零附近,具体取决于初始化方式。如果您从一开始就想到那些小的特征权重的输出预测是什么,然后看到那些未归一化的特征值的差异将达到数百万,这就是损失值爆炸的原因。

教训是,您不应该先对这些特征进行归一化(减去均值并除以标准差),然后再将其放入网络中。尝试执行此操作,您将看到该行为将恢复正常。