码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【AI数学】交叉熵损失函数CrossEntropy


    交叉熵损失(CrossEntropyLoss)函数是分类任务里最常见的损失函数。

    当然,CrossEntropy(以下简称“CE”)的作用不仅仅是在简单的分类任务里,比如最近大火的图文多模态模型CLIP就用到CE来进行对比学习,稍微改造一下变成Symmetrical Cross Entropy。

    交叉熵不具有对称性,所以交换变量位置,会导致数值不同。所以,在使用Pytorch内置交叉熵损失函数时,记得注意顺序:(label记得放在后面)

    import torch.nn.functional as F
    loss = F.cross_entropy(logits, label)
    
    • 1
    • 2

    简单来说,交叉熵可以用来描述两个分布的差别。先看公式,
    C r o s s E n t r o p y ( p , q ) = − Σ k = 1 K l o g ( p ( k ) ) q ( k ) CrossEntropy(p, q) = -\Sigma_{k=1}^K log(p(k))q(k) CrossEntropy(p,q)=−Σk=1K​log(p(k))q(k)
    这里的p是我们模型输出,而q是我们的label。
    通常,在分类任务里,我们的label通常是one-hot类型,假设我们应对三分类任务,有label = [1, 0, 0]代表第0类是正例。那么,CE就变得好算了:

    logits = [0.3, 0.5, 0.2]
    label = [1, 0, 0]
    CE = -(1*log(0.3)) - (0*log(0.5)) - (0*log(0.2)) = -log(0.3)
    
    • 1
    • 2
    • 3

    上面是一段伪代码,代表CE的计算。在Pytorch里,CE里面有一个暗坑,没注意就会犯错,那就是CE会先给你做一个softmax(不了解softmax的,可戳《通俗易懂的Softmax》)再进行上述计算。我们看实验代码便知:

    import torch
    from math import log
    import torch.nn.functional as F
    
    logits = torch.Tensor([[0.8, 0.3, 1.2]]) # pre-softmax
    label = torch.Tensor([[1, 0, 0]])
    loss = F.cross_entropy(logits, label)
    print(loss)
    
    softmax_logits = F.softmax(logits, dim=-1) # post-softmax
    loss_check = - (log(softmax_logits[0][0]))
    print(loss_check)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上面代码的loss和loss_check是相等的,由此可知,Pytorch内置的CE函数会将logits加一层softmax,所以,咱们不用画蛇添足在输入CE前再加一个softmax了。


    进阶

    面对一个batch时,label有两种表达方式。

    1. 与logits具有相同的shape:
    logits = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    label = torch.Tensor([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
    loss = F.softmax(logits, label, reduction='mean')
    
    • 1
    • 2
    • 3

    比较好理解,分别算logits[i]和label[i]的CE,最后求平均,或者设置reduction='sum'求和;

    1. 假设batch size为n,label的shape可以为(1, n);
    logits = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    label = torch.arange(3)
    loss = F.softmax(logits, label, reduction='mean')
    
    • 1
    • 2
    • 3

    这段代码和上面的代码是等效的。当label的维度低于logits纬度时,CE函数会把label理解成one-hot的简写,比如label = [1, 2, 0]等效于[[0, 1, 0], [0, 0, 1], [1, 0, 0]]。
    第二种用法属实诡异,一不小心就理解不对代码的意思。

    参考:https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss

  • 相关阅读:
    【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】
    [java刷算法]牛客—剑指offer链表复习、手写简易正则匹配
    回溯法实现全排列(leetcode46)
    Security RBAC 表结构+权限查询sql
    老卫带你学---leetcode刷题(43. 字符串相乘)
    MATLAB中writetimetable函数用法
    [管理与领导-112]:IT人看清职场中的隐性规则 - 9 - 付出与回报的关系:先付出,后回报,不行就止损,这才是职场价值交换的本质
    pytorch的gpu版本安装以及cpu版本的卸载
    image could not be accessed on a registry to record its digest
    用于原发性进行性失语症分类的可解释性机器学习影像组学模型
  • 原文地址:https://blog.csdn.net/leviopku/article/details/127413611
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号