引言
学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:
- 什么是激活函数?
- 激活函数的用途(为什么需要激活函数)?
- 有哪些激活函数,都有什么性质和特点?
- 应用中如何选择合适的激活函数?
如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。
什么是激活函数?
首先要了解神经网络的基本模型
单一神经元模型如下图所示。
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。
激活函数的用途(为什么需要激活函数)?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
有哪些激活函数,都有什么性质和特点?
早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:
Sigmoid函数
Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
1
1
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
11
+
e
−
z
f
(
z
)
=
1
+
e
−
z
1
f(z)=11+e−zf(z)=11+e−zf(z)=11+e−zf(z)=11+e−zf(z)=11+e−z f(z)=\frac{1}{1+e^{-z}}f(z)=11+e−zf(z)=11+e−zf(z)=1+e−z1
f(z)=11+e−zf(z)=11+e−zf(z)=11+e−zf(z)=11+e−zf(z)=11+e−z f(z)=1+e−z1f(z)=11+e−zf(z)=11+e−zf(z)=1+e−z1f(x)={x,α(ex−1),if x>0otherwise
函数及其导数的图像如下图所示:
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
不会有Dead ReLU问题输出的均值接近0,zero-centered
- 1
- 2
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
MaxOut函数
这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。
应用中如何选择合适的激活函数?
这个问题目前没有确定的方法,凭一些经验吧。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.