ReLU 激活函数中神经元死亡问题

简介: ReLU 激活函数中神经元死亡问题

最近在看 MobileNetV3 的结构特征,又碰到了新的激活函数,查看了其与 ReLU 的联系,联想到之前看到过的 ReLU 的问题,写了这篇文章

ReLU 激活函数可以算作是深度学习领域的 GOAT 了,虽然现在出现了很多变种和发展,但是综合使用范围和效果,其当之无愧。ReLU 之所以能获得广泛认可和应用,离不开自身的特性(图我就不画了)。

  1. 单侧抑制。当输入小于 0 时,神经元处于抑制状态,也就是输出为 0。
  2. 宽阔的激活边界。当输入大于 0 时,神经元全部出于激活状态,激活值取值边界无穷大,无饱和区。
  1. Sigmoid 存在梯度小时问题,就是因为当出于饱和区时,导数趋近于 0,更新缓慢,拖累收敛。
  2. 另一方面,Sigmoid 这类激活函数的导数绝对值小于 1,链式法则的情况下在连乘的时候很容易迅速变小为接近于 0,也是导致梯度消失的原因。
  1. 稀疏性。相比于 Sigmoid 之类的激活函数,稀疏性是 ReLU 的优势。Sigmoid 把抑制区设置为一个极小值,但是不为 0,因此要参与运算,而 ReLU 的抑制区的结果直接为 0,不参与后续计算,简单粗暴的造成网络稀疏性,而且计算十分简单。
  1. 稀疏性和单侧抑制有很多生物神经学上的解释,对于大多数深度学习从业者而言,其计算简单和对网络稀疏性(防止过拟合)的优点才是真正关注的。

ReLU 凭借上述优点获得了无数青睐,但是也不能忽视其存在的不足,甚至一些不足就是由于其自身特性带来的。比如最常见的 ReLU Dying 问题。

ReLU Dying 问题是指当出现异常输入时,在反向传播中会产生大的梯度,这种大的梯度会导致神经元死亡和梯度消失。等等,ReLU 不就是为了解决梯度消失的问题吗?我们提取这里的关键词,异常输入,大梯度,神经元死亡,一一解释。


1687688056450.png


上图是一个典型的神经元。

现在假设,这个神经元已经经过若干次迭代,其参数 w\mathbf{w}wbbb 已经迭代得趋于稳定。现在,神经元接收到了一个异常输入 x\mathbf{x}x。比方说,它的某一维特征 xix_ixi 与对应的权重 wiw_iwi 的乘积 wixiw_i x_iwixi 非常大。一般来说,这意味着 xix_ixi 的绝对值非常大。于是,ReLU 的输入就会很大,对应 ReLU 的输出 yyy 也就会很大。好了,假设这个 ReLU 神经元期望的输出(ground truth)是 y^\hat{y}y^,这个时候损失就会很大——损失一般是 ∣y−y^∣|y - \hat{y}|yy^ 的增函数,记为 f(∣y−y^∣)f(|y - \hat{y}|)f(yy^)

于是,在反向传播过程中,传递到 ReLU 的输入时的梯度就是 g=f(∣y−y^∣)g=f(|y - \hat{y}|)g=f(yy^)。考虑对于偏置 bbb 有更新:

b=b−α⋅gb = b - \alpha \cdot gb=bαg

其中,α\alphaα 是学习率。

考虑到大梯度ggg是一个很大的正数,于是 b bb 可能被更新为一个很小的负数。此后,对于常规输入来说,ReLU 的输入大概率是个负数。这也就是说,ReLU 大概率是关闭的。这时,梯度无法经 ReLU 反向传播至 ReLU 的输入函数。也就是说,这个神经元的参数再也不会更新了。这就是所谓的神经元死亡

如此看来,尽管 ReLU 解决了因激活函数导数的绝对值小于 1,在反向传播连乘的过程中迅速变小消失至 0 的问题,但由于它在输入为负的区段导数恒为零,而使得它对异常值特别敏感。这种异常值可能会使 ReLU 永久关闭,而杀死神经元。

由此可见,神经网络中的梯度消失问题是个多元化的问题,不仅仅局限于由于激活函数导数连乘导致的梯度消失。

话说回来,很多激活函数比如 LeakyReLU 把小于 0 的输入的输出不设为 0,从而缓解这个问题,其实现在这个问题已经被 BN 解决了。回到上述我们分析的原因,导致 ReLU Dying 的前提是异常输入,如果 Conv-BN-ReLU 这种结构,由于 BN 的归一化操作,异常输入基本不存在了,所以这个问题也被解决了,这也是目前 ReLU 仍然流行使用的原因。


总结和思考


ReLU作为深度学习领域的"GOAT",优点包括单侧抑制、宽阔的激活边界和稀疏性。但它也存在不足,最常见的是ReLU Dying问题。这个问题是指当出现异常输入时,在反向传播中会产生大的梯度,这种大的梯度会导致神经元死亡和梯度消失。因此,需要根据具体问题选择适当的激活函数。

目录
相关文章
|
8月前
|
机器学习/深度学习 测试技术 Python
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
889 0
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
|
3月前
|
机器学习/深度学习 编解码
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
本文介绍了九种常用的神经网络激活函数:Sigmoid、tanh、ReLU、ReLU6、Leaky ReLU、ELU、Swish、Mish和Softmax,包括它们的定义、图像、优缺点以及在深度学习中的应用和代码实现。
297 0
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
|
3月前
|
机器学习/深度学习 资源调度 自然语言处理
Softmax激活函数介绍
【10月更文挑战第2天】
174 0
|
3月前
|
机器学习/深度学习 数据可视化 算法
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
WK
|
4月前
|
机器学习/深度学习
在神经网络的反向传播中,Tanh和Sigmoid哪个更快
在神经网络反向传播中,Tanh与Sigmoid函数的速度差异并无定论,受网络结构、数据特性及参数设置影响。Sigmoid在远离零时易导致梯度消失,而Tanh因输出范围为(-1, 1)且以0为中心,能更好地缓解此问题,理论上训练速度更快。两者计算复杂度相近,现代硬件优化使这一差距不明显。实际应用中,Sigmoid常用于二分类输出层,Tanh则适用于隐藏层以加速收敛并减少权重更新偏向。随着深度学习发展,ReLU等新激活函数因高效性和轻度梯度消失问题成为主流选择。综合来看,Tanh可能比Sigmoid稍快,但需根据具体任务和网络结构选择。
WK
105 0
|
6月前
|
机器学习/深度学习
激活函数
【7月更文挑战第24天】激活函数
61 3
|
5月前
|
机器学习/深度学习
Softmax 和 ReLU 函数的效用
【8月更文挑战第23天】
359 0
|
7月前
|
机器学习/深度学习
激活函数:神经网络的生命之花
激活函数:神经网络的生命之花
激活函数:神经网络的生命之花
|
8月前
|
机器学习/深度学习 人工智能 算法
神经网络中的神经元和激活函数介绍
神经网络中的神经元和激活函数介绍
122 0
|
机器学习/深度学习
深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数
池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过池化某一片区域的像素点来得到总体统计特征会显得很有用。由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。
508 1
深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数