首页 > 其他分享 >增强 softmax 函数的稳定性

增强 softmax 函数的稳定性

时间:2024-09-05 22:14:17浏览次数:9  
标签:指数函数 函数 最大值 稳定性 Softmax exp softmax

概述

oftmax函数的表达式 $ \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} $,但在计算机的运算上有一定的缺陷。这个缺陷就是溢出问题。
softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e^{10} 的值会超过20000,
e^{100} 会变成一个后面有40多个0的超大值, e^{1000} 的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况。

计算机处理“数”时,数值必须在4字节或8字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此,会出现超大值无法表示的问题。这个问题称为溢出,在进行计算机的运算时必须(常常)注意。

数学原理

首先,在上式中分子和分母上都乘上C这个任意的常数(因为同时对分母和分子乘以相同的常数,所以计算结果不变)​。然后,把这个C移动到指数函数(exp)中,记为log C。最后,把log C替换为另一个符号C'。所以,在进行softmax的指数函数的运算时,加上(或者减去)某个常数并不会改变运算的结果。这里的C'可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。

python 代码

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c) # 溢出对策
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

为什么要用 e^x 的形式修改 x 的值?

在神经网络中,Softmax函数经常被用作最后一层的激活函数,尤其是在多类分类问题中。Softmax函数将每个神经元的输出转化为一个概率分布的一部分,使得这些概率值加起来总是等于1。
使用 (e^x) 的原因包括:

  1. 概率解释:(e^x) 将任何实数转换成正数,这对于表示概率是必要的,因为概率值必须是非负的。

  2. 归一化:通过除以所有 (e^{z_j}) 的和,确保了输出的概率分布是归一化的,即所有输出的概率值相加等于1。

  3. 非线性映射:指数函数是非线性的,这使得Softmax函数能够提供一个非线性的映射,这对于复杂的分类任务至关重要。

  4. 数值稳定性:直接计算 (e^x) 可能会导致数值上的不稳定,特别是当 (x) 很大时。为了避免这种情况,通常会从每一个 (x_i) 中减去最大值 (x_{\text{max}})(即 (x_i - x_{\text{max}})),这样可以防止在计算过程中出现过大的指数值,从而避免了溢出。

  5. 最大值增强:指数函数有一个属性,就是它可以放大最大值与其他值之间的差距。这意味着在Softmax函数的输出中,最大值对应的类别的概率会显著高于其他类别,这有助于模型更清晰地区分不同的类别。

综上所述,使用 (e^x) 的形式是基于其能够提供概率解释、归一化输出、非线性映射以及数值稳定性的优点。这些特点共同使得Softmax函数成为多类分类任务中非常有效的工具。

标签:指数函数,函数,最大值,稳定性,Softmax,exp,softmax
From: https://www.cnblogs.com/litifeng/p/18399317

相关文章

  • chatgpt生成的所有分析函数,感觉很好.
      好的,我会列出Hive的主要分析函数,然后创建一个表并插入10条数据来演示这些函数的效果。Hive的主要分析函数:ROW_NUMBER()RANK()DENSE_RANK()CUME_DIST()PERCENT_RANK()NTILE()LAG()LEAD()FIRST_VALUE()LAST_VALUE()现在,让我们创建一个表并插入数据: --创建......
  • 构造函数的深浅拷贝问题详解
     构造函数的分类构造函数重载:构造函数可以通过不同的参数列表进行重载,这意味着可以有多个构造函数,每个构造函数有不同的参数。多参构造函数:通过传递多个参数来创建对象。无参(缺省)构造函数:不需要参数来创建对象。类型转换构造函数:使用不同类型的参数来创建对象。拷贝构造函数:......
  • hive日期函数的使用
    hive日期函数的使用hive日期函数如下:current_datecurrent_timestampdate_formatdate_adddate_subdatediffdaydayofmonthdayofweekfloor_dayfloor_hourfloor_minutefloor_monthfloor_quarterfloor_secondfloor_week......
  • 终于使用c++、结构体,函数实现简单数组元素的插入
    includeusingnamespacestd;//定义结构体structMyArray{intarr[100];//数组,假设最大长度为100intn;//数组当前元素数量};//输入函数voidscanf(MyArray&myArray,int&x,int&y){cin>>myArray.n;for(inti=0;i<myArray.n;i++){cin>>my......
  • 深度解析C++中函数重载与引用
    ......
  • 基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
    作者:计缘LLMChat应用大家应该都不陌生,这类应用也逐渐称为了我们日常的得力助手,如果只是个人使用,那么目前市面上有很多方案可以快速的构建出一个LLMChat应用,但是如果要用在企业生产级别的项目中,那对整体部署架构,使用组件的性能,健壮性,扩展性要求还是比较高的。本文带大家了解一......
  • send发送完成后测试select函数,每次都要等带20ms 实际数据在2ms内已经返回
    在发送完成后加入该函数  tcdrain(ctx->s); 使用该函数将会增加发送的时间,但是接收的时间会缩短,并未真正改善。Modbusslave工具基本上要等待40ms后才能返回,但是modbusascii返回的快一些,工具存在bug使用真实从站效果好一些      if(msg_type==1)p_......
  • PLC结构化文本(ST)——构造函数(FB_init)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——构造函数(FB_init)构造函数的作用简单来说,构造函数是一种方法,用来初始化类的实例也就是对象。类在创建时会有一个默认的构造函数,如果自定义一个构造函数,那么默认构造函数失效。与高级语言的区别高级语言C#......
  • MySQL(四)日期函数 NULL函数 字符串函数
    日期函数函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()提取日期或日期/时间表达式的日期部分EXTRACT()返回日期/时间的单独部分DATE_ADD()向日期添加指定的时间间隔DATE_SUB()从日期减去指定的时间......
  • C++ 模板(函数模板)
    模板模板介绍C++提供了函数模板(functiontemplate)。所谓函数模板。实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡事函数体相同的函数都可以使用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调......