• 深度学习(十六) ReLU为什么比Sigmoid效果好


    sigmoid:

    Relu:

     

    为什么通常Relu比sigmoid和tanh强,有什么不同?
    主要是因为它们gradient特性不同。

    1.sigmoid和tanh的gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。vanishing gradient在网络层数多的时候尤其明显,是加深网络结构的主要障碍之一。相反,Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。

    2.Relu的另一个优势是在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征
    3.而提出sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或着-1到1,在表达上,尤其是输出层的表达上有优势。

    4.Relu输出更具稀疏性。

    5.ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:

     

    第一个问题:为什么引入非线性激励函数?
    如果不用激励函数(其实相当于激励函数是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的位置会有更好的效果。大家有兴趣可以看下。

     

  • 相关阅读:
    大数据运维(40)ElasticSearch安装ik中文分词器
    大数据运维(39)Kylin 3.1.0集群部署
    大数据运维(38)Flink 1.11.1部署安装
    项目实战 从 0 到 1 学习之Flink(28)Flink 1.11 新特性:流批一体的 Hive 数仓
    项目实战从0到1之hive(29)企业级数据仓库构建(十):搭建 ADS 层
    项目实战从0到1之hive(28)数仓项目(九)数仓搭建-DWT 层
    项目实战从0到1之hive(27)数仓项目(九)数仓搭建
    项目实战从0到1之hive(26)企业级数据仓库构建(八):搭建DWD 层-业务数据
    项目实战从0到1之hive(25)企业级数据仓库构建(七):搭建DWD 层
    项目实战从0到1之hive(24)企业级数据仓库构建(六):数仓理论及数仓搭建
  • 原文地址:https://www.cnblogs.com/callyblog/p/8977517.html
Copyright © 2020-2023  润新知