一篇文章理解深度神经网络5个常用**函数

一篇文章理解深度神经网络5个常用**函数

1.Sigmoid

  • Sigmoid非线性**函数的数学表达式是
    一篇文章理解深度神经网络5个常用**函数
  • Sigmoid非线性**函数的图像是
    一篇文章理解深度神经网络5个常用**函数
  • 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,这个时候
    一篇文章理解深度神经网络5个常用**函数
    如果x是0均值的数据,那么梯度就会有正有负。但是这个问题并不是太严重,因为一般神经网络在训练的时候,都是按批(batch)进行训练的,在一定程度上,缓解了这个问题。

2.Tanh

  • Tanh**函数是Sigmoid**函数的变形,其图像是
    一篇文章理解深度神经网络5个常用**函数
  • 它将输入的数据转换到-1~1之间,可以通过图像看出它将输出变成了0均值,在一定程度上解决了Sigmoid函数的第二个问题,但是仍存在梯度消失的问题。因此实际上Tanh**函数总是比Sigmoid**函数更好。

3.ReLU

  • ReLU**函数(Rectified Linear Unit)近几年变得越来越流行,它的数学表达式为
    一篇文章理解深度神经网络5个常用**函数
  • 这个**函数只是简单的将大于0的部分保留,将小于0的部分变为0,函数图形如下。
    一篇文章理解深度神经网络5个常用**函数
  • 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,它的数学形式可以表现为
    一篇文章理解深度神经网络5个常用**函数
  • 其中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差。
  • 在实际应用中,很少使用混合类型的**函数,一般在同一网络中使用同一**函数。