原文链接:https://blog.csdn.net/tyhj_sf/article/details/79932893
原文链接:https://blog.csdn.net/qq_40514904/article/details/103638147
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:


ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!


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)函数即充当了激活函数。
选择激活函数的小经验
如果输出的是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默认激活函数,而不用其他的激活函数,那就可能在近期或者往后,每次解决问题的时候都使用相同的方法。
原文链接:https://blog.csdn.net/qq_40514904/article/details/103638147
浙公网安备 33010602011771号