为什么激活函数是非线性的?

如果不用激励函数(相当于激励函数是f(x)=x),在这种情况下,每一层的输出都是上一层的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这与一个隐藏层的效果相当(这种情况就是多层感知机MPL)。

但当我们需要进行深度神经网络训练(多个隐藏层)的时候,如果激活函数仍然使用线性的,多层的隐藏函数与一层的隐藏函数作用的相当的,就失去了深度神经网络的意义,所以引入非线性函数作为激活函数。

激活函数性质

  • 非线性:如果激活函数都为线性,那么神经网络的最终输出都是和输入呈线性关系;显然这不符合事实。 
  • 可导性:神经网络的优化都是基于梯度的,求解梯度时需要确保函数可导。 
  • 单调性:激活函数是单调的,否则不能保证神经网络抽象的优化问题为凸优化问题了,导数符号不变,使得在激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。 
  • 输出范围有限:激活函数的输出值的范围是有限时,基于梯度的方法会更加稳定。输入值范围为,如果输出范围不加限制,虽然训练会更加高效,但是learning rate将会更小,且给工程实现带来许多困难。

常见的激活函数

sigmoid:

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_神经网络

优点:

  • Sigmoid函数是深度学习领域开始时使用频率最高的激活函数,它是便于求导的平滑函数,能够将输出值压缩到0-1范围之内。

缺点:

  • 容易出现梯度消失

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_激活函数_02

优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。但当x较大或较小时,导数接近0;并且Sigmoid函数导数的最大值是0.25,导数在每一层至少会被压缩为原来的1/4。正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致神经网络无法被优化。

  • 输出不是zero-centered

Sigmoid函数的输出值恒大于0,假设后层的输入都是非0的信号,在反向传播过程中,weight要么是都往正方向更新,要么都往负方向更新,按照图中所示的阶梯式更新,并非好的优化路径,计算量较大,模型收敛的速度减慢。

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_神经网络_03

  • 幂运算相对耗时

tanh:

优点:

  • 全程可导
  • 输出区间为-1到1
  • 解决了zero-centered的输出问题。

缺点:

  • 容易出现梯度消失

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_激活函数_04

  • 幂运算相对耗时

relu:

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_激活函数_05

优点:

  • 解决了梯度消失的问题 (在正区间)

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_深度神经网络_06

  • 计算速度非常快,只需要判断输入是否大于0
  • 收敛速度远快于sigmoid和tanh
  • relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

缺点:

  • 输出不是zero-centered
  • Dead ReLU Problem

Dead ReLU Problem指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) 学习速率太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将学习速率设置太大或使用adagrad等自动调节学习速率的算法。

激活函数怎么把线性函数转化为非线性函数的 激活函数 非线性_深度神经网络_07