本文详细的推导了二值交叉熵(BCE)和二值交叉熵损失函数(BCE Loss)之间的关系。
一、 理论基础
A : = f ( ⋅ ) A:=f(\cdot) A:=f(⋅) 表示 A A A定义为 f ( ⋅ ) f(\cdot) f(⋅),这是人们为了某些目的而将 A A A定义成 f ( ⋅ ) f(\cdot) f(⋅)的,有意义的定义往往能揭示一些规律。
1. 信息量
对于事件 x x x,假设它的信息量表示为 I ( x ) I(x) I(x),它发生的概率表示为 p ( x ) p(x) p(x)。
基于我们的常识可以知道:
- 一个事件 x i x_i xi发生的概率越小,它包含的信息量 I ( x i ) I(x_i) I(xi)应该越大 = > I =>I =>I应该和 p p p成反比 = > => =>即 I I I和 1 p \frac{1}{p} p1成正比
- 两个事件 x i , x j x_i, x_j xi,xj的信息量 I ( x i ) + I ( x j ) I(x_i)+I(x_j) I(xi)+I(xj)相加,应该和这两个事件同时发生有关(注意:两个事件同时发生的概率等于两个事件的概率之积 p ( x i ) p ( x j ) p(x_i)p(x_j) p(xi)p(xj)) = > I =>I =>I应该能把加法转换为乘法 = > => =>可用 l o g log log实现
基于上面两个性质,可以有 I ( x ) : = l o g 1 p ( x ) I(x):=log\frac{1}{p(x)} I(x):=logp(x)1 ,log的底取任何>1的值其实都没关系,但为了让它更有意义,通常取 2 2 2为底,因为这样,就能使得抛硬币正面朝上这样只有 1 2 \frac{1}{2} 21 概率的事件的信息量刚好为1,并且可以赋予其"比特"的单位(注意,单位也是定义的,人们会把一些有意义的事情给上单位)。所以说,抛硬币正面朝上的信息量为1比特。
所以,最终定义信息量为:
I ( x ) : = l o g 2 1 p ( x ) = − l o g 2 p ( x ) I(x):=log_2\frac{1}{p(x)}=-log_2p(x) I(x):=log2p(x)1=−log2p(x)
2. 熵(也叫香农熵)
熵这个概念是针对一个事件集合 X X X而定义的(即有一系列事件 x ∈ X x \in X x∈X),
熵定义为这些事件携带信息量的平均值(也叫期望)。所以有:
H ( p ( x ) ) : = ∑ x ∈ X p ( x ) I ( x ) = − ∑ x ∈ X p ( x ) l o g 2 p ( x ) H(p(x)):=\sum_{x\in X}p(x)I(x)=-\sum_{x\in X}p(x)log_2p(x) H(p(x)):=x∈X∑p(x)I(x)=−x∈X∑p(x)log2p(x)
或简写版:
H ( p ) : = ∑ p x I x = − ∑ p x l o g 2 p x H(p):=\sum p_xI_x=-\sum p_xlog_2p_x H(p):=∑pxIx=−∑pxlog2px
这样,熵越大,表示这个系统包含的信息越多,系统越不稳定。
熵越小,表示这个系统包含的信息越少,系统越稳定。
如上图所示,中国和法国比赛悬念比较小,所以信息量少,结果比较稳定。(虽然中国赢了有更大的信息量,但发生的概率太小,整体基本上是法国赢)
而德国对荷兰的比赛则55开,比较不稳定,谁最终夺冠是个信息量很大的事。
所以德国VS荷兰这个系统的熵>法国VS中国的熵
3. 交叉熵
对于事件 x x x,
假设它发生的真实概率(ground truth probability)表示为 p ( x ) p(x) p(x)
假设它的观测概率为 q ( x ) q(x) q(x)(即通过多次试验得到的概率或者通过算法预测出来的概率)
则交叉熵定义为:
H ( p ( x ) , q ( x ) ) : = ∑ x ∈ X p ( x ) I q ( x ) = − ∑ x ∈ X p ( x ) l o g 2 q ( x ) H(p(x),q(x)):=\sum_{x\in X}p(x)I^q(x)=-\sum_{x\in X}p(x)log_2q(x) H(p(x),q(x)):=x∈X∑p(x)Iq(x)=−x∈X∑p(x)log2q(x)
或简写版:
H ( p , q ) : = ∑ p x I x q = − ∑ p x l o g 2 q x H(p,q):=\sum p_xI^q_x=-\sum p_xlog_2q_x H(p,q):=∑pxIxq=−∑pxlog2qx
I q ( x ) I^q(x) Iq(x)表示以 q q q为概率的信息量。
举个例子:
假设抛硬币正面为 h h h,反面为 t t t。我们知道真实概率 p ( h ) = p ( t ) = 0.5 p(h)=p(t)=0.5 p(h)=p(t)=0.5。
现在有两枚硬币,由于粘了不同程度的泥土导致抛出的概率不一样。通过实验,得到:
这里,我们就可以看出一点点门道了,即观测概率 q q q越接近真实概率 p p p。交叉熵相对越小。而这个结论是可以被证明的(见后面的KL散度)。
简化版
4. KL散度(或相对熵)
KL散度定义为交叉熵和香农熵的差。
D ( p ( x ) ∣ ∣ q ( x ) ) = H ( p ( x ) , q ( x ) ) − H ( p ( x ) ) = ∑ x ∈ X p ( x ) I q ( x ) − ∑ x ∈ X p ( x ) I ( x ) = ∑ x ∈ X p ( x ) l o g 2 1 q ( x ) − ∑ x ∈ X p ( x ) l o g 2 1 p ( x ) = ∑ x ∈ X p ( x ) l o g 2 p ( x ) q ( x ) \begin{aligned} D(p(x)||q(x))=H(p(x),q(x))-H(p(x))&=\sum_{x\in X}p(x)I^q(x)-\sum_{x\in X}p(x)I(x)\\ &=\sum_{x\in X}p(x)log_2\frac{1}{q(x)}-\sum_{x\in X}p(x)log_2\frac{1}{p(x)}\\ &=\sum_{x\in X}p(x)log_2\frac{p(x)}{q(x)} \end{aligned} D(p(x)∣∣q(x))=H(p(x),q(x))−H(p(x))=x∈X∑p(x)Iq(x)−x∈X∑p(x)I(x)=x∈X∑p(x)log2q(x)1−x∈X∑p(x)log2p(x)1=x∈X∑p(x)log2q(x)p(x)
简写版:
D ( p ∣ ∣ q ) = H ( p , q ) − H ( p ) = ∑ p x I x q − ∑ p x I x = ∑ p x l o g 2 1 q x − ∑ p x l o g 2 1 p x = ∑ p x l o g 2 p x q x \begin{aligned} D(p||q)=H(p,q)-H(p)&=\sum p_xI^q_x-\sum p_xI_x\\ &=\sum p_xlog_2\frac{1}{q_x}-\sum p_xlog_2\frac{1}{p_x}\\ &=\sum p_xlog_2\frac{p_x}{q_x} \end{aligned} D(p∣∣q)=H(p,q)−H(p)=∑pxIxq−∑pxIx=∑pxlog2qx1−∑pxlog2px1=∑pxlog2qxpx
性质1:
D ( p ∣ ∣ q ) ≥ 0 D(p||q)\ge 0 D(p∣∣q)≥0 当且仅当 q = p q=p q=p时等号成立。
证明:吉布斯不等式
性质2:
D ( p ∣ ∣ q ) ≠ D ( q ∣ ∣ p ) D(p||q)\neq D(q||p) D(p∣∣q)=D(q∣∣p)
性质3:
由于 H ( p ) H(p) H(p)是个常量,q是一个变量,通常可表示为函数 f ( θ ) f(\theta) f(θ),所以通过选取不同 q θ q_\theta qθ(简便起见,这么写,不代表 θ \theta θ是事件)最小化 D ( p ∣ ∣ q θ ) D(p||q_\theta) D(p∣∣qθ)等价于最小化 H ( p , q θ ) H(p,q_\theta) H(p,qθ),即:
▽ θ D ( p ∣ ∣ q θ ) = ▽ θ H ( p , q θ ) − ▽ θ H ( p ) = ▽ θ H ( p , q θ ) \triangledown_\theta D(p||q_\theta)=\triangledown_\theta H(p,q_\theta)-\triangledown_\theta H(p)=\triangledown_\theta H(p,q_\theta) ▽θD(p∣∣qθ)=▽θH(p,qθ)−▽θH(p)=▽θH(p,qθ)
关于事件空间的误解
(注意,很多教程没有讲清楚事件空间和采样试验(见下一节) 的区别,这里拉出来强调下。)
事件空间是指 X X X,即事件 x x x的可取值的集合。
由于观测值样本空间只能是真实值样本空间的子集,所以不存在有些教程里说的要确定取值的问题。比如下面:
当观测值和真实值一样时:
如果观测数更多:
如果观测数更少:
总是取事件空间更大的值。(注意上面的图在事件空间体现这块是有问题的,横轴表示事件空间。不可能出现观测值在真实值中不存在的情况,比如第一幅图,真实值只有1,它却观测到了0.4或者0.8;最后一幅图,观测到的是1,真实值从图上看又没有1。)
实际上根据公式 x ∈ X x\in X x∈X这里的 X X X指的是真实事件空间。对于 p p p不存在的情况 i i i, p i p_i pi取0,对于 q q q不存在的情况 j j j, q j q_j qj取0代入公式即可,不必要关注所谓的取大取小的问题。
5. 二值交叉熵(Binary Cross-Entropy,BCE)和BCE损失函数
二值交叉熵是交叉熵的一种特殊情况,即真实样本空间只有两个取值,一般来说是 [ 0 , 1 ] [0,1] [0,1]。有 p ( 0 ) + p ( 1 ) = 1 , q ( 0 ) + q ( 1 ) = 1 p(0)+p(1)=1,q(0)+q(1)=1 p(0)+p(1)=1,q(0)+q(1)=1
H ( p ( x ) , q ( x ) ) = ∑ x ∈ [ 0 , 1 ] p ( x ) I q ( x ) = p ( 0 ) I q ( 0 ) + p ( 1 ) I q ( 1 ) = − ( p ( 0 ) l o g 2 q ( 0 ) + ( 1 − p ( 0 ) ) l o g x ( 1 − q ( 0 ) ) ) 或 = − ( ( 1 − p ( 1 ) ) l o g x ( 1 − q ( 1 ) ) + p ( 1 ) l o g 2 q ( 1 ) ) = − ( p ( x ) l o g 2 q ( x ) + ( 1 − p ( x ) ) l o g x ( 1 − q ( x ) ) ) \begin{aligned} H(p(x),q(x))=\sum_{x\in [0,1]}p(x)I^q(x)&=p(0)I^q(0)+p(1)I^q(1)\\ &=-(p(0)log_2q(0)+(1-p(0))log_x(1-q(0)))或=-((1-p(1))log_x(1-q(1))+p(1)log_2q(1))\\ &=-(p(x)log_2q(x)+(1-p(x))log_x(1-q(x))) \end{aligned} H(p(x),q(x))=x∈[0,1]∑p(x)Iq(x)=p(0)Iq(0)+p(1)Iq(1)=−(p(0)log2q(0)+(1−p(0))logx(1−q(0)))或=−((1−p(1))logx(1−q(1))+p(1)log2q(1))=−(p(x)log2q(x)+(1−p(x))logx(1−q(x)))
其中x可取0或者1。
或简写版:
H ( p , q ) = − ( p x l o g 2 q x + ( 1 − p x ) l o g 2 ( 1 − q x ) ) H(p,q)=-(p_xlog_2q_x+(1-p_x)log_2(1-q_x)) H(p,q)=−(pxlog2qx+(1−px)log2(1−qx))
其中 x x x可取 0 0 0或 1 1 1。
有两点要注意:
- H中的累加符号没有了
- 也就是说,我们可以只关注一种结果,0或者1。
为什么我们在其他文献或者教材里看到的BCE是长下面这样呢?
1 N ∑ i = 0 N ( y i l o g 2 y ^ i + ( 1 − y i ) l o g 2 ( 1 − y ^ i ) ) \frac{1}{N}\sum_{i=0}^N(y_ilog_2\hat{y}_i+(1-y_i)log_2(1-\hat{y}_i)) N1i=0∑N(yilog2y^i+(1−yi)log2(1−y^i))
其中: N N N为采样数, y i y_i yi为真实标签(0或1), y ^ i \hat{y}_i y^i为预测概率。
事实上,严格的来说,上面的公式并不是交叉熵,而是基于交叉熵构造的BCE损失函数, q ( x ) q(x) q(x)这个观测值或者预测值是由未知变量的函数决定的(比如sigmoid函数 q ( x ) ( θ ) = 1 1 + e − θ x ^ q(x)(\theta)=\frac{1}{1+e^{-\theta \hat{x}}} q(x)(θ)=1+e−θx^1),假设做了N次实验,那么损失函数定义为:
L o s s ( θ ) : = 1 N ∑ i = 0 N H ( p i ( x ) , q i ( x ) ) = 1 N ∑ i = 0 N H ( p i ( x ) , q i ( x ) ( θ ) ) Loss(\theta):=\frac{1}{N}\sum_{i=0}^NH(p_i(x),q_i(x))=\frac{1}{N}\sum_{i=0}^NH(p_i(x),q_i(x)(\theta)) Loss(θ):=N1i=0∑NH(pi(x),qi(x))=N1i=0∑NH(pi(x),qi(x)(θ))
代入BCE公式得:
L o s s ( θ ) = − 1 N ∑ i = 0 N ( p i ( x ) l o g 2 q i ( x ) ( θ ) + ( 1 − p i ( x ) ) l o g x ( 1 − q i ( x ) ( θ ) ) ) Loss(\theta)=-\frac{1}{N}\sum_{i=0}^N(p_i(x)log_2q_i(x)(\theta)+(1-p_i(x))log_x(1-q_i(x)(\theta))) Loss(θ)=−N1i=0∑N(pi(x)log2qi(x)(θ)+(1−pi(x))logx(1−qi(x)(θ)))
注意这里的 i i i代表的事每次实验。举个例子,假设下面有N张照片,我们预测它是不是猫。即x=1表示是猫,x=0表示不是猫。那么i就表示第i张照片。注意每个 x i x_i xi都有两个取值。
由第4节的性质3可知,最小化上面的损失函数,其实就是最小化每一个KL散度 ▽ θ D ( p i ∣ ∣ q i ( θ ) ) \triangledown_\theta D(p_i||q_i(\theta)) ▽θD(pi∣∣qi(θ)),
即设计这么个损失函数就是为了找最好的 θ \theta θ使得 q i ( θ ) q_i(\theta) qi(θ)在每个测试点上都能拟合真实的 p i p_i pi。
现在只剩下疑问:原公式中只有概率,标签怎么出现到公式里的?
首先,我们要明确这里的真实事件空间是什么。
如果我们把事件定义成"a=它是1”,“b=它是0”,
类比“h=抛硬币正面朝上”和"t=抛硬币反面朝上", p ( h ) = p ( t ) = 0.5 p(h)=p(t)=0.5 p(h)=p(t)=0.5
那么对于一张照片,它是不是猫,真实概率要么是100%要么是0%。
所以 p ( a ) = 100 % = 1 p(a)=100\%=1 p(a)=100%=1或者 p ( a ) = 0 % = 0 p(a)=0\%=0 p(a)=0%=0(刚好和标签0,1对应上)
那么,
H ( p ( x ) , q ( x ) ) = − ( p ( x ) l o g 2 q ( x ) + ( 1 − p ( x ) ) l o g x ( 1 − q ( x ) ) ) = − ( x l o g 2 q ( x ) + ( 1 − x ) l o g x ( 1 − q ( x ) ) ) \begin{aligned} H(p(x),q(x))&=-(p(x)log_2q(x)+(1-p(x))log_x(1-q(x)))\\ &=-(xlog_2q(x)+(1-x)log_x(1-q(x))) \end{aligned} H(p(x),q(x))=−(p(x)log2q(x)+(1−p(x))logx(1−q(x)))=−(xlog2q(x)+(1−x)logx(1−q(x)))
x x x取 1 1 1或 0 0 0,即对应图片是不是猫的真实标签。
这样,标签的值就写进公式了。
即:
L o s s ( θ ) = − 1 N ∑ i = 0 N ( p i ( x ) l o g 2 q i ( x ) ( θ ) + ( 1 − p i ( x ) ) l o g x ( 1 − q i ( x ) ( θ ) ) ) = − 1 N ∑ i = 0 N ( x i l o g 2 q i ( x ) ( θ ) + ( 1 − x i ) l o g 2 ( 1 − q i ( x ) ( θ ) ) ) \begin{aligned} Loss(\theta)&=-\frac{1}{N}\sum_{i=0}^N(p_i(x)log_2q_i(x)(\theta)+(1-p_i(x))log_x(1-q_i(x)(\theta)))\\ &=-\frac{1}{N}\sum_{i=0}^N(x_ilog_2q_i(x)(\theta)+(1-x_i)log_2(1-q_i(x)(\theta))) \end{aligned} Loss(θ)=−N1i=0∑N(pi(x)log2qi(x)(θ)+(1−pi(x))logx(1−qi(x)(θ)))=−N1i=0∑N(xilog2qi(x)(θ)+(1−xi)log2(1−qi(x)(θ)))
或简写版
L o s s ( θ ) = = − 1 N ∑ i = 0 N ( x i l o g 2 q x i ( θ ) + ( 1 − x i ) l o g 2 ( 1 − q x i ( θ ) ) ) \begin{aligned} Loss(\theta)&= &=-\frac{1}{N}\sum_{i=0}^N(x_ilog_2q_{x_i}(\theta)+(1-x_i)log_2(1-q_{x_i}(\theta))) \end{aligned} Loss(θ)==−N1i=0∑N(xilog2qxi(θ)+(1−xi)log2(1−qxi(θ)))
参考
可视化理解Binary Cross-Entropy
【10分钟】了解香农熵,交叉熵和KL散度
打包理解“信息量”、“比特”、“熵”、“KL散度”
Understanding binary cross-entropy / log loss: a visual explanation
维基百科-Cross Entropy
个视频彻底搞懂交叉熵、信息熵、相对熵、KL散度、交叉熵损失、交叉熵