Exp-normalize和LogSumExp技巧

Machine Learning小技巧:LogSumExp LogSumExp小技巧 Machine Learning当中会涉及到许多的小技巧让运算更快捷,或者结果更精确,其中LogSumExp就是一种可以运到softmax的代码实现中小技巧。 LogSumExp(x1…xn)=log⁡(∑i=1nexi) LogSumExp(x_1…x_n) = \log\big( \sum_{i=1}^{n} e^{x_i} \big) LogSumExp(x1​…x... 阅读详情

softmax模型中,会计算出模型输出然后将此输出送入交叉熵损失。
对较大值进行指数运算时,可能会出现上溢 (overflow) 或下溢 (underflow) 问题。

Exp-normalize技巧

使用softmax预测概率分布时,
y ^ j = exp ⁡ ( x j ) ∑ k = 1 n exp ⁡ ( x k ) \hat{y}_{j}=\frac{\exp \left(x_{j}\right)}{\sum^{n}_{k=1} \exp \left(x_{k}\right)} y^​j​=∑k=1n​exp(xk​)exp(xj​)​
其中 y ^ j \hat{y}_j y^​j​是预测的概率分布,由向量 x ∈ R n \boldsymbol{x} \in \mathbb{R}^{n} x∈Rn决定。如果 x k x_k xk​中的一些数值非常大, e x p ( x k ) exp(x_k) exp(xk​)可能会大于数据类型容许的最大数字,造成上溢 (overflow),这将使这将使分母或分子变为 i n f inf inf (无穷大),最后得到的是0、 i n f inf inf或 n a n nan nan (不是数字) 的 y ^ j \hat{y}_{j} y^​j​。 在这些情况下,我们无法得到一个明确定义的交叉熵值。这种情况下可以使用exp-normalize技巧避免数值上溢。
y ^ j = exp ⁡ ( x i − b ) exp ⁡ ( b ) ∑ k = 1 n exp ⁡ ( x k − b ) exp ⁡ ( b ) = exp ⁡ ( x i − b ) ∑ k = 1 n exp ⁡ ( x k − b ) \hat{y}_{j}=\frac{\exp \left(x_{i}-b\right) \exp (b)}{\sum_{k=1}^{n} \exp \left(x_{k}-b\right) \exp (b)}=\frac{\exp \left(x_{i}-b\right)}{\sum_{k=1}^{n} \exp \left(x_{k}-b\right)} y^​j​=∑k=1n​exp(xk​−b)exp(b)exp(xi​−b)exp(b)​=∑k=1n​exp(xk​−b)exp(xi​−b)​
可以选择 b = max ⁡ i = 1 n x i b=\max _{i=1}^{n} x_{i} b=maxi=1n​xi​,这种情况下, y ^ j \hat{y}_{j} y^​j​移位不变,不可能出现上溢,因为此时最大的指数为 max ⁡ i = 1 n x i − b = 0 \max _{i=1}^{n} x_{i}-b=0 maxi=1n​xi​−b=0。

例子:

x = np.array([1, -10, 1000])
np.exp(x) / np.exp(x).sum()
RuntimeWarning: overflow encountered in exp
RuntimeWarning: invalid value encountered in true_divide
array([ 0.,  0., nan])

使用exp-normalize后:

def exp_normalize(x):
    b = x.max()
    y = np.exp(x - b)
    return y / y.sum()

exp_normalize(x)
array([0., 0., 1.])

上溢问题得到解决。

使用exp-normalize技巧的sigmoid函数

sigmoid 函数可以使用exp-normalize技巧进行计算,避免数值溢出。
s i g m o i d ( x ) = 1 1 + exp ⁡ ( − x ) = exp ⁡ ( x ) 1 + exp ⁡ ( x ) sigmoid(x)=\frac{1}{1+\exp (-x)}=\frac{\exp (x)}{1+\exp (x)} sigmoid(x)=1+exp(−x)1​=1+exp(x)exp(x)​
如果x很大, e x p ( x ) exp(x) exp(x)会出现上溢;如果x很小, e x p ( − x ) exp(-x) exp(−x)可能会出现上溢,为了避免这种情况,在 x > = 0 x>=0 x>=0时使用第一种表示, x < 0 x<0 x<0时使用第二种。

def sigmoid(x):
    "Numerically stable sigmoid function."
    if x >= 0:
        z = exp(-x)
        return 1 / (1 + z)
    else:
        # if x is less than zero then z will be small, denom can't be
        # zero because it's 1+z.
        z = exp(x)
        return z / (1 + z)

LogSumExp技巧

经过减法和规范化步骤之后,可能有些 x k − b x_k-b xk​−b具有较大的负值,由于精度受限, e x p ( x k − b ) exp(x_k-b) exp(xk​−b)将有接近0的值,即下溢 (underflow) ,这些值可能会四舍五入为零,使 y ^ j \hat y_j y^​j​为零,并且使得 log ⁡ ( y ^ j ) \log(\hat y_j) log(y^​j​)的值为-inf。反向传播几步后,我们可能会发现自己面对一屏幕可怕的nan结果。
尽管我们要计算指数函数,但在后续计算交叉熵损失函数的过程中需要取他们的对数, 通过将softmax和交叉熵结合在一起,可以避免反向传播过程中可能会困扰我们的数值稳定性问题。

LogSumExp (LSE) 操作可以被表示为:
LSE ⁡ ( x 1 , … , x N ) = log ⁡ ( ∑ n = 1 N exp ⁡ ( x n ) ) \operatorname{LSE}\left(x_{1}, \ldots, x_{N}\right)=\log \left(\sum_{n=1}^{N} \exp \left(x_{n}\right)\right) LSE(x1​,…,xN​)=log(n=1∑N​exp(xn​))
且 max ⁡ { x 1 , … , x n } < LSE ⁡ ( x 1 , … , x n ) ≤ max ⁡ { x 1 , … , x n } + log ⁡ ( n ) \max \left\{x_{1}, \ldots, x_{n}\right\}<\operatorname{LSE}\left(x_{1}, \ldots, x_{n}\right) \leq \max \left\{x_{1}, \ldots, x_{n}\right\}+\log (n) max{x1​,…,xn​}<LSE(x1​,…,xn​)≤max{x1​,…,xn​}+log(n)

在softmax中使用这种技巧,将交叉熵和softmax结合在一起,对原式取对数得:
log ⁡ ( y ^ j ) = log ⁡ exp ⁡ ( x j ) ∑ k = 1 n exp ⁡ ( x k ) = x j − log ⁡ ∑ k = 1 n exp ⁡ ( x k ) \begin{aligned} \log \left(\hat{y}_{j}\right) &=\log \frac{\exp \left(x_{j}\right)}{\sum_{k=1}^{n} \exp \left(x_{k}\right)} \\ &=x_{j}-\log \sum_{k=1}^{n} \exp \left(x_{k}\right) \end{aligned} log(y^​j​)​=log∑k=1n​exp(xk​)exp(xj​)​=xj​−logk=1∑n​exp(xk​)​
此时 log ⁡ ∑ k = 1 n exp ⁡ ( x k ) \log \sum_{k=1}^{n} \exp \left(x_{k}\right) log∑k=1n​exp(xk​)仍有可能出现上溢,故令
L o g S u m M a x = log ⁡ ∑ k = 1 n exp ⁡ ( x k ) = log ⁡ ∑ k = 1 n exp ⁡ ( x k − b ) exp ⁡ ( b ) = b + log ⁡ ∑ k = 1 n exp ⁡ ( x k − b ) \begin{aligned} LogSumMax=\log \sum_{k=1}^{n} \exp \left(x_{k}\right) &=\log \sum_{k=1}^{n} \exp \left(x_{k}-b\right)\exp(b) \\ &= b+\log \sum_{k=1}^{n} \exp \left(x_{k}-b\right) \end{aligned} LogSumMax=logk=1∑n​exp(xk​)​=logk=1∑n​exp(xk​−b)exp(b)=b+logk=1∑n​exp(xk​−b)​
此时 log ⁡ ( s o f t m a x ) \log(softmax) log(softmax)函数可表示为:
log ⁡ ( y ^ j ) = x j − L o g S u m M a x = x j − b − log ⁡ ∑ k = 1 n exp ⁡ ( x k − b ) \begin{aligned} \log \left(\hat{y}_{j}\right) &=x_j-LogSumMax\\ &=x_j-b-\log \sum_{k=1}^{n} \exp \left(x_{k}-b\right) \end{aligned} log(y^​j​)​=xj​−LogSumMax=xj​−b−logk=1∑n​exp(xk​−b)​
y ^ j = exp ⁡ ( x j − L o g S u m M a x ) \hat{y}_{j} =\exp \left( x_j-LogSumMax\right) y^​j​=exp(xj​−LogSumMax)
对LogSumMax求导即可得到exp-normalize:
∂ ( b + log ⁡ ∑ k = 1 n exp ⁡ ( x k − b ) ) ∂ x j = exp ⁡ ( x j − b ) ∑ k = 1 n exp ⁡ ( x k − b ) \frac{\partial \left( b+ \log \sum_{k=1}^{n} \exp \left(x_{k}-b\right)\right)}{\partial x_{j}}=\frac{\exp \left(x_{j}-b\right)}{\sum_{k=1}^{n} \exp \left(x_{k}-b\right)} ∂xj​∂(b+log∑k=1n​exp(xk​−b))​=∑k=1n​exp(xk​−b)exp(xj​−b)​

如果需要对概率分布求log(如使用交叉熵损失的softmax)则使用LogSumMax,如果只求概率分布,使用exp-normalize即可。由于exp-normalize使用exp更少,在数值上更稳定。

例子:

def logsumexp(x):
    c = x.max()
    return c + np.log(np.sum(np.exp(x - c)))  
>>> x = np.array([1000, 1000, 1000])
>>> np.exp(x)
array([inf, inf, inf])

>>> logsumexp(x)
1001.0986122886682
>>> np.exp(x - logsumexp(x))
array([0.33333333, 0.33333333, 0.33333333])
>>> x = np.array([-1000, -1000, -1000])
>>> np.exp(x)
array([0., 0., 0.])
>>> np.exp(x - logsumexp(x))
array([0.33333333, 0.33333333, 0.33333333])

>>> x = np.array([-1000, -1000, 1000])
>>> np.exp(x - logsumexp(x))
array([0., 0., 1.])

exp-normalize和log-sum-max有时都被叫做"softmax",但其实exp-normalize更接近"soft argmax",LSE函数才是真正意义上的softmax函数。也就是说我们常常在神经网络中用的softmax其实是soft argmax。

Reference

  1. Exp-normalize trick
  2. The Log-Sum-Exp Trick
EMI互信息探索:让智能体在稀疏奖励下自主‘好奇’学习 在强化学习中,稀疏奖励环境导致传统探索方法失效,智能体难以获得有效反馈。互信息(Mutual Information)作为一种可微、可优化的信息度量,为内在动机探索提供了理论基础与工程路径;其核心在于建模动作与状态表征间的因果关联,而非依赖外部信号或人工设计的奖励函数。通过对比学习(如InfoNCE)实现端到端优化,EMI将高维观测压缩为解耦、语义敏感的状态表征,显著提升动力学建模能力与探索效率。该方法广泛适用于机器人控制、游戏AI、仿真训练等需自主认知环境的场景,是解决奖励稀疏问题的关键技术范式。 阅读详情

相关推荐

单次前向传播的语义分割OOD检测方法

语义分割中的分布外(OOD)检测是保障视觉系统安全落地的核心能力,其本质是让模型具备‘知道自己不知道’的元认知。传统基于softmax熵或后处理的方法受限于归一化失真、计算延迟与像素级孤立判别,难以满足工业实时性与鲁棒性要求。本文聚焦‘单次前向传播’这一关键约束,提出以神经能量(Neural Energy)为置信度代理的技术路径——直接利用未归一化的logits计算像素级能量值,规避softmax伪置信问题,并通过能量引导门控与联合优化,将OOD感知深度耦合进主干网络推理流。该方案天然适配Jetson等边缘

weixin_34059951的博客 537

一文弄懂LogSumExp技巧

什么是LogSumExp?

日积月累,天道酬勤 1万+

音频嵌入的两条工程路径:通用预训练与领域微调实战指南

音频嵌入(audio embedding)是语音助手、智能降噪、工业声学诊断等AI系统的核心底层能力,其本质并非保存声音,而是将音频映射为具有语义距离可解释性的高维向量。技术原理上,它依赖自监督学习(如Wav2Vec 2.0、HuBERT)构建通用语音表征空间,再通过对比学习、三元组学习等微调范式适配特定场景。其核心价值在于支撑下游任务的距离敏感型计算——如异常检测需类间分离度高、RUL预测需embedding与物理量强相关。典型应用场景覆盖医疗呼吸音分析、轴承故障识别、电梯异响分类等小样本高精度需求领域。

weixin_34242331的博客 353

Log-Sum- Exp

分类问题中对softmax值求max后,得到图片所属类别。 max的计算过于暴力,提出log-sum-exp另一种求取最大值的方法。we use Log-Sum-Exp (LSE) function to compute a smooth approximation to the maximum value

jingtingxu369的博客 1226

PyTorch手写神经网络实操:从零理解反向传播与激活函数

神经网络是深度学习的基础模型,其核心在于前向传播的线性变换与非线性激活,以及反向传播中链式法则驱动的梯度更新。理解activation functions(如ReLU、Sigmoid)的导数特性,能避免梯度消失;掌握loss function(如CrossEntropy)的梯度形式,可确保分类任务中优化方向正确。这些原理在PyTorch等框架中被封装,但调试时需回归张量维度与梯度流本质。本文以3层全连接网络为载体,聚焦neural network basics,通过手动推导backpropagation、显

shirlly 402

自监督学习实战:从原理到工业级视觉系统落地

自监督学习是一种无需人工标注、利用数据自身结构进行表征学习的基础范式,其核心在于挖掘图像、文本或时序数据中的内在一致性与预测约束。它通过对比学习、掩码建模和生成式建模等技术路径,显著提升模型对未见样本的泛化能力与数据利用效率。在标注成本高、数据持续增长或下游任务多变的工业场景中,该技术展现出远超传统监督学习的工程价值。本文聚焦视觉领域,结合SimCLR、BYOL、DINO等主流方法,详解数据增强设计、特征坍塌规避、小样本微调及产线部署等关键实践环节,为算法工程师提供可复用的工业级自监督学习落地路径。

430

【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)

