初步事实
从功能上讲,当类的数量等于2时,S形是softmax函数的部分情况。它们都执行相同的操作:将logit(请参见下文)转换为概率。
在简单的二进制分类中,两者之间没有太大区别,但是在多项分类的情况下,Sigmoid允许处理非排他性标签(aka multi-labels),而softmax处理排他类(请参见下文)。
甲分对数(也称为得分)是一个与一个类别相关联的原始未缩放的值计算所述概率之前,。就神经网络体系结构而言,这意味着logit是密集(完全连接)层的输出。
Tensorflow的命名有点奇怪:下面的所有函数都接受logits而不是probability,并且自己应用转换(这更高效)。
乙状结肠功能家族
如前所述,sigmoid
损失函数用于二进制分类。但是tensorflow函数更通用,并且在类独立时可以进行多标签分类。换句话说,tf.nn.sigmoid_cross_entropy_with_logits
解决N
二进制分类。
标签必须是一键编码的,或者可以包含软类概率。
tf.losses.sigmoid_cross_entropy
此外,允许设置批内权重,即使某些示例比其他示例更重要。
tf.nn.weighted_cross_entropy_with_logits
允许设置班级权重
(请记住,分类是二进制的),即,使正误差大于负误差。当训练数据不平衡时,这很有用。
Softmax功能系列
这些损失函数应用于多项互斥分类,即从N
类中选择一种。也适用于N = 2
。
标签必须是一键编码的,或者必须包含软类别概率:一个特定示例可以以50%的概率属于A类,而以50%的概率属于B类。请注意,严格来说,这并不意味着它同时属于这两个类别,而是可以用这种方式解释概率。
就像在sigmoid
家庭中一样,tf.losses.softmax_cross_entropy
允许设置批内权重,即使一些示例比其他示例更重要。据我所知,从tensorflow 1.3开始,还没有内置的方法来设置类权重。
[UPD]在tensorflow 1.5中引入了v2
版本,并且原来的softmax_cross_entropy_with_logits
损失已被弃用。它们之间的唯一区别是,在较新的版本中,反向传播同时发生在logit和标签中(这里讨论了为什么这样做可能有用)。
稀疏函数族
像softmax
上面的普通函数一样,这些损失函数应用于多项互斥分类,即从N
类中选择一个。区别在于标签编码:类被指定为整数(类索引),而不是一键向量。显然,这不允许使用软类,但是当有成千上万个类时,它可以节省一些内存。但是,请注意,logits
每个类的参数仍必须包含登录信息,因此它至少消耗[batch_size, classes]
内存。
像上面一样,tf.losses
version具有weights
允许设置批内权重的参数。
采样的softmax函数系列
这些函数为处理大量类提供了另一种选择。他们没有计算和比较精确的概率分布,而是根据随机样本计算损失估计。
参数weights
和biases
指定一个单独的完全连接层,该层用于计算所选样本的logit。
像上面一样,labels
不是一次性编码,而是具有形状[batch_size, num_true]
。
采样函数仅适用于训练。在测试期间,建议使用标准softmax
损失(稀疏或单热)来获得实际分布。
另一个替代损耗是tf.nn.nce_loss
,它执行噪声对比估计(如果您有兴趣,请参阅此非常详细的讨论)。我已将此功能包括在softmax系列中,因为NCE保证在极限范围内近似于softmax。
tf.losses.log_loss
,实际上它仅用于二进制交叉熵。也是github.com/tensorflow/tensorflow/issues/2462