Jon*_*han 5 python machine-learning deep-learning keras tensorflow
当我使用keras的binary_crossentropy作为损失函数(即调用tensorflow的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)
Run Code Online (Sandbox Code Playgroud)
表示范围是从[0, infinity)。那么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)。
我们还可以讨论交叉熵的定义,一般是entropy(p) + kullback-leibler divergence(p,q)。如果p和q是相同的分布(例如p,当每个类具有相同数量的示例时是均匀的,并且q对于随机网络来说是均匀的),则 KL 散度变为 0,我们剩下entropy(p)。
现在,由于训练目标通常是减少交叉熵,我们可以将其视为log(n)一种最坏情况值。如果它变得更高,则您的模型可能有问题。因为看起来你只有两个类(0 和 1),log(2) < 1所以你的交叉熵通常会很小。
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |