- 什么是激活函数?
- 为什么要用激活函数?
- 有哪些激活函数?(Sigmoid、Tanh ---双曲正切、ReLu ---修正线性单元、Softmax等)
- 如何选择激活函数?
1.什么是激活函数
所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到网络中。
如上图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。
2.为什么要用激活函数
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
3.有哪些激活函数
ReLU函数
ReLU又叫 “ 修正线性单元 ”,或者 “ 线性整流函数 ” 。函数表达式及图像如下所示。
代码示例:
CLASS torch.nn.ReLU(inplace=False)
用法举例:
>>> m = nn.ReLU()
>>> input = torch.randn(2)
>>> output = m(input)
inplace:默认值为False。表示在不在原来的位置上进行替换。若取True,则表示在原来的位置上进行替换;若为False,则表示不在原来的位置上进行替换,可以保留输入的数据。
举例说明inplace参数,如下所示。
优点:
(1)收敛速度快,并且在正值区域(x > 0 )可以对抗梯度消失问题。
(2)相比于 sigmoid函数,时间和空间复杂度更低;不涉及成本更高的指数运算。
缺点:
(1)不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,因此只存在正向梯度。
(2)负值区域(x < 0 )存在梯度消失问题。如果 x < 0,则神经元保持非激活状态,且在反向传播过程中「杀死」梯度。这样权重无法得到更新,网络无法学习。
Sigmoid函数
Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间。函数表达式及对应的图像如下所示。
代码示例:
CLASS torch.nn.Sigmoid(*args, **kwargs)
用法举例:
>>> m = nn.Sigmoid()
>>> input = torch.randn(2)
>>> output = m(input)
优点:
Sigmoid函数的优点在于它可导,并且值域在0到1之间,使得神经元的输出标准化。
缺点:
(1)梯度消失:Sigmoid 函数值在趋近 0 和 1 的时候函数值会变得平坦,梯度趋近于 0。
(2)不以零为中心:sigmoid函数的输出恒为正值,不是以零为中心的,这会导致权值更新时只能朝一个方向更新,从而影响收敛速度。
(3)计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂。
(4)梯度爆炸:x值在趋近0的左右两边时,会造成梯度爆炸情况。
Tanh函数
Tanh 激活函数又叫作双曲正切激活函数。与 Sigmoid 函数类似,但Tanh函数将其压缩至-1 到 1 的区间内。函数表达式及对应的图像如下所示。
优点:输出值以 0 为中心,解决了sigmoid函数输出值只为正,梯度只向一个方向更新的问题。
缺点:依然存在sigmoid中梯度消失和爆炸的问题和指数运算计算量大的问题。
Softmax函数
Softmax函数比较适合作为多分类模型的激活函数,一般会与交叉熵损失函数相配。
将Softmax函数应用于n维输入张量,重新缩放它们,使得n维输出张量的元素位于 [0,1] 的范围内,并且总和为1(概率之和为1)。函数表达式如下所示。
计算 Softmax
想象一下,我们有一个包含三个实数的数组。这些值通常可以是机器学习模型(例如神经网络)的输出。我们想将这些值转换为概率分布。
首先我们可以计算输入数组的每个元素的指数。这是 softmax 方程上半部分。
这些值看起来不像概率。注意在输入元素中,虽然8只比5大一点,但由于指数的影响,2981比148.4大很多。我们可以通过对所有三个指数项求和来获得归一化项,即 softmax 方程的下半部分:
我们看到归一化项一直由 z1 主导。
最后,除以归一化项,我们得到三个元素中每一个的 softmax 输出。请注意,没有单个输出值,因为 softmax 将数组转换为相同长度的数组,在本例中为 3。
从计算结果,我们可以看出有三个输出值,而且都是有效的概率,即它们位于 0 和 1 之间,并且它们的总和为 1。
还要注意,由于指数运算,第一个元素 8 主导了 softmax 函数,并将 5 和 0 挤出为非常低的概率值。
如果在机器学习模型中使用 softmax 函数,在将其解释为真实概率之前应该小心,因为它倾向于产生非常接近 0 或 1 的值。如果神经网络的输出为 [8, 5, 0],就像在这个例子中一样,那么 softmax 函数会将 95% 的概率分配给第一类,而实际上神经网络的预测可能会有更多的不确定性。这可能给人的印象是神经网络预测具有很高的置信度,而事实并非如此。
对于上面的例子,我们使用程序进行验证,如下。
代码示例:
# CLASS torch.nn.Softmax(dim=None) # 用法示例
import torch
from torch import nn
m = nn.Softmax(dim=1)
input = torch.tensor([[8, 5, 0]], dtype=float)
output = m(input)
print(output)
结果为:
tensor([[9.5227e-01, 4.7411e-02, 3.1945e-04]], dtype=torch.float64)
经对比,程序运行结果与理论结果一致。
注: Softmax函数的输出结果是0到1之间的概率值,对应着输入数据属于某个类别的概率,因此适合于多分类模型。通常,Softmax函数只应用于输出层。
4.如何选择激活函数
激活函数种类繁多而且各有优缺点,那么,在神经网络中,应该选择哪个函数作为激活函数呢?
首先要建立一个观念:不存在普遍适用各种神经网络的万能的激活函数。在选择激活函数的时候,要考虑很多条件限制:
- 如果函数可导,求导数的计算难度如何?
- 网络的收敛速度如何?
- 函数光滑程度如何?
- 是否满足通用的逼近定理条件?
- 输出是否保持标准化?
等等,不一而足。
所以,要结合具体问题以及激活函数的特点,恰当地选择。下面是一些经验,供参考:
- Sigmoid函数比较适合于二分类模型。
- 使用Sigmoid函数和tanh函数,要注意梯度消失问题。
- ReLU函数是应用比较广泛的激活函数,可以作为你的默认选项。
- 如果网络中存在大量未激活神经元,可以考虑leaky ReLU函数。
- ReLU函数应该只用于隐藏层。
- 如果是回归模型,在输出层上可以使用线性激活函数。
参考自:
非线性激活函数( Activation Function) - 知乎
https://blog.csdn.net/zhuguiqin1/article/details/120401753