【白话机器学习系列】白话 Softmax

在这里插入图片描述

文章目录

    • 什么是 Softmax
    • Softmax 函数详解
    • 示例
    • 编程实现
    • 对矩阵应用 Softmax 函数

什么是 Softmax

Softmax 函数,又称归一化指数函数,它使用指数函数将输入向量归一化为概率分布(每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间,并且所有元素的和为 1 1 1)。Softmax 函数多用于多分类问题中。

Softmax 函数能够将一个包含 K K K 个实数值的向量 z ⃗ \vec z z “压缩”到另一个 K K K 个实数值的向量 σ ( z ⃗ ) \sigma(\vec z) σ(z ),这些值的总和为 1 1 1。输入值可以是正数、负数、零或大于 1 1 1,但 Softmax 会将它们转换为 0 0 0 1 1 1 之间的值,以便可以解释为概率。如果某个输入值很小或为负,Softmax 会将其转换为小概率;如果输入值较大,则转换为大概率,但始终保持在 0 0 0 1 1 1 之间。

Softmax 是逻辑回归的一个泛化形式,可以用于多类分类,其公式与用于逻辑回归的 Sigmoid 函数非常相似。Softmax 函数只能在类别互斥时用于分类器。

在许多多层神经网络中,倒数第二层会输出一些未便于缩放的实数分数,这可能难以处理。在这种情况下,Softmax 很有用,因为它能够将这些分数转换为归一化的概率分布,既可以显示给用户,也可以作为其他系统的输入。因此,通常会将 Softmax 函数附加为神经网络的最终层。

Softmax 函数详解

Softmax 函数的定义如下:

公式图像
σ ( z ⃗ ) i = e z i ∑ j = 1 K e z j \qquad \qquad \qquad \sigma(\vec z)_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} \qquad \qquad \qquad σ(z )i=j=1Kezjezi在这里插入图片描述

