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

如何安全的计算softmax?

Softmax 函数广泛用于分类任务的输出层。但直接计算容易导致 数值不稳定 —— 轻则结果错误,重则出现 inf 或 nan

🚨 问题:为什么原始 Softmax 不安全?

标准 Softmax 公式:

softmax(xi)=exi∑j=1nexjsoftmax(xi​)=∑j=1n​exj​exi​​

❌ 危险场景举例:

假设输入向量中有大数:

  • x=[1000,2000,3000]
  • 计算 e3000→ 远超浮点数表示范围(溢出为 inf
  • 结果变成:inf / inf = nan → 模型崩溃!

即使不溢出,小数也可能被“淹没”,造成精度丢失。

✅ 解法:使用 Log-Sum-Exp 技巧 + 减去最大值

✅ 安全版 Softmax(Numerically Stable)

import numpy as npdef stable_softmax(x):# Step 1: 减去最大值(关键!)z = x - np.max(x, axis=-1, keepdims=True)# Step 2: 计算 exp(z),此时所有元素 ≤ 0,不会溢出exp_z = np.exp(z)# Step 3: 归一化return exp_z / np.sum(exp_z, axis=-1, keepdims=True)

🔍 原理说明

我们利用一个数学恒等变换:

softmax(xi)=exi∑jexj=exi−c∑jexj−c,对任意 csoftmax(xi​)=∑j​exj​exi​​=∑j​exj​−cexi​−c​,对任意 c

选择 c=max⁡(x1,x2,...,xn)c=max(x1​,x2​,...,xn​),则:

  • 所有 xi−c≤0xi​−c≤0
  • exi−c≤1exi​−c≤1
  • 最大指数项为 e0=1e0=1,避免了上溢

✅ 这是几乎所有深度学习框架(PyTorch、TensorFlow)内部实现的方式。

原则说明
1. 减去最大值xi←xi−max⁡(x),防止指数溢出
2. 使用双精度用 float64 替代 float32 提高稳定性
3. 在 log 空间操作如需取对数,优先使用 logsumexp 技巧
http://www.dtcms.com/a/393147.html

相关文章:

  • 第一部分:基础架构与入门
  • [Windows] Cencrack在线工具包6.52
  • 算法基础篇(2)模拟
  • Go基础:Go语言结构体(Struct)和接口(Interface)详解
  • 【计算机毕业设计】基于生成对抗网络的动作与表情一致性动漫角色生成算法系统​
  • html5 做个人网页识芯平夹回拼翘
  • 开收价均值策略
  • 【大模型部署】Ollama部署gguf模型
  • Coze源码分析-资源库-删除工作流-前端源码-核心组件
  • 机器学习实战第八章 降维
  • 2025年csp-j真题和解析
  • C++ STL map 深度解析:从原理到实战的全方位指南
  • 【EKF组合导航例程】MATLAB代码,15维状态量、3维观测量的组合导航,滤波使用EKF(扩展卡尔曼滤波)。附下载链接
  • word文档怎么根据大纲拆分章节
  • 【Modbus】Modbus协议基础知识详解
  • Springboot使用Integration实现MQTT发送和接收消息
  • 中国传统文化上衣下裳
  • zk管理kafkakafka-broker通信
  • 前端开发技术趋势Web Components
  • Python tarfile库详解
  • ​​[硬件电路-287]:高性能六通道数字隔离器CA-IS3763L 功能概述与管脚定义
  • 错题集系统接口文档
  • 【RAG-LLM】InfoGain-RAG基于文档信息增益的RAG
  • Browser-Use深度解析:重新定义AI与浏览器的智能协作
  • 【Mysql】事务隔离级别、索引原理、/redolog/undolog/binlog区别、主从复制原理
  • AWS 全景速查手册
  • 小米Openvela城市沙龙
  • Python数据分析:求矩阵的秩。啥是矩阵秩?听故事学线代并用Python实现,娘来太容易学会了!
  • UI Toolkit自定义元素
  • redis未授权访问-漏洞复现