激活函数:让神经网络活过来了

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。

在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。

激活函数是确定神经网络输出的数学方程式。

1、没有激活函数

在没有引入激活函数之前,输入和输出都是线性组合,跟没有隐藏层的效果是一样的,网络不易收敛的,学习能力有限,就比如原始的感知机一样。

激活函数:让神经网络活过来了_第1张图片

若没有激活函数:

激活函数:让神经网络活过来了_第2张图片

首先对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大/小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合预期,很多情况下我们希望的输出是一个概率。

更重要的是,线性变换太简单(只是加权偏移),限制了对复杂任务的处理能力。

如果没有激活函数,不论线性层有多深,在将其简化后,它依然只能解决线性问题。

激活函数:让神经网络活过来了_第3张图片

没有激活函数的神经网络可以说是死气沉沉,没有生机。

2、激活函数的作用

不使用激活函数的话,神经网络的每层都只是做线性变换,多层输入叠加后也还是线性变换。

因为线性模型的表达能力通常不够,所以这时候就体现了激活函数的作用了,激活函数可以引入非线性因素。

有激活函数:

加入非线性激励函数后,神经网络就有可能学习到平滑的曲线来分割平面,而不是用复杂的线性组合逼近平滑曲线来分割平面,使神经网络的表示能力更强了,能够更好的拟合目标函数。

激活函数:让神经网络活过来了_第4张图片

有了激活函数的神经网络一下子活了过来,可以拟合任何非线性函数。

3、ReLU

ReLU 是非常经典的激活函数,ReLU激活函数在形式上更加接近生物神经网络。当神经元的输入大于0时,神经元才有输出,否则,神经元输出为0,即神经元死亡,通过ReLU训练的神经网络往往具有很好的稀疏性,只有一部分神经元会参与计算,从而更好的模拟了生物神经网络。

生物神经网络:

激活函数:让神经网络活过来了_第5张图片

ReLU公式:

激活函数:让神经网络活过来了_第6张图片

ReLU图像:

激活函数:让神经网络活过来了_第7张图片

ReLU优点:

1、ReLU 函数在正输入时是线性的,收敛速度快。当输入为正时,由于导数是1,能够完整传递梯度,不存在梯度消失的问题。

2、计算速度快。ReLU 函数中只存在线性关系且无论是函数还是其导数都不包含复杂的数学运算,因此它的计算速度比 sigmoid 和 tanh 更快。

3、它保留了 step 函数的生物学启发,只有输入超出阈值时神经元才激活。不过当输入为正的时候,导数不为零,从而允许基于梯度的学习。

4、神经元死亡带来了稀疏性。通过ReLU训练的神经网络往往具有很好的稀疏性,只有一部分神经元会参与计算,从而更好的模拟了生物神经网络。

ReLU缺点:

1、ReLU的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“Dead Neuron”。

2、与Sigmoid一样,其输出不是以0为中心的(ReLU的输出为0或正数)。

4、ReLU的神经元死亡

ReLU的神经元死亡是可能的,而不是一定的。

在训练的时候,ReLU单元比较脆弱并且可能“死掉”。

举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。

如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。

也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。

什么时候会出现神经元死亡?

激活函数:让神经网络活过来了_第8张图片

在反向传播中,参数w、b的更新需要对ReLU进行求导,当倒数为0时,梯度为0。

结合ReLU的导函数图像可知,relu梯度为0的地方就是relu的x<0的地方,这些地方将有参数不再更新的风险。

relu倒数为0的区域为relu的x<0的区域,即wx+b<0的区域;

暂时死亡:

wx+b<0由w或者b导致的小于0,而b还是正常的范围。

这波batch size的数据进入后这一次不更新,不代表下一波batch size的数据进入后不更新。

在训练过程中这个神经元可能就某次坏死,然后下一次又活过来了。

永久死亡:

wx+b<0由b导致的小于0,b是一个很大的负数,使得wx+b一直小于0。

这波batch size的数据进入后这一次不更新,下一波batch size的数据进入后还是不更新,因为出现了一个很大负值的b。

激活函数的输入值有一项偏置项(bias),假设bias变得太小,以至于输入激活函数的值总是负的,那么反向传播过程经过该处的梯度恒为0,对应的权重和偏置参数此次无法得到更新。如果对于所有的样本输入,该激活函数的输入都是负的,那么该神经元再也无法学习,称为神经元”死亡“问题。