输入是一个包含 K K K 个元素的向量 z ⃗ = [ z 0 , z 1 , … , z K ] \vec z = [z_0, z_1, \dots, z_K] z =[z0,z1,,zK],其中不带箭头的 z z z 表示向量的一个元素。例如 z ⃗ = [ 2 , 3 , 5 , 8 ] → { z 1 = 2 z 2 = 3 x 3 = 5 z 4 = 8 \vec z = [2,3,5,8] \rarr \begin{cases}z_1 = 2 \\ z_2 = 3 \\ x_3 = 5 \\ z_4=8\end{cases} z =[2,3,5,8] z1=2z2=3x3=5z4=8
分子部分,Softmax 对向量的每个元素应用指数函数,对于最大的输入值返回最大的输出值。任何负数也变为正数,因为指数的值域为 ( 0 , ∞ ) (0, \infty) (0,)。这可以通过查看指数函数的图像,或者通过检验下面的区间知晓。
( e − ∞ = 1 e ∞ = 0 , e ∞ = ∞ ) \Big(e^{-\infty} = \frac{1}{e^\infty} = 0, e^\infty = \infty\Big) (e=e1=0,e=)
分母部分,Softmax 通过求和确保函数的总和为 1 1 1,从而将每个元素归一化,形成一个概率分布。所有经过指数化的元素会被加在一起,因此当每个指数化的元素除以这个总和时,它就表示为这个总和的一部分。例如 [ 2 , 3 , 5 , 8 ] [2,3, 5, 8] [2,3,5,8] 的指数化元素求和为:
∑ j = 1 4 e z j = e 2 + e 3 + e 5 + e 8 \sum_{j=1}^4 e^{z_j} = e^2+e^3+e^5+e^8 j=14ezj=e2+e3+e5+e8

示例

我们以 z ⃗ = [ 2 , 3 , 5 , 8 ] \vec z = [2,3,5,8] z =[2,3,5,8] 为例,演示 Softmax 的计算过程。
i = 1 σ ( z ⃗ ) 1 = e 2 e 2 + e 3 + e 5 + e 8 = 0.00234 i = 2 σ ( z ⃗ ) 2 = e 3 e 2 + e 3 + e 5 + e 8 = 0.00636 i = 3 σ ( z ⃗ ) 3 = e 5 e 2 + e 3 + e 5 + e 8 = 0.04702 i = 4 σ ( z ⃗ ) 4 = e 8 e 2 + e 3 + e 5 + e 8 = 0.94428 i=1 \quad \sigma(\vec z)_1 = \frac{e^2}{e^2+e^3+e^5+e^8} = 0.00234 \\ i=2 \quad \sigma(\vec z)_2 = \frac{e^3}{e^2+e^3+e^5+e^8} = 0.00636 \\ i=3 \quad \sigma(\vec z)_3 = \frac{e^5}{e^2+e^3+e^5+e^8} = 0.04702 \\ i=4 \quad \sigma(\vec z)_4 = \frac{e^8}{e^2+e^3+e^5+e^8} = 0.94428 i=1σ(z )1=e2+e3+e5+e8e2=0.00234i=2σ(z )2=e2+e3+e5+e8e3=0.00636i=3σ(z )3=e2+e3+e5+e8e5=0.04702i=4σ(z )4=e2+e3+e5+e8e8=0.94428
最终输出为 [ 0.00234 , 0.00636 , 0.04702 , 0.94428 ] [0.00234, 0.00636, 0.04702, 0.94428] [0.00234,0.00636,0.04702,0.94428],所有元素之和为 1 1 1。最小的输入值 2 2 2 输出最小的概率;最大的输入值 8 8 8 输出最大的概率。

编程实现

Pytorch 中自带 Softmax 函数实现 nn.Softmax(),我们也可以根据 Softmax 函数的定义手动编程实现 Softmax 函数。

import torch# 创建输入向量
z = torch.Tensor([2, 3, 5, 8])# 实现 softmax 函数
softmax = torch.exp(z) / torch.sum(torch.exp(z))
tensor([0.0023, 0.0064, 0.0470, 0.9443])

对矩阵应用 Softmax 函数

对矩阵应用 Softmax 并不是很多人想当然的那样,将每一个元素的指数除以所有元素的指数和,而是每个元素只与自己所在得向量进行 Softmax 运算。具体来说,对于下面的矩阵
M = [ [ 1 , 2 , 3 ] [ 4 , 5 , 6 ] [ 7 , 8 , 9 ] ] M=\begin{bmatrix} [1, 2, 3] \\ [4, 5, 6] \\ [7, 8, 9] \end{bmatrix} M= [1,2,3][4,5,6][7,8,9]
我们其实是一行一行地对每个向量应用 Softmax。
i = 1 , j = 1 σ ( M ) 1 , 1 = e 1 e 1 + e 2 + e 3 = 0.0900 i = 1 , j = 2 σ ( M ) 1 , 2 = e 2 e 1 + e 2 + e 3 = 0.2447 i = 1 , j = 3 σ ( M ) 1 , 3 = e 3 e 1 + e 2 + e 3 = 0.6652 i = 2 , j = 1 σ ( M ) 2 , 1 = e 4 e 4 + e 5 + e 6 = 0.0900 i = 2 , j = 2 σ ( M ) 2 , 2 = e 5 e 4 + e 5 + e 6 = 0.2447 i = 2 , j = 3 σ ( M ) 2 , 3 = e 6 e 4 + e 5 + e 6 = 0.6652 i = 3 , j = 1 σ ( M ) 3 , 1 = e 7 e 7 + e 8 + e 9 = 0.0900 i = 3 , j = 2 σ ( M ) 3 , 2 = e 8 e 7 + e 8 + e 9 = 0.2447 i = 3 , j = 3 σ ( M ) 3 , 3 = e 9 e 7 + e 8 + e 9 = 0.6652 i=1, j=1 \quad \sigma(M)_{1,1} = \frac{e^1}{e^1+e^2+e^3} = 0.0900 \\ i=1, j=2 \quad \sigma(M)_{1,2} = \frac{e^2}{e^1+e^2+e^3} = 0.2447 \\ i=1, j=3 \quad \sigma(M)_{1,3} = \frac{e^3}{e^1+e^2+e^3} = 0.6652 \\ i=2, j=1 \quad \sigma(M)_{2,1} = \frac{e^4}{e^4+e^5+e^6} = 0.0900 \\ i=2, j=2 \quad \sigma(M)_{2,2} = \frac{e^5}{e^4+e^5+e^6} = 0.2447 \\ i=2, j=3 \quad \sigma(M)_{2,3} = \frac{e^6}{e^4+e^5+e^6} = 0.6652 \\ i=3, j=1 \quad \sigma(M)_{3,1} = \frac{e^7}{e^7+e^8+e^9} = 0.0900 \\ i=3, j=2 \quad \sigma(M)_{3,2} = \frac{e^8}{e^7+e^8+e^9} = 0.2447 \\ i=3, j=3 \quad \sigma(M)_{3,3} = \frac{e^9}{e^7+e^8+e^9} = 0.6652 \\ i=1,j=1σ(M)1,1=e1+e2+e3e1=0.0900i=1,j=2σ(M)1,2=e1+e2+e3e2=0.2447i=1,j=3σ(M)1,3=e1+e2+e3e3=0.6652i=2,j=1σ(M)2,1=e4+e5+e6e4=0.0900i=2,j=2σ(M)2,2=e4+e5+e6e5=0.2447i=2,j=3σ(M)2,3=e4+e5+e6e6=0.6652i=3,j=1σ(M)3,1=e7+e8+e9e7=0.0900i=3,j=2σ(M)3,2=e7+e8+e9e8=0.2447i=3,j=3σ(M)3,3=e7+e8+e9e9=0.6652
用代码实现就是

x = torch.Tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])softmax = torch.exp(x) / torch.sum(torch.exp(x), axis=1, keepdims=True)