在计算机科学和机器学习中,经常会遇到计算指数和的对数的情况,由于指数函数 的值增长极快,直接计算可能会导致数值上溢(overflow)或下溢(underflow),影响计算的准确性。为了避免这些问题,我们可以使用 Log-Sum-Exp (LSE) 技巧,本篇文章将详细介绍该技巧的原理、推导过程以及实际应用。

IT古董 1971

ICLR 2022前沿论文实操指南:可复现、轻量化与鲁棒性落地

深度学习已从模型创新阶段迈入工程深化期,核心挑战聚焦于计算效率、部署鲁棒性与实验可复现性。注意力机制优化与轻量化模型设计成为突破显存墙和硬件约束的关键路径,其技术价值在于将理论改进转化为可在单卡V100/ A100上5分钟验证的代码级方案;典型应用场景涵盖长序列建模、小样本微调、对抗鲁棒评测及大模型剪枝压缩。本文基于ICLR 2022中经严格工程筛选的10篇高复现性工作,系统梳理FlashAttention的IO感知分块、RobustBench的标准化评估框架、LLM-Pruner的梯度敏感度剪枝等硬核落地

cuikuangru5755的博客 388

flashinfer attention kernel分析

分析flashinfer代码库中attention算子的实现细节

u010643777的专栏 792

