zl程序教程

您现在的位置是:首页 >  其它

当前栏目

激活函数整理

函数 整理 激活
2023-09-11 14:22:29 时间

1. 前言

这里主要首先要说下为什么在深度学习网络中需要加入激活函数?因为激活函数是网络中非线性的来源,去除了该部分之后网络就只剩下线性运算部分了,而且线性运算的组合叠加也是线性的,最后得到的结果模型也当然可以等价于单层的线性模型了,也为了能够适用于复杂的情况,所以需要在网络中引入非线性单元。
那么说到了激活函数那么就先从常见的sigmoid开始谈起吧。

2. sigmoid函数

首先,来看看sigmoid函数是怎么定义的

sigmoid(x)=11+ex s i g m o i d ( x ) = 1 1 + e − x

其表示的实际函数曲线是这样的
这里写图片描述
从上图中可以看出:sigmoid函数的输出被限制在(0,1)之间,单调连续,并且根据其定义其求导容易;但是该损失函数由于其软饱和性,容易产生梯度消失,导致训练出现问题,并且其输出并不是以0为中心的。

3. tanh函数

tanh函数和sigmoid函数比较类似,其函数定义为

tanh(x)=2sigmoid(2x)1=21+e(2x)1=exexex+ex t a n h ( x ) = 2 s i g m o i d ( 2 x ) − 1 = 2 1 + e ( − 2 x ) − 1 = e x − e − x e x + e − x

其函数曲线为:
这里写图片描述
从上面的曲线中可以看出函数的取值范围为[-1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。Tanh的梯度相比较Sigmoid更加陡峭。我们选择Sigmoid还是Tanh是根据问题中对梯度的要求而定的。

4. Softmax函数

Softmax是另一种Sigmoid函数,但是它是在分类中比较容易控制的一种激活函数。Sigmoid只能处理两类的问题。Softmax将输出结果压缩在0-1之间,并依据输出的总和来分类。它给输入的概率一个概率。Softmax形式如下:
假设我们的一个输出结果是[1.2,0.9,0.75],当我们使用了softmax之后,这个值变成了[0.42, 0.31, 0.27],我们可以使用这些概率当做每一类的概率。
Softmax在输出层中使用是比较完美的,这里我们通常是需要获得输入数据对应的类别的各种概率。
笼统解释:二分类情况一般使用sigmoid激活,多分类情形一般使用softmax进行激活。

5. relu函数

说到relu函数一般是说的其一般表达式:

relu(x)=max(x,0) r e l u ( x ) = m a x ( x , 0 )

其函数图像也很简单了,大于0的分布就是一条直线,小于0的分布那就是 y=0 y = 0 的水平直线。
这里写图片描述
relu函数在最近的几年中是最广泛使用的激活函数原因首先是它是非线性的,也就意味着反向传播算法可用。而ReLu一个非常好的特性是它不会同时激活所有的神经元。这是什么意思呢?从上面的图中我们可以看到ReLU的图形,在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。
在进行反向传播的时候,输入值小于0对应的神经元是不会被更新的,相当于是死的,不会被激活。
通过上面的图像可以看到relu函数在输入小于0的时候,对应的神经元是不能被激活的。为了解决该问题,提出了relu这一族的函数,其大体思想可以使用下面的函数进行概括:
f(x)={x,ax,x > 0x<= 0 f ( x ) = { x , x > 0 a x , x<= 0

6. swish函数

该函数是Google大脑团队提出了一个新的激活函数。其函数定义式为:

swish(x)=xsigmoid(x)=x1+ex s w i s h ( x ) = x ⋅ s i g m o i d ( x ) = x 1 + e − x

其函数图像为:
这里写图片描述
团队的测试结果表明该函数在很多模型都优于ReLu。
从图像上来看,Swish函数跟ReLu差不多,唯一区别较大的是接近于0的负半轴区域。其实这个激活函数跟facebook提出的GLU激活函数是类似的。

7. 激活函数选择的一些指导

讲了如上的激活函数,在实际的运用过程中如何使用?并没有特定的规则。但是根据这些函数的特征,可以总结一个比较好的使用规律或者使用经验,使得网络可以更加容易且更快的收敛。
1. Sigmoid函数以及它们的联合通常在分类器的中有更好的效果
2. 由于梯度崩塌的问题,在某些时候需要避免使用Sigmoid和Tanh激活函数
3. ReLU函数是一种常见的激活函数,在目前使用是最多的
4. 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数
5. 记住,ReLU永远只在隐藏层中使用
6. 根据经验,我们一般可以从ReLU激活函数开始,但是如果ReLU不能很好的解决问题,再去尝试其他的激活函数
7. 如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout.

8. 参考

  1. The Activation Function in Deep Learning 浅谈深度学习中的激活函数
  2. 深度学习基础——激活函数以及什么时候该使用激活函数
  3. 常用激活函数比较