【PyTorch】第九节:Softmax 函数与交叉熵函数

这篇具有很好参考价值的文章主要介绍了【PyTorch】第九节:Softmax 函数与交叉熵函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者🕵️‍♂️:让机器理解语言か

专栏🎇:PyTorch

描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。

寄语💓:🐾没有白走的路,每一步都算数!🐾 

【PyTorch】第九节:Softmax 函数与交叉熵函数

介绍💬

        本实验主要讲解了分类问题中的二分类问题和多分类问题之间的区别,以及每种问题下的交叉熵损失的定义方法。由于多分类问题的输出为属于每个类别的概率,要求概率和为 1 。因此,我们还介绍了如何利用 Softmax 函数,处理神经网络的输出,使其满足损失函数的格式要求。

本文参考蓝桥云课:PyTorch 基础入门实战_机器学习 - 蓝桥云课 (lanqiao.cn) 

知识点🍀

  • 👉二分类和多分类

  • 👉交叉熵损失

  • 👉PyTorch 中的 Softmax 和交叉熵


二分类问题和多分类问题

        二分类问题:表示分类任务有两个类别。比如我们想要识别一副图是否是猫,我们一般会训练出一个分类器,输入一副图片(用向量 x 表示),输出该图片是猫的概率 p。我们可以使用 max 函数判断 p 和 0.5 的大小。如果 p 大,则输出 1(表示该图像为猫)。如果 0.5 大,则输出 0 (表示该图像不为猫)。这就是二分类问题,即输出只为 0 或 1 的分类问题。

        多分类问题:表示分类任务有多个类别。比如我们需要建立一个分类器,用于分辨一堆水果图片中,哪些是橘子、哪些是苹果还有哪些是香蕉。

        在二分类问题中,我们可以使用 max(代码描述为 if a > b return a; else b) 来判断结果,就是非黑即白。但是在多分类问题中,我们就不能这样做。我们需要引入 Softmax 的概念

🌐Softmax

        在机器学习尤其是深度学习中,Softmax 是个非常常用的函数,尤其在多分类的场景中使用广泛。Softmax把输入映射为 0-1 之间的实数,并且通过归一化保证和为 1

        在多分类问题中,我们需要分类器输出每种分类的概率,且为了能够比较概率之间的大小,我们还希望概率之和能够为 1。因此,我们就需要使用 Softmax 函数。 特别是在利用神经网络解决多分类问题时,我们一般都会将输出的最后一层,加上 Softmax 函数,用于规则化输出

假设一个数组为 V,表示 V 中的第 i 个元素,那么这个元素经历了 Softmax 函数后的输出为:

        这个定义其实很简单,也就是对输入的值进行了指数化,我认为这里进行指数化的目的是为了扩大任意两个输入之间的差距。将指数化后的值除以总的值,目的是将所有的值缩放到 0-1 之间,并保证所有的输出值相加的和为 1 。

我们可以先利用 NumPy 对其进行实现:

import numpy as np


def softmax(x):
    return np.exp(x) / np.sum(np.exp(x), axis=0)    # 按行相加


x = np.array([2.0, 1.0, 0.1])
outputs = softmax(x)

print('numpy 版 softmax 的输入 :', x)
print('numpy 版 softmax 的输出 :', outputs)
print('numpy 版 softmax 的输出之和:', outputs.sum())

【PyTorch】第九节:Softmax 函数与交叉熵函数

        当然,我们也可以使用 PyTorch 中自带的 Softmax 函数,完成数据的处理:

import torch
import torch.nn as nn
x = torch.tensor([2.0, 1.0, 0.1])
outputs = torch.softmax(x, dim=0)  # dim=0,表示处理的是第 1 维的数据
print('torch 版 softmax 的输入 :', x)
print('torch 版 softmax 的输出 :', outputs)
print('torch 版 softmax 的输出之和:', outputs.sum())

【PyTorch】第九节:Softmax 函数与交叉熵函数

🌐损失函数

        损失函数反映的是预测结果和实际结果之间的差距,即从预测结果到实际结果需要走的距离,即所需要消耗的成本,故称之为损失函数。

        这里让我们介绍一种常用的损失函数:交叉熵损失。那么为什么我们需要使用交叉熵损失作为我们的损失函数呢?为什么我们不直接用错误率来作为损失函数,用梯度下降算法得到错误率最低时的模型呢?为了能够更好的阐述上面这个问题,让我们来举个例子。

葡萄酒的种类预测

        我们希望通过葡萄酒的酒精浓度 、苹果酸浓度 、灰分浓度等独立特征,来预测该葡萄酒源产地。假设数据集中有三种源产地:英国、法国和美国。

        这里我们建立了两个模型用以预测葡萄酒的种类。每个模型都会输出三个值,即输入的葡萄酒来源于英国、法国和美国的概率。

        这里我们对两个模型输入了三条相同的数据,得到的结果如下:

模型 1 :

