python – keras的binary_crossentropy损失函数范围

当我使用keras的binary_crossentropy作为
loss function(调用
tensorflow’s sigmoid_cross_entropy时,它似乎仅在[0,1]之间产生损失值.但是,等式本身

# The logistic loss formula from above is
#   x - x * z + log(1 + exp(-x))
# For x < 0, a more numerically stable formula is
#   -x * z + log(1 + exp(x))
# Note that these two expressions can be combined into the following:
#   max(x, 0) - x * z + log(1 + exp(-abs(x)))
# To allow computing gradients at zero, we define custom versions of max and
# abs functions.
zeros = array_ops.zeros_like(logits, dtype=logits.dtype)
cond = (logits >= zeros)
relu_logits = array_ops.where(cond, logits, zeros)
neg_abs_logits = array_ops.where(cond, -logits, logits)
return math_ops.add(
    relu_logits - logits * labels,
    math_ops.log1p(math_ops.exp(neg_abs_logits)), name=name)

意味着范围是从[0,无穷大].那么Tensorflow正在做一些我没有抓到的剪辑吗?此外,因为它正在做math_ops.add()我认为它肯定大于1.我是否正确地假设损失范围肯定超过1?

最佳答案 交叉熵函数确实没有向上限制.但是,如果预测非常错误,它只会采用大值.让我们首先看一下随机初始化网络的行为.

对于随机权重,许多单位/层通常会复合,从而导致网络输出大致统一的预测.也就是说,在n类的分类问题中,每个类的概率大约为1 / n(在两类情况下为0.5).在这种情况下,在某些假设下(见下文),交叉熵将围绕n级均匀分布的熵,即log(n).

这可以看作如下:单个数据点的交叉熵是-sum(p(k)* log(q(k)))其中p是真实概率(标签),q是预测,k是不同的班级和总和在课堂上.现在,对于硬标签(即单热编码),只有单个p(k)为1,所有其他都为0.因此,该术语缩减为-log(q(k)),其中k现在是正确的类.如果使用随机初始化的网络q(k)~1 / n,我们得到-log(1 / n)= log(n).

我们也可以得到交叉熵的定义,它通常是熵(p)kullback-leibler散度(p,q).如果p和q是相同的分布(例如,当我们对于每个类具有相同数量的示例时p是均匀的,并且对于随机网络q是均匀的)那么KL散度变为0并且我们留下熵(p).

现在,由于训练目标通常是减少交叉熵,我们可以将log(n)视为一种最坏情况值.如果它变得更高,你的模型可能有问题.因为看起来你只有两个类(0和1),log(2)< 1,所以你的交叉熵通常很小.

点赞