【问题标题】:Cost function convergence in Tensorflow using softmax_cross_entropy_with_logits and "soft" labels/targets使用 softmax_cross_entropy_with_logits 和“软”标签/目标在 Tensorflow 中的成本函数收敛
【发布时间】:2018-05-21 03:10:14
【问题描述】:

我发现在 Tensorflow 中可能是一种罕见的情况,但我正在尝试使用 KL 散度(交叉熵)作为 Tensorflow 中的成本函数,使用软目标/标签来训练分类器(线性或非线性)(形成有效概率分布但不是“硬”1 或 0 的标签)。

但是很明显(告诫标志)肯定有问题。我尝试过线性和非线性(密集神经网络)形式,但无论如何,无论网络架构如何,我的损失函数总是得到相同的最终值(即使我只训练一个偏差)。此外,使用 L-BFGS(一个非常可靠的优化器!),成本函数收敛得非常快(在 20-30 次迭代内)。出现问题的另一个迹象是我无法过度拟合数据,并且验证集的损失值似乎与训练集完全相同。然而,奇怪的是,当我增加网络架构大小和/或更改正则化损失时,我确实看到了一些的改进。准确性也随之提高(尽管不是我对此感到满意或正如我所期望的那样)。

当我使用完全相同的代码但发送单热编码标签(不是软目标)时,它确实按预期工作。下面显示了从 Tensorboard 获取的训练成本函数示例。有人可以给我一些想法吗?

【问题讨论】:

    标签: tensorflow classification


    【解决方案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 位浮点,您可以从斜率中看到,您可以继续训练并可能从中看到优势。您可能不需要最终权重和偏差的精确度……只是在训练期间支持成本函数的持续优化。

    【讨论】:

    • 我没有看到“好多了”,我看到了“y 轴刻度变化”。
    • L-BFGS 不再在 20-30 次迭代时停止优化。由于在超过 2000 次迭代后发现成本函数下降,它仍在继续。这确实反映在结果中,由于简洁和可能不必要的细节,我没有在这里发布。
    • 如果不清楚,我还应该注意,这是使用与更改为 64 位浮点数之前相同的网络架构、数据和随机种子。所以这是一个合法的一对一比较。
    猜你喜欢
    • 2022-01-23
    • 2018-06-05
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多