系列文章目录
参考文献
[1] 一文详解激活函数
[2] Softmax 函数和它的误解
[3] 各种激活函数
[4]
[5]
[6]
[7]
文章目录
前言
- 什么是激活函数(activation function):
就是人工神经网络中的神经元上运行的函数,负责将神经元的输入映射到输出端。一个节点的激活函数定义了该节点在给定输入或者输入集合下的输出。激活函数对于神经网络模型去学习、理解复杂和非线性的函数非常重要。将非线性特性引入到网络中。下图,输入inputs 通过加权求和之后,被作用在一个函数上,这个函数就是激活函数。
-
为什么使用激活函数,激活函数存在的意义。
如果不使用激活函数,每层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,没有激活函数的每层就相当于矩阵相乘。即使叠加若干层,还是矩阵相乘。引入激活函数,就是给神经元引入了非线性因素,从而神经网络可以逼近任何的非线性函数,此时,神经网络可以应用到众多的非线性模型中。
模型角度:线性模型的表达力不够,引入激活函数添加非线性因素;
数据角度:数据是线性不可分的,如果采用线性化,需要复杂的线性组合去逼近问题,因此需要非线性变换对数据分布进行重新映射。 -
激活函数为什么是非线性的
非线性的目的是增加神经网络模型的非线性因素,从而使网络更加强大,增加他的能力,可以表达更复杂的映射。 -
应用中,输出层可以使用线性激活函数,隐含层都使用非线性激活函数。
-
常见激活函数
-
1、sigmoid函数
sigmoid又是logistic函数,用于隐层神经元输出,取值范围是(0,1),用来进行二分类,表达式如下:
σ ( x ) = 1 1 + e − x ( ) \sigma(x)=\frac{1}{1+e^{-x}} \tag{} σ(x)=1+e−x1()- sigmoid函数的几何形状如下所示,
- 优点:
1、输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层;
2、连续函数,便于求导; - 缺点:
1、变量绝对值非常大的时候,会出现非常大的正/负值,会出现饱和现象,函数会变得很平,对微小的输入变化不敏感。反向传播时候,当梯度接近0时候,权重基本不会更新,很容易出现梯度消失的情况,从而无法完成深层网络的训练;
2、函数的输出不是0均值,会导致后续的神经元的输入是非0均值的信号,对梯度产生影响;
3、计算复杂度搞,因为sigmoid是指数形式;
- sigmoid函数的几何形状如下所示,
-
tanh函数:
tanh函数也称为双曲正切函数,取值范围是[-1,1],函数定义如下:
t a n h ( x ) = e x − e − x e x + e − x ( ) tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \tag{} tanh(x)=ex+e−xex−e−x()- 函数图像如下所示:
- tanh的sigmoid变形为:
t a n h ( x ) = 2 σ ( x ) − 1 tanh(x)=2\sigma(x)-1 tanh(x)=2σ(x)−1
tanh函数是0均值的,因此实际应用中tanh会比sigmoid更好。但是仍然存在梯度饱和和exp计算的问题。
- 函数图像如下所示:
-
Relu函数:
- 定义如下,
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x) - 图像如下所示,
- 优点:
1、使用Relu的SGD算法的收敛速度比sigmoid和tanh快;
2、在x>0区域,不会出现梯度饱和、梯度消失的问题;
3、计算复杂度低,不需要进行指数运算,只需要一个阈值就可以得到激活值。 - 缺点:
1、输出不是0均值的;
2、dead Relu 问题(神经元坏死问题)
在负数区域,被KILL的现象叫做dead relu,训练时候很脆弱。在x<0时,梯度为0.这个神经元及其之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应的参数永远不会被更新。
3、dead现象的原因:参数初始化问题,learning rate太高导致训练过程中参数更新过大;
4、解决方案:采用Xavier初始化方法,避免将learning rate设置太大或者使用adagrad自动调节learning rate的方法;
- 定义如下,
-
一、激活函数的选择
从较高层次说,建模的最终目标就是希望模型收敛,而模型收敛就需要梯度平稳传播。影响梯度平稳性的核心要素包括:
- 各层的参数;
- 各线性层接收到的数据;
- 激活函数;
由于各层参数本身的特殊性,只能设定参数初始值,一旦模型开始迭代,参数就开始不受控制的调整。
为了使各个线性层接收到的数据平稳,通常采用BN的归一化方法。
- 激活函数如果选择不当,将会引起梯度爆炸和梯度消失:tanh比sigmoid要好,且Relu更好。因为relu解决了tanh容易发生梯度爆炸的问题,且计算速度远远快于tanh。
- 结论:
- 训练深度学习模型尽量使用zero-centered数据和zero-centered输出;
- 如果使用relu,一定要小心设置learning rate,不要让网络出现dead神经元;
- 最好不要使用sigmoid,因为tanh比他好,不过预期效果会比relu和maxout差;
1.1 总结
激活函数快于分为2大类:
- 饱和激活函数:sigmoid、tanh;
- 非饱和激活函数:relu,leaky relu,ELU,PRELU;非饱和函数优点:能够解决梯度消失问题;其次,快于加快收敛速度。
二、softmax函数及其作用
softmax是一个数学函数,用于0-1之间的值进行归一化。
2.1 什么是softmax激活函数及其数学表达式
在深度学习中,使用softmax作为激活函数,对0-1之间的额向量中每个值的输出和尺度进行归一化。softmax用于分类向量,在网络的最后一层,生成N维向量,分类任务中每个类对应一个向量。softmax用于对0-1之间的那些加权和值进行归一化,并且他们的和等于1,这就是为什么大多数人认为这些值是类的概率,但是这是错误的。
实现softmax的函数公式:
P
(
y
=
j
∣
θ
(
i
)
)
=
e
θ
(
i
)
∑
j
=
0
k
e
θ
k
(
i
)
P(y=j|\theta^{(i)})=\frac{e^{\theta^{(i)}}}{\sum_{j=0}^ke^{\theta_k^{(i)}}}
P(y=j∣θ(i))=∑j=0keθk(i)eθ(i)
使用这个数学表达式,我们计算每类数据的贵一直,这里的
θ
(
i
)
\theta(i)
θ(i)是从展平层得到的输入。
计算每个类的归一化数值,分子是类的指数值,分母是所有类的指数值之和。使用softmax函数,我们得到0-1之间的所有值,所有值之和为1.如果将其视为概率,是一个误解。
2.2 如何使用softmax()函数
对每个类使用上述数学函数后,softmax会给每个类计算一个介于0-1之间的值,
现在每个类都有几个值,为了分类输入属于哪个类,softmax使用了argmax()给出了应用softmax后具有最大值的索引。
2.3 为什么softmax只用在神经网络的最后一层
softmax仅用于最后一层对值进行归一化,其他激活函数(relu,leaky relu, sigmoid和其他各种激活函数)用于内层。
但是在softmax函数中,坟墓中,取所有指数值的和来归一化所有类的值,因为他考虑了范围内的所有的类,这是我们在最后一层使用他们的原因,通过分析可以知道input属于哪个类
2.4 对softmax的误解
最大误解:通过归一化的输出是每个类的概率值,完全错误。这种误解是因为这些值的总和为1,但是他们只是归一化值而不是类的概率。
最后一层并不是单独使用softmax,log softmax效果更好,对来自softmax函数的归一化值进行对数。
log softmax在数值稳定性、更便宜的模型训练成本 和 penalizes large error(误差越大惩罚越大)方面是优于softmax的。
三、梯度爆炸和梯度消失
神经网络进行反向传播的过程中,各参数层的梯度计算会涉及到激活函数的导函数取值,具体来说,现在有三层神经网络,X输入,w是神经网络层,F(x)是激活函数,
反向传播更新w时,根据链式法则:
每一层参数在计算梯度的过程中需要相乘激活函数的导函数f(x),当神经网络的层数越多时,需要相乘的f(x)也就越多。
- 梯度爆炸:
当fx>1 - 梯度消失
fx接近0的时候
3.1 sigmoid的梯度更新问题
对sigmoid函数来说,简单的叠加容易出现梯度消失问题
上图可见:
- sigmoid函数的左右两端的区间为函数的饱和区间;两端的饱和区间,导数趋向于0,此时出现梯度消失
- sigmoid导函数最大值是0.25(在0点取到),当x较大或者较小时,导函数取值趋向于0;
3.2 tanh的梯度更新
tanh的激活函数和导函数性质如下图所示:
- 取值范围是(-1,1),导数范围是(0,1);
- 对于tanh来说,导函数的取值分布在0-1之间,一定程度可以避免梯度消失的情况,但是当前几层的梯度变量大于1时候,会造成梯度爆炸的情况。
- 作为sigmoid激活函数的额升级版,tanh激活函数除了能够在一定程度上规避梯度消失问题外,还可以生成zero-centered data零点对称数据,从而确保下一层能够接收到zero-centered data,这种数据分布式解决梯度消失和梯度爆炸问题的关键。