深度学习之Loss Function:TensorFlow中交叉熵损失函数简单说明
TensorFlow中有四个关于交叉熵损失函数的类,BinaryCrossentropy
,CategoricalCrossentropy
,SparseCategoricalCrossentropy
,BinaryFocalCrossentropy
。本文将对这四个交叉熵损失函数类做简单说明。
一、基本概念
在信息论里,“熵” 作为信息的度量,是香农于1948年在其著名论文《通信的数学原理》中首次提出。对于一个随机变量
X
X
X,它的熵定义如下:
H
(
X
)
=
−
∑
x
∈
X
P
(
x
)
l
o
g
P
(
x
)
H(X) = -\sum_{x \in X}P(x)logP(x)
H(X)=−x∈X∑P(x)logP(x)
简单来说,就是一条信息的信息量和它的不确定性有着直接关系。信息量越大,其不确定性越大,熵也越大;信息量越小,其不确定性也越小,熵也越小。
交叉熵代价函数定义如下:
C
=
−
1
n
∑
x
[
y
l
n
a
+
(
1
−
y
)
l
n
(
1
−
a
)
]
C = -\frac{1}{n} \sum_{x}[ylna+(1-y)ln(1-a)]
C=−n1x∑[ylna+(1−y)ln(1−a)] 其中,
n
n
n 是训练数据的总数,求和是在所有的训练输⼊
x
x
x 上进⾏的,
y
y
y 是对应的⽬标输出。
通过观察上述交叉熵代价函数,可以发现它的两个非常重要的特点:第一,它是非负的,
C
>
0
C > 0
C>0。因为对数函数的定义域是
(
0
,
1
)
(0,1)
(0,1),故求和中的所有独立的项都是负数,且求和前面有一个负号,所以整个函数是非负的。第二,对于所有的训练输入
x
x
x ,预测值越接近目标值
y
y
y,那么交叉熵将接近
0
0
0。假设在这个例⼦中,
y
=
0
y = 0
y=0 ⽽
a
≈
0
a ≈ 0
a≈0。这是我们想到得到的结果。我们看到公式中第⼀个项就消去了,因为
y
=
0
y = 0
y=0;⽽第⼆项实际上就是
−
l
n
(
1
−
a
)
≈
0
− ln(1 − a) ≈ 0
−ln(1−a)≈0。反之,
y
=
1
y = 1
y=1 ⽽
a
≈
1
a ≈ 1
a≈1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。
这其实就是交叉熵函数可以被当做代价函数的原因。
二、简单说明
损失函数的选择,跟网络的输出层有关。一般情况下,当用 softmax 作为output输出层时,我们选择对数似然代价函数;当用 sigmoid 作为输出层时,代价函数往往选择交叉熵。这样的选择可以避免学习缓慢的问题。
1.类BinaryCrossentropy
二分类交叉熵类,在TensorFlow中可通过tf.keras.losses.BinaryCrossentropy
调用。只能用于二分类问题,即他的标签要么是
0
0
0,要么是
1
1
1。其中参数from_logits
默认为False
,即认为y_pred的取值为[0,1],若y_pred的取值为[-inf, inf],则该参数需要置为True
2.类CategoricalCrossentropy
在TensorFlow中可通过tf.keras.losses.CategoricalCrossentropy
调用,可用于二分类或多分类。在模型中用做损失函数时,注意标签需要是独热编码(one hot)形式,即形如y_true = [[1,0,0],[0, 1, 0], [0, 0, 1]]
方式。
3.类SparseCategoricalCrossentropy
类tf.keras.losses.SparseCategoricalCrossentropy
也是用于多分类,与上一个CategoricalCrossentropy
的差别在于,其接受的分类标签是整型的,即形如y_true = [1, 2, 3]
的标签类型。所以2、3的选择,在于当前数据集的标签形式。
4.类BinaryFocalCrossentropy
当 gamma=0 时,此函数等价于二元交叉熵损失参数BinaryCrossentropy
。该类结合了FOCAL损失函数的思想,主要用于CV领域,针对目标检测问题中正负样本比例极度不均衡导致检测精度提升困难的问题,对标准的交叉熵损失引入系数因子,实现根据预测准确度自适应调整样本对损失的贡献程度。
三、参考资料
[1] <<数学之美>>
[2] Neural Networks and Deep Learning
[3] Tensorflow API 文档:损失函数模块