其中 axis=1 表示按行求和,keepdims = True 用于保持矩阵的形状。输出结果如下:

tensor([[0.0900, 0.2447, 0.6652],[0.0900, 0.2447, 0.6652],[0.0900, 0.2447, 0.6652]])

上面的输出,每一行相加的都等于 1 1 1。有趣的是输出结果中三个向量的值是相同的,这完全是巧合,因为
σ ( M ) 1 , 1 = e 1 e 1 + e 2 + e 3 = e e ( 1 + e + e 2 ) = 1 1 + e + e 2 σ ( M ) 2 , 1 = e 4 e 4 + e 5 + e 6 = e 4 e 4 ( 1 + e + e 2 ) = 1 1 + e + e 2 σ ( M ) 3 , 1 = e 7 e 7 + e 8 + e 9 = e 7 e 7 ( 1 + e + e 2 ) = 1 1 + e + e 2 \sigma(M)_{1,1} = \frac{e^1}{e^1+e^2+e^3} = \frac{e}{e(1+e+e^2)} = \frac{1}{1+e+e^2}\\ \sigma(M)_{2,1} = \frac{e^4}{e^4+e^5+e^6} = \frac{e^4}{e^4(1+e+e^2)} = \frac{1}{1+e+e^2}\\ \sigma(M)_{3,1} = \frac{e^7}{e^7+e^8+e^9} = \frac{e^7}{e^7(1+e+e^2)} = \frac{1}{1+e+e^2}\\ σ(M)1,1=e1+e2+e3e1=e(1+e+e2)e=1+e+e21σ(M)2,1=e4+e5+e6e4=e4(1+e+e2)e4=1+e+e21σ(M)3,1=e7+e8+e9e7=e7(1+e+e2)e7=1+e+e21
再实际开发中,我们不会自己实现 Softmax 函数,而是直接调用 Pytorch 库自带的 nn.Softmax() 函数。

