我发现在Tensorflow中可能是罕见的情况,但我正在尝试使用KL散度(交叉熵)作为Tensorflow中的成本函数来训练分类器(线性或非线性),具有软目标/标签(形成有效概率分布但不是“硬”1或0的标签。
然而很明显(告诉尾迹)有些事情肯定是错误的。我已经尝试过线性和非线性(密集神经网络)形式,但不管网络架构如何(即使我只训练偏差),无论我总是得到与损失函数相同的最终值。此外,使用L-BFGS(非常可靠的优化器!),成本函数可以非常快速地收敛(在20-30次迭代中)。另一个迹象是,我不能过度填充数据,验证集似乎与训练集具有完全相同的损失值。但是,奇怪的是,当我增加网络架构大小和/或改变正规化损失时,我确实看到了一些改进。精度也随着这一点而提高(虽然不是我对它感到满意或正如我所期望的那样)。
当我使用完全相同的代码但发送单热编码标签(不是软目标)时,它会按预期工作。下面显示了来自Tensorboard的培训的成本函数示例。有人可以给我一些想法吗?
答案 0 :(得分:1)
啊,我的朋友,你的问题是,对于软目标,特别是那些不接近1或零的目标,随着算法的改进,交叉熵损失不会发生显着变化。有助于您理解此问题的一件事是从您的训练数据中获取示例并计算熵......然后您将知道成本函数的最低值。这可能会对您的问题有所了解。因此,对于您的一个示例,让我们说目标是[0.39019628,0.44301641,0.16678731]。好吧,使用交叉熵的公式
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
然后使用目标“y_”代替预测的概率“y”,我们得到真实的熵值1.0266190072458234。如果你的预测只是略微偏离目标......让我们说它们是[0.39511779,0.44509024,0.15979198],那么交叉熵是1.026805558049737。
现在,与大多数困难问题一样,这不仅仅是一件事,而是一系列事情。损失函数正在正确实现,但在训练深度学习算法时,你在99.9%的情况下做了你应该做的事情的“错误”......你使用了32位浮点数。但是,在这种特殊情况下,在训练算法收敛到良好结果之前,32位浮点数可以很好地表示有效数字。如果我使用完全相同的数据和代码,但只是将数据类型更改为64位浮点数,您可以在下面看到结果更好 - 您的算法继续训练超过2000次迭代,您将看到它反映在你的准确性。事实上,你可以从斜率看到是否支持128位浮点,你可以继续训练并可能从中看到它的优点。您可能不需要在最终权重和偏差中精确度......仅在培训期间支持持续优化成本函数。