深度学习训练流水线术语实战指南:从数据加载到模型部署

深度学习不是术语堆砌,而是环环相扣的工程流水线。理解activation function、batch normalization、gradient clipping等核心概念,关键在于掌握其在真实训练流程中的作用机制与相互制约关系——比如BN层如何依赖batch_size稳定统计量,gradient clipping如何防止RNN梯度爆炸,pin_memory如何通过锁页内存加速GPU数据传输。这些技术共同构成模型可复现、可调优、可上线的基础能力,广泛应用于图像分类、NLP微调、医疗影像分析等场景。本文聚

weixin_33824363的博客 317

一步生成模型实战:基于得分匹配的稳定训练方法

深度生成模型的核心任务是从噪声中还原真实数据分布,而扩散模型虽生成质量高,却受限于多步迭代采样的推理效率。一步生成模型通过单次前向传播直接得到输出,大幅提升部署性能,但如何稳定训练是工程难点。得分匹配(Score Matching)提供了优雅的解决路径——它不依赖对抗博弈或复杂蒸馏框架,而是直接在概率密度梯度上进行回归,让生成样本与真实样本的得分场对齐。若结合最优传输正则,可进一步提升生成多样性。这种训练方式收敛稳定、实现简单,尤其适合CIFAR-10等中小规模数据集的快速验证,同时也为高分辨率图像的分布式

