机器学习— 交叉熵损失(CrossEntropy Loss)–(附代码)

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 =⎣⎢⎢⎢⎢⎡​x 1 ​⋯x i ​⋯x n ​​⎦⎥⎥⎥⎥⎤​,
那么 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]S o f t m a x (x )=⎣⎢⎢⎢⎢⎢⎡​∑k ​e x k ​e x 1 ​​⋯∑k ​e x k ​e x i ​​⋯∑k ​e x k ​e x n ​​​⎦⎥⎥⎥⎥⎥⎤​

若 y = S o f t m a x ( x ) y = Softmax(x)y =S o f t m a x (x ), 那么对于任意 y i y_i y i ​ 有以下特点:

1.2 一些问题

  • 相同的问题:
    由于 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 (X Y ); 在 决策时 通过B a y e s Bayes B a y e s 定理获取条件分布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 I n p u t 和O u t p u t之间的对应关系
    • 无法获得任何其他信息
    • 在分类场景中:只得到一个分类的决策边界。
  • 解答:
    S o f t m a x Softmax S o f t m a x 函数一般对应判别函数
    将S o f t m a x Softmax S o f t m a x 作为 L o s s Loss L o s s 的一部分,可以认为你得到一个判别模型。
    如果不关心 模型决策的条件概率分布,那么去掉S o f t m a x Softmax S o f t m a x 没有什么差别。

2.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 ∑n ​p (x i ​)l o g p (x i ​)

  • 概率取负对数表示了一种可能事件发生时候携带出的 信息量
  • 把各种可能表示出的信息量乘以其发生的概率之后 求和,就表示了整个系统所有信息量的一种 期望值

    机器学习--- 交叉熵损失(CrossEntropy Loss)--(附代码)
  • 作用:

  • 用于衡量两个概率分布之间的差异。值越小,表示两个分布越接近。
  • 数学形式
  • 离散形式: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)})D K L ​(p ∣∣q )=i =1 ∑n ​p (x i ​)l o g (q (x i ​)p (x i ​)​)
  • 连续形式: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)})D K L ​(A ∣∣B )=∫a (x )l o g (b (x )a (x )​)
  • 特点
  • 非对称性K L ( p ∣ ∣ q ) ≠ K L ( q ∣ ∣ p ) KL(p || q) \neq KL(q || p)K L (p ∣∣q )​=K L (q ∣∣p ),KL散度尽管被用来度量两个分布的相似度或者说距离, 但是KL散度本身不是距离。
  • 非负性,【当p ( x ) 和 q ( x ) p(x) 和 q(x)p (x )和q (x )两个分部完全相同时,其值=0,】
  • 不满足三角不等式性

本质上, KL散度度量的是两者之间的 信息损失,而不是两者之间的距离。

  • 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 } )J S (p ∣∣q )=2 1 ​K L (p ,2 p +q ​)+2 1 ​K L (q ,2 p +q ​)

  • 如果两个分配 𝑃,𝑄 离得很远,完全没有重叠的时候,那么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 (x i ​)​​传递的信息l o g q (x i ​)​​
    其 中 p ( x ) 表 示 正 确 分 布 , q ( x ) 表 示 预 测 分 布 。 其中 p(x) 表示正确分布,q(x) 表示预测分布。其中p (x )表示正确分布,q (x )表示预测分布。

  • 根据公式的形式,也可以理解为:
  • 表示信息量的项来自于非真实分布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))}{常量}K L (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}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 )​

  • 表示我们使用了预测分布q ( x ) q(x)q (x ) 的平均编码长度,比用真实分布p ( x ) p(x)p (x ) 进行编码增加的信息量。

  • 目标是训练模型使得模型拟合的分布于数据的真实分布差异尽可能小,自然想到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}L o s s =−i ∑​y i ​l o g y i ​^​

  • y i y_i y i ​ 表示真实标签。
  • y i ^ \hat{y_i}y i ​^​ 表示预测结果的概率分布。【一般为 Softmax 之后的结果。】

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}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 ​^​)]​

2.4 对交叉熵求导

符号符号说明维度N输出层神经元的数量标量zSoftmax 的输入

Softmax 的输出;预测值

;是一个One-hot 向量

  • 数学公式表示
    L o s s = − ∑ i N y i l o g a Loss = – \sum_i^N y_i log a L o s s =−i ∑N ​y i ​l o g a
    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 =S o f t m a x (z )其中,a ={a 1 ​,a 2 ​,…,a N ​}
  • 遵循从单个到整体的求梯度原则,我们只需要计算∂ L o s s ∂ z i \frac{\partial Loss}{\partial z_i}∂z i ​∂L o s s ​
  • 根据链式求导法则:∂ 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}∂z i ​∂L o s s ​=∑j N ​∂a j ​∂L o s s ​∂z i ​∂a j ​​

  • 注意:
    因为当 j ≠ k 时 y j = 0 当 j \neq k时 y_j = 0 当j ​=k 时y j ​=0,所以可以直接将这两种情况合并。


∂ 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}∂z i ​∂a j ​​​=∂z i ​∂∑k N ​e z k ​e z j ​​​=(∑k N ​e z k ​)2 ∂z i ​∂e z j ​​∑k N ​e z k ​−e z j ​∂z i ​∂∑k N ​e z k ​​​​

上 式 = 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}上式​=(∑k N ​e z k ​)2 e z j ​∑k N ​e z k ​−e z j ​e z i ​​=∑k N ​e z k ​e z j ​​−∑k N ​e z k ​e z j ​​∑k N ​e z k ​e z i ​​=a j ​−a j ​a i ​​

上 式 = 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}上式​=(∑k N ​e z k ​)2 0 ∗∑k N ​e z k ​−e z j ​e z i ​​=0 −∑k N ​e z k ​e z j ​​∑k N ​e z k ​e z i ​​=−a j ​a i ​​

总结:∂ 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}∂z i ​∂a j ​​​={−a j ​a i ​(j ​=i )a j ​−a j ​a i ​(j =i )​​

∂ 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}∂z i ​∂L o s s ​​=j =1 ∑N ​∂a j ​∂L o s s ​∂z i ​∂a j ​​=j =1 ∑N ​−a j ​y j ​​(a j ​1 i =j ​−a j ​a i ​)=−a j ​y j ​​(a j ​−a j ​a i ​)​i =j 的情况​+j =1 ;i ​=j ∑N ​a j ​y 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 ​​

  • ( y i + ∑ j = 1 ; i ≠ j N y j ) = 1 (y_i + \sum_{j=1; i\neq j}^N y_j) =1 (y i ​+∑j =1 ;i ​=j N ​y j ​)=1 因为y 为 O n e − H o t 向 量 y 为 One-Hot 向量y 为O n e −H o t 向量

2.5 代码实现

  • 经过卷积操作后,最后一层出来的特征经过S o f t m a x Softmax S o f t m a x 函数后会变成一个概率向量(当前输入分别属于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损失值。
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)

  • 注意:
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)
'''
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。
'''

Original: https://blog.csdn.net/xiao_xian_/article/details/116011455
Author: Jankin_Tian
Title: 机器学习— 交叉熵损失(CrossEntropy Loss)–(附代码)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/623381/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球