一个问题两种看法:

ReLU将负值截断为0 ,可导致神经元死亡,而神经元死亡也为网络引入了稀疏性。

稀疏性:

稀疏性,能缓解过拟合,反向传播时也能减少计算量。

如果神经网络是稠密的,即神经元的输出都大于0,那么输入的一个微小改变,都可能在一次又一次的前向传播中被放大,导致神经网络的输出发生很大变化,这就会导致整个神经网络不够健壮。

若一个神经网络是稀疏的,即部分神经元的输出为0,输入的微小改变也许就不会在一次又一次的前向传播中被放大,导致神经网络输出发生大的变化。

灵魂的拷问:

ReLU会导致神经元坏死,为什么还被广泛的使用呢?

灵魂的分析:

1、可能是短暂的坏死,还可以复活。2、可能神经元坏死并不是不可以接受的,或者说神经元坏死并不致命。3、可能出现的概率很低,使用可以忽略这种情况。4、可能可以通过某些方法或者参数比较容易能够避免这种情况发生。

灵魂的回答:

1、神经元坏死并不致命,依然可以用。

死亡掉一些神经元不一定就是坏事,带来的稀疏性甚至有一定帮助。

对于神经网络而言,不论是稀疏亦或是稠密,模型都具有一定的复杂度,仍然可以拟合复杂的数据,但过分稀疏会导致模型的复杂度下降,模型的拟合能力大大下降。也就是说,不要死亡的太多,依然work,且效果还不错。

失效也没关系,架不住神经元多啊,假设设置了一万个神经元,只有五千个活了,五千个神经元的拟合效果也是非常不错的。

2、出现的概率较低。

模型中的参数即卷积核的参数,这些参数大多在0值附近。在训练中出现一个很大负值的b概率不是很大。虽然任然会出现。

3、可能是短暂的坏死,还可以复活。

4、通过合理设置学习率,神经元坏死发生的概率会降低。

可以采用Xavier初始化方法,同时将learning rate设置为合理的范围,可以有效避免神经元死亡现象。

5、负值为什么可以为0?

当relu输入大于0,开关处于开启状态,说明在输入范围内检测到了对应的特征,且正值越大代表特征越明显。

那么负值越小代表什么意思呢?

负值代表特征的缺失,但用负值的大小代表缺失的程度就不太合理,难道缺失也有程度吗?

所以0或者负值都代表没有检测到特征,即用一个常量值0来表示检测不到特征是更方便合理的,像ReLU这样单侧饱和的神经元就满足要求。

0点不可微怎么办?

对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响。

6、none-zero-centered

无论ReLU的输入值是什么范围,输出值总是非负的,这也是一个缺点。

我们希望激活函数的输出是以0为中心对称的。

输出不是以零为中心,这会导致神经网络收敛较慢。(这个问题依然不致命)

为什么?

激活函数:让神经网络活过来了_第9张图片

由反向传播算法可知,各个 w更新方向之间的差异,完全由对应的输入值 x的符号的差异决定,而上一层relu的输出不是0就是正的。

在某一层中,我们希望一个w变大,另外一个w变小,则需要输入的x有正有负。

然后relu函数做不到这一点,一次输入必然输出非负的数,导致w的更新一起大或者一起小。

不能使得w更新做到有的变大有的变小是激活函数输出不以0为中心对称的最大问题。

激活函数:让神经网络活过来了_第10张图片

模型参数走绿色箭头能够最快收敛,但由于输入值的符号总是为正,所以模型参数可能走类似红色折线的箭头。

从原地到达最优点,一部分参数需要减小,另一部分参数需要增大,但由于relu,每次更新时,w0/w1 必须同时增大或减小,造成了更新方向的锯齿问题,减缓了训练过程。

ReLU的这个问题sigmoid也有。

针对这个问题,ReLu的改进版本均作出相应的改进,使得负轴方向有负值。

不仅有值,而且有梯度,也解决了梯度为0的梯度消失问题。

激活函数:让神经网络活过来了_第11张图片

7、总结

激活函数的改进除非多,但是在实际的应用中依然无法确定哪个激活函数是最好的,或者是最有效的。

激活函数:让神经网络活过来了_第12张图片

你可能感兴趣的:(人工智能,算法)