softmax数值不稳定问题及解决办法

计算机用有限位模式表示实数会引入近似误差,可能导致算法实效。介绍了下溢(接近零的数四舍五入为零)和上溢(大量级的数近似为无穷)的概念,以softmax函数为例说明上溢和下溢问题,并给出解决方法,即softmax(z)=softmax(z−maxizi)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上溢和下溢
计算机通过有限数量的位模式来表示无限多的实数,总会引入一些近似误差。如果涉及时没有考虑最小化舍入误差的累积,在实践时可能会导致算法实效。

下溢:当接近零的数被四舍五入为零时发生下溢。

许多函数在其参数为零而不是一个很小的正数时会表现出质的不同:

避免零除
避免取0的对数
上溢:大量级的数被近似为无穷时发生上溢。

必须对上溢和下溢进行数值稳定的一个例子是softmax函数

softmax(x)i=exp(xi)∑nj=1exp(xj)
softmax(x)i=exp(xi)∑j=1nexp(xj)
问题:假设所有的x_i都等于某个常数c,理论上对所有x_i上式结果为1/n。

如果 c 是很小的负数,exp(c)就会下溢,softmax分母会变成0,最后的结果将为NaN
如果 c 量级很大,exp(c)上溢,导致最后的结果将为NaN
方法:

softmax(z)=softmax(z−maxizi)
softmax(z)=softmax(z−maxizi)
减去最大值导致exp最大为0,排除了上溢的可能性
同样,分母中至少有一个值为1的项(exp(0)=1),从而也排除了因分母=下溢导致被零除的可能性
还需注意分子可能发生下溢,会导致计算 log softmax(x)时得到负无穷。

原帖地址:https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2softmax%E5%87%BD%E6%95%B0%E4%B8%8A%E6%BA%A2%E5%87%BAoverflow%E5%92%8C%E4%B8%8B%E6%BA%A2%E5%87%BAunderflow/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值