【深度学习05】 交叉熵损失函数

本文详细介绍了损失函数的作用,包括L1损失,并通过信息论的角度阐述了熵和交叉熵的概念。交叉熵在模型比较中起到关键作用,用于衡量模型预测概率与真实结果的接近程度。此外,还讲解了KL散度作为衡量两个概率分布差异的指标。文章以二分类和多分类问题为例,展示了交叉熵在实际计算中的应用,并给出了PyTorch中的实现方式。
摘要由CSDN通过智能技术生成

基本损失函数

损失函数作用

  1. 计算出实际输出和目标之间的差距
  2. 为我们更新输出提供依据(反向传播)

o u t p u t : 10 , 10 , 20 t a r g e t : 30 , 20 , 50 l o s s = ∣ ( 30 − 10 ) ∣ + ∣ ( 20 − 10 ) ∣ + ∣ ( 50 − 10 ) ∣ = 70 L 1 l o s s = 70 / 3 = 23.33 output: 10,10,20 \\ target : 30,20,50 \\ loss=|(30-10)|+|(20-10)|+\mid ( 50-10) \mid=70\\ L1loss=70 / 3=23.33 output:10,10,20target:30,20,50loss=(3010)+(2010)+(5010)=70L1loss=70/3=23.33

交叉熵

image-20220603115920208

两个不同的模型比较,需要熵作为中介。比如,黄金和白银比较价值,需要把他们都换算为美元,才能对比

1.信息量

  1. 不同的信息,含有不同的信息量,假设下列对阵表中阿根廷的夺冠概率是1/8,A同学告诉我阿根廷夺冠了,那么这个信息量就很大了(因为它包括了阿根廷进了四强,决赛);B同学告诉我阿根廷进决赛了,那么这个信息量就较小。

    image-20220604224650165
  2. 假设f(x):= 信息量(:=是定义符),x是信息

    • f ( 阿 根 廷 夺 冠 ) = f ( 阿 根 廷 进 决 赛 ) + f ( 阿 根 廷 赢 了 决 赛 ) f(阿根廷夺冠)= f(阿根廷进决赛)+ f(阿根廷赢了决赛) f=f+f

    因为事件越不确定,则其包含的信息量就越多,所以自变量又可以变为事件的概率

    则有:

    f ( 1 / 8 ) = f ( 1 / 4 ) + f ( 1 / 2 ) f(1/8)= f(1/4)+ f(1/2) f1/8=f1/4+f(1/2)

    同时,也必须满足

    • P ( 阿 根 廷 夺 冠 ) = P ( 阿 根 廷 进 决 赛 ) ∗ P ( 阿 根 廷 赢 得 了 决 赛 ) P(阿根廷夺冠)= P(阿根廷进决赛)*P(阿根廷赢得了决赛) P=P()P

    所以

    🚀 f ( P ( 阿 根 廷 夺 冠 ) ∗ P ( 阿 根 廷 赢 得 了 决 赛 ) ) = f ( P ( 阿 根 廷 进 决 赛 ) ) + f ( P ( 阿 根 廷 赢 得 了 决 赛 ) ) f(P(阿根廷夺冠)*P(阿根廷赢得了决赛))=f(P(阿根廷进决赛))+ f(P(阿根廷赢得了决赛)) f(P()P())=f(P())+f(P())

    所以,用表达式中肯定有🌻log

    又因为事件发生概率和信息量成反比,所以有 -log

image-20220604225652608

2.熵

🔥熵:一个事件,从原来的不确定到完全确定,有多大的难度。而信息量的期望,就是熵H§

image-20220604224535714 $$ \begin{array}{c} H(P):=E\left(P_{f}\right) \\ =\sum_{i=1}^{m} p_{i} \cdot f\left(p_{i}\right)=\sum_{i=1}^{m} p_{i}\left(-\log _{2} p_{i}\right)=-\sum_{i=1}^{m} p_{i} \cdot \log _{2} p_{i} \end{array} $$

🌈 P f P_f Pf是总信息量, f ( p i ) f(p_i) f(pi)是该事件的信息量, p i p_i pi是该事件发生的概率

交叉熵越小,两个模型就越接近

3.相对熵(KL散度)

f Q ( q i ) f_Q(q_i) fQ(qi)表示Q系统的信息量; f P ( p i ) f_P(p_i) fP(pi)是P系统的信息量

D K L ( P ∣ ∣ Q ) D_KL(P||Q) DKL(PQ)表示两个系统的相对熵,或者说KL散度

D K L ( P ∣ ∣ Q ) D_KL(P||Q) DKL(PQ)以P为基准,去考虑P、Q相差多少

D K L ( Q ∣ ∣ P ) D_KL(Q||P) DKL(QP)表示以Q为基准

  • $\sum_{i=1}^{m} p_{i} \cdot\left(f_{Q}\left(q_{i}\right)-f_{P}\left(p_{i}\right)\right) \$

