【问题标题】:How to apply weights to a sigmoid cross entropy loss function in Tensorflow?如何将权重应用于 Tensorflow 中的 sigmoid 交叉熵损失函数?
【发布时间】:2018-04-13 09:15:12
【问题描述】:

训练数据集包含两个类 A 和 B,我们在目标标签中分别表示为 10。出标签数据严重偏向于类0,它占据了大约 95% 的数据,而我们的类 1 仅占 5%。在这种情况下我们应该如何构建我们的损失函数?

我发现 Tensorflow 有一个可以与权重一起使用的函数:

tf.losses.sigmoid_cross_entropy

weights 充当损失系数。如果提供了标量,则损失只是按给定值缩放。

听起来不错。我将权重设置为 2.0,以提高损失并更多地惩罚错误。

loss = loss_fn(targets, cell_outputs, weights=2.0, label_smoothing=0)

但是,不仅损失没有下降,而且数据集的最终准确率略有下降。好的,也许我误解了,它应该是

不用说,在同一数据集上训练的同一网络,但损失权重为 0.3,在 Torch / PyTorch 中可将损失显着降低 10 倍。

谁能解释一下如何在 Tensorflow 中使用损失权重?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    如果您使用标量(如 2.0)缩放损失,那么基本上您将损失乘以反向传播的梯度。这类似于提高学习率,但不完全相同,因为您还更改了正则化损失的比率,例如权重衰减。

    如果你的类严重偏斜,并且你想在计算损失时平衡它,那么你必须指定一个张量作为权重,如tf.losses.sigmoid_cross_entropy()手册中所述:

    权重:可选张量,其秩为 0,或与标签的秩相同,并且必须可广播到标签(即所有维度必须为 1,或与相应的损失相同尺寸)。

    那就是让第 0 类的权重张量为 1.0,第 1 类可能为 10,现在“假阴性”损失将被更多地计算。

    你应该在多大程度上夸大代表性不足的阶层,这是一门艺术。如果你过度使用它,模型就会崩溃,并且会一直预测过度加权的类。

    实现相同目的的另一种方法是使用tf.nn.weighted_cross_entropy_with_logits(),它具有用于完全相同目的的pos_weight 参数。但它在 tf.nn 而不是 tf.losses 所以你必须手动将它添加到损失集合中。

    通常另一种处理方法是在抽样时任意增加代表性不足的类别的比例。然而,这也不应该过度。你也可以做这两件事。

    【讨论】:

    • 但这基本上意味着构建一个权重张量的小批量,因为您必须查看目标小批量并查看其中的值在单元格为 1 时使用 10,否则为 1.0。
    • 是的,基本上。添加了对tf.nn.weighted_cross_entropy_with_logits() 的引用,它更容易为您完成。
    • 这是否意味着每个由 tf.nn 函数计算的损失都应该添加到损失集合中?
    • 是的。 tf.losses.* 集合产生的张量将自动成为损失集合的一部分。如果您计算一个您希望添加为损失的自定义张量,您必须手动添加它。
    【解决方案2】:

    您可以为每个样本的错误分类设置惩罚。如果weights 是形状为[batch_size] 的张量,则每个样本的损失将乘以相应的权重。因此,如果您为所有样本分配相同的权重(这与使用标量权重相同),您的损失将仅按此标量进行缩放,并且准确性不应改变。

    如果您改为为少数类和多数类分配不同的权重,则样本对损失函数的贡献将不同,您应该能够通过选择不同的权重来影响准确性。

    几个场景(你的选择取决于你的需要):

    1.) 如果你想要一个好的整体准确率,你可以选择多数类的权重非常大,而少数类的权重要小得多。这可能会导致将所有事件分类到多数类(即总分类准确率的 95%,但少数类通常会被分类到错误的类。

    2.) 如果您的信号是少数类而背景是多数类,您可能希望预测信号中的背景污染非常少,即您希望几乎没有背景样本被预测为信号。如果您选择的多数权重远大于少数权重,也会发生这种情况,但您可能会发现网络倾向于将所有样本预测为背景。所以你不会留下任何信号样本。 在这种情况下,您应该考虑少数类的较大权重 + 被分类为信号样本(误报)的背景样本的额外损失,如下所示:

    loss = weighted_cross_entropy + extra_penalty_for_false_positives

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2017-03-14
      • 2016-08-01
      • 2021-11-25
      • 2018-01-31
      • 2019-06-19
      • 2018-04-12
      • 2017-11-11
      • 2019-03-30
      相关资源
      最近更新 更多