【PyTorch】第九节:Softmax 函数与交叉熵函数

        从结果可以看出,模型 1 对于样本 1 和样本 2 以非常微弱的优势(概率只比其他结果高 0.1)判断正确,对于样本 3 的判断则彻底错误。

模型 2 :

【PyTorch】第九节:Softmax 函数与交叉熵函数

        模型 2 对于样本 1 和样本 2 的判断非常准确(概率比其他结果高很多)。模型 2 对于样本 3 的判断错误,但是相对来说没有错得太离谱(概率只比其他结果高 0.1)。好了,有了模型之后,我们需要通过定义损失函数来判断模型在样本上的表现,那么我们可以定义哪些损失函数呢?

        如果使用简单的分类错误率作为损失函数,那么两个模型的分类错误率为:

模型 1:

模型 2:

        从结果可以看出,如果使用分类错误率来衡量两个模型的好坏,那么这两个模型的好坏程度相同。我们从上面的结果可以看出,虽然模型 1 和模型 2 都预测错了 1 个,但是相对来说,模型 2 的预测效果更好,损失函数照理来说应该更小。因此,我们使用分类错误率不能很好的描述模型的优劣。

        为此,我们引入了交叉熵损失函数用以描述模型的优劣。

🌐交叉熵损失函数

交叉熵损失函数有两种形式:二分类形式多分类形式

  • 🍒二分类的任务 

在 二分类的任务 中,模型最后需要预测的结果只有两种情况,对于每个类别,我们的预测得到的概率为 p 和 1−p 。此时的交叉熵损失(又叫二进制交叉熵)为:

【PyTorch】第九节:Softmax 函数与交叉熵函数

其中:

  • :表示样本 i 的真实标签值,正类为 1,负类为 0。
  • :表示样本 i 的预测为正的概率。

        当然,我们不必手动实现上面的损失函数。我们可以利用 nn.BCELoss() 定义二值交叉熵损失。如下:

loss = nn.BCELoss()
# 假设两个模型最后的预测结果相同,但是概率不同
model_one_pred = torch.tensor([0.9, 0.6])
model_two_pred = torch.tensor([0.6, 0.9])
# 真实结果
target = torch.FloatTensor([1, 0])

# 计算两种模型的损失
l1 = loss(model_one_pred, target)
l2 = loss(model_two_pred, target)
l1, l2
# (tensor(0.5108), tensor(1.4067))

        从上面代码中可以看出,其实模型 1 和模型 2 都预测对了一条数据,预测错了一条数据。但是,由于模型 1 是在概率差距很大的情况下,预测正确的。因此,模型 1 的预测效果比模型 2 好,即模型 1 的损失应当比模型 2 的损失小。

  • 🍒 多分类任务 

        在 多分类任务 中,交叉熵损失的函数形式会发生一定的改变(其实就是二进制交叉熵损失的扩展):

其中:

  • : 类别的数量。
  • ​: 标签的 one-hot 编码,如果该类别和样本 i 的类别相同,就是 1,否则为 0。
  • ​: 对于观察样本 i 属于类别 c 的预测概率。

        利用 PyTorch 中的 nn.CrossEntropyLoss() 定义多分类任务的交叉熵损失函数。但是,实际上 nn.CrossEntropyLoss() 是包含了 nn.LogSoftmax()  nn.NLLLoss() 。 因为这里已经是概率值了,所以我们使用 nn.NLLLoss() 来计算交叉熵损失。

        接下来让我们利用交叉熵损失来评估一下上面建立的两个葡萄酒预测模型的好坏:

loss = nn.NLLLoss()
# 三条数据的真实结果:法国、美国、英国
Y = torch.tensor([2, 1, 0])

# 模型一对每条数据的预测,每条数据对应三个概率,表示该条数据属于第 i 类的概率值
model_one_pred = torch.tensor(
    [[0.3, 0.3, 0.4],  # predict class 2
     [0.3, 0.4, 0.3],  # predict class 1
     [0.1, 0.2, 0.7]])  # predict class 0

# 模型 2 对每条数据的预测,每条数据对应三个概率,表示该条数据属于第 i 类的概率值
model_two_pred = torch.tensor(
    [[0.1, 0.2, 0.7],  # predict class 2
     [0.1, 0.7, 0.2],  # predict class 1
     [0.4, 0.3, 0.3]])  # predict class 0
l1 = loss(torch.log(model_one_pred), Y)
l2 = loss(torch.log(model_two_pred), Y)
l1, l2
# (tensor(1.3784), tensor(0.5432))

        从上面的损失大小可以看出,通过交叉熵损失对模型进行评估的话,模型 2 的效果要优于模型 1 的效果,这是符合我们的客观想法的。

        综上,这就是我们为什么使用交叉熵损失的原因。交叉熵损失函数除了考虑模型的准确率之外,还将模型的鲁棒性等因素考虑了进去,能够更好的评价模型的好坏,使训练出来的模型具有更加稳定的预测准确率。

        从上面的输入可以看出,交叉熵损失需要的的输入每条数据所属种类的概率,且这些概率之和为 1。说到这里,我想你已经联想到了本实验开始学到的 Softmax 函数了吧。

        实际上,我们一般无法严格的将神经网络的输出控制在 0 - 1 之间,更无法使这些值之和等于 1。因此我们一般会在神经网络的最后一层,加上 softmax 函数,得到每种种类的概率值。然后将概率值放入交叉熵损失函数之中,得到预测结果和真实结果之间的距离

