ReLu(修正线性单元)、sigmoid和tahh的比较

简介:

最近,在看论文,提及到这个修正线性单元(Rectified linear unit,ReLU)

 

Deep Sparse Rectifier Neural Networks 
ReLu(Rectified Linear Units) 
修正线性单元(Rectified linear unit,ReLU) 
激活函数实现–4 Rectified linear函数实现 
Rectified Linear Units

ReLU 和sigmoid 函数对比

ReLU为什么比Sigmoid效果好

 

  在CNN卷积神经网络中,习惯用ReLU函数代替sigmoid, tahh等目标激活函数,这应该是因为,RELU函数在大于0的时候,导数为恒定值,而sigmoid和tahh函数则不是恒定值,相反,sigmoid和tahh的导数,类似于高斯函数的曲线形状,在两端接近目标时,导数变小。

  导数小的话,在训练神经网络的时候,会BP反向传播误差,导致收敛减慢;而ReLU函数则避免了这点,很好很强大。

  当然,事情不是一定的,还是得结合实际情况选择,或者涉及目标激活函数。

 

 

附:双曲函数类似于常见的(也叫圆函数的)三角函数。基本双曲函数是双曲正弦"sinh",双曲余弦"cosh",从它们导出双曲正切"tanh"

                    

sigmod函数:

                

 

Relu函数:

   

         

 

综合:

        

 

 

 

@作者:约翰曰不约 
为什么通常Relu比sigmoid和tanh强,有什么不同?
主要是因为它们gradient特性不同。sigmoid和tanh的gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。vanishing gradient在网络层数多的时候尤其明显,是加深网络结构的主要障碍之一。相反,Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。
而提出sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或着-1到1,在表达上,尤其是输出层的表达上有优势。
 
@作者:crackhopper
  ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:

 

 


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

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

当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。
多加一句,现在主流的做法,会在做完relu之后,加一步batch normalization,尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2],他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果。大家有兴趣可以看下。
 



本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6970538.html,如需转载请自行联系原作者
相关文章
|
4天前
EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测
EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测
EI级 | Matlab实现VMD-TCN-GRU变分模态分解结合时间卷积门控循环单元多变量光伏功率时间序列预测
|
5月前
|
机器学习/深度学习 自然语言处理 计算机视觉
什么是RNN门控循环单元GRU?
什么是RNN门控循环单元GRU?
87 0
|
9月前
|
机器学习/深度学习 数据采集
区间预测 | MATLAB实现基于QRCNN-BiGRU-Multihead-Attention多头注意力卷积双向门控循环单元多变量时间序列区间预测
区间预测 | MATLAB实现基于QRCNN-BiGRU-Multihead-Attention多头注意力卷积双向门控循环单元多变量时间序列区间预测
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch: 池化-线性-激活函数层
PyTorch: 池化-线性-激活函数层
145 0
|
11月前
|
机器学习/深度学习 并行计算 算法
激活函数Relu对精度和损失的影响研究
激活函数Relu对精度和损失的影响研究
99 0
|
11月前
|
算法 PyTorch 算法框架/工具
pytorch实现空洞卷积+残差网络实验(torch实现)
pytorch实现空洞卷积+残差网络实验(torch实现)
326 0
|
机器学习/深度学习 人工智能 自然语言处理
【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU
对于分类任务来说,如果仅仅给出分类的结果,在某些场景下,提供的信息可能并不充足,这就会带来一定的局限。因此,我们建立分类模型,不仅应该能够进行分类,同时,也应该能够提供样本属于该类别的概率。这在现实中是非常实用的。例如,某人患病的概率,明天下雨概率等。因此,我们需要将z的值转换为概率值,逻辑回归使用sigmoid函数来实现转换。
458 0
|
机器学习/深度学习 人工智能 数据可视化
F(x)构建方程 ,梯度下降求偏导,损失函数确定偏导调整,激活函数处理非线性问题
F(x)构建方程 ,梯度下降求偏导,损失函数确定偏导调整,激活函数处理非线性问题
90 0
F(x)构建方程 ,梯度下降求偏导,损失函数确定偏导调整,激活函数处理非线性问题
|
机器学习/深度学习 人工智能 自然语言处理
手写数字识别python代码 卷积层,池化层,正向传播(relu:激活函数)
手写数字识别python代码 卷积层,池化层,正向传播(relu:激活函数)
248 0
手写数字识别python代码 卷积层,池化层,正向传播(relu:激活函数)