Pytorch中易混淆的损失函数与激活函数【softmax, log_softmax, NLLLoss, CrossEntropy】

news/2025/1/16 1:53:29/

文章目录

  • 定义
    • 激活函数
      • softmax
      • T-softmax
      • log_softmax
    • 损失函数
    • NLLLoss
    • CrossEntropy交叉熵

定义

  • softmax:将一个数值序列映射到概率空间(每个元素分布并且所有和为1)
  • log_softmax:在softmax的基础上取对数
  • NLLLoss:对log_softmax与one-hot进行计算
  • CrossEntropy:衡量两个概率分布的差别(交叉熵)

在分类问题中,CrossEntropy等价于log_softmax 结合 nll_loss。

激活函数

softmax

import torch
import torch.nn.functional as F
'''
torch.nn.functional 涉及了所有 torch.nn 需要 类 和 方法 ,torch.nn 构建的模块通常就是调用 torch.nn.functional 里的方法实现的.
'''
torch.manual_seed(0)
output = torch.randn(2, 3)
print(output)
#tensor([[ 1.5410, -0.2934, -2.1788],
#        [ 0.5684, -1.0845, -1.3986]])
print(F.softmax(output, dim=1))
# 这里dim的意思是计算Softmax的维度,这里设置dim=1,可以看到每一行的加和为1。0是对列 1 是对行
#tensor([[0.8446, 0.1349, 0.0205],
#       [0.7511, 0.1438, 0.1051]])

T-softmax

T-softmax的目的是平滑分布,不让分布太过于极端。比如可以看下面的实例哈。

import numpy as npdef softmax(x):x_exp = np.exp(x)return x_exp / np.sum(x_exp)output = np.array([0.1, 1.6, 3.6])
print(softmax(output))
#[0.02590865 0.11611453 0.85797681]

使用带温度系数的softmax函数:

def softmax_t(x, t):x_exp = np.exp(x / t)return x_exp / np.sum(x_exp)output = np.array([0.1, 1.6, 3.6])
print(softmax_t(output, 5))
#[0.22916797 0.3093444  0.46148762]

设置为5可以看到分布在【0,1】的数更加平滑了。

log_softmax

这个很好理解,其实就是对softmax处理之后的结果执行一次对数运算。可以理解为 log(softmax(output))

print(F.log_softmax(output, dim=1))
print(torch.log(F.softmax(output, dim=1)))
# 输出结果是一致的

tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]]) tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]])

损失函数

NLLLoss

该函数的全称是negative log likelihood loss. 若 x i = [ q 1 , q 2 , . . . , q N ] x_i=[q_1, q_2, ..., q_N] xi=[q1,q2,...,qN] 为神经网络对第i个样本的输出值, y i y_i yi为真实标签。则:
f ( x i , y i ) = − q y i f(x_i,y_i)=-q_{y_i} f(xi,yi)=qyi
其中输入:log_softmax(output), target

print(F.nll_loss(torch.tensor([[-1.2, -2, -3]]), torch.tensor([0])))
#结果是tensor(1.2000) 就是取第0个index值的负数

通常我们结合 log_softmax 和 nll_loss一起用

CrossEntropy交叉熵

在分类问题中,CrossEntropy等价于log_softmax 结合 nll_loss

N N N分类问题,对于一个特定的样本,已知其真实标签,CrossEntropy的计算公式为:

c r o s s _ e n t r o p y = − ∑ k = 1 N ( p k ∗ log ⁡ q k ) cross\_entropy=-\sum_{k=1}^{N}\left(p_{k} * \log q_{k}\right) cross_entropy=k=1N(pklogqk)

其中p表示真实值,在这个公式中是one-hot形式;q是经过softmax计算后的结果, q k q_k qk为神经网络认为该样本为第 k k k类的概率。

仔细观察可以知道,因为p的元素不是0就是1,而且又是乘法,所以很自然地我们如果知道1所对应的index,那么就不用做其他无意义的运算了。所以在pytorch代码中target不是以one-hot形式表示的,而是直接用scalar表示。若该样本的真实标签为 y y y,则交叉熵的公式可变形为:

c r o s s _ e n t r o p y = − ∑ k = 1 N ( p k ∗ log ⁡ q k ) = − l o g q y cross\_entropy=-\sum_{k=1}^{N}\left(p_{k} * \log q_{k}\right)=-log \, q_{y} cross_entropy=k=1N(pklogqk)=logqy

output = torch.tensor([[1.2, 2, 3]])
target = torch.tensor([0])log_sm_output = F.log_softmax(output, dim=1)
nll_loss_of_log_sm_output = F.nll_loss(log_sm_output, target)
print(nll_loss_of_log_sm_output)
output = torch.tensor([[1.2, 2, 3]])
target = torch.tensor([0])ce_loss = F.cross_entropy(output, target)
print(ce_loss)F.cross_entropy 《==》 F.log_softmax(output, dim=1)+F.nll_loss(log_sm_output, target)

这两者是等价的。


http://www.ppmy.cn/news/77788.html

相关文章

02SpringCloud Nacos注册中心和配置中心与Sentinel服务熔断和流控

Nacos注册中心和配置中心 Nacos 是 Alibaba 开发的用于微服务管理的平台,核心功能:服务注册与发现和集中配置管理。 Nacos 作为服务注册发现组件,可以替换Spring Cloud 应用中传统的服务注册于发现组件,如:Eureka、C…

前端到接口层的反序列化流程

前置知识 参考我的另一篇博客,(209条消息) Servlet和SpringMVC_fengwuJ的博客-CSDN博客,描述了Servlet与SpringMVC的关系,大致可以知道从前端请求,到后端接口的中间过程 反序列化流程 前篇文章中,走到 getMethodPara…

陌生交友发布动态圈子单聊打招呼群聊app开发

陌生交友发布动态圈子单聊打招呼群聊app开发 功能有,发布圈子,发布动态,查看附近的人,发布活动,实人认证,个人主页,相册查看,单聊,群聊。 即时通讯第三方goeasy接口。 好的&#x…

hive函数03

自定义函数 Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。 在企业中处理数据的时候,对于敏感数据往往需要进行脱敏处理。比如手机号。我们常见的处理方式是将手机号中间4位…

【CSS语法应用在Qt中的QSS和文本】第一天

CSS语法应用在Qt中的QSS和文本 【1】CSS语法【1】QSS使用以上CSS语法【1.1】QTextBrowser设置样式表【1.2】QTextBrowser使用CSS语法设置文本样式 【1】CSS语法 💛💛💛💛💛💛💛💛&am…

etcd实现大规模服务治理应用实战

导读:服务治理目前越来越被企业建设所重视,特别现在云原生,微服务等各种技术被更多的企业所应用,本文内容是百度小程序团队基于大模型服务治理实战经验的一些总结,同时结合当前较火的分布式开源kv产品etcd,…

手机充电宝电子充气泵方案

该充气泵产品方案的运行原理是通过电动机将电能转化为机械能,带动电机做往复运动,从而产生大量压缩空气,达到快速充气的效果。该充气泵可用于气垫床、汽车轮胎、自行车轮胎、足球、游泳圈等各类充气物品。产品设计以人性化为主,简…

Java设计模式-模板方法模式

简介 在软件开发中,设计模式是一种被广泛采用的方法,用于解决常见的设计问题。模板方法模式是其中一种重要的设计模式之一,它提供了一种将算法的结构骨架固定,但允许子类实现具体步骤的机制。 模板方法模式是一种行为型设计模式…