zoukankan      html  css  js  c++  java
  • 激活函数的比较,sigmoid,tanh,relu

    1. 什么是激活函数

    如下图,在神经元中,输入inputs通过加权、求和后,还被作用了一个函数。这个函数就是激活函数Activation Function

    2. 为什么要用激活函数

    如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网路有多少层,输出都是输入的线性组合。与没有隐藏层效果相当,这种情况就是最原始的感知机了。

    使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

    3. 都有什么激活函数

    (1)sigmoid函数

    导数:

    等式的证明也很简单。sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1)

    sigmoid缺点:

    • 激活函数计算量大,反向传播求误差梯度使,求导涉及除法
    • 反向传播使,很容易就会出现梯度消失的情况,从而无法完成生成网络的训练
    • sigmoid两端饱和且容易kill掉梯度
    • 收敛缓慢

    为何出现梯度消失:

    sigmoid原函数及导数图如下图所示:

    由图可知,导数从0开始很快又趋近于0,易造成"梯度消失"现象

    (2)tanh函数(双曲正切)

    取值范围[-1,1]。0均值,实际应用中tanh比sigmoid要好

    (3)ReLU

    公式:

    输入信号 < 0时,输出都是0;输入 > 0时,输出等于输入

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

    2. ReLU会使一部分神经元输出为0,造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合。

    3. 当然现在也有一些对ReLU的改进,比如lrelu、prelu,在不同的数据集上会有一些训练速度上或者准确率上的改进。

    4. 现在主流的做法,是在relu之后,加上一层batch normalization,尽可能保证每一层网络的输入具有相同的分布。

    ReLU的缺点:

    训练的时候很"脆弱",很容易"die"

    例如:一个非常大的梯度流过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元就永远都会是0.

    (4)softmax函数

    Softmax-用于多分类神经网络输出

    上图所示,如果某个 zj 大过其他 z,那这个映射的分量就逼近于1,其他逼近于0,主要应用于多分类

    为什么要取指数?

      1. 模拟 max 的行为,让大的更大

      2. 需要一个可导函数

  • 相关阅读:
    Vue 中样式穿透 /deep/
    Vue 数据冻结 Object.freeze
    Vue 启动项目内存溢出
    Typora[ markdown ] 使用3之----- 语法高亮显示
    Typora[ markdown ] 使用2之-----空格显示
    手动创建mysql数据库的语句记录
    api不能自动注入条件的解决方法
    【WTM框架】查询列表显示正常,但是导出的时候查询条件不起作用的问题记录及解决方法
    WTM问题之“数据列表”控件出现横向的滚动条的解决方法
    树莓派docker无法限制内存Your kernel does not support memory limit capabilities or the cgroup is not mounted
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/10583394.html
Copyright © 2011-2022 走看看