在模型构建完毕后,下面的工作就是定义损失函数。损失函数的功能在于,衡量实际输出值和预期输出值之间的差异程度,井借此调节网络的参数。
对于多分类问题,最常用的损失函数就是交叉熵函数( Cros-enrorp)那什么是交叉熵呢?说到交叉熵,就不得不提一下“熵”的概念。熵的概念源自热力学。它是系统混乱度的度量,越有序,熵越小。反之,越杂乱无序,熵就越大。
在信息领域,信息论的开创者香农(Claude Shannon )在他的一篇经典论文 “通信的数学原理(A mathematic Theory of Communication)中,借用了热力学的“熵”,提出了“信息熵”的概念。
简单来说,“信息熵”描述了这样一件事情: 一条信息的信息量和它的不确定程度有密切关系。比如,我们要搞清楚一件非常不确定的事情,就得知道关于这件事的大量信息。相反,如果我们已经对某件事情了如指掌,那么就不需要掌握太多的信息就能把它搞明白。所以,从这个角度来看,信息量就等于一个系统的不确定性程度。用大白话来说,熵就是一个从“不知道”变成“知道”的差值。
那么,如何衡量事件的不确定程度呢?香农发明了一个叫“比特(bit)”的概念,并给出了信息熵的计算公式::
H
(
X
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
p
(
x
i
)
H(X)=-\sum _{i=1}^{n}p(x_i)logp(x_i)
H(X)=−i=1∑np(xi)logp(xi)
其中
p
(
x
)
p(x)
p(x)代表随机事件
X
X
X为
x
i
x_i
xi的概率。简单来说,信息量的大小跟随机事件发生的概率有关。越小概率的事情发生了,不确定程度越高, 产生的信息量越大。从信息论的角度来看,
−
l
o
g
p
(
x
i
)
-logp(x_i)
−logp(xi)表示的是编码长度(如果log是以2为底,长度单位就是比特),
−
l
o
g
p
(
x
i
)
p
(
x
i
)
-logp(x_i) p(x_i)
−logp(xi)p(xi)其实就是在计算加权长度(权值为概率)。所以,对于编码而言,信息熵的意义就是最小的平均编码长度。
举例说明,对于单词"HELLO",我们可根据上述描述来计算它的熵:
p
(
′
H
′
)
=
p
(
′
E
′
)
=
p
(
′
O
′
)
=
1
/
5
=
0.2
p
(
L
′
)
=
2
/
5
=
0.4
H
(
′
H
E
L
L
O
′
)
=
−
0.2
∗
l
o
g
2
0.2
∗
3
−
0.4
∗
l
o
g
2
0.4
=
1.9293
\begin{aligned} &p('H')=p('E')= p('O')=1/5=0.2 \\ &p(L')=2/5=0.4\\ &H('HELLO')= -0.2*log_20.2*3-0.4*log_20.4=1.9293 \end{aligned}
p(′H′)=p(′E′)=p(′O′)=1/5=0.2p(L′)=2/5=0.4H(′HELLO′)=−0.2∗log20.2∗3−0.4∗log20.4=1.9293
通过上面计算可知,如果采用最优编码方案的化,“HELLO”中的每个字符大概需要2个比特来编码。
上面熵的计算,是基于每个字符出现的真实概率
p
i
p_i
pi计算得到的。假设在对字符编码时,采用的不是真实概率
p
i
p_i
pi,而采用的是其他概率
q
i
q_i
qi来近似
p
i
p_i
pi,现在的问题是,如果用概率分布
q
i
q_i
qi近似概率
p
i
p_i
pi,那么该如何评价这个“近似”的好与坏呢?这就要用到相对熵的概念了。
相对嫡的理论基础是KL散度,也称KL距离、它可以用来衡量两个随机分布之间的距离,记为
D
K
L
(
p
∣
∣
q
)
D_{KL}(p||q)
DKL(p∣∣q):
D
K
L
(
p
∣
∣
q
)
=
∑
x
ϵ
X
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
=
∑
x
ϵ
X
p
(
x
)
l
o
g
p
(
x
)
−
∑
x
ϵ
X
p
(
x
)
l
o
g
q
(
x
)
=
−
H
(
p
)
−
∑
x
ϵ
X
p
(
x
)
l
o
g
q
(
x
)
\begin{aligned} D_{KL}(p||q)&=\sum_{x\epsilon X}p(x)log\frac{p(x)}{q(x)}\\ &=\sum_{x\epsilon X}p(x)logp(x)-\sum_{x\epsilon X}p(x)logq(x)\\ &=-H(p)-\sum_{x\epsilon X}p(x)logq(x) \end{aligned}
DKL(p∣∣q)=xϵX∑p(x)logq(x)p(x)=xϵX∑p(x)logp(x)−xϵX∑p(x)logq(x)=−H(p)−xϵX∑p(x)logq(x)
参考公式可知,公式的第一部分就是
p
p
p 的负熵,记作
−
H
(
p
)
- H(p)
−H(p)。
假设
p
p
p和
q
q
q代表两种不同的分布,它们在给定样本集合中的交叉熵可描述为公式的第二部分:
C
E
(
p
,
q
)
=
−
∑
x
ϵ
X
p
(
x
)
l
o
g
q
(
x
)
CE(p,q)=-\sum_{x\epsilon X}p(x)logq(x)
CE(p,q)=−xϵX∑p(x)logq(x)
这里的“交叉”之意,主要用于描述这是两个事件之间的相互关系。通过对公式实施变形,很容易推导出交叉嫡和相对摘之间的关系,如下所示:
C
E
(
p
,
q
)
=
H
(
p
)
+
D
K
L
(
p
∣
∣
q
)
CE(p,q)=H(p)+D_{KL}(p||q)
CE(p,q)=H(p)+DKL(p∣∣q)从公式可知,交叉熵和相对熵之间相差了一个熵
H
(
p
)
H(p)
H(p)。如果当p为已知时,
H
(
p
)
H(p)
H(p)是一个常数,此时交叉嫡与KL距离(即相对熵)在意义上是等价的,它们都反映了分布p和q的相似程度。最小化交叉熵,实质上就等价于最小化KL距离。它们都在p=q时,取得最小值
H
(
p
)
H(p)
H(p),因为此时
D
K
L
(
p
∣
∣
q
)
=
0
D_{KL}(p||q)=0
DKL(p∣∣q)=0。
如果信息熵是一种最优编码的体现,那么交叉熵的存在,它允许我们以另外一种“次优”编码方案来计算同一个字符串编码所需的平均最小位数。如前文捕述,
−
l
o
g
q
(
x
i
)
-logq(x_i)
−logq(xi)表示编码的长度,下面还以字符串"HELLO"为何来说明这个“次优”编码方案。
我们知道,ASCI 编码表有256个不同的字符,如果对每个字符都赋于相同的概率,那么这个概率
q
i
=
1
/
256
q_i=1/256
qi=1/256。于是,根据公式“HELLO”的交叉熵计算如下:
q
(
′
H
)
=
q
(
′
E
′
)
=
q
(
′
O
′
)
=
q
(
′
L
′
)
=
1
/
256
C
E
(
′
H
E
L
L
O
′
)
=
−
0.2
∗
l
o
g
2
(
1
/
256
)
∗
3
−
0.4
∗
l
o
g
2
(
1
/
256
)
=
8
\begin {aligned} &q('H)=q('E')= q('O')=q('L')=1/256\\ &CE('HELLO')= -0.2*log_2(1/256)*3-0.4*log_2(1/256)=8\end{aligned}
q(′H)=q(′E′)=q(′O′)=q(′L′)=1/256CE(′HELLO′)=−0.2∗log2(1/256)∗3−0.4∗log2(1/256)=8
也就说。如果采用ASCII编码时,每个字符需要8位,这与ASCII所用的实际编码长度是相符合的。在当前条件下,编码长度远大于它的最优编码(约等于2位)。
从前面的分析可知,如果真实概率与预测概率相差很小,那么交又熵就会很小。反之,如果二者相差较大,则交叉熵就较大。假设某个神经网络的输出值和预期值都是概率,交叉熵岂不是一个绝佳的损失函数?
的确是这样。对于多分类问题,在
s
o
f
t
m
a
x
softmax
softmax 函数的“加工”下,它的实际输出值就是个概率向量,如[0.96, 0.04, 0],设其概率分布为
q
q
q。而实际上,它的预期输出值,就是标签的one-hot编码:
从本质上看,one-hot操作就是把具体的标签空间,变换到一个概率测度空间(设为
p
p
p).如,[1,0,0]。可以这样理解这个概率,标签分类的标量输出为1(即概率为100),其他值为0(即概率为0%)现在要做的工作是,利用交又熵评估实际输出的微率分布
q
q
q,与预期概率的分布
p
p
p之间的差异程度。如果差别较大,就接着调节网络参数,直至二者的差值小于给定的阈值。
一文读懂交叉熵的基本概念
最新推荐文章于 2024-04-28 09:26:33 发布