非线性激活函数(Activation Function)

  1. 什么是激活函数?
  2. 为什么要用激活函数?
  3. 有哪些激活函数?(Sigmoid、Tanh ---双曲正切、ReLu ---修正线性单元、Softmax等)
  4. 如何选择激活函数?

1.什么是激活函数

        所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到网络中。

                

        如上图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。

2.为什么要用激活函数

        如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

3.有哪些激活函数
ReLU函数

ReLU又叫 “ 修正线性单元 ”,或者 “ 线性整流函数 ” 。函数表达式及图像如下所示。

 

../_images/ReLU.png

 代码示例:

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之间。函数表达式及对应的图像如下所示。

  ​​​​

../_images/Sigmoid.png

 代码示例:

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 的区间内。函数表达式及对应的图像如下所示。

../_images/Tanh.png

优点:输出值以 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值