实验总结📌

        本实验以葡萄酒的类别为预测的例,以一种简单的方式,理解了交叉熵损失与其他损失的不同,以及引入交叉熵损失的原因。当然,从模型的训练角度来讲,引入交叉熵损失函数也是为了能够加快模型的收敛速度。文章来源地址https://www.toymoban.com/news/detail-429088.html

到了这里,关于【PyTorch】第九节:Softmax 函数与交叉熵函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第九节:揭开交互的秘密:如何制作原型图

    交互(interaction)是指用户与产品之间的互动 ,即用户 输入(input) ,产品对应 给出反馈(Feedback)或输出(Output) 的过程。简单可以理解为【交流和互动】。我们把任何两个系统之间的交互都可以看做【对话】。 动作和反馈 1.1 物理交互 我们在使用电视遥控器的时候,按下(

    2024年03月28日
    浏览(40)
  • 【Git 入门教程】第九节、Git的最佳实践

    Git是一个强大的版本控制系统,可以帮助开发者管理和协调代码库。然而,正确使用Git并不总是容易。本文将介绍一些Git的最佳实践,以帮助开发者更好地利用Git来管理和协调代码库。   在使用Git时,编写有意义的提交信息是非常重要的。提交信息应该简明扼要地描述所做的

    2024年02月06日
    浏览(27)
  • 【蓝桥杯】【嵌入式组别】第九节:MCP4017编程设计

    他本质是一个IC器件,也就是本质是一个芯片。 芯片内部是一些电阻网络,是通过很多模拟开关来切换不同的阻值的。 那么如何控制芯片内部的不同开关从而实现不同的阻值呢?在本竞赛开发板上是通过IIC总线实现CPU向本芯片发送数据的,告诉芯片要打开多少开关,打开哪几

    2023年04月08日
    浏览(70)
  • pytorch学习-线性神经网络——softmax回归+损失函数+图片分类数据集

            Softmax回归(Softmax Regression)是一种常见的多分类模型,可以用于将输入变量映射到多个类别的概率分布中。softmax回归是机器学习中非常重要并且经典的模型,虽然叫回归,实际上是一个分类问题         回归是估计一个连续值,分类是预测一个连续的类别  示例

    2024年02月15日
    浏览(34)
  • AI实战营第二期 第九节 《底层视觉与MMEditing》——笔记10

    本节内容 : 图像超分辨率 Super Resolution 基于卷积网络的模型 SRCNN 与 FSRCNN 损失函数 对抗生成网络 GAN 简介 基于 GAN 的模型 SRGAN 与 ESRGAN 视频超分辨率介绍 实践 MMEditing 1 图像超分辨率 : 根据从低分辨率图像重构高分辨率图像 。 将图像放大,变清晰 提高图像的分辨率 高分图像

    2024年02月09日
    浏览(22)
  • 第九节 你还在为证件照/职业照发愁吗?Midjourney教你一键生成

    上一节我们提到如何使用Midjourney制作盲盒模型/形象,想必已经引起大家的兴趣,但是盲盒毕竟离我们普通大众有点距离,也不是每一个人都喜欢盲盒。今天我们所要讲的内容就与大家息息相关,特别是步入职场的年轻人。 在我们投递简历、提交报名表或者是参与评选的时候

    2024年02月06日
    浏览(30)
  • 【PyTorch】在PyTorch中使用线性层和交叉熵损失函数进行数据分类

    在机器学习的众多任务中,分类问题无疑是最基础也是最重要的一环。本文将介绍如何在PyTorch框架下,使用线性层和交叉熵损失函数来解决分类问题。我们将以简单的Iris数据集作为起点,探讨线性模型在处理线性可分数据上的有效性。随后,我们将尝试将同样的线性模型应

    2024年01月18日
    浏览(40)
  • pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

    pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 打印的结果: tensor(0.7075, grad_fn=NllLossBackward0) 以上是对10个样本做的均值的标量 在构造CrossEntropyLoss时候加入  reduction=\\\'n

    2024年02月14日
    浏览(33)
  • pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

    pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 打印的结果: tensor(0.7075, grad_fn=NllLossBackward0) 以上是对10个样本做的均值的标量 在构造CrossEntropyLoss时候加入  reduction=\\\'n

    2024年02月14日
    浏览(25)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(十一):分类问题-softmax回归

    1)连续值与离散值 线性回归模型,适用于输出为连续值的情景。 softmax回归模型,适用于输出为离散值的情景。例如图像类别,就需要对离散值进行预测。softmax回归模型引入了softmax运算,使输出更适合离散值的预测和训练。 2)输出个数 线性回归模型,输出单元为1个,而

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包