这之前了解一下 s o f t m a x softmax softmax的一些概念,区别于 m a x max max, s o f t m a x softmax softmax的特点就在于他的 s o f t soft soft,有点像聚类里的软聚类和硬聚类的区别类似, s o f t m a x softmax softmax会给出属于各个类别是概率,而非直接归为某个类别。 s o f t m a x softmax softmax计算也非常简单,公式如下:
S o f t m a x i = e i ∑ j e j Softmax_i = \frac{e^i}{\sum_j{e^j}} Softmaxi=∑jejei
∑ i s o f t m a x i = 1 \sum_i{softmax_i} = 1 ∑isoftmaxi=1
公式表达的含义很简单明了,就是对输出求指数后归一化。
在这里也顺带介绍一下交叉熵损失的概念。交叉熵损失描述的是实际输出的概率同期望输出的概率(如标注的结果)间的“距离”。
L = 1 N ∑ i L i = 1 N ∑ i − ∑ c = 1 M y i c log ( p i c ) L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) L=N1i∑Li=N1i∑−c=1∑Myiclog(pic)
其中, M M M为类别数量, y i c y_{ic} yic为指示变量(大多数情况下为0,1,做了Label Smooth后也可能非0或1), p i c p_{ic} pic为观测样本 i i i属于 c c c类的概率(一般用 s o f t m a x softmax softmax计算 p i c = e i c ∑ j = 1 M e i j p_{ic} = \frac{e^{ic}}{\sum_{j=1}^M e^{ij}} pic=∑j=1Meijeic)。
那么为什么交叉熵公式长这样呢?
这需要从很古老的概念说起…1948年香农提出了信息熵的概念,解决了对信息的量化度量问题,提出信息量的度量就等于不确定性的多少。 一条信息的信息量大小和它的不确定性有直接的关系,不确定性越高,信息量越低。
香农信息量定义为 − log p = 1 log p -\log{p}=\frac{1}{\log{p}} −logp=logp1 ,熵定义为 H ( i ) = − ∑ i P ( i ) log ( P ( i ) ) H(i)=-\sum_{i} P(i) \log (P(i)) H(i)=−∑iP(i)log(P(i)),熵的本质是香农信息量的期望(可以看到熵的计算公式就是**(概率*信息量)之和**也就是期望的计算方法之一)。 通俗的说,变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大,通过熵就可以定量量度信息的不确定性。
那么交叉熵又是什么呢?
交叉熵:假设q(x)是用来拟合p(x)的概率分布,x属于p的样本空间,交叉熵用于衡量q在拟合p的过程中,用于消除不确定性而充分使用的信息量大小(理解为衡量q为了拟合p所付出的努力,另外注意交叉熵定义里的“充分使用”和信息熵定义里的“所需”的区别,“充分使用”不一定能达到全部,“所需”是指全部)。
也就是说,对于得到的模型输出的概率分布q,希望定量计算出其同真实概率分布p之间的差异(或者理解为从当前概率分布要变成真实或目标概率分布需要充分使用的信息量大小),就可以用交叉熵计算。计算公式为:
H ( p , q ) = − ∑ i p ( i ) log ( q ( i ) ) H(p, q)=-\sum_{i} p(i) \log (q(i)) H(p,q)=−i∑p(i)log(q(i))
上式计算其实也很简单,交叉熵就是真实概率分布下模型输出的香农信息量的期望,并以此来描述真实概率分布同模型输出的概率分布间的“距离”,所以交叉熵损失也就是交叉熵平均值 1 N ∑ i − ∑ c = 1 M y i c log ( p i c ) \frac{1}{N} \sum_{i}-\sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) N1∑i−∑c=1Myiclog(pic)
简单的例子:二分类的交叉熵
L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ( p i ) + ( 1 − y i ) ⋅ log ( 1 − p i ) ] L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] L=N1i∑Li=N1i∑−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
式中, y i c y_{ic} yic为指示变量(样本i的label,正类为1,负类为0 ), p i c p_{ic} pic表示样本i预测为正的概率。
Python代码
# 带溢出保护的softmax
def softmax(x):
shift_x = x - np.max(x) # 防止输入增大时输出为nan
return np.exp(shift_x) / np.sum(np.exp(shift_x))
# 二分类交叉熵
def cross_entropy(y, y_hat): # y-真实,y_hat-模型输出
return -np.sum(np.nan_to_num(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat)))
# np.nan_to_num()使用0代替数组x中的nan元素,使用有限的数字代替inf元素