交叉熵(Cross Entropy) 被普遍应用在深度学习的损失函数中
二值交叉熵函数(BinaryCrossEntropyLoss) 可用于二值分类任务中的损失函数
SoftmaxCrossEntropyLoss, 采用 softmax 来输出每一类的概率值, 再将 softmax 输出结果, 送入交叉熵损失函数.
1. 二值交叉熵(BinaryCrossEntropy)
假设训练数据 ${ D = \lbrace (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) \rbrace }$ ,
其中,
${ x \in R^n }$ - 训练样本, 如图片;
${ y \in \lbrace 0, 1\rbrace }$ - 标签labels, 只有 0 和 1, 二值分类问题.
假设已经有训练模型 ${ f(x, \theta) }$, 在给定 ${ x }$ 时, 输出 ${ y }$ 的概率. ${ f(x, \theta) }$ 是深度 CNN 模型或传统机器学习模型, ${ \theta }$ 是模型参数.
基于 最大似然(Maximum Likelihood) 思想, 其目的是为了寻找能够最大化 ${ P(D | \theta) }$ 的参数 ${ \theta }$.
假设数据服从伯努利分布(Bernoulli distribution), 且 ${ \lbrace (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) \rbrace }$ 相互独立, 则有:
${ P(D | \theta) = \prod _{i=1}^{n} f(x_i, \theta)^{y_i} \cdot (1- f(x_i, \theta))^{(1- y_i)} }$ (1)
取 log,
${ log P(D | \theta) = log ( \prod _{i=1}^n f(x_i, \theta)^{y_i} \cdot (1- f(x_i, \theta))^{(1- y_i)} ) }$ (2)
简化,
${ log P(D | \theta) = \sum_{i=1}^n y_i logf(x_i, \theta) + (1- y_i)log(1- f(x_i, \theta)) }$ (3)
相比于直接最大化等式 (1) 进行优化, 一般采用对其 log 等式 (3) 的负值进行最小化优化:
${- log(P(D | \theta)) =- \sum_{i=1}^n y_i logf(x_i, \theta) + (1- y_i)log(1- f(x_i, \theta)) }$ (4)
因此, 可以得到二值交叉熵函数 , 如下:
${- \sum_{i=1}^n y_i logf(x_i, \theta) + (1- y_i)log(1- f(x_i, \theta)) }$ (5)
二值交叉熵函数可用于二值分类任务中的损失函数.
CNN 中, 输出层可以采用 sigmoid 作为激活函数, 并将 sigmoid 输出结果, 送入二值交叉熵损失函数.
2. 交叉熵(CrossEntropy)
根据二分类的二值交叉熵,可以延展到多分类 multi-classification 任务.
假设标签labels ${ y \in \lbrace 0, 1, ..., k\rbrace }$, ${ k }$ 个类别.
假设 ${ k }$ 个类别中, 每个类别包含的样本数分别为 ${ n_1, n_2, ..., n_k }$, 且 ${ \sum_{i=1}^{k} n_i = n }$.
同样基于 最大似然(Maximum Likelihood) 思想,
假设数据服从多项式分布(Multinomial distribution), 且 ${ \lbrace (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) \rbrace }$ 相互独立, 则有:
${ P(D | \theta) = \frac{n!}{n_1! \cdot n_2! \cdot ... \cdot n_k! } \prod _{i=1}^{n} f(x_i, \theta)^{y_i} }$ (6)
取 log,
${ P(D | \theta) = log n!-logn_1! \cdot n_2! \cdot ... \cdot n_k! + log \prod_{i=1}^{n} f(x_i, \theta)^{y_i} }$ (7)
简化,
${ P(D | \theta) = log n!-logn_1! \cdot n_2! \cdot ... \cdot n_k! + \sum_{i=1}^{n} y_i logf(x_i, \theta) }$ (8)
由于 ${ log n!- logn_1! \cdot n_2! \cdot ... \cdot n_k! }$ 是与模型参数 ${ \theta }$ 无关的项, 作为常数项, 可以忽略, 则有:
${ P(D | \theta) = \sum_{i=1}^{n} y_i logf(x_i, \theta) }$ (9)
同样地, 最小化等式 (8) 的负值, 进行优化:
${- P(D | \theta) =- \sum_{i=1}^{n} y_i logf(x_i, \theta) }$ (10)
因此,可以得到交叉熵函数, 如下:
${- \sum_{i=1}^{n} y_i logf(x_i, \theta) }$ (11)
交叉熵函数可用于多分类multi-classification任务中的损失函数.
CNN 中, 输出层可以采用 softmax 来输出每一类的概率值, 再将 softmax 输出结果, 送入交叉熵损失函数.
Categorical CrossEntropy 多分类的对数损失函数
3. 信息论&熵&交叉熵
信息论中, 信号所包含的信息量多少, 可理解为:
- 如果发生可能性很高的事情发生了, 则包含的信息量较少, 价值不大;</p>
- 如果发生的可能性很低的事情发生了, 则包含的信息量较多, 价值更大.</p>
自信息定义为:
${ I(x) = -log(P(x)) }$
则, ${ P(x) }$ 值较大, 则 ${ I(x) }$ 值较小;反之, ${ P(x) }$ 值较小, 则 ${ I(x) }$ 值较大. 很好的反映了 ${ P(x) }$ 的信息量.
熵 是信息量的期望值, 度量了随机变量的确定性.
${ H(x) = -E(P(x)) * log(P(x)) }$
以二分类为例, label X 值只能为 0 或 1, 则其熵为:
${ H(x) = -[P(X=0) * log(P(X=0)) + (1- P(X=1))* log(1- P(X=1))] }$
交叉熵 是对于两个分布的度量,
${ H(P, Q) = -E(P(x)) * log(Q(x)) }$
其中, ${ P(x) }$ 和 ${ Q(x) }$ 表示两个分布, 如模型预测分布和真实标签分布.
当两个分布相同, 差别较小时, 即 ${ P(x) }$ 的位置, ${ Q(x) }$ 发生的概率非常确定为1, 则 ${ -log(Q(x)) = -log(1) = 0 }$, 二者的交叉熵为 ${ H(P, Q) = 0 }$.
当两个分布很不相同, 差别较大时, 即${ P(x) }$ 的位置, ${ Q(x) }$ 发生的概率非常小, 则 ${ -log(Q(x)) }$ 值会较大, 随之二者的交叉熵也较大.
相对熵, 也叫 KL 散度, 用于分析两个分布的差异程度. 也是交叉熵可以作为 loss 的原因.
将交叉熵减去训练样本的熵, 有:
${ H(P, Q)- H(P) =-E(P(x)) * log(Q(x))- (-E(P(x)) * log(P(x))) }$
${ H(P, Q)- H(P) =-E(P(x)) * log(Q(x)) + E(P(x)) * log(P(x)) }$
${ H(P, Q)- H(P) =-E(P(x)) (log(Q(x))- log(P(x)) ) }$
${ H(P, Q)- H(P) =-E(P(x)) log \frac{Q(x)}{P(x)} }$
其中, 训练样本的熵 ${ P(x) }$ 是固定的, 因为样本是固定的.
Related
[1] - CaffeLoss - SigmoidCrossEntropyLoss 推导与Python实现
[2] - CaffeLoss - SigmoidCrossEntropyLossLayer
[3] - Caffe源码 - SoftmaxWithLossLayer
[4] - CaffeLoss - LossLayers简述
2 comments
“假设数据服从多项式分布(Multinomial distribution), 且
相互独立, 则有:”
这里的公式可以提供下出处吗?不是很理解。
这个是多项式分布的基本公式的,搜一下多项式分布就能找到.