import torch.nn as nnx = torch.Tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])softmax_layer = nn.Softmax(dim=1)output = softmax_layer(x)
tensor([[0.0900, 0.2447, 0.6652],[0.0900, 0.2447, 0.6652],[0.0900, 0.2447, 0.6652]])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++系列之继承

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xf…

【微软:多模态基础模型】(5)多模态大模型:通过LLM训练

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…

数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)

下图所示为咱们社区T12nm A55低功耗实现项目。其实这个项目还可以根据产品的需求做一些改进。改进后项目实现的难度会大大增加。也希望通过今天的这个项目案例分享,帮助到今年IC秋招的同学。 芯片低功耗设计实现upf编写指南(附低功耗项目案例&#xff0…

Vue3中使用:deep修改element-plus的样式无效怎么办?

前言:当我们用 vue3 :deep() 处理 elementui 中 el-dialog_body和el-dislog__header 的时候样式一直无法生效,遇到这种情况怎么办? 解决办法: 1.直接在 dialog 上面增加class 我试过,也不起作用,最后用这种…

HTTP CRLF注入攻击

HTTP CRLF注入攻击 大家好,今天我们来聊聊一个与网络安全相关的重要话题——CRLF注入(CRLF Injection)。了解这种安全漏洞有助于我们更好地保护我们的应用程序和用户数据。 什么是CRLF? CRLF代表Carriage Return (回车) 和 Line…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求,我基于canvas开发了这款图片加水印工具。 地址:https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 ,轻松调整水印宽高,精准适配每张图…

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体,因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中,经常会发生零部件间干涉或装配顺序不合理等现象,且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

进入 RPG Prime:第六周游戏指南

进入 RPG Prime,在这里,每一个任务都是一个等待展开的史诗故事。选择你的等级,召集你的队伍,开始融合策略、魔法和神话的冒险! 本系列共有 10 篇攻略,贯穿 Alpha 第 4 季,每周都有新攻略&#…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中,BootLoader 的设计是非常关键的部分,它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤,尤其是在面对静态网页时: 获取页面 HTML:使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML:将下载的 HTML 输入解析器,准备提取内容。提取数据:利用解析器功能&#…

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…

详细分析ipvsadm负载均衡的命令

目录 前言1. 基本知识2. 命令参数3. 拓展 前言 LVS四层负载均衡架构详解Lvs推荐阅读:添加链接描述 1. 基本知识 ipvsadm 是用于管理和配置 Linux 服务器上 IP Virtual Server (IPVS) 的工具,是 Linux 提供的一个负载均衡模块,支持多种负载…

量化选股日常操作日记-11-ai眼镜-润欣科技

用 微信小程序 梦想兔企业智能风险分析助手 ,选择AI眼镜板块,挖掘了几个合适的股,分析下来感觉 润欣科技 比较安全些适合观察,几块到十几块波动,企业基本面也没有特别大问题。就是现在价位在周期波动高位,下…

动力学法测量金属弹性模量

🏫中南民族大学-⚛大学物理实验2-📠通信工程2024 目录 Python代码 1. 绘制图像 2. 弹性模量数值计算 图像显示 Pycharm 豆包 MarsCode 非常强大!有了它们,我在处理大学物理实验的数据及其可视化就非常方便,极大缩减…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息: 简介: 本文讨论的背景是大型语言模型(LLMs)的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力

SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…

RabbitMQ1:初识MQ

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

父组件提交时让各自的子组件验证表格是否填写完整

项目场景: 提示:这里简述项目相关背景: 父组件中有三个表格,表格中时输入框,有些输入框是必填的,在父组件提交时需要验证这三个表格的必填输入框中是否有没填写的。 原因分析: 提示&#xff1a…

Siglus引擎 Unpack | 未完待续

前言 未完待续。 代码在这里:https://github.com/N0zoM1z0/SiglusEngine-Extract 以后随时会更新。() 因为我是选择直接逆向游戏引擎,在无源码,不hook的情况下硬逆Siglus…… 路漫漫。。。 read.sav 可以直接逆Sigl…