cuiji1279的博客 350

PyTorch深度学习实践手记:从NumPy反向传播到可调试CNN

深度学习不是纯数学,而是数据、计算与工程的三位一体。理解张量维度、自动微分机制和梯度生命周期,是让模型真正跑通的基础前提;PyTorch的动态图特性与NumPy的手动实现对照,能打通‘公式→代码→运行’的认知闭环。这种‘代码即教材’的路径,显著降低初学者在数据加载、loss.backward()、Normalize参数等高频卡点上的调试成本,适用于已掌握Python基础并尝试过机器学习项目的工程师。本文聚焦手写数字识别这一经典任务,以可追踪、可打印、可归因的实操方式,还原真实开发中的决策逻辑与排错过程。

chenzhuofei4155的博客 500

Exp_ATR_Normalize_Histogram - MetaTrader 5EA.zip

一套基于 ATR_Normalize_Histogram 指标信号的交易系统。

NLP损失函数实战:从SoftMax到对比学习,代码详解与避坑指南

在自然语言处理(NLP)与深度学习领域,损失函数是模型训练的核心引擎,它定义了模型优化的具体目标。其基本原理是通过计算模型预测与真实标签之间的差异,生成梯度来指导参数更新。从技术价值看,选择合适的损失函数直接影响模型的收敛速度、泛化能力和最终性能。在应用场景上,传统的SoftMax交叉熵损失广泛用于文本分类等任务,而随着表示学习和语义匹配需求的增长,对比损失和三元组损失等度量学习方法在相似度计算、稠密检索和文本生成评估中变得至关重要。本文聚焦于NLP中的关键损失函数,通过代码实战深入解析了SoftMax交叉

