为什么要用非线性激活函数?为什么要引入非线性修正单元?

为什么引入非线性函数?Relu函数的优点?

    第一个问题:为什么引入非线性激励函数?
    如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。
    正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。

    第二个问题:Relu函数的优点?
    第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
    第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时(输入太大或者太小),变换太缓慢,导数趋于0,这种情况会造成信息丢失,参见@Haofeng Li 答案的第三点),从而无法完成深层网络的训练。
    第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。

 

注:

relu也有一些缺点:比如造成一些神经元die的现象。

一般的神经网络中至少要有一个非线性的激活函数,否则多层就和1层没有了区别,网络失去了非线性拟合的能力。

那么为什么还要有relu呢?(我猜:线性的层数也可以有连续的多个呀,这样多加一些网络也变得深了。)

 

神经网络结构中,通常网络结构是一种这样的结构:神经元-激活函数-神经元-激活函数…。也即在每个神经元计算得到一个输出后,再将输出输入到一个激活函数f(.),对神经元的输出做一个非线性变换得到当前网络层的最终输出结果。这样设计的一种多层次神经网络通常可以拟合任何目标函数。而如果将神经元后面的激活函数移除,则整个神经网络模型就变成一个简单线性函数,而此时的神经网络只能解决简单的线性可分或者回归问题,对于复杂的问题,比如:图像分类、语音识别、以及机器翻译等等,简单的线性函数则不能很好的处理上述这些复杂的问题。在神经网络的每个网络层后面都添加一个激活函数,则可以对每个网络层的输出做一个非线性变换,整个神经网络就变成了一个十分复杂的非线性函数。此时的神经网络就变得十分强大,可以处理上述很多复杂的问题。使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。

 

你可能感兴趣的:(深度学习)