如何解决sigmoid函数饱和区问题

1、sigmoid函数及其应用


图1:sigmoid 函数

        如图1为sigmoid函数,它是神经网络中的一种激活函数,可以将输出限制在(0,1)范围内。目前我能想到的sigmoid函数在神经网络中的两种应用是:
a、 作为神经网络中间层的一个激活函数,对于这种应用而言,sigmoid函数有两个特性是重要的,一是输出在(0,1)之间,二是非线性;
b、 对于回归任务,在网络的最后一层将数据框定在(0,1)之间,对于这种应用而言,似乎更关注于sigmoid函数的输出在(0,1)之间这个特性,而其非线性特性就显得不那么必要;

2、sigmoid函数饱和区带来的问题

        所谓sigmoid函数的饱和区,是指图1中左下角和右上角的平缓区域。相对于第1小节提到的sigmoid函数的两种应用,饱和区(平缓区域)会带来以下问题:
a、 梯度消失问题(平缓区梯度几乎为0),这个问题对于sigmoid函数的两种应用都是存在的;
b、 对于输入x,输出y的区分度不高,这个问题主要针对第二种应用;

3、如何解决sigmoid函数饱和区问题

        针对第2小节提出的a问题,一种解决方法是在sigmoid层之前引入Batch Normalization层。批规范化(Batch Normalization,BN)方法(实现见图2),就是对每个神经元的输出规范化,即均值为 0,方差为 1,之后再进入激活函数。每一层规范化后,输出就以极大的概率落在靠近中心的区间,如 [-1, 1],这时sigmoid函数的梯度变化很大,也就解决了梯度消失的问题。

        但是这样做又有一个缺点,可以看到图1中sigmoid 函数[-1, 1] 这段区间近似直线,也就是激活函数变成了线性的,所以整个网络绝大多数就都是线性表达,降低了神经网络的表达能力。所以BN的作者又再次引入了两个变量(图2最后一行中的 γ \gamma γ β \beta β),对规范化后的神经元输出做了一次线性映射,参数也是可以学习的,使得最终输出落在非线性区间的概率大一些。这样就在 sigmoid 函数梯度小和线性表达之间做了一个平衡,使得神经网络有了非线性变换,保证了其学习能力,也使梯度比较大,加快了训练速度。


图2:Batch Normalization 具体实现

        针对第2小节提出的b问题,我们可以将激活函数由sigmoid更换为下图的函数(自己想的,暂且叫做similar-ReLU吧)。简单的解释下这个函数,输入小于0的,强制为0,输入大于1的,强制为1,输入位于(0,1)之间的,输出不变。这样就使得输出在(0,1)之间的值有了区分度。


图3:similar-ReLU 函数
### Sigmoid函数在分类问题中的作用和用法 #### 1. Sigmoid函数的定义及其性质 Sigmoid函数是一个平滑的非线性函数,其表达式为 $\sigma(x) = \frac{1}{1 + e^{-x}}$[^3]。该函数具有以下重要特性: - 输出范围严格位于 (0, 1),因此可以直接将其视为概率估计。 - 它是非线性的,能够引入模型复杂度并增强神经网络的学习能力。 - 导数形式简单且易于计算,具体为 $\sigma'(x) = \sigma(x)(1 - \sigma(x))$[^1]。 这些特点使它成为解决二分类问题的理想选择之一。 --- #### 2. Sigmoid函数在逻辑回归中的应用 逻辑回归是一种经典的监督学习算法,主要用于处理二分类问题。通过将输入特征 $X$ 映射到一个连续的概率值 $P(Y=1|X)$,逻辑回归利用了Sigmoid函数作为核心组件[^2]。 假设有一个线性组合 $z = w^T X + b$,其中 $w$ 是权重向量,$b$ 是偏置项,则预测输出可以通过下式得到: $$ P(Y=1|X) = \sigma(z) $$ 这里,$\sigma(z)$ 将任意实数值转换成介于 0 到 1 的概率值。如果阈值设定为 0.5,则可以根据输出判断类别归属:当 $\sigma(z) > 0.5$ 时属于正类;反之则属于负类。 --- #### 3. 实现示例 以下是基于Python的一个简单的Sigmoid函数实现以及如何用于逻辑回归的例子: ```python import numpy as np def sigmoid(x): """ 计算Sigmoid函数 """ return 1 / (1 + np.exp(-x)) # 测试数据 input_data = np.array([[-2], [-1], [0], [1], [2]]) # 应用Sigmoid函数 output_probabilities = sigmoid(input_data) print(output_probabilities) ``` 上述代码展示了如何使用Sigmoid函数来变换输入数据至概率空间。 --- #### 4. Sigmoid函数的优势与局限性 尽管Sigmoid函数非常适合某些场景下的分类任务,但它也存在一些缺点需要注意: - **梯度消失问题**:对于较大的正值或较小的负值输入,Sigmoid函数接近饱和域 ($\approx 0$ 或者 $\approx 1$),此时导数几乎为零[$^{1}$],从而可能导致训练过程中的梯度更新缓慢甚至停滞。 - **不对称中心化**:由于输出始终大于零小于一,可能会影响后续层参数优化效率。 然而,在浅层模型或者特定应用场景里(比如传统统计方法),这些问题通常不会显著影响性能表现。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值