weixin_34252686的博客 335

从零开始:PLUMED与GROMACS整合安装全攻略

本文详细介绍了如何从零开始整合安装PLUMED与GROMACS,包括系统环境检查、MPI配置、PLUMED编译安装、GROMACS补丁应用及常见问题解决方案。通过本教程,研究人员可以快速完成分子动力学模拟工具的整合安装,实现增强采样和自由能计算功能。

weixin_42520796的博客 292

从“要啥”到“咋测”:手把手拆解Aspice SWE.1需求分析,为你的车载/嵌入式项目避坑

本文深入解析Aspice SWE.1需求分析在车载/嵌入式项目中的关键作用,帮助开发者将模糊的系统需求转化为可执行、可验证的软件需求。通过实战案例和结构化方法,详细拆解功能需求原子化、非功能需求工程化表达等核心技巧,为项目避坑提供实用指南。

weixin_31682031的博客 257

手撕AdaBoost原始论文:从在线学习到指数损失的理论溯源

AdaBoost作为集成学习的经典算法,其本质是在线学习框架下的专家聚合策略,核心原理源于Hedge算法在二分类任务中的遗憾界保证。它并非经验性调参工具,而是指数损失函数在弱学习器空间上的前向分步梯度下降实现。该算法的技术价值在于将弱学习器(错误率<0.5)通过自适应权重更新与线性组合,转化为强分类器,并提供训练误差指数级下降的可证明上界。典型应用场景包括高维稀疏数据分类、金融风控中的可解释模型构建,以及教学中对集成机制的深度剖析。本文聚焦Freund与Schapire 1997年原始论文,还原样本权重更新

