sigmoid函数的数值稳定性

本文深入探讨了Sigmoid函数在深度学习中的应用及其数值稳定性问题,特别是针对1-f(x)时出现的不稳定现象,并提出了两种解决方案。

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

在深度学习中,我们常常选用sigmoid函数作为激活函数。sigmoid函数的具体形式如下:

f(x)=11+ex

曲线表示为:




再画大一点,取x区间更大一些,则为:

这里写图片描述

显然从图像上看,sigmoid函数是数值稳定的,即对于更大范围的x,y的取值是连续的,有效的。

从理论上看,

limx+f(x)=1;limxf(x)=0

且中间数值可以从数学上证明是稳定的。
但我们考虑1-f(x)呢?
1f(x)=ex1+ex

我们用matlab绘制其曲线:


这里写图片描述

我们发现这时,当x趋向负无穷,甚至仅仅x趋向-800,此时1-f(x)就不再稳定了,在matlab的值变成了NAN了

其实我们发现,对于 1- f(x),显然当x趋向正无穷时,还是稳定的,此时:
分子: ex0 ,而分母: 1+ex1 ,

显然 01 ,结果趋向0.

但是当x趋向负无穷时,此时,
分子: ex+ ,而分母: 1+ex+ ,
此时:
ex1+ex 就会变得不稳定,尽管理论上趋向1。
因此就出现了以上的图像。

那么如何解决这种不稳定问题的解呢?

其实有两种办法:

(一)先计算稳定的f(x),结果赋予y,再计算1-y .

乍看从数学上,好像完全一致,但是在数值解上不等价。 y=f(x)是稳定的,因此对于1-f(x)=1-y也变成了稳定的解。

我们从图像上证明:


这里写图片描述

此时就正确了,与理论解完全一致。

(二)直接从1-f(x)着手
这里我们从caffe的sigmoid_cross_entropy_loss_layer.cpp得到启发。

主要办法就是对于

1f(x)=ex1+ex

分别考虑正负x.

x0 时,维持上式不变;
x<0 时,分子分母同时乘以 ex ,则有:

ex1+ex=ex1+ex11+exx0x<0

此时绘制曲线为:


这里写图片描述

因此在实际coding中,我们需要考虑计算的稳定性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值