Press "Enter" to skip to content

人工智能学习教程笔记-10:激活函数总结

激活函数/激励函数总结

 

我们之前在神经网络三大基础问题中简单提到了激活函数,并举出了sigmoid的例子。当时我们只提出了激活函数的一个用途: 把结果映射到0~1之间方便我们预测概率 。这其实并不是激活函数最主要的用途,激活函数也远远不止sigmoid一种。

 

激活函数正如其名,将我们的神经网络进行激活!

 

:star:️为什幺需要激活函数

 

激活函数是 神经网络中非线性的来源 ,如果去掉激活函数,整个网络就只剩下线性运算,不管神经网络有多少层,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型。 :bulb:高中数学知识,低次套高次函数才能套出来高次,而只有高次才能拟合复杂的曲线。

 

神经网络的本质实就是 通过训练来得出一个函数来拟合函数图形 ,而神经网络的层数越多所能表示的曲线也就越复杂,理论上只要层数足够就可以拟合出任何复杂的曲线图形。

 

 

常见的激活函数

 

激活函数又称激励函数

 

Sigmoid函数

 

sigmoid函数也称为Logistic函数,因为Sigmoid函数可以从逻辑回归(LR)中推理得到,也是 逻辑回归模型指定的激活函数 。sigmoid对于二元分类问题,其值域(0,1)的特点恰好可以用来预测概率,所以我们可以在二分问题的输出层用sigmoid,其他层用其他激活函数。

 

sigmod函数的取值范围在(0, 1)之间,可以将网络的输出映射在这一范围,方便分析。

 

sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些缺点。

 

公式及图像

 

 

 

优点

平滑、易于求导(从图像也可以看出来)
非常适合二元分类问题。

缺点

激活函数 计算量大 ,对于规模比较大的深度网络耗时严重(在正向传播和反向传播中都包含幂运算和除法)。
:star:️Sigmoid的输出不是 0均值(zero-centered) (平均数为0.5), 这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布
深层网络的梯度消失问题 Sigmoid导数取值范围是[0, 0.25],由于神经网络反向传播时的“链式反应”,很容易就会出现 梯度消失 的情况。例如对于一个10层的网络, 根据 ,第10层的误差相对第一层卷积的参数 的梯度将是一个非常小的值,这就是所谓的“梯度消失”。 :warning: 学习速度与偏导数有关 :简单来说就是梯度下降是通过减去导数来下降的,如果导数太小,那幺相隔层数比较多后就出不来效果了。数学分析

Tanh函数

 

 

tanh函数可以说是sigmoid函数的升级版,各个方面都要比sigmoid优秀一点。sigmoid的平均值是0.5,而tanh的平均值则是0。将这些靠近0的输出值传递给下一层神经元的话,下一层神经元会工作地更加高效。

 

公式及图像

 

 

优点

相比于sigmoid函数,tanh的值域在(-1,1),解决了0均值的问题

缺点

幂运算耗时严重问题依然存在
tanh的导数范围在(0,1)之间,虽说相比于sigmoid的(0,0.25)大了一些,但仍然很小, 梯度消失 相对来说得到缓解,但没有解决。

ReLu函数

 

Relu(Rectified Linear Unit),修正线性单元函数。该函数形式比较简单,却很有特点,是适用最为广泛的激活函数之一。

 

Sigmoid和tanh的导数范围导致了 梯度消失 问题,而relu的导数恒为1,有效解决了链式反应中 梯度消失 问题,反向传播可以正常进行。

 

relu还有一个非常好的特性就是它对于负值输出为0(置为0就是屏蔽该特征),可以使得在同一时间内只有部分的神经元被激活,使得网络很稀疏,可以大大提高计算效率。 下面一段话我觉得说的很好:

 

描述该特征前,需要明确深度学习的目标:**深度学习是根据大批量样本数据,从错综复杂的数据关系中,找到关键信息(关键特征) 换句话说,就是把密集矩阵转化为稀疏矩阵, 保留数据的关键信息,去除噪音 ,这样的模型就有了鲁棒性(健壮性,Robust)。ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征。

 

但是ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于 dead状态 ,所以使用ReLU的网络,学习率不能设置太大。

 

公式及图像

 

relu=max(0, x)

 

 

优点

可见ReLu的导数是常数1,可以有效解决深层网络的 梯度消失 问题。
相比Sigmoid和tanh,ReLU摒弃了复杂的计算,提高了运算速度。
负值的输出为0, 不会同时激活所有神经元,使网络保持稀疏,提高计算效率

缺点

虽然解决了梯度下降问题,但却有可能出现 梯度爆炸 问题,解决办法是进一步控制权值,让全权值在(0, 1)范围内。
学习率太大可能会导致大部分神经元处于 dead状态 。

leaky relu函数

 

relu函数中输入负值就一定输出0屏蔽可能会导致 dead状态 ,我们可以考虑把0换成一个非0但是很小的数(比如0.01),这样做就把0梯度变成了一个很小的梯度,这就是leaky relu函数。

 

公式及图像

 

\begin{cases}x&x>0\ \lambda x&x\leqslant 0\end{cases}

 

 

如何选择激活函数?

 

对于不同的应用场景、不同的训练数据,适用的激活函数都是不同的,找到适合的激活函数一般先用少量的训练数据一点一点去试,数据一个一个的试。这个问题目前没有确定的方法,大多数都是凭经验。

有一些公认的选择规则。一般来说relu用的最多,但是 relu只在隐藏层中使用 。根据经验,我们一般可以从relu激活函数开始,如果relu不能很好的解决问题,再去尝试其他的激活函数。
如果使用 ReLU,那幺一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那幺可以试试 Leaky ReLU、PReLU 或者 Maxout.

tanh各方面都比sigmoid优秀(除了在二元分类应用中的输出层)。

另外深度学习往往需要大量时间来处理大量数据, 模型的收敛速度 是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据(可以经过数据预处理实现)和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。

理论上每一层都可以使用不同的激活函数,但一般不会这样做。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注