在谈激活函数前,我们先确立一个概念:什么是深度学习?
维基百科对深度学习的定义为:“一类通过多层非线性变换对高复杂性数据建模算法的合集”,这里用到了两个概念:多层、非线性,激活函数的作用就是为神经网络引入非线性。
- 问:什么是激活函数?
在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数。
- 问:激活函数有什么用?
如果没有激励函数,在这种情况下你每一层节点的输入都是上层输出的线性函数,无论你神经网络有多少层,输出都是输入的线性组合,相当于没有隐藏层,网络的学习能力有限。
深度学习最主要的特点就是:多层,非线性。 多层为了能够学习更多的东西;没有非线性,多层和单层没什么区别,就是简单的线性组合,连异或都解决不了。
- 问:介绍一下你熟悉的激活函数?特点,优缺点
sigmoid函数
![]()
特点:
将输入的连续值映射到0和1之间,减小了离群值对模型的影响,同时引入非线性,模型的拟合程度变强。
缺点:
Sigmoid缺点大致有3:
①容易出现梯度消失:从梯度图来看,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐藏层很多,那么梯度在穿过多层后悔变得接近0,即出现梯度消失现象。
这里引申出反向传播的概念:简要地说,BP算法是一个迭代算法,它的基本思想为:(1)先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);(2)计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);(3)更新参数(目标是误差变小)。求解梯度用链导法则。迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。
改进:1、LSTM可以解决梯度消失问题 2、Batchnorm 3、优化激活函数,使用relu 4、使用残差结构
②函数输出不是0均值(zero-centered)
sigmoid 函数的输出均大于 0,使得输出不是 0 均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非 0 均值的信号作为输入。
改进:数据规范化(normalization)如Layer-Normalization Batch-Normalization等
③解析式中含有幂运算:幂运算对计算机来讲比较耗时,对于规模比较大的深度网络,这会较大地增加训练时间。
tanh函数
![]()
特点:和sigmoid差不多,但值域为[-1,1]
此外,解决了Sigmoid函数的不是zero-centered输出问题。
缺点:
①仍存在梯度消失问题
②仍存在幂运算问题
ReLU函数
![]()
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient
特点:①解决了梯度消失问题
②计算速度非常快,只需要判断是否大于0
③收敛速度快于sigmoid和tanh,因为ReLu的收敛速度一直为1
缺点:
①不是0均值的(zero-centered)
②Dead ReLU Problem,指某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,少见 。例如w初始化全部为一些负数。(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
③原点不可导,解决办法:坐标轴下降法、最小角回归法
LeakyReLU函数
特点:对ReLu的一个改进,可以改善relu中x<0部分的dead问题。
参考资料:
https://blog.csdn.net/GreatXiang888/article/details/99296607
https://zhuanlan.zhihu.com/p/25110450
网友评论