f Q ( q i ) − f P ( p i ) f_{Q}\left(q_{i}\right)-f_{P}\left(p_{i}\right) fQ(qi)fP(pi)表示某一事件,在Q系统的信息量,减去P系统的信息量

image-20220604231434495

D K L ( P ∥ Q ) : = ∑ i = 1 m p i ⋅ ( f Q ( q i ) − f P ( p i ) ) = ∑ i = 1 m p i ⋅ ( ( − log ⁡ 2 q i ) − ( − log ⁡ 2 p i ) ) = ∑ i = 1 m p i ⋅ ( − log ⁡ 2 q i ) − ∑ m i = 1 m p i ⋅ ( − log ⁡ 2 p i ) \begin{array}{l} \boldsymbol{D}_{\boldsymbol{K} \boldsymbol{L}}(\boldsymbol{P} \| \boldsymbol{Q}) \\ :=\sum_{i=1}^{m} p_{i} \cdot\left(f_{Q}\left(q_{i}\right)-f_{P}\left(p_{i}\right)\right) \\ =\sum_{i=1}^{m} p_{i} \cdot\left(\left(-\log _{2} q_{i}\right)-\left(-\log _{2} p_{i}\right)\right) \\ =\sum_{i=1}^{m} p_{i} \cdot\left(-\log _{2} q_{i}\right)-\sum_{m i=1}^{m} p_{i} \cdot\left(-\log _{2} p_{i}\right) \end{array} DKL(PQ):=i=1mpi(fQ(qi)fP(pi))=i=1mpi((log2qi)(log2pi))=i=1mpi(log2qi)mi=1mpi(log2pi)

∑ m i = 1 m p i ⋅ ( − log ⁡ 2 p i ) \sum_{m i=1}^{m} p_{i} \cdot(-\log _{2} p_{i}) mi=1mpi(log2pi):P的熵,因为我们把P定做基准了,所以看散度时,只需要考虑 ∑ i = 1 m p i ⋅ ( − log ⁡ 2 q i ) \sum_{i=1}^{m} p_{i} \cdot\left(-\log _{2} q_{i}\right) i=1mpi(log2qi),这一部分,就是交叉熵

202206042318786
  1. 二分类问题

    交叉熵要包含所有可能的结果,而二分类的结果为:是/否,所以要有 ( 1 − x i ) ⋅ log ⁡ 2 ( 1 − y i ) (1-x_{i}) \cdot \log _{2}\left(1-y_{i}\right) (1xi)log2(1yi)
    H ( P , Q ) = − ∑ i = 1 n ( x i ⋅ log ⁡ 2 y i + ( 1 − x i ) ⋅ log ⁡ 2 ( 1 − y i ) ) \begin{array}{ll} \boldsymbol{H}(\boldsymbol{P}, \boldsymbol{Q}) & =-\sum_{i=1}^{n}\left(x_{i} \cdot \log _{2} y_{i}+\left(1-x_{i}\right) \cdot \log _{2}\left(1-y_{i}\right)\right) \end{array} H(P,Q)=i=1n(xilog2yi+(1xi)log2(1yi))

  2. 多分类问题

KaTeX parse error: Expected 'EOF', got '&' at position 49: …boldsymbol{Q}) &̲ =\sum_{i=1}^{m…

4.交叉熵

image-20220603115920208

pytorch中的交叉熵有点不太一样,它是以softmax函数作为事件的概率

w c w_c wc是权重

理论很难,使用起来确很简单,就一句代码的事~😎

loss_fn = nn.CrossEntropyLoss() # 交叉熵损失

数学计算

loss ⁡ ( x ,  class  ) = − log ⁡ ( exp ⁡ ( x [  class  ] ) ∑ j exp ⁡ ( x [ j ] ) ) = − x [  class  ] + log ⁡ ( ∑ j exp ⁡ ( x [ j ] ) ) \mathbf{\mathbb{} } \operatorname{loss}(x, \text { class })=-\log \left(\frac{\exp (x[\text { class }])}{\sum_{j} \exp (x[j])}\right)=-{\color{Purple} } x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x, class )=log(jexp(x[j])exp(x[ class ]))=x[ class ]+log(jexp(x[j]))

程序

import torch
import torch.nn as nn
import math

criterion = nn.CrossEntropyLoss()
output = torch.randn(1, 5, requires_grad=True)
label = torch.empty(1, dtype=torch.long).random_(5)
loss = criterion(output, label)

print("网络输出为5类:")
print(output)
print("要计算label的类别:")
print(label)
print("计算loss的结果:")
print(loss)

first = 0
for i in range(1):
    first = -output[i][label[i]]
    print("output:{}".format(output[i]))
    print("label:{}".format(label[i]))
    print("first:{}".format(first))
second = 0
for i in range(1):
    for j in range(5):
        second += math.exp(output[i][j])
        print("second:{}".format(second))
res = 0
res = (first + math.log(second))
print("自己的计算结果:")
print(res)

手动计算

微信图片_20220617175032

注意:python中log的底是e,即ln

image-20220609201335688

程序输出

image-20220617165729371

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落叶随峰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值