理解交叉熵损失
字符集编码
字符集编码的意义在于将数据集进行有效压缩。
假设在一个文档中只出现了a、b、c、d、e 5种字符,其占比如下表:
字符 | a | b | c | d | e |
---|---|---|---|---|---|
占比 | 0.1 | 0.1 | 0.2 | 0.2 | 0.4 |
最容易想到的编码方式,5个字符,需要3个bit位,故:
字符 | a | b | c | d | e | 单个字符编码长度期望值 |
---|---|---|---|---|---|---|
编码 | 000 | 001 | 010 | 011 | 100 | 3 |
但是这并不是最优的编码方式,例如:
字符 | a | b | c | d | e | 单个字符编码长度期望值 |
---|---|---|---|---|---|---|
编码 | 1111 | 1110 | 110 | 10 | 0 | 2.2 |
这种编码方式的特点就在于,占比高的字符编码长度尽可能短,同时要满足不能出现歧义的限制条件。
那么给定一个数据集之后,究竟每个字符编码是什么,编码应该多长呢?
给定字符集
X={x}
, 满足
p(x)
的概率分布,设字符x的最优编码长度为
l(x)
,设
H(X)
为字符编码长度期望,则根据香农信息理论,最优编码情况下有以下结论:
字符集编码先介绍这么多,一会儿会用到。
相对熵
相对熵是一种用来评价两种概率分布差异程度的方法。
给定字符集
X={x}
,你通过某种方法预测其概率分布为
q(x)
,但是其真实的概率分布为
p(x)
,那么怎么评价二者的差异呢?如何评价
q(x)
偏离真实分布
p(x)
的程度呢?
可以通过字符集编码长度与最优编码方案下的编码长度的差来度量。
最优编码方案下的字符编码长度为:
根据预测概率分布 q(x) 进行编码,字符编码长度为:
最优编码方案下字符编码长度期望为:
根据预测概率分布 q(x) 进行编码,实际获得的编码长度期望为:
很显然:
因为最优编码是编码长度期望最短的;
定义:
可得:
DKL(P||Q) 就是相对熵,从公式可以看出,相对熵是不对称的。
交叉熵
交叉熵是从相对熵而来的。
在机器学习领域,多分类问题很常见,在很多深度学习模型当中,网络的输出层就是一个
softmax
层,对于
N
分类问题,输出是一个
将
softmax
层输出向量视为预测类别的概率分布
q(x)
,用真实类别标签构造真实的类别概率分布
p(x)
(例如,令真实类别概率为1,其余类别概率为0),那么相对熵
DKL(P||Q)
就可以评价预测结果
q(x)
的好坏了,我们只需要最小化它就好了。
既然可以用相对熵作为代价函数,那为什么还要引出交叉熵?
因为在
DKL(P||Q)
的公式中:
∑xp(x)log(p(x)) 不涉及预测结果 q(x) ,是一个常数项,可以把这一项去掉简化模型。
于是只剩下:
其实就是:
也就是说,交叉熵等于基于预测概率分布 q(x) 对符合 p(x) 分布的字符集进行编码之后的平均字符编码长度,通过最小化交叉熵可以使 q(x) 逼近真实分布 p(x) ,也就使得预测模型更优。
延伸
既然是让预测概率分布
q(x)
逼近真实概率分布
p(x)
,你可能马上就想到,直接让代价函数等于
(q(x)−p(x))2
不就好了,为什么搞得这么复杂?
因为二次代价函数有一个缺点,而交叉熵损失代价函数没有,请看传送门。
说明
如有错误,敬请指正。