一篇文章理解深度神经网络5个常用**函数
1.Sigmoid
- Sigmoid非线性**函数的数学表达式是
- Sigmoid非线性**函数的图像是
- Sigmoid**函数是将一个实数输入转化到0~1之间的输出,就是将越大的负数转化到越靠近0,越大的正数转化到越靠近1,历史上Sigmoid函数频繁的使用,因为其具有良好的解释性。
- 但是最近几年,Sigmoid函数已经越来越少的被使用了,主要是因为Sigmoid函数有以下两大缺点。
- (1)Sigmoid函数会造成梯度消失。一个非常不好的特点就是Sigmoid函数在靠近1和0的两端时,梯度会几乎变成0。梯度下降法通过梯度乘上学习率来更新参数,因此如果梯度接近0,那么没有任何信息来更新参数,这样就会造成模型不收敛。另外,如果使用Sigmoid函数,那么需要在初始化权重的时候也必须非常小心,如果初始化的时候权重太大,那么经过**函数也会导致大多数神经元变得饱和,没有办法更新参数。
- (2)Sigmoid输出不是以0为均值,这就会导致经过Sigmoid**函数之后的输出,作为后面一层网络的输入的时候是非0均值的,这个时候如果输入进入下一层神经元的时候全是正的,这就会导致梯度全是正的,那么在更新参数的时候永远都是正梯度。比如进入下一层神经元的输入是x,参数是w和b,那么输出就是
f = wx + b
,这个时候
如果x是0均值的数据,那么梯度就会有正有负。但是这个问题并不是太严重,因为一般神经网络在训练的时候,都是按批(batch)进行训练的,在一定程度上,缓解了这个问题。
2.Tanh
- Tanh**函数是Sigmoid**函数的变形,其图像是
- 它将输入的数据转换到-1~1之间,可以通过图像看出它将输出变成了0均值,在一定程度上解决了Sigmoid函数的第二个问题,但是仍存在梯度消失的问题。因此实际上Tanh**函数总是比Sigmoid**函数更好。
3.ReLU
- ReLU**函数(Rectified Linear Unit)近几年变得越来越流行,它的数学表达式为
- 这个**函数只是简单的将大于0的部分保留,将小于0的部分变为0,函数图形如下。
- ReLU的优点。
- (1)相比于Sigmoid**函数和Tanh**函数,ReLU**函数能够极大地加速随机梯度下降法的收敛速度,这是因为它是线性的,且不存在梯度消失的问题。
- (2)相比于Sigmoid**函数和Tanh**函数的复杂计算而言,ReLU的计算方法更简单,只需要一个阈值过滤就可以得到结果,不需要进行一大堆复杂的运算。
- ReLU的缺点。
- 训练的时候很脆弱。比如一个很大的梯度经过ReLU**函数,更新参数后,会使这个神经元不会对任何数据有**现象。如果发生这种情况之后,经过ReLU的梯度永远都会是0,也就意味着参数无法再更新了,因为ReLU**函数本质上是一个不可逆的过程,因为它会直接去掉输入小于0的部分,在实际操作中可以通过设置比较小的学习率来避免这个小问题。
4.Leaky ReLU
- Leaky ReLU**函数是ReLU**函数的变式,主要为了修复ReLU**函数中训练比较脆弱的这个缺点,不将小于0的部分变为0,而是给它一个很小的负的斜率,比如0.01,它的数学形式可以表现为
- 其中
a
是一个很小的常数,这样就可以使得输入小于0的时候也有一个小的梯度。关于Leaky ReLU**函数的效果,一些实验证明很好,一些实验证明不好。
5.Maxout
- 另外一种**函数的类型并不是
f(w*x+b)
作用在一种输出结果的形式,而是max(w1*x+b1,w2*x+b2)
这种Maxout类型,可以发现ReLU**函数只是Maxout中w1=0
,b1=1
的特殊形式。因此Maxout既有ReLU**函数的优点,同时也避免了ReLU函数训练脆弱的缺点。不过,Maxout**函数的缺点是加倍了模型的参数,导致模型的存储变大。
小结
- 通过上面的部分,简单介绍了一些**函数的优缺点,实际使用较多的**函数还是ReLU**函数,但是注意学习率不要设定太大了。
- 一定不要使用Sigmoid**函数,可以尝试Tanh**函数,但一般Tanh的实际效果比ReLU和Maxout差。
- 在实际应用中,很少使用混合类型的**函数,一般在同一网络中使用同一**函数。