**函数(Activation Functions)


神经网络结构的输出为所有输入的加权和,这导致整个神经网络是一个线性模型。如果将每一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,使得神经网络可以更好地解决较为复杂的问题。这个非线性函数也就是**函数


目前TensorFlow提供了7种不同的非线性**函数,tf.nn.relu、tf.sigmoid、tf.tanh 是其中比较常用的几个。当然,TensorFlow也支持使用自己定义的**函数。


**函数有以下几种形式:

  1. 平滑非线性函数(Smooth nonlinearities):

    • sigmoid

      sigmoid 非线性函数将输入映射到 (0,1) 之间。

      **函数(Activation Functions)

      数学关系为:f(x)=1/(1+e^−x)
      **函数(Activation Functions)

      sigmoid优点

      1. Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。

      2. 求导容易。

      sigmoid函数曾被广泛地应用,但由于其自身的一些缺陷,现在很少被使用了。
      sigmoid缺点

      1. 函数饱和使梯度消失
        sigmoid 在值为 0 或 1 的时候接近饱和,这些区域,梯度几乎为 0。因此在反向传播时,这个局部梯度会与整个损失函数关于该单元输出的梯度相乘,结果也会接近为 0 。因此这时梯度就对模型的更新没有任何贡献。
        除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习。

      2. sigmoid 函数关于原点中心不对称
        这个特性会导致后面网络层的输入也不是零中心的,进而影响梯度下降的运作。因为如果输入都是正数的话(如y=wx+b中每个元素都 x>0),那么关于w的梯度在反向传播过程中,要么全是正数,要么全是负数(具体依据整个表达式y而定),这将会导致梯度下降权重更新时出现z字型的下降。
        如果是按 batch 训练,那么每个 batch 可能得到不同的信号,整个批量的梯度加起来后可以缓解这个问题。

      资料:http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf

    • tanh
      **函数(Activation Functions)

      数学关系为:f(x)=tanh(x)
      **函数(Activation Functions)

      tanh函数与sigmoid一样也存在饱和问题,但它的输出是零中心的,因此实际应用中tanh比sigmoid 更受欢迎。tanh函数实际上是一个放大的sigmoid函数。

      tanh优点:

      1. 比Sigmoid函数收敛速度更快。

      2. 相比Sigmoid函数,其输出以0为中心。

      tanh缺点:

      1. 还是没有改变Sigmoid函数的最大问题–由于饱和性产生的梯度消失。

      资料:http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf

    • softplus

      数学关系为:
      **函数(Activation Functions)

      资料http://papers.nips.cc/paper/1920-incorporating-second-order-functional-knowledge-for-better-option-pricing.pdf

    • softsign

      数学关系为:
      **函数(Activation Functions)

    • ELU

      数学关系为:
      **函数(Activation Functions)

      资料:https://arxiv.org/pdf/1511.07289v5.pdf

  2. 连续但并不是处处可微(Continuous but not everywhere differentiable):

    • ReLU
      **函数(Activation Functions)

      数学关系为:f(x)=max(0,x)

      ReLU的优点:

      1. 相较于sigmoid和tanh函数,ReLU 对于 SGD 的收敛有巨大的加速作用(Alex Krizhevsky 指出有 6 倍之多)。有人认为这是由它的线性、非饱和的公式导致的。

      2. 相比于 sigmoid和tanh,ReLU 只需要一个阈值就可以得到**值,而不用去算一大堆复杂的(指数)运算。

      3. 有效缓解了梯度消失的问题。

      4. 在没有无监督预训练的时候也能有较好的表现。

      5. 提供了神经网络的稀疏表达能力。

      ReLU的缺点:

      1. 它在训练时比较脆弱并且可能“死掉”。

        举例来说:一个非常大的梯度经过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有**现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉(在整个训练集中这些神经元都不会被**)。

        合理设置学习率,会降低这种情况的发生概率。

    • ReLU6

      数学关系为:
      **函数(Activation Functions)

      资料:https://www.tensorflow.org/api_docs/python/tf/nn/relu6

    • SReLU

      数学关系为:
      **函数(Activation Functions)

      资料:

    • Leaky ReLU
      **函数(Activation Functions)

      数学关系为:
      **函数(Activation Functions)

      Leaky ReLU是为解决“ ReLU 死亡”问题的尝试。ReLU中当x<0时,函数值为0。而 Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。

      资料:http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf

    • PReLU

      数学关系为:
      **函数(Activation Functions)

      PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。
      **函数(Activation Functions)
      Kaiming He 等人在 2015 年发布的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中,对比了PReLU和ReLU在ImageNet model A的训练效果,把负区间上的斜率当做每个神经元中的一个参数来训练。然而该**函数在在不同任务中表现的效果也没有特别清晰。

      资料:https://arxiv.org/pdf/1502.01852.pdf

    • RReLU

      数学关系为:
      **函数(Activation Functions)

      资料:http://blog.csdn.net/yhl_leo/article/details/56488640

    • CReLU

      数学关系为:
      **函数(Activation Functions)

      资料:https://arxiv.org/pdf/1603.05201v2.pdf

  3. 离散的(Discrete):


References: