我正在针对代表性明显不足的目标类别训练循环二分类器。假设我们的目标类别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], ...
。除了比未加权版本稍差之外,这也没有任何改进。
有人可以向我解释加权损失的行为吗?我做得正确吗?应该怎么做才能增加少数族裔阶层的人?
答案 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