啥也不会照样看懂交叉熵损失函数
什么是损失函数
损失函数(loss function)是用来估量模型的预测值与真实值的不一致程度,它是一个非负函数。一般来说,损失函数越小,模型的鲁棒性越好。损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数表示预测值与真实值之间的差异,结构风险损失函数是指经验风险损失函数加上正则化。一般形式为:
θ
=
a
r
g
m
i
n
θ
1
N
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
,
θ
i
)
)
+
λ
Θ
(
θ
)
\theta =arg\underset{\theta }{min}\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i},\theta _{i}))+\lambda \Theta (\theta)
θ=argθminN1∑i=1NL(yi,f(xi,θi))+λΘ(θ)
上面这个公式并不是损失函数,而是求解损失函数中的参数解。
损失函数其实就是我们设计的函数距离实际结果的误差。结合上面的公式我们知道,降低损失函数的办法就是调整和输入参数相关的权重(就是上面的参数解),调整权重实际上相当于在每个点调整改点的斜率。
损失函数的作用
根据上面对损失函数的解释可以发现,损失函数最大的作用就是用于衡量机器学习模型的预测能力。当我们发现目标函数与结果差距过大时,我们就要想办法优化其中的参数,尽量减小函数的损失,让函数变得准确。
有哪些损失函数
针对不同的问题,选用的损失函数也是不一样的。
没有一个适合所有机器学习算法的损失函数。针对特定问题选择损失函数涉及到许多因素,比如所选机器学习算法的类型、是否易于计算导数以及数据集中异常值所占比例。从学习任务的类型出发,可以从广义上将损失函数分为两大类——回归损失和分类损失。
在分类任务中,我们要从类别值有限的数据集中预测输出,比如给定一个手写数字图像的大数据集,将其分为 0~9 中的一个。
而回归问题处理的则是连续值的预测问题,例如给定房屋面积、房间数量以及房间大小,预测房屋价格。
这里跟大家简要介绍几个常用的损失函数
1,交叉熵(Cross Entroy)损失函数
2,描述概率分布的Sigmoid函数与softmax回归
3,均方误差损失函数
交叉熵(Cross Entroy)损失函数
直奔主题,交叉熵到底是如何工作的
在深度学习领域,交叉熵是用来刻画两个概率分布方向向量之间的距离的,是分类问题中使用比较广的一种损失函数。从这句话我们显然知道,距离越小,函数越精确。
我们以MNIST手写数字识别为例,详细跟大家介绍一下交叉熵的分类方式:
手写体识别问题可以被归纳为一个十分类问题,主要是判断一张图片中的阿拉伯数字是0-9中的哪一个。
解决对分类问题最常用的方法是设置n个网络的输出节点,节点的个数要与类别的个数一致。对于网络输入的每一个样本,神经网络的输出都是一个n维的向量,向量中的每一个结果都对应n个类别中的某一类别的概率值。
例如,在理想情况下,如果一个样本属于类别
k
k
k,那么这个类别所对应的输出节点的输出值应该为1,其他节点的输出值均为0.以手写体识别数字1为例,网络模型的输出结果可能是【0.1,0.8,0.1,.0,.0,.0,.0,.0,.0,.0】或者【0.2,0.5,0.2,0.1,.0,.0,.0,.0,.0,.0,】。根据输出结果,我们的直觉是选择其中概率最大的那个作为最终答案,所以这两个结果都能判断出数字的结果为1.
最理想的情况是【.0,1.0,.0,.0,.0,.0,.0,.0,.0,.0】,**那么如何判断一个输出向量有多接近于期望的向量输出呢?**我们会选用一个损失函数来刻画输出向量能达到的精度,例如交叉熵损失函数:
H ( P , Q ) = − ∑ x p ( x ) l o g Q ( x ) H(P,Q)=-\sum_{x}p(x)logQ(x) H(P,Q)=−∑xp(x)logQ(x)
交叉熵可以理解为概率分布Q对概率分布P估计的准确程度,所以在使用交叉熵损失函数时,一般设定
P
P
P代表的是正确答案(例如上面的理想情况),
Q
Q
Q代表预测的结果值。损失函数需要一步一步的被减小,才能使得预测答案接近真实答案。针对
Q
Q
Q最小化交叉熵可以等价于最小化KL散度。
Q
Q
Q对
P
P
P估计的越准确,说明两个概率分布之间的距离越小(交叉熵的值越小)比如对于上面的两个结果【0.1,0.8,0.1,.0,.0,.0,.0,.0,.0,.0】和【0.2,0.5,0.2,0.1,.0,.0,.0,.0,.0,.0,】,对于第一个结果而言,交叉熵的损失值为
H
(
P
,
Q
)
=
−
(
0
×
l
o
g
0.1
+
1
×
l
o
g
0.8
+
0
×
l
o
g
0.1
+
7
×
(
0
×
l
o
g
0
)
)
≈
0.01
H(P,Q)=-(0\times log0.1+1\times log0.8+0\times log0.1+7\times (0\times log0))\approx 0.01
H(P,Q)=−(0×log0.1+1×log0.8+0×log0.1+7×(0×log0))≈0.01
对于第二个而言,交叉熵损失值为
H
(
P
,
Q
)
=
−
(
0
×
l
o
g
0.2
+
1
×
l
o
g
0.5
+
0
×
l
o
g
0.1
+
0
×
l
o
g
0.1
+
6
×
(
0
×
l
o
g
0
)
)
≈
0.3
H(P,Q)=-(0\times log0.2+1\times log0.5+0\times log0.1+ 0\times log0.1+6\times (0\times log0))\approx 0.3
H(P,Q)=−(0×log0.2+1×log0.5+0×log0.1+0×log0.1+6×(0×log0))≈0.3
很显然,我们会倾向于第一个损失函数值。
有一个严重的问题,交叉熵的损失函数公式是如何来的呢,不要惊慌,听我慢慢说
交叉熵损失函数与应用数学中的信息论有些渊源,所以在介绍交叉熵损失的时候我们先简单的介绍一下信息论的基础内容。
信息论与交叉熵
信息论是应用数学的一个分支,主要研究如何将某个信号包含信息的多少进行量化。
信息论的基本想法是一个小概率事件的发生要比一个大概率事件的发生能提供更多的信息(也许这就是熟悉的地方没有风景的道理吧)。那么如何将这些事件提供的信息量化呢?
想要通过上述思想来量化信息,我们要遵循以下这些规律:
1,极可能发生的事件信息量会比较少,并且极端情况下,确保能够发生的事件应该没有信息量。
2,越小概率发生的事件越具有较高的信息量。
3,重复发生的独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上所包含的信息会是投掷一次硬币正面朝上所包含的信息量的2倍(想一想这是为什么?)
为了满足上述3个性质,我们定义一个事件 X = x X=x X=x的自信息( S e l f − i n f o r m a t i o n Self-information Self−information)为:
I ( x ) = − l o g ( P ( x ) ) I(x)=-log(P(x)) I(x)=−log(P(x))
在不加说明的情况下,我们通常选择 l o g log log来表示数学中的自然对数函数 l n ln ln(以 e e e为底的 l o g log log函数)。在信息论中,我们将定义的 I ( x ) I(x) I(x)的单位成为奈特( n a t nat nat)。1奈特是以 1 / e 1/e 1/e的概率观测到一个事件时获得的信息量。
大家先记住上面的公式,来走起
现在我们回顾一下概率论的一些小知识,在概率论中,假设某个离散型随机变量
X
X
X的分布为:
P
{
X
=
x
k
}
=
p
k
,
.
.
k
=
1
,
2
,
.
.
.
P\left \{ X=x_{k} \right \}=p_{k}, ..k=1,2,...
P{X=xk}=pk,..k=1,2,...
若级数
∑
k
=
1
∞
x
k
p
k
\sum_{k=1}^{\infty }x_{k}p_{k}
∑k=1∞xkpk绝对收敛,则称其为变量
X
X
X的数学期望,记为
E
(
X
)
E(X)
E(X),即:
E
(
X
)
=
∑
k
=
1
∞
x
k
p
k
E(X)=\sum_{k=1}^{\infty }x_{k}p_{k}
E(X)=∑k=1∞xkpk
对于连续性随机变量,假设随机变量
X
X
X的概率密度为
f
(
x
)
f(x)
f(x),若积分
∫
−
∞
+
∞
x
f
(
x
)
d
x
\int_{-\infty }^{+\infty}xf(x)dx
∫−∞+∞xf(x)dx绝对收敛,则称这个积分的值为随机变量
X
X
X的数学期望,即:
E
(
X
)
=
∫
−
∞
+
∞
x
f
(
x
)
d
x
E(X)=\int_{-\infty }^{+\infty}xf(x)dx
E(X)=∫−∞+∞xf(x)dx
数学期望也叫均值,描述的是随机变量取值的平均值。现在我们将上述对随机变量求解期望的思路扩展到对随机变量函数求解数学期望上面。
设
Y
Y
Y是随机变量
X
X
X的函数
Y
=
g
(
X
)
Y=g(X)
Y=g(X),(
g
g
g是连续函数),当随机变量
X
X
X是连续的时候,设概率密度仍然为
f
(
x
)
f(x)
f(x),若
∫
−
∞
+
∞
g
(
x
)
f
(
x
)
d
x
\int_{-\infty }^{+\infty}g(x)f(x)dx
∫−∞+∞g(x)f(x)dx绝对收敛,则有:
E
(
Y
)
=
E
[
g
(
X
)
]
=
∫
−
∞
+
∞
g
(
x
)
f
(
x
)
d
x
E(Y)=E[g(X)]=\int_{-\infty }^{+\infty }g(x)f(x)dx
E(Y)=E[g(X)]=∫−∞+∞g(x)f(x)dx
这样就可以使用一个叫做香农熵的东西来量化整个概率分布中的不确定性总量。利用之前的公式,得到香农熵的计算公式为:
H
(
X
)
=
E
X
−
P
[
I
(
X
)
]
=
−
E
X
−
P
[
l
o
g
(
P
(
x
)
)
]
H(X)=E_{X-P}[I(X)]=-E_{X-P}[log(P(x))]
H(X)=EX−P[I(X)]=−EX−P[log(P(x))]
这个公式也可以记为
H
(
P
)
H(P)
H(P),概括的说就是,一个分布的香农熵是指遵循这个分布的事件所产生的期望信息总量。一些确定性的分布(几乎可以确定事件是否发生)具有较低的熵;那些均匀分布的概率事件(每个事件发生的概率相同)具有较高的熵。
注意
如果对于
X
X
X的同一个随机变量有两个单独的概率分布
P
(
x
)
P(x)
P(x)和
Q
(
x
)
Q(x)
Q(x),则可以使用
K
L
KL
KL散度来衡量这两个分布的差异:
D
K
L
(
P
∣
Q
∣
)
=
E
X
−
P
[
l
o
g
P
(
x
)
Q
(
x
)
]
=
E
X
−
P
[
l
o
g
(
P
(
x
)
)
−
l
o
g
(
Q
(
x
)
)
]
D_{KL}(P\left | Q \right |)=E_{X-P}[log\frac{P(x)}{Q(x)}]=E_{X-P}[log(P(x))-log(Q(x))]
DKL(P∣Q∣)=EX−P[logQ(x)P(x)]=EX−P[log(P(x))−log(Q(x))]
K
L
KL
KL散度是非负的。
D
K
L
=
0
D_{KL}=0
DKL=0表示X离散时
P
P
P和
Q
Q
Q的取值处处相同或者在
X
X
X连续时
P
P
P和
Q
Q
Q的取值几乎处处相同
重点来了
在机器学习算法中,经常使用
K
L
KL
KL散度来衡量两个概率分布之间的某种距离,但是我们不会直接使用
K
L
KL
KL散度,而是使用其替代形式—交叉熵。交叉熵和
K
L
KL
KL散度关系密切,用
H
(
P
,
Q
)
H(P,Q)
H(P,Q)表示交叉熵值,则有:
H
(
P
,
Q
)
=
H
(
P
)
+
D
K
L
(
P
∣
∣
Q
)
H(P,Q)=H(P)+D_{KL}(P\left | \right | Q)
H(P,Q)=H(P)+DKL(P∣∣Q)
简化之后得到
H
(
P
,
Q
)
=
−
E
X
−
P
l
o
g
(
Q
(
x
)
)
H(P,Q)=-E_{X-P}log(Q(x))
H(P,Q)=−EX−Plog(Q(x))
针对交叉熵的计算公式,上述公式可以表示为:
H
(
P
,
Q
)
=
−
∑
x
P
(
x
)
l
o
g
(
Q
(
x
)
)
H(P,Q)=-\sum_{x}P(x)log(Q(x))
H(P,Q)=−∑xP(x)log(Q(x))
这个公式是不是很熟悉了。。
希望可以帮助到大家,如果觉得有意思,可以顺手点个赞,您的支持,是作者努力的动力。
下一期我会介绍sigmoid函数、softmax回归以及均方差损失函数。
参考文献
深度学习–算法原理与编程实践 《蒋子阳》