weixin_30252709的博客 341

油气井管柱力学发展

油气井管柱力学发展 1 石油管柱力学问题的发复杂性 1)油气管柱动力学的非线性 钻井中钻柱在重力、钻压、扭矩、钻井液浮力和井壁约束等作用下,产生三维变形。一方面随井眼轴线的弯曲而弯曲,这一变形被称为管柱的初位移;另一方面,管柱在运动过程中相对井眼轴线也有变形,这种变形被称为计算位移。管柱大变形主要表现在初位移部分,计算位移相对很小。大曲率井眼中管柱产生大挠度,但管柱很长且柔软性较好,变形一般仍保持...

weixin_43831995的博客 949

数学建模中ACO的精准应用:离散组合优化实战指南

蚁群算法(ACO)是一种面向离散组合优化问题的群体智能方法,其核心在于通过信息素正反馈、启发式引导与概率转移机制,在巨大解空间中高效搜索可行且高质量的解。相较于梯度类或连续优化算法,ACO天然适配决策变量为整数序列、约束强耦合、目标多峰的典型建模场景,如车辆路径规划(VRPTW)、设施选址分配和动态节点调度。它不追求理论最优,而以可解释的机制实现快速收敛与工程鲁棒性,特别契合数学建模竞赛中时间紧、约束严、结果导向的实战需求。本文聚焦ACO在真实赛题中的落地逻辑,涵盖问题识别、图结构建模、参数协同设计及硬约束

weixin_34417183的博客 639

电子元件及其规格书的查找与理解

本内容收录:在电子开发或维修过程中,查找电子元件及其规格书心得体会,以及元件规格书的理解,系个人多年实战经验的系统梳理。内容着重介绍贴片元件代码反查型号的实用技巧,并以三款典型疑难元件为例,详述其完整查找过程与最终型号确认。

让你爱上电路设计 3985

管好 SAP Fiori Launchpad Content:技术目录、业务目录与 KPI 工具的完整治理思路

SAP Fiori Launchpad 作为企业级统一入口,需通过技术目录(源对象)和业务目录(引用编排)分层治理。技术目录由 Launchpad App Manager 维护,负责应用描述对象(Tile 和 Target Mapping)的创建与管理;业务目录由 Launchpad Content Manager 编排,通过引用技术目录对象实现灵活配置。分析型内容则通过 F2814 统一管理。这种分层设计支持应用复用,便于升级维护,是 SAP S/4HANA 项目中实现高效内容治理的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 129

一文带大家理解对比学习:原理、框架与应用

本文系统解析了对比学习的原理、框架与应用。通过正负样本构造和InfoNCE损失函数,介绍了SimCLR、MoCo、SupCon等经典框架,以及图像分类、跨模态检索等应用场景。文章采用"直觉→数学→框架→案例→实践"的学习路线,详细阐述了对比学习的核心概念、训练流程和关键技术点,包括数据增强策略、温度系数调节、alignment与uniformity的平衡等。最后提供了代码实现示例、实验设计方法和常见问题解答,为读者构建了完整的对比学习知识体系。

m0_69395553的博客 614

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 58
上一篇: 动手学深度学习 softmax:RuntimeError: An attempt has been made to start a new process before the current
下一篇: Leetcode刷题:二分查找
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值