机器学习--- 交叉熵损失(CrossEntropy Loss)--(附代码)
文章目录
文章目录
一、 Softmax 介绍
1.1 Softmax 的形式
若
x
=
[
x
1
⋯
x
i
⋯
x
n
]
x = \left[ \begin{matrix} x_1 \\ \cdots \\ x_i \\ \cdots \\x_n \end{matrix} \right]
x=⎣⎢⎢⎢⎢⎡x1⋯xi⋯xn⎦⎥⎥⎥⎥⎤,
那么
S
o
f
t
m
a
x
(
x
)
=
[
e
x
1
∑
k
e
x
k
⋯
e
x
i
∑
k
e
x
k
⋯
e
x
n
∑
k
e
x
k
]
Softmax(x) = \left[ \begin{matrix} \frac{e^{x_1}}{\sum_k e^{x_k}} \\ \cdots \\ \frac{e^{x_i}}{\sum_k e^{x_k}} \\ \cdots \\\frac{e^{x_n}}{\sum_k e^{x_k}} \end{matrix} \right]
Softmax(x)=⎣⎢⎢⎢⎢⎢⎡∑kexkex1⋯∑kexkexi⋯∑kexkexn⎦⎥⎥⎥⎥⎥⎤
若 y = S o f t m a x ( x ) y = Softmax(x) y=Softmax(x), 那么对于任意 y i y_i yi 有以下特点:
- y i ∈ ( 0 , 1 ) y_i \in (0,1) yi∈(0,1),且 ∑ i y i = 1 \sum_i y_i = 1 ∑iyi=1, ⟹ \Longrightarrow ⟹ y i 可 以 看 做 是 类 i 的 概 率 y_i 可以看做是 类 i 的概率 yi可以看做是类i的概率
- 在 计算任意一个 y i y_i yi 时, 都会用到所有的 x i x_i xi
- 会产生马太效应 ⇒ \Rightarrow ⇒ “大的更大, 小的更小” ⇒ \Rightarrow ⇒ 以 e e e 为底数, e x e^x ex 会随着 x x x 的增大而急剧增大。
1.2 一些问题
1.2.1 为什么训练阶段需要 Softmax 层?推理阶段通常不使用 Softmax 层?
-
相同的问题:
由于 Softmax 函数具有保序性,在推理时,去掉 Softmax 也总能找到最大概率的类别,去掉与否有什么差别? -
在推理阶段 为 样本 X X X 分配最优的类别 Y Y Y 实际上有三类模型,对应三种层次的需求。
{ 生 成 模 型 判 别 模 型 判 别 函 数 \begin{cases} 生成模型\\ 判别模型 \\ 判别函数 \end{cases} ⎩⎪⎨⎪⎧生成模型判别模型判别函数-
生成模型
- 不仅关心 给定 X X X 时 Y Y Y 的概率分布;还关心输入变量的分布。
- 建模的是
X
和
Y
的
联
合
分
布
P
(
X
Y
)
X 和 Y 的联合分布 P(XY)
X和Y的联合分布P(XY); 在决策时 通过
B
a
y
e
s
Bayes
Bayes 定理获取条件分布
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)
- 决策结果
- 条件概率分布
- 输入的边际分布
-
判别模型
- 只关心 给定 X X X 时 Y Y Y 的概率分布;不关心输入变量的分布。
- 建模的是 条件分布 $P(Y|X)。
- 不仅可以获得一个 决策结果(给定 X X X 时,最优的 Y Y Y)
- 还可以得到模型给出的 条件分布(模型决策结果的置信度)
-
判别函数
- 不关心 给定 X X X 时 Y Y Y 的概率分布;只关心输入和输出的一种对应关系。
- 建模的是
判
定
函
数
Y
=
f
(
x
)
判定函数 Y= f(x)
判定函数Y=f(x)
- 只能得到 I n p u t 和 O u t p u t Input 和 Output Input和Output之间的对应关系
- 无法获得任何其他信息
- 在分类场景中:只得到一个分类的决策边界。
-
-
解答:
S o f t m a x Softmax Softmax 函数一般对应判别函数
将 S o f t m a x Softmax Softmax 作为 L o s s Loss Loss 的一部分,可以认为你得到一个判别模型。
如果不关心模型决策的条件概率分布,那么去掉 S o f t m a x Softmax Softmax 没有什么差别。
二、交叉熵损失(CrossEntropy Loss)
2.0 信息熵
- 熵 是关于不确定性的数学描述。
- 信息的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大。
- 所以 信息的量度应该依赖于概率分布 p ( x ) p(x) p(x)
- 性质:
- 单调性:发生概率越高的事件,其携带的信息量越低;
- 非负性:信息熵可以看作为一种广度量,非负性是一种合理的必然;
- 累加性:即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和,这也是广度量的一种体现。
2.0.0 定义:
- 熵描述的是整个系统内部样本之间的一个距离,或者称之为系统内样本分布的集中程度(一致程度)、分散程度、混乱程度(不一致程度)。
- 系统内样本分布越分散(或者说分布越平均),信息熵就越大。
- 分布越有序(或者说分布越集中),信息熵就越小。
- 数学公式表示:
H ( X ) = − ∑ i = 1 n p ( x i ) l o g p ( x i ) H(X) = - \sum_{i=1}^n p(x_i)\ log\ p(x_i) H(X)=−i=1∑np(xi) log p(xi)- 对概率取负对数表示了一种可能事件发生时候携带出的信息量。
- 把各种可能表示出的信息量乘以其发生的概率之后求和,就表示了整个系统所有信息量的一种期望值。
2.0.1 KL散度 (Kullback–Leibler divergence)
- 作用:
- 用于衡量两个概率分布之间的差异。值越小,表示两个分布越接近。
- 数学形式
- 离散形式: D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) D_{KL}(p||q) = \sum_{i=1}^n p(x_i) log(\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))
- 连续形式: D K L ( A ∣ ∣ B ) = ∫ a ( x ) l o g ( a ( x ) b ( x ) ) D_{KL}(A||B) = \int a(x) log(\frac{a(x)}{b(x)}) DKL(A∣∣B)=∫a(x)log(b(x)a(x))
- 特点
- 非对称性 K L ( p ∣ ∣ q ) ≠ K L ( q ∣ ∣ p ) KL(p || q) \neq KL(q || p) KL(p∣∣q)=KL(q∣∣p),KL散度尽管被用来度量两个分布的相似度或者说距离,但是KL散度本身不是距离。
- 非负性,【当 p ( x ) 和 q ( x ) p(x) 和 q(x) p(x)和q(x)两个分部完全相同时,其值=0,】
- 不满足三角不等式性
本质上,KL散度度量的是两者之间的信息损失,而不是两者之间的距离。
2.0.2 JS 散度(Jensen-Shannon divergence)
- JS散度度量两个概率分布的差异度,它基于KL散度的变体,
- 解决了KL散度非对称的问题
- 其取值是 0 到 1 之间。
定义如下:
J S ( p ∣ ∣ q ) = 1 2 K L ( p , p + q 2 ) + 1 2 K L ( q , p + q 2 ) J S ( p ∣ ∣ q ) = \frac{1}{2} KL( p , \frac{p + q}{ 2 }) + \frac{1}{2} K L ( q , \frac{p + q}{ 2 } ) JS(p∣∣q)=21KL(p,2p+q)+21KL(q,2p+q)
2.0.3 KL散度和JS散度存在的问题:
- 如果两个分配 𝑃,𝑄 离得很远,完全没有重叠的时候,那么KL散度值是没有意义的,而JS散度值是一个常数。
- 这在学习算法中是比较致命的,这就意味这这一点的梯度为 0。梯度消失了。
2.1 交叉熵定义
- 交叉熵一般作为多分类问题的损失函数
- 交叉熵损失经常用在逻辑回归问题(求解的是离散的分类问题)上,用来作为预测值和真实标签值的距离度量。
-
定义:
给定两个概率分布 p , q p,q p,q ,其交叉熵为:
H ( p , q ) = − ∑ i = 1 n p ( x i ) ⏟ 信 息 传 递 方 式 l o g q ( x i ) ⏟ 传 递 的 信 息 H(p,q) = -\sum_{i=1}^n \underbrace{p(x_i)}_{信息传递方式} \ \ \underbrace{log \ q(x_i)}_{传递的信息} H(p,q)=−i=1∑n信息传递方式 p(xi) 传递的信息 log q(xi)
其 中 p ( x ) 表 示 正 确 分 布 , q ( x ) 表 示 预 测 分 布 。 其中 p(x) 表示正确分布,q(x) 表示预测分布。 其中p(x)表示正确分布,q(x)表示预测分布。- 根据公式的形式,也可以理解为:
- 表示信息量的项来自于非真实分布 q ( x ) q(x) q(x),【要传递的信息】
- 对其期望值的计算 采用的是真实分布 p ( x ) p(x) p(x)。【信息传递的方式】
-
作用:
- 描述两个概率分布之间的距离。
- 交叉熵越小,两个概率的分布越接近。
2.1.1 为什么交叉熵可以作为预测值和真实标签值的距离度量?
- 实际上交叉熵度量的是 预测值和真实标签值 之间的信息损失。
- 交叉熵代表的是 KL散度的一部分信息,而在KL散度表示了使用预测分布 q ( x ) q(x) q(x) 的平均编码长度,比用真实分布 p ( x ) p(x) p(x) 进行编码增加的信息量。
K L ( p ∣ ∣ q ) = H ( p , q ) ⏟ 交 叉 熵 + ( − H ( p ) ) ⏟ 常 量 KL(p||q)= \underbrace{H(p,q)}_{交叉熵} + \underbrace{(-H(p))}_{常量} KL(p∣∣q)=交叉熵 H(p,q)+常量 (−H(p))
2.2 交叉熵与 KL散度的关系
D K L ( p ∣ ∣ q ) = − H ( p ) + H ( p , q ) = ∑ i = 1 n p ( x i ) l o g p ( x i ) − ∑ i = 1 n p ( x i ) l o g q ( x i ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) l o g q ( x i ) ] = − H ( p ) + H ( p , q ) \begin{aligned}D_{KL}(p||q) &= -H(p) + H(p,q) \\ &=\sum_{i=1}^n p(x_i) \ log \ p(x_i) - \sum_{i=1}^n p(x_i) \ log \ q(x_i) \\ &= -H(p(x)) + [- \sum_{i=1}^n p(x_i) \ log \ q(x_i)] \\ &= -H(p) + H(p,q)\end{aligned} DKL(p∣∣q)=−H(p)+H(p,q)=i=1∑np(xi) log p(xi)−i=1∑np(xi) log q(xi)=−H(p(x))+[−i=1∑np(xi) log q(xi)]=−H(p)+H(p,q)
- 表示我们使用了预测分布 q ( x ) q(x) q(x) 的平均编码长度,比用真实分布 p ( x ) p(x) p(x) 进行编码增加的信息量。
2.2.1 为什么使用交叉熵用在分类任务中?
- 目标是训练模型使得模型拟合的分布于数据的真实分布差异尽可能小,自然想到KL散度,
- 数据集的真实标记是确定的,也就是 H ( P ) H(P) H(P) 实际上为常数,因此 最小化交叉熵 即可。
2.3 在机器学习中的交叉熵
- 在机器学习中交叉熵常用于分类问题。
- 只要涉及到在词表中挑选单词,就可以使用分类任务的思路来解决。
L o s s = − ∑ i y i l o g y i ^ Loss = - \sum_i y_i log \hat{y_i} Loss=−i∑yilogyi^
- y i y_i yi 表示真实标签。
- y i ^ \hat{y_i} yi^ 表示预测结果的概率分布。【一般为 Softmax 之后的结果。】
2.3.1 二分类的交叉熵损失
L o s s = − ∑ i y i l o g y i ^ = − [ y 0 l o g y 0 ^ + y 1 l o g y 1 ^ ] 令 y 1 = 1 − y 0 , y 1 ^ = 1 − y 0 ^ 所 以 = − [ y 0 l o g y 0 ^ + ( 1 − y 0 ) l o g ( 1 − y 0 ^ ) ] \begin{aligned}Loss &= - \sum_i y_i log \hat{y_i} \\ & = -[y_0 log\hat{y_0} + y_1 log\hat{y_1}]\\ & 令 y_1 = 1 - y_0, \hat{y_1} = 1 - \hat{y_0} \\ 所以 & = -[y_0 log\hat{y_0} + (1 - y_0) log(1 - \hat{y_0})] \end{aligned} Loss所以=−i∑yilogyi^=−[y0logy0^+y1logy1^]令y1=1−y0,y1^=1−y0^=−[y0logy0^+(1−y0)log(1−y0^)]
2.4 对交叉熵求导
符号 | 符号说明 | 维度 |
---|---|---|
N | 输出层神经元的数量 | 标量 |
z | Softmax 的输入 | N × 1 N × 1 N×1 |
a a a | Softmax 的输出;预测值 | N × 1 N × 1 N×1 |
Y | L a b e l Label Label;是一个One-hot 向量 | N × 1 N × 1 N×1 |
-
数学公式表示
L o s s = − ∑ i N y i l o g a Loss = - \sum_i^N y_i log a Loss=−i∑Nyiloga
a = S o f t m a x ( z ) 其 中 , a = { a 1 , a 2 , . . . , a N } a = Softmax(z) \\ 其中,a = \{{a_1}, {a_2},..., {a_N} \} a=Softmax(z)其中,a={a1,a2,...,aN} -
遵循从单个到整体的求梯度原则,我们只需要计算 ∂ L o s s ∂ z i \frac{\partial Loss}{\partial z_i} ∂zi∂Loss
-
根据链式求导法则: ∂ L o s s ∂ z i = ∑ j N ∂ L o s s ∂ a j ∂ a j ∂ z i \frac{\partial Loss}{\partial z_i} = \sum_j^N \frac{\partial Loss}{\partial {a_j}} \frac{\partial {a_j}}{\partial z_i} ∂zi∂Loss=∑jN∂aj∂Loss∂zi∂aj
2.4.1 计算 ∂ L o s s ∂ a j \frac{\partial Loss}{\partial {a_j}} ∂aj∂Loss
- L o s s = − ∑ i N y i l o g a i Loss = - \sum_i^N y_i log\ {a_i} Loss=−∑iNyilog ai
-
y
i
y_i
yi 是
O
n
e
−
h
o
t
One-hot
One−hot 向量,假设仅
y
k
=
1
y_k = 1
yk=1,那么
L o s s = − ∑ i N y i l o g a i = − y k l o g a k Loss = - \sum_i^N y_i log \ {a_i} = -y_k log \ {a_k} Loss=−∑iNyilog ai=−yklog ak - ∂ L o s s ∂ a j = { 0 ( j ≠ k ) − y j a j ( j = k ) = − y j a j \begin{aligned} \frac{\partial Loss}{\partial {a_j}} &= \begin{cases} 0 \qquad (j \neq k) \\ -\frac{y_j}{{a_j}} \qquad (j = k) \end{cases} \\ &= -\frac{y_j}{{a_j}} \end{aligned} ∂aj∂Loss={0(j=k)−ajyj(j=k)=−ajyj
- 注意:
因为 当 j ≠ k 时 y j = 0 当 j \neq k时 y_j = 0 当j=k时yj=0,所以可以直接将这两种情况合并。
2.4.2 计算 ∂ a j ∂ z i \frac{\partial {a_j}}{\partial z_i} ∂zi∂aj
∂
a
j
∂
z
i
=
∂
e
z
j
∑
k
N
e
z
k
∂
z
i
=
∂
e
z
j
∂
z
i
∑
k
N
e
z
k
−
e
z
j
∂
∑
k
N
e
z
k
∂
z
i
(
∑
k
N
e
z
k
)
2
\begin{aligned} \frac{\partial {a_j}}{\partial z_i} &= \frac{\partial \frac{e^{z_j}}{\sum_k^N e^{z_k}}}{\partial z_i}\\ &= \frac{ \frac{\partial e^{z_j}}{\partial z_i} \sum_k^N e^{z_k} - e^{z_j} \frac{\partial \sum_k^N e^{z_k}}{\partial z_i} }{ (\sum_k^N e^{z_k})^2 } \end{aligned}
∂zi∂aj=∂zi∂∑kNezkezj=(∑kNezk)2∂zi∂ezj∑kNezk−ezj∂zi∂∑kNezk
1. 当 i = j 时 , 有 1. 当 i=j 时,有 1.当i=j时,有
上 式 = e z j ∑ k N e z k − e z j e z i ( ∑ k N e z k ) 2 = e z j ∑ k N e z k − e z j ∑ k N e z k e z i ∑ k N e z k = a j − a j a i \begin{aligned} 上式&= \frac{ e^{z_j} \sum_k^N e^{z_k} - e^{z_j} e^{z_i} }{ (\sum_k^N e^{z_k})^2 } \\ & = \frac{e^{z_j}}{\sum_k^N e^{z_k}} - \frac{e^{z_j}}{\sum_k^N e^{z_k}} \frac{e^{z_i}}{\sum_k^N e^{z_k}} \\ & = a_j - a_j a_i \end{aligned} 上式=(∑kNezk)2ezj∑kNezk−ezjezi=∑kNezkezj−∑kNezkezj∑kNezkezi=aj−ajai
2. 当 i ≠ j 时 , 有 2. 当 i \neq j 时,有 2.当i=j时,有
上 式 = 0 ∗ ∑ k N e z k − e z j e z i ( ∑ k N e z k ) 2 = 0 − e z j ∑ k N e z k e z i ∑ k N e z k = − a j a i \begin{aligned} 上式&= \frac{ 0* \sum_k^N e^{z_k} - e^{z_j} e^{z_i} }{ (\sum_k^N e^{z_k})^2 } \\ &= 0 - \frac{e^{z_j}}{\sum_k^N e^{z_k}} \frac{e^{z_i}}{\sum_k^N e^{z_k}} \\ &= - a_j a_i \end{aligned} 上式=(∑kNezk)20∗∑kNezk−ezjezi=0−∑kNezkezj∑kNezkezi=−ajai
总结: ∂ a j ∂ z i = { − a j a i ( j ≠ i ) a j − a j a i ( j = i ) \begin{aligned} \frac{\partial a_j}{\partial {z_i}} &= \begin{cases} -a_j a_i \qquad (j \neq i) \\ a_j - a_j a_i \qquad (j = i) \end{cases} \end{aligned} ∂zi∂aj={−ajai(j=i)aj−ajai(j=i)
2.4.3 计算 ∂ L o s s ∂ z j \frac{\partial Loss}{\partial {z_j}} ∂zj∂Loss
∂ L o s s ∂ z i = ∑ j = 1 N ∂ L o s s ∂ a j ∂ a j ∂ z i = ∑ j = 1 N − y j a j ( a j 1 i = j − a j a i ) = − y j a j ( a j − a j a i ) ⏞ i = j 的 情 况 + ∑ j = 1 ; i ≠ j N y j a j a j a i = − y i + y i a i + ∑ j = 1 ; i ≠ j N y j a i = − y i + a i ( y i + ∑ j = 1 ; i ≠ j N y j ) = − y i + a i \begin{aligned} \frac{\partial Loss}{\partial z_i} &= \sum_{j=1}^N \frac{\partial Loss}{\partial {a_j}} \frac{\partial {a_j}}{\partial z_i} \\ &=\sum_{j=1}^N - \frac{y_j}{a_j} (a_j \mathbf{1}_{i=j} - a_j a_i) \\ &= \overbrace{- \frac{y_j}{a_j}(a_j - a_j a_i)}^{i=j的情况} + \sum_{j=1; i\neq j}^N \frac{y_j}{a_j} a_j a_i \\ &=-y_i + y_i a_i + \sum_{j=1; i\neq j}^N y_j a_i \\ &= - y_i + a_i(y_i + \sum_{j=1; i\neq j}^N y_j) \\ &= -y_i + a_i \end{aligned} ∂zi∂Loss=j=1∑N∂aj∂Loss∂zi∂aj=j=1∑N−ajyj(aj1i=j−ajai)=−ajyj(aj−ajai) i=j的情况+j=1;i=j∑Najyjajai=−yi+yiai+j=1;i=j∑Nyjai=−yi+ai(yi+j=1;i=j∑Nyj)=−yi+ai
- ( y i + ∑ j = 1 ; i ≠ j N y j ) = 1 (y_i + \sum_{j=1; i\neq j}^N y_j) =1 (yi+∑j=1;i=jNyj)=1 因为 y 为 O n e − H o t 向 量 y 为 One-Hot 向量 y为One−Hot向量
2.5 代码实现
- 经过卷积操作后,最后一层出来的特征经过 S o f t m a x Softmax Softmax 函数后会变成一个概率向量(当前输入分别属于N个分类的概率),我们可以看作为是概率分布 q ( x ) q(x) q(x),
- 而真实标签我们可以看作是概率分布 p ( x ) p(x) p(x),
- 因此真实分布 p ( x ) p(x) p(x) 和预测分布 q ( x ) q(x) q(x) 的交叉熵就是我们要求的loss损失值。
2.5.1 python 代码实现
import torch
import torch.nn as nn
import numpy as np
''' 1、输入变量'''
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
''' 2、label 标签,表示真实分布 p(x)'''
label=torch.tensor([0,2,1])
''' 3、Softmax 函数,得到预测分布 q(x)
注意:当 dim=1 时,注意转置操作。
np.sum(np.exp(x),axis=1 得到的维度是 1 × 3
'''
def softmax(x, dim = 0):
if dim == 0:
return np.exp(x)/np.sum(np.exp(x),axis=0)
else:
return np.exp(x).T /np.sum(np.exp(x),axis=1)
''' 4、计算交叉熵损失'''
loss =-np.sum(label*np.log(softmax(x)))
print(loss)
2.5.2 torch 代码实现 nn.NLLLoss()
- 注意:
- NLLLoss 的 输入 是一个对数概率向量和一个目标标签.
- 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax.
import torch
import torch.nn as nn
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
target = torch.tensor([0,2,1])
Softmax_dim1 = nn.Softmax(dim=1)
Nll_loss = nn.NLLLoss()
print(Nll_loss(torch.log(Softmax_dim1(input)), target))
'''
tensor(2.0374)
'''
2.5.3 torch 代码实现 nn.CrossEntropyLoss()
import torch
import torch.nn as nn
input = torch.tensor(tensor([
[-1.0606, 1.5613, 1.2007, -0.2481],
[-1.9652, -0.4367, -0.0645, -0.5104],
[ 0.1011, -0.5904, 0.0243, 0.1002]
]))
target = torch.tensor([0,2,1])
Cross_loss = nn.CrossEntropyLoss()
print(Cross_loss(input, target))
'''
tensor(2.0374)
'''
# *******************************************#
torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')
'''
weight (Tensor, optional)
– 自定义的每个类别的权重. 必须是一个长度为 C 的 Tensor
ignore_index (int, optional)
– 设置一个目标值, 该目标值会被忽略, 从而不会影响到 输入的梯度。
reduction-三个值,
none: 不使用约简;
mean:返回loss和的平均值;
sum:返回loss的和。
默认:mean。
'''
参考资料
更多推荐
所有评论(0)