人工智能里的数学修炼 | 交叉熵损失函数:从信息说起

交叉熵损失函数被广泛的运用于各种神经网络的训练目标函数,今天我们来深度刨析一番这一函数的优势何在,它又是从何而来?

一、最初的方差代价函数

在一步步介绍到交叉熵损失函数之前,先让我们来看一下最初的方差损失函数,为什么我们需要更优的交叉熵损失函数?先了解方差损失函数有助于我们更好的把握交叉熵损失函数的优势与性能。现在我们假设有一个独立的多输入单输出神经元的结构如下:
这里写图片描述

其中输入向量 X = ( x 1 , x 1 , . . . , x n ) X = (x_{1},x_{1},...,x_{n}) X=x1,x1,...,xn) ,权重系数 W = ( w 1 , w 2 , . . . , w n ) W = (w_{1},w_{2},...,w_{n}) W=(w1,w2,...,wn), 偏置b,激活函数 σ \sigma σ s i g m o i d sigmoid sigmoid函数 。由此我们可以得到该神经元的实际输出函数如下:

a = σ ( Z ) a = \sigma(Z) a=σ(Z) 其中 Z = W X + b Z = WX+b Z=WX+b

有了上面的基础,现在我们就可以给出最基础的方差损失函数

C = ( y − a ) 2 2 C = \frac{(y-a)^{2}}{2} C=2(ya)2

上式中, y y y 为我们期望的输出,在训练神经网络的过程中,我们通过梯度下降算法来更新 W W W b b b,这一过程中,我们需要分别求损失函数 C C C W W W b b b的偏导如下:

∂ C ∂ W = ( a − y ) σ ′ ( Z ) X = a 1 σ ′ ( Z ) \frac{\partial C}{\partial W} = (a-y)\sigma ^{'}(Z)X = a_{1}\sigma ^{'}(Z) WC=(ay)σ(Z)X=a1σ(Z)
∂ C ∂ b = ( a − y ) σ ′ ( Z ) = a 2 σ ′ ( Z ) \frac{\partial C}{\partial b} = (a-y)\sigma ^{'}(Z) = a_{2}\sigma ^{'}(Z) bC=(ay)σ(Z)=a2σ(Z)

然后我们就可以用梯度下降的公式求得理想的参数,迭代如下:
W k = W k − 1 − η ∗ a 1 ∗ σ ′ ( Z ) W_{k} = W_{k-1} - \eta* a_{1}*\sigma ^{'}(Z) Wk=Wk1ηa1σ(Z)
b k = b k − 1 − η ∗ a 2 ∗ σ ′ ( Z ) b_{k} = b_{k-1} - \eta* a_{2}*\sigma ^{'}(Z) bk=bk1ηa2σ(Z)

其中 η \eta η 为自行设置的迭代步长,这里我们又需要了解一下激活函数 s i g m o i d sigmoid sigmoid 的性质,其函数曲线如下:
这里写图片描述

从上图我们可以看出来, 激活函数 s i g m o i d sigmoid sigmoid 的变化空间集中在0附近,与0的距离越远,函数的变化越小,即导数越小。这一性质会导致 σ ′ \sigma^{'} σ Z Z Z 取绝大多数值的时候会非常小,从而使 W W W b b b 更新的非常慢,而交叉熵损失函数正是为了解决这一问题而被引入神经网络的优化过程。

二、独热编码与SoftMax函数

看完了方差损失函数,我们先不急着说交叉熵损失函数,别急,我们还需要了解一下可以使交叉损失函数更方便应用的一些神经网络设置与技巧。

2.1独热编码

我们可以先回忆一下我们平时使用的二分类器,通常我们使用0表示“是“,1表示“不是“,这其实也是一种编码,我们称其为自然编码。而我们要说的独热编码是这样的:“01“表示“是“,“10“表示“不是“。说到这里大家应该明白了,独热编码是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。

2.2SoftMax函数

做过逻辑回归分类问题的同学应该知道,在logistic regression二分类问题中,我们使用 s i g m o i d sigmoid sigmoid 函数将输入 W X + b WX+b WX+b 映射到(0,1)区间中,从而得到输入样本属于某个类别的概率。将这一思想推广到多分类问题中,我们就可以使用SoftMax函数来实现,对输出的值归一化为概率值。
这里假设在进入SoftMax函数之前,已有模型输出,一个输入样本的输出个数为C(在独热编码下即为类别数),记输出为 a 1 , a 2 , . . . , a c a_{1},a_{2},...,a_{c} a1,a2,...,ac,对于每个样本,它属于类别 i i i 的概率为:

y i = e a i ∑ k = 1 C e a i y_{i} = \frac{e^{a_{i}}}{\sum _{k =1}^{C}e^{a_{i}}} yi=k=1Ceaieai

通过上式,即SoftMax函数,可以保证 ∑ k = 1 C y i = 1 \sum_{k =1}^{C}y_{i} = 1 k=1Cyi=1 ,即属于各个类别的概率和为1。

三、信息量与熵

千呼万唤始出来,终于要讲到交叉熵损失函数的概念了。在信息论中,熵是对信息量的一个度量,我们先来介绍一下什么是信息量。

3.1信息量

假设 X X X是一个离散型随机变量,其取值集合为 χ \chi χ , X X X 的概率密度函数为 P ( x ) = P r ( X = x ) , x ϵ χ P(x) = Pr(X = x) , x \epsilon \chi P(x)=Pr(X=x),xϵχ , 于是,我们可以定义事件 X = x 0 X = x_{0} X=x0 的信息量为:

I ( x 0 ) = − l o g ( P ( x 0 ) ) I(x_{0})= -log(P(x_{0})) I(x0)=log(P(x0))

l o g log log 以2为底时其单位为bit,以e为底时其单位为net,以10为底时单位为Hart。光看公式可能比较抽象,这里举一个简单的例子:

小宝贝考试及格的概率是0.9
骏骏哥哥考试及格的概率是0.6

则“小宝贝考试及格“这一事件带给我们的信息量(这里以e为底)是 − l o g e ( 0.9 ) = 0.105 -log_{e}(0.9) = 0.105 loge(0.9)=0.105
而“骏骏哥哥考试及格“这一事件带给我们的信息量是 − l o g e ( 0.6 ) = 0.511 -log_{e}(0.6) = 0.511 loge(0.6)=0.511
对此,我们可以理解为,一个事件发生的概率越大,则它所携带的信息量就越小,当 P ( x 0 = 1 ) P(x_{0} = 1) P(x0=1) 时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。

3.2熵

有了信息量的基础,我们就可以较好的理解熵的概念。对于一个随机变量 X X X ,它的所有可能取值的信息量的期望 E [ I ( x ) ] E[I(x)] E[I(x)]就称为熵,其数学定义为:

H ( x ) = E p ( l o g 1 p ( x ) ) = − ∑ x ϵ X p ( x ) l o g ( p ( x ) ) H(x) = Ep( log\frac{1}{p(x)}) = -\sum _{x\epsilon X}p(x)log(p(x)) H(x)=Ep(logp(x)1)=xϵXp(x)log(p(x))

如果 p ( x ) p(x) p(x)是连续型随机变量的概率密度函数,则可以类似的定义熵为:

H ( x ) = E p ( l o g 1 p ( x ) ) = − ∫ x ϵ X p ( x ) l o g ( p ( x ) ) H(x) = Ep( log\frac{1}{p(x)}) = -\int _{x\epsilon X}p(x)log(p(x)) H(x)=Ep(logp(x)1)=xϵXp(x)log(p(x))

为了保证有效性,定义:
lim ⁡ p ( x ) → 0 p ( x ) l o g ( p ( x ) ) ) = 0 \lim_{p(x) \to 0}p(x)log(p(x))) = 0 limp(x)0p(x)log(p(x)))=0

