机器学习激活函数的使用
使用神经网路时,需要决定使用哪种激活函数在隐藏层,哪种用在输出节点上,常见的激活函数有sigmoid, tanh, Relu
1、三种不同的激活函数
sigmoid(z):
a
=
σ
(
z
)
=
1
1
+
ξ
−
z
a = \sigma(z) = \frac{1}{1+\xi^{-z}}
a=σ(z)=1+ξ−z1
tanh(z):
a
=
t
a
n
h
(
z
)
=
ξ
z
−
ξ
−
z
ξ
z
+
ξ
−
z
a = tanh(z) = \frac{\xi^z - \xi^{-z}}{\xi^z + \xi^{-z}}
a=tanh(z)=ξz+ξ−zξz−ξ−z
- 事实上,tanh函数事simmoid的向下平移和伸缩后的结果,对它进行了变形后,穿过了(0, 0)点,并且值介于 +1 和 -1 之间。
结果表明,在隐藏层上使用tanh函数结果总时优于sigmoid函数,因为函数值域在-1和+1的激活函数,其均值事更接近零均值的,在训练一个算法模型时,如果使用tanh函数代替sigmoid函数中心化数据,使得数据的平均值更接近0而不是0.5,这会使得下一层学习简单。 - 在讨论优化算法时,有一点要说明的是,我基本不使用sigmoid函数,**tanh函数在所有的场合都优于sigmoid函数。**但是有一个例外,在二分类问题中,对于输出层,因为y的值是0, 1, 所以想让y’的数值介于0和1之间,而不是在-1 和 +1 之间,所有这时候需要使用sigmoid函数。
- sigmoid函数和tanh函数两者的共同的缺点是,在z特别大或者特别小的情况下,导数的梯度或者函数的斜率会特别小,最后会接近0,导致降低梯度下降的速度。
- 在机器学习中另一个很流行的函数是:修正线性单元的函数(ReLu), ReLu函数图像是上图所示,所以z是正的情况下,导数恒等于1,当z是负数的情况下,导数恒等于0, 从实际上来说, 当使用z的导数时,z=0的导数时没有定义的,但在编程实现的时候,z的取值刚好等于0.000000, 这个值相当的小,所以,在实践中,不需要担心这个值,z时等于0的时候,假设一个导数是1或者0效果都可以 。
2、选择激活函数的小经验
- 如果输出的是0, 1二分类问题,那么输出层就选择sigmoid函数 ,然后其他的所有单元都选择Relu函数,这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,通常都会使用ReLu激活函数,有时也会使用tanh激活函数,但ReLu的一个优点是,当z是负值的时候,导数等于0.
- 上图还有一个另一个版本的ReLu,称为Leaky ReLu,当z是负值时,这个函数的值不是等于0,而是轻微的倾斜,这个函数通常要比ReLu激活函数效果要好,尽管在实际中Leaky ReLu使用的并不多。
- 两者的优点是,第一,在z的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个if-else语句,而sigmoid函数进行浮点四则运算,在实践中,使用ReLu激活函数神经网络通常要比sigmoid或者tanh激活函数学习的更快。第二,sigmodi和tanh函数的导数在正负饱和区的而梯度会接近0,这回造成梯度弥散,而ReLu和LeakyReLu函数大于0部分都为常熟,不会产生梯度弥散现象,同时应该注意的是,ReLu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而LeakyReLu不会有这个问题。
- z在ReLu的梯度一半都是0,但是有足够的隐藏层会使得z值大于0, 所以对大多数的训练数据来说学习过程应然可以很快。
- 快速总结:
- a. sigmoid函数:除了输出层是一个二分类问题,除非基本不会使用它。
- b.tanh函数,tanh是非常优秀的,几乎适合所有的场景
- c.ReLu激活函数,最常用的默认函数,如果不确定用哪个激活函数,就使用ReLu或者Leaky ReLu。
- a = max(0.01z, z)
- 为什么常数是0.01, 当然,可以为学习算法选择不同的参数
- 在选择自己神经网路的激活函数时,有一定的值观感受,在深度学习中经常遇到一个问题:在编写神经网络的时候,会有很多的选择,隐藏层的个数,激活函数的选择, 初始化权值,这些选择想到一个对比较好的直到原则时挺困难的。
- 鉴于以上的三个原因,以及在工业界的见闻,提供一种值观的感受,哪一种工业界用的最多,哪一种用的最少,但是,自己的神经网络的应用,以及特殊性,是很难提前直到选择哪些效果更好,所以通常的建议是,如果不确定哪一个激活函数的效果更好,可以把他们都试试,然后再验证集或者发展集上进行评价时,看哪一种的表现更好,就去使用它。
- 为自己的神经网络的应用测试这些不同的选择,会再以后检验自己的神经网络或者评估算法的时候,看到不同的效果,如果仅仅遵守ReLu默认激活函数,而不用其他的激活函数,那就可能在近期或者往后,每次解决问题的时候都使用相同的方法。
望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。