一次面试引发的问题:激活函数Relu,sigmoid ,tanh的角逐

来源:互联网 发布:刀卡 淘宝 编辑:程序博客网 时间:2024/05/17 07:59

记得之前去某东面试,面试官问我CNN的激活函数有哪些?

我说:Relu/sigmoid /tanh

问:有区别吗?

我心想我只用过relu,至于区别我想应该是高效吧。

问:为什?

我真没细想过,后来面试完啦赶紧去巴拉巴拉,整理啦以下资料,果然,做学问,不仅仅要知道how,更要知道why

整理笔记:

激活函数的性质

数据”经过一个神经网络时,经过卷积或池化等运算后,最终输出的一个值。这个“输出值”就是经过激活函数计算的来的,反向求导,也是对激活函数来求导的。
激活函数通常有以下性质:
非线性:如果激活函数都为线性,那么神经网络的最终输出都是和输入呈线性关系;显然这不符合事实。
可导性:神经网络的优化都是基于梯度的,求解梯度时需要确保函数可导。
单调性:激活函数是单调的,否则不能保证神经网络抽象的优化问题为凸优化问题了。
输出范围有限:激活函数的输出值的范围是有限时,基于梯度的方法会更加稳定。输入值范围为(,+),如果输出范围不加限制,虽然训练会更加高效,但是learning rate将会更小,且给工程实现带来许多困难。


激活函数的作用

为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数

Signmoid函数

数学表达式:

其对x的导数可以用自身表示:


可以看出,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,由于两端饱和 很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,所谓的梯度消散 就是简单地说,根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话(w_{ij}y_{i}'<1.0 ),那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0(\lim_{n\to\infty}0.99^n=0 ),这样就dead啦。由于使用sigmoid函数,梯度最大是0。25,这样因为激活函数的问题,造成每层乘以了最多0.25的乘积


tanh函数



也类似~~~


  关于relu:

Jarrett, K., Kavukcuoglu, K., Ranzato, M., and LeCun, Y. (2009a). What is the best multi-stagearchitecture for object recognition?

这篇论文详细介绍啦~
它的表达式为:
f(x)=max(0,x)

ReLU导数(分段):
x <= 0时,导数为0

x > 0时,导数为1
可见sigmoid函数值在[0,1],ReLU函数值在[0,+无穷],所以sigmoid函数可以描述概率,ReLU适合用来描述实数;sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。

阅读全文
0 0
原创粉丝点击