我刚开始学习深度学习的时候,看到了这么一段话:
作者把非线性激活函数(ReLU)用在了模型里,发现训练速度显著提高,原因在于
传统用的是饱和非线性激活函数,例如tanh,训练时如果进入到饱和区域,那么会因为梯度变化过小而难以训练;而ReLU是一种非饱和非线性激活函数,接受阈是0~∞∞,不存在tanh的问题。
来源:经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)_alexnet论文-CSDN博客
初学的我有很多疑问:
1、什么是激活函数?有什么用?
2、常见的激活函数有什么
3、什么是线性激活函数?什么是饱和激活函数?
4、什么是梯度消失问题?
5、为什么使用Relu能克服梯度消失问题?
以下是我能理解的回答:
一、什么是激活函数?
激活函数是神经网络中的一个重要组件,它决定了每个神经元的输出。当一个神经元接收到输入信号后,会进行加权求和,然后通过激活函数进行处理,最终得到这个神经元的输出。
(类似圈出来的隐层部分,由输入层进行加权求和之后并不是马上进行下一轮运算,而是再经过一个激活函数决定给下一轮的值)
激活函数的作用主要有以下几点:
1、非线性化:激活函数就像是在给神经网络“增加脑筋”,让它不仅能处理简单的事情,还能理解复杂的问题。
2、归一化:有些激活函数会把输出值限制在一定范围内,比如把所有结果都压缩在0到1之间。这样可以让训练过程更平稳,不至于出现太大的波动,确保网络学得更稳定。
3、激励作用:激活函数决定了神经元是否“开工”工作。就像一个开关,控制着神经元是否把信号传递给下一层,影响到最终的结果。
二、常见的激活函数有什么
常见的激活函数有:
- ReLU(Rectified Linear Unit): 输出为输入值和0之间的较大值,公式为
f(x) = max(0, x)
,常用于深度神经网络,因为它计算简单且在实际应用中表现出色。
- Sigmoid: 将输入映射到0到1之间,公式为
f(x) = 1 / (1 + e^(-x))
,常用于输出层做二分类问题。 - Tanh(双曲正切函数): 将输入映射到-1到1之间,公式为
f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
,比 Sigmoid 在某些情况下表现更好。
- Softmax: 通常用于多分类问题的输出层,将输出值转化为概率分布,所有输出的和为1。
不同的激活函数在不同的任务中有不同的适用性,选择合适的激活函数是设计神经网络时的重要一步。
三、什么是线性激活函数?什么是饱和激活函数?
线性激活函数
线性激活函数是指输入与输出成线性关系的激活函数,通常表现为 f(x) = x
,即输出与输入相同。这意味着不管输入是什么值,输出都是它的原值,没有进行任何非线性变换。
- 优点: 计算简单,不会出现梯度消失问题(梯度消失后面再说)。
- 缺点: 没有引入非线性特性,导致整个神经网络只能表示线性关系,即使多层堆叠,仍然等价于单层线性变换。因此,使用线性激活函数的神经网络无法解决复杂的非线性问题。
饱和激活函数
饱和激活函数指的是当输入值足够大或足够小时,输出会趋向于某个固定值,并且不再随输入的变化而变化。这类函数通常具有“饱和”区间,即输入过大或过小时,输出不再变化。
例如tanh,可以看到当输入值趋近正无穷的时候,输出为1。
四、什么是梯度消失问题?
梯度消失问题发生在反向传播过程中,当神经网络的层数较多时,梯度(即损失函数对网络参数的导数)在从输出层向前传播到输入层的过程中逐渐变小,甚至接近于零。这样一来,前几层网络的权重更新会变得非常缓慢,甚至停止更新,从而导致模型难以学习深层次的特征。
这个问题主要出现在使用 Sigmoid 和 Tanh 等饱和激活函数的情况下,因为这些函数在输入非常大或非常小时,导数(梯度)接近于零。当这些梯度通过链式法则逐层相乘时,它们会进一步减小,导致梯度几乎消失。
五、为什么Relu能解决梯度消失问题?
ReLU(Rectified Linear Unit) 是一种非线性激活函数,定义为 f(x) = max(0, x)
。ReLU 的主要特点是:
- 非饱和性: 当输入为正数时,ReLU 的梯度始终为1,不会出现像 Sigmoid 和 Tanh 那样的梯度趋近于零的情况。这意味着在正值区间,梯度可以保持较大的值,从而避免梯度消失。
- 稀疏性: 当输入为负数时,ReLU 的输出为0,对应的梯度也是0。这会导致一部分神经元在训练过程中不会被激活,使得模型更加稀疏,提高了计算效率。
为什么 ReLU 可以克服梯度消失问题?
- 稳定的梯度: ReLU 的梯度在正值区间内是恒定的1,这使得反向传播过程中的梯度不容易随着层数增加而消失。
- 深层网络的有效训练: 因为 ReLU 不会饱和,梯度不会消失,所以可以有效训练深层网络,捕捉更多复杂的特征。