当前位置: 首页 > news >正文

深度学习篇---softmax层

softmax 层是神经网络分类任务的 “最终裁判”,它的作用是把网络输出的 “原始分数” 转换成 “概率”,让结果更直观、更符合人类对 “可能性” 的理解。

一、先看一个问题:网络输出的 “原始分数” 有什么问题?

假设我们训练了一个识别 “猫、狗、鸟” 的网络,最后一层全连接层输出了三个数字:
[2.0, 1.0, 0.1]

这三个数字可以理解为网络对三个类别的 “原始打分”:猫 2 分,狗 1 分,鸟 0.1 分。虽然能看出 “猫的分数最高”,但有两个问题:

  1. 分数没有明确范围(可能是负数,也可能很大),无法直接解读为 “可能性”;
  2. 分数之间的差距不直观(2.0 比 1.0 高 1 分,但这代表猫的可能性是狗的 2 倍吗?不一定)。

这时候就需要 softmax 层来 “加工” 这些分数。

二、softmax 层的核心作用:把 “分数” 变成 “概率”

softmax 层会对原始分数做一套数学处理,最终输出几个加起来等于 1 的数字(概率)。比如上面的[2.0, 1.0, 0.1],经过 softmax 处理后可能变成:
[0.7, 0.27, 0.03]

这三个数字分别对应 “猫的概率 70%、狗 27%、鸟 3%”,加起来正好是 100%,非常直观。

三、softmax 是怎么计算的?用一个通俗公式

计算过程可以简化为两步(以三个类别为例):

第一步:给每个分数 “exponentiate”(指数化)

简单说就是用 “自然常数 e(约 2.718)” 的 “分数次方” 来放大分数之间的差距。
比如对[2.0, 1.0, 0.1]

  • 猫的指数化结果:e²⁰ ≈ 7.389
  • 狗的指数化结果:e¹⁰ ≈ 2.718
  • 鸟的指数化结果:e⁰¹ ≈ 1.105

(e 的次方特性:分数越高,结果越大;分数差距会被放大 —— 比如 2.0 比 1.0 只高 1 分,但指数化后 7.389 比 2.718 高很多)

第二步:用 “比例” 计算概率

每个类别的概率 = 自己的指数化结果 ÷ 所有类别指数化结果的总和。

上面的例子中,总和 = 7.389 + 2.718 + 1.105 ≈ 11.212

  • 猫的概率 = 7.389 ÷ 11.212 ≈ 0.66(66%)
  • 狗的概率 = 2.718 ÷ 11.212 ≈ 0.24(24%)
  • 鸟的概率 = 1.105 ÷ 11.212 ≈ 0.10(10%)

(实际计算可能因精度略有差异,但核心是 “分数高的类别,概率占比更高”)

四、为什么要用 softmax?它解决了什么问题?

  1. 把分数变成 “概率”:输出结果在 0~1 之间,且总和为 1,符合人类对 “可能性” 的认知(比如 “有 80% 的把握是猫”)。
  2. 放大差距:原始分数高的类别,概率会被进一步拉大(比如 90% vs 10%),让网络的 “决策” 更果断,避免模棱两可。
  3. 方便计算 “损失”:在训练时,网络需要根据 “预测概率” 和 “正确答案” 的差距来调整权重。softmax 输出的概率能让这个差距(损失)的计算更合理(比如用交叉熵损失函数)。

五、举个生活例子:softmax 像 “老师给学生排名”

假设三个学生的原始得分是[80, 70, 60](类似网络输出的分数):

  • 老师想知道 “每个学生在班级中的占比”(类似概率)。
  • 第一步:给分数 “加权放大”(比如用 e 的次方,让高分学生的优势更明显);
  • 第二步:用每个学生的放大分数除以总放大分数,得到占比(比如第一名占 60%,第二名 30%,第三名 10%)。

softmax 做的事和这个过程类似 —— 让 “相对优秀” 的类别更突出。

总结:softmax 是 “概率转换器”

  • 输入:网络对每个类别的原始打分(可正可负,可大可小);
  • 输出:每个类别的概率(0~1 之间,总和为 1);
  • 核心:通过数学处理,让 “分数高的类别” 拥有更高的概率,方便最终决策和训练优化。

在分类任务中,softmax 层通常是网络的最后一步,它把复杂的特征计算结果,转化成了我们能直接看懂的 “可能性”。

http://www.lryc.cn/news/625155.html

相关文章:

  • Maven 生命周期和插件
  • 大数据分析-读取文本文件内容进行词云图展示
  • 大厂求职 | 2026海尔校园招聘,启动!
  • Vuex 状态持久化企业级解决方案
  • ​Kali Linux 环境中的系统配置文件与用户配置文件大全
  • MongoDB 从入门到精通:安装配置与基础操作指令详解
  • 计算机组成原理(9) - 整数的乘除法运算
  • 抽象类和接口的区别
  • VLN视觉语言导航(3)——神经网络的构建和优化 2.3
  • qsort函数使用及其模拟实现
  • Android Cutout(屏幕挖孔)详解
  • SpringBoot--Spring MVC 拦截器注入与 new 的区别
  • gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别
  • 优秀开发者的重要认知能力无法被AI替代
  • 在win10/11下Node.js安装配置教程
  • Ai Agent 项目
  • 项目延期的主要原因分析,以及应对策略
  • 摔倒检测数据集:1w+图像,yolo标注
  • 深度学习-计算机视觉-微调 Fine-tune
  • 【完整源码+数据集+部署教程】织物缺陷检测系统源码和数据集:改进yolo11-RevCol
  • STL库——string(类函数学习)
  • steal tsoding‘s pastebeam code as go server
  • CMake指令:查找文件(find_file)、查找目录(find_path)、查找库文件(find_library)
  • npm设置了镜像 pnpm还需要设置镜像吗
  • Esp32基础(③旋转编码器)
  • wait / notify、单例模式
  • 在openEuler系统中如何查看文件夹下每个文件的大小
  • AVB(Android Verified Boot)中vbmeta结构浅析
  • C/C++ 中 str、str、*str 在指针语境下的具体含义(以 char* str 为例):
  • Android输入框文字不垂直居中