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