根据定义我们可以知道,熵其实描述了一个系统所包含的信息量的大小

四、相对熵

相对熵是一个非常容易和交叉熵弄混的概念,相对熵又称为KL散度,KL距离,是两个随机分布间的距离的度量。记为 D K L ( p ∣ ∣ q ) DKL(p||q) DKL(pq) ,它所描述的是当真实分布为 p p p 时,分布 q q q 的失效性(越大越失效)。数学描述如下:

D K L ( p ∣ ∣ q ) = E p ( l o g ( p ( x ) q ( x ) ) = ∑ x ϵ X p ( x ) l o g p ( x ) q ( x ) DKL(p||q) = E_{p}(log(\frac{p(x)}{q(x)}) = \sum_{x\epsilon X}p(x)log\frac{p(x)}{q(x)} DKL(pq)=Ep(log(q(x)p(x))=xϵXp(x)logq(x)p(x)
= ∑ x ϵ X ( p ( x ) l o g ( p ( x ) ) − p ( x ) l o g ( q ( x ) ) ) =\sum_{x\epsilon X}(p(x)log(p(x)) - p(x)log(q(x))) =xϵX(p(x)log(p(x))p(x)log(q(x)))
= ∑ x ϵ X p ( x ) l o g ( p ( x ) ) − ∑ x ϵ X p ( x ) l o g ( q ( x ) ) =\sum_{x\epsilon X}p(x)log(p(x)) - \sum_{x\epsilon X}p(x)log(q(x)) =xϵXp(x)log(p(x))xϵXp(x)log(q(x))
= − H ( p ) − ∑ x ϵ X p ( x ) l o g ( q ( x ) ) = -H(p)- \sum_{x\epsilon X}p(x)log(q(x)) =H(p)xϵXp(x)log(q(x))
= − H ( p ) + E p ( − l o g ( q ( x ) ) ) = -H(p) + E_{p}(-log(q(x))) =H(p)+Ep(log(q(x)))
= − H ( p ) + H p ( q ) = -H(p) + H_{p}(q) =H(p)+Hp(q)

上式中的 H p ( q ) H_{p}(q) Hp(q) 表示在分布 p p p 下,使用 q q q 进行编码需要的的bit数,而 H ( p ) H(p) H(p) 表示对真实分布 p p p 所需要的最小编码bit数。基于此,相对熵的意义就很明确了:DKL(p||q)表示在分布为 p p p的前提下,使用 q q q分布进行编码,相对于使用真实分布进行编码(即最优编码)所多出来的bit数。显然,当 p = q p =q p=q 时,两者之间的相对熵 为0。
同样的,为了保证连续有效性,定义:
0 l o g 0 0 = 0 , 0 l o g 0 q = 0 , p l o g p 0 = inf ⁡ 0log\frac{0}{0} = 0 , 0log\frac{0}{q} = 0,plog\frac{p}{0} = \inf 0log00=0,0logq0=0,plog0p=inf

五、交叉熵与交叉熵损失函数

终于说到重头戏了,假设有两个分布 p , q p,q p,q,则它们在给定样本集上的交叉熵定义如下:

C E H = E p ( − l o g q ) = − ∑ x ϵ X p ( x ) l o g ( q ( x ) ) = H ( p ) + D K L ( p ∣ ∣ q ) CEH = E_{p}(-logq) = -\sum_{x\epsilon X}p(x)log(q(x)) = H(p) + DKL(p||q) CEH=Ep(logq)=xϵXp(x)log(q(x))=H(p)+DKL(pq)

我们可以从公式中看出来,交叉熵与上一节定义的相对熵仅差了 H ( p ) H(p) H(p) ,当 p p p已知时,可以把 H ( p ) H(p) H(p) 看作一个常数,此时交叉熵与相对熵在行为上是等价的,都反映了分布 p , q p,q p,q的相似程度。最小化熵等于最小化的相对熵。它们都将在 p = q p = q p=q时取得最小值 H ( p ) H(p) H(p)

特别的,在logistic regression中,我们有
p p p:真实样本分布,服从参数为 p p p 的0-1分布,即 x ~ B(1,p)
q q q:待估计的模型,服从参数为 q q q 的0-1分布,即 x ~ B(1,q)
两者的交叉熵为:

C E H ( p , q ) = − ∑ x ϵ X ( p , q ) CEH(p,q) = -\sum_{x\epsilon X}(p,q) CEH(p,q)=xϵX(p,q)
= − ( P p ( x = 1 ) l o g P q ( x = 1 ) + P p ( x = 0 ) l o g P q ( x = 0 ) ) = -(P_{p}(x=1)logP_{q}(x = 1) + P_{p}(x=0)logP_{q}(x = 0) ) =(Pp(x=1)logPq(x=1)+Pp(x=0)logPq(x=0))
= − ( p l o g q + ( 1 − p ) l o g ( 1 − q ) ) = -(plogq + (1-p)log(1-q) ) =(plogq+(1p)log(1q))

对所有m个样本的交叉熵取均值,可得逻辑回归问题的交叉熵损失函数:
C = − 1 m ∑ i = 1 m ( p i l o g q i + ( 1 − p i ) l o g ( 1 − q i ) ) C= -\frac{1}{m}\sum_{i = 1}^{m}(p^{i}logq^{i} + (1-p^{i})log(1-q^{i}) ) C=m1i=1m(pilogqi+(1pi)log(1qi))

现在我们可以回答一开始的问题:交叉熵损失函数相比于方差损失函数好在哪里?

让我们对交叉熵损失函数C求偏导(y为期望输出,a为实际输出):

C = − 1 m ∑ m ( y l o g a + ( 1 − y ) l o g ( 1 − a ) ) C= -\frac{1}{m}\sum^{m}(yloga+ (1-y)log(1-a) ) C=m1m(yloga+(1y)log(1a))

对W求偏导:
∂ C ∂ σ ( W ) = ∂ C ∂ σ ( Z ) ∂ σ ( Z ) ∂ Z ∂ Z ∂ W = 1 m ∑ x x j ( σ ( Z ) − y ) \frac{\partial C}{\partial\sigma(W)} = \frac{\partial C}{\partial\sigma(Z)} \frac{\partial\sigma(Z)}{\partial Z} \frac{\partial Z}{\partial W} = \frac{1}{m} \sum_{x}x_{j}(\sigma(Z)-y) σ(W)C=σ(Z)CZσ(Z)WZ=m1xxj(σ(Z)y)

对b求偏导:
∂ C ∂ σ ( b ) = ∂ C ∂ σ ( Z ) ∂ σ ( Z ) ∂ Z ∂ Z ∂ b = 1 m ∑ x ( σ ( Z ) − y ) \frac{\partial C}{\partial\sigma(b)} = \frac{\partial C}{\partial\sigma(Z)} \frac{\partial\sigma(Z)}{\partial Z} \frac{\partial Z}{\partial b} = \frac{1}{m} \sum_{x}(\sigma(Z)-y) σ(b)C=σ(Z)CZσ(Z)bZ=m1x(σ(Z)y)

对比之前方差损失函数,我们会发现交叉熵损失函数的偏导少了 σ ′ \sigma^{'} σ项,从而避免了最初迭代过慢的问题

六、更多资源下载

微信搜索“老和山算法指南”获取更多下载链接与技术交流群
在这里插入图片描述
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liangjun_Feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值