损失权重在Tensorflow中如何工作?

时间:2018-11-13 14:18:49

标签: python tensorflow machine-learning

我正在针对代表性明显不足的目标类别训练循环二分类器。假设我们的目标类别1占我们拥有的所有训练数据的<1%,类别0> 99%。为了更好地惩罚模型,以防误测了少数群体,我想在损失函数中使用权重。对于每个小批量,我都创建了一个相应的权重小批量,其中我们的目标类的权重标量> 1.0,而我们的多数类<1.0。例如,在下面的代码中,我们将2.0用于类1,将0.6用于类2。

loss_sum = 0.0
for t, o, tw in zip(self._targets_uns, self._logits_uns, self._targets_weight_uns):
    # t -- targets tensor [batchsize x 1], tw -- weights tensor [batchsize x 1]
    # e.g. [0, 0, 0, 0, 1, 1, 0] -- [0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 0.5]
    _loss = tf.losses.sigmoid_cross_entropy(t, o, weights=tw, label_smoothing=0,
                                scope="sigmoid_cross_entropy",
                                loss_collection=tf.GraphKeys.LOSSES)
    loss_sum += _loss

一旦训练了模型,我检查了预测精度,发现它比没有权重的精度略低。我继续尝试试验[1.4, 0.8], [1.6, 0.4], [4.0, 0.1], [3.0, 1.0], ...的权重对,依此类推。但是,除了边际差异降低2-3%之外,我没有对未加权训练进行任何改进。好的,也许我误解了tf.losses.sigmoid_cross_entropy函数的文档。

  

权重充当损失的系数。如果提供了标量,则损耗将简单地按给定值缩放。如果权重是形状为[batch_size]的张量,则损失权重将应用于每个对应的样本。

我只是反转对,并为0类使用较高的权重,为1类使用较低的权重:[0.5, 2.0], [0.8, 1.3], [0.2, 1.0], ...。除了比未加权版本稍差之外,这也没有任何改进。

有人可以向我解释加权损失的行为吗?我做得正确吗?应该怎么做才能增加少数族裔阶层的人?

1 个答案:

答案 0 :(得分:2)

加权是一种通用的数学技术,用于求解形式为Wx=y的方程组的过度指定,其中输入向量中的x,输出向量中的y和{ {1}}是您希望找到的转换矩阵。通常,使用SVD等技术可以解决这些问题。 SVD可以通过将过度指定的系统的W最小化来找到W的解决方案。 Tensorflow基本上通过其最小化过程来解决类似的问题。

在您的情况下,正在发生的事情是您有1个A类样本和99个B类样本。由于求解过程可以最大程度地减少总体误差,所以B类对解决方案的贡献为99倍A的1.为了解决这个问题,您应该将权重调整为,以使A类和B类对解决方案的贡献均匀,即将B类的权重降低0.01。

一般来说,您可以做...

least-squared error