Max*_*xim 76 machine-learning neural-network logistic-regression tensorflow cross-entropy
分类问题,例如逻辑回归或多项逻辑回归,优化了交叉熵损失.通常,交叉熵层遵循softmax层,其产生概率分布.
在tensorflow中,至少有十几种不同的交叉熵损失函数:
tf.losses.softmax_cross_entropy
tf.losses.sparse_softmax_cross_entropy
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.softmax_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits
哪个只适用于二进制分类,哪个适用于多类问题?你何时应该使用sigmoid
而不是softmax
?如何在sparse
功能与别人不同,为什么仅是它softmax
?
相关(更多数学导向)讨论:交叉熵丛林.
Max*_*xim 125
在功能意义上,当类的数量等于2时,sigmoid是softmax函数的部分情况.它们都执行相同的操作:将logits(见下文)转换为概率.
在简单的二进制分类中,两者之间没有太大的区别,但是在多项分类的情况下,sigmoid允许处理非独占标签(也称为多标签),而softmax处理独占类(见下文).
甲分对数(也称为得分)是一个与一个类别相关联的原始未缩放的值计算所述概率之前,.就神经网络架构而言,这意味着logit是密集(完全连接)层的输出.
Tensorflow命名有点奇怪:下面的所有函数都接受logits而不是概率,并自己应用转换(这样更有效).
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
(已弃用)如前所述,sigmoid
损失函数用于二进制分类.但是,当类是独立的时,tensorflow函数更通用并允许进行多标签分类.换句话说,
一次tf.nn.sigmoid_cross_entropy_with_logits
解决N
二进制分类.
标签必须是单热编码的,或者可以包含软类概率.
tf.losses.sigmoid_cross_entropy
此外,它允许设置批内重量,即使一些例子比其他例子更重要.
tf.nn.weighted_cross_entropy_with_logits
允许设置类权重
(记住,分类是二进制),即使正误差大于负误差.当训练数据不平衡时,这很有用.
tf.nn.softmax_cross_entropy_with_logits
(已弃用1.5)tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
tf.contrib.losses.softmax_cross_entropy
(已弃用)这些损失函数应该用于多项互斥分类,即选择一N
类.也适用于N = 2
.
标签必须是单热编码的或者可以包含软类概率:特定示例可以属于具有50%概率的A类和具有50%概率的B类.请注意,严格来说,这并不意味着它属于这两个类,但可以用这种方式解释概率.
就像在sigmoid
家庭中一样,tf.losses.softmax_cross_entropy
允许设置批内重量,即使一些例子比其他例子更重要.据我所知,从tensorflow 1.3开始,没有内置的方法来设置类权重.
[UPD]在tensorflow 1.5中,引入了v2
版本并且原始丢失已被弃用.它们之间的唯一区别是,在较新的版本中,反向传播发生在logits和标签中(这里讨论为什么这可能有用).softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy
(已弃用)与softmax
上面的普通一样,这些损失函数应该用于多项互斥分类,即选择一N
类.区别在于标签编码:类被指定为整数(类索引),而不是单热矢量.显然,这不允许软类,但是当有数千或数百万个类时它可以节省一些内存.但是,请注意,logits
参数必须仍然包含每个类的logits,因此它至少消耗[batch_size, classes]
内存.
如上所述,tf.losses
版本有一个weights
参数,允许设置批内重量.
这些函数为处理大量类提供了另一种选择.他们不是计算和比较精确的概率分布,而是根据随机样本计算损失估计.
参数weights
并biases
指定一个单独的完全连接层,用于计算所选样本的logits.
如上所述,labels
不是单热编码,而是具有形状[batch_size, num_true]
.
采样功能仅适用于培训.在测试时间内,建议使用标准softmax
损耗(稀疏或单热)来获得实际分布.
另一种替代损失是tf.nn.nce_loss
执行噪声对比估计(如果您有兴趣,请参阅此非常详细的讨论).我已将此函数包含在softmax系列中,因为NCE保证在极限范围内逼近softmax.
但是对于版本1.5,softmax_cross_entropy_with_logits_v2
必须改为使用,同时将其参数与argument key=...
类似以下内容一起使用>
softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,\
logits = my_prediction, dim=-1, name=None)
Run Code Online (Sandbox Code Playgroud)
虽然很高兴接受的答案包含比所要求的更多的信息,但我认为共享一些通用的经验规则将使答案更加紧凑和直观:
现在让我们来探讨一些情况。假设有一个简单的二元分类问题- 图像中是否存在猫?激活函数和损失函数的选择是什么?这将是一个 sigmoid 激活和一个(二元)CE。因此,可以使用sigmoid_cross_entropy或更佳地使用 sigmoid_cross_entropy_with_logits。后者结合了激活函数和损失函数,并且应该是数值稳定的。
多类分类怎么样?假设我们想知道图像中是否存在猫、狗或驴。激活函数和损失函数的选择是什么?这将是一个 softmax 激活和一个(分类)CE。因此,可以使用softmax_cross_entropy或更优选地使用softmax_cross_entropy_with_logits。我们假设预期值是 one-hot 编码的(100 或 010 或 001)。如果(出于某种奇怪的原因),情况并非如此,并且预期值是整数(1或2或3),您可以使用上述函数的“稀疏”对应项。
可能还有第三种情况。我们可以进行多标签分类。所以同一张图片中可能有一只狗和一只猫。我们该如何处理这个问题?这里的技巧是将这种情况视为多个二元分类问题 - 基本上是猫或没有猫/狗或没有狗和驴或没有驴。找出 3 个(二元分类)中每一个的损失,然后将它们相加。因此本质上这可以归结为使用sigmoid_cross_entropy_with_logits损失。
这回答了您提出的 3 个具体问题。上面分享的功能都是需要的。您可以忽略已弃用且不应使用的 tf.contrib 系列。
归档时间: |
|
查看次数: |
42242 次 |
最近记录: |