Activation Function(**函数) - 小结

Activation Function

我们知道,conv+BN+activation function+pooling=CNN,对于其中的Activation Function,究竟有什么作用?下面主要分两个方面和大家一起分享一下自己的认识。

  • 在CNN中我们为什么需要**函数?
    假设我们不使用**函数,无论网络结构多么复杂,我们的预测结果始终是输入特征的一个线性结果。
  • 市面上常用的**函数有哪些?各自有什么优缺点?
     1)之前一直在使用的Sigmoid函数F(x)=11+ex,想必大家都对此函数烂熟于心了吧,如图1,此函数有3个缺点:
     Activation Function(**函数) - 小结
     注:图1
       1.1)梯度弥散。在反向传播过程中,极其容易出现梯度消失(弥散)问题,当|x|>8时,梯度几乎为0,这对训练网络十分不利,因为当梯度弥散时,欲训练的参数几乎不会发生变化
       1.2)不关于原点对称。经过此**函数进行**之后,致使输出结果全部为positive
       1.3)指数运算浪费时间
     2)改进的Sigmoid函数F(x)=exexex+ex,如图2,这个**函数是Sigmoid的改进版本
     Activation Function(**函数) - 小结
     注:图2
       2.1)照样会出现梯度弥散问题
       2.2)次**函数关于原点对称
       2.3)指数运算确实浪费时间
     3)神奇的ReLU**函数F(x)=max(0,x)给人一种简单粗暴,行之有效的感觉,确实,自2012年AlexNet首次使用ReLU作为**函数并取得了比Sigmoid/tanh**函数快6倍的效果之后,仿佛成了NN默认的**函数,如图3,大家都用。。。
     Activation Function(**函数) - 小结
     注:图3
       3.1)不会出现梯度弥散现象
       3.2)不关于原点对称
       question:假设某层在经过ReLU时,并没有被**,那反向传播时,此处的梯度为多少?
       当然为0,换句话说,就是此处的权重并不进行任何更新,再换句话说,这个神经元死掉了。
      4)改进的ReLU**函数:Leaky ReLU=max(0.1*x,x),如图4,至于这个**函数和ReLU的区别,大家可以自己把握,总体来说还是ReLU的使用范围更广些
      Activation Function(**函数) - 小结
      注:图4
      5)改进的ReLU**函数:ELU,如图5,其中的α是超参数,注意此处包含指数e运算
      Activation Function(**函数) - 小结
      注:图5
      

Summary:
- 大胆使用ReLU,但必须注意自己的learning rate
- 可以尝试leaky ReLU/ELU
- tanh可以用,但是不要期望有较好的结果
- 不要使用Sigmoid!!!

**函数很重要。。。。。。


暂时想到这里,以后有时间了进行补充
*作者:gengmiao 时间:2018.02.19,原创文章,转载请保留原文地址、作者等信息*