zoukankan      html  css  js  c++  java
  • 激活函数与权值初始化

    1.sigmod函数——tf.nn.sigmoid()

    sigmod函数性质:

    1.如图像所示其值域在[0,1]之间,函数输出不是0均值的,权重更新效率降低,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

    2.如图当其取值远离原点时,其梯度越来越小趋近于0,在反向传播中,用链式求导法,求权值求梯度,梯度逐层减小,权值更新速度缓慢,一般不超过五层sigmod层,就会出现梯度弥散,即梯度饱和问题。

    3.要进行指数运算,速度慢

    4.定义域(0, 1) 可以表示作概率,或者用于输入的归一化,如Sigmoid交叉熵损失函数。

    5.sigmoid在压缩数据幅度方面有优势,在深度网络中,在前向传播中,sigmoid可以保证数据幅度在[0,1]内,这样数据幅度稳住了,不会出现数据扩散,不会有太大的失误。

    2.tanh 函数——(tf.nn.tanh())

      

     

    tanh函数性质

    1.如图所示,值域是0均值的,权值更新快,而且也能保证数据幅度稳定。

    2.也有梯度弥散问题,要进行指数运算,速度慢。

    一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数

     3.relu函数——σ(x)=max(0,x)(tf.nn.relu())

    relu函数性质

    1.当输入为正数的时候,不存在梯度饱和问题;当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。这样在前向传播过程中,还不算什么问题,有的区域是敏感的,有的是不敏感的。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。

    2.ReLU函数也不是以0为中心的函数,权值更新慢

    3.计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。

    4.在正向传播时,relu不会对数据做幅度压缩,所以如果数据的幅度不断扩张,那么模型的层数越深,幅度的扩张也会越厉害,最终会影响模型的表现。

    5.但是relu在反向传导方面可以很好地将梯度传到后面,这样在学习的过程中可以更好地发挥出来。

     

    4.elu函数——(tf.nn.elu())

          elu函数公式     elu函数图

    ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。

    5.prelu函数——σ(x)=max(ax,x)(tf.nn.relu())
    prelu函数图

    1.参数α一般是取0~1之间的数,而且一般还是比较小的,如零点零几。当α=0.01时,PReLU为Leaky ReLU。

    2.PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,虽然斜率很小,但是不会趋于0。这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,速度快。

    6.softplus函数——σ(x)=log(1+ex)(tf.nn.softplus())

     softplus可以看作是ReLu的平滑。根据神经科学家的相关研究,softplus和ReLu与脑神经元激活频率函数有神似的地方。也就是说,相比于早期的激活函数,softplus和ReLu更加接近脑神经元的激活模型。

     

    7.softmax函数

    softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中bi是一个0-1的常数,且k项之和为1,用于多分类任务,bi最大的那一项为所属类别。

    8.maxout函数

     

    f(x)=max(wT1x+b1,wT2x+b2,,wTn+bn)

    是将激活函数用一层全链接层取拟合,输出为,那层的最大值,理论maxout网络能够近似任意连续函数,且当w2,b2,…,wn,bn为0时,退化为ReLU。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量,对于中间层数k,其参数会随k增长。

    权值初始化

    1.高斯初始化

    2.均值初始化

    3.Xavir初始化——(tf.contrib.layer.xavier_initializer_conv2d())

    如上图nj为第j层的节点数,为均匀分布均值为1,且保证前向传播和反向传播时每一层的方差一致,原因可以见论文及其解释为了,当激活函数为sigmoid和tanh的时候比较适用。

    这对梯度消失有好处?感觉只是保证了在前向传播中方差一致的问题,解决了前向传播中的数据稳定性保证问题,可以防止数据扩散和爆炸问题

    4.he initia——激活函数为relu比较适用(tf.contrib.layers.variance_scaling_initializer())

  • 相关阅读:
    在日本被禁止的コンプガチャ設計
    Starling常见问题解决办法
    Flixel引擎学习笔记
    SQLSERVER中修复状态为Suspect的数据库
    T4 (Text Template Transformation Toolkit)实现简单实体代码生成
    创建Linking Server in SQL SERVER 2008
    Linq to Sql 与Linq to Entities 生成的SQL Script与分页实现
    Linq to Entity 的T4 模板生成代码
    在VisualStudio2008 SP1中调试.net framework 源代码
    使用HttpModules实现Asp.net离线应用程序
  • 原文地址:https://www.cnblogs.com/yutingmoran/p/8597990.html
Copyright © 2011-2022 走看看