常用激活函数--小白角度 TensorFlow 机器学习 神经网络 选取

先简单介绍一下激活函数

第一次 我的三脚猫功夫

M-P神经元模型
如上图“M-P神经元模型”,“当前神经元”接受上一层神经元的输出的线性函数,然后与阈值进行比较,得到一个值,试想一下,如果没有我后面的的函数f,那么所有的神经元都是上一层的神经元的输出的线性函数,即使有多层隐含层,每个隐含层有多个神经元,但仅仅只是线性函数在神经元里的传递,那我们可以直接推导一下,不过是一个权值乘上一串多项式,下一次再乘上一个权值,那我其实可以直接由输入就直接推导出输出来,最后得到的,其实还是一个线性函数,不过是有好几个权值相乘作为系数,可以想之,逼近能力应该非常有限,所以引入了非线性的额函数来作为激活函数,遮掩神经网路的逼近程度,拟合程度就会达到我们想要的效果。

常用激活函数review

1、阶跃函数

我们很自然能想到的函数当然就是阶跃函数,它将输入值映射为输出值"0" 或“1”,“显然"1” 对应于神经元兴奋, “0” 对应于神经元抑制,这与生物学意义的神经元非常类似。
** 图像 **
在这里插入图片描述
** 特点 **
我们很容易发现,阶跃函数具有不连续、不光滑等不太好的性质,所以这个函数在这里我只是举出来做一个帮助理解的引子。

2、Sigmoid函数(logistic函数)

在上面的基础上,sigmoid函数就作为一个很好的函数出现了
** 图像**
Sigmoid函数
导函数 图像
sigmoid函数的导函数
sigmoid函数作为非线性激活函数,但是现在不常用了,原因如下
缺点一:当 z 值非常大或者非常小时,通过上图我们可以看到,sigmoid函数的导数 g′(z) 将接近 0 。这会导致权重 W 的梯度将接近 0 ,使得梯度更新十分缓慢,即梯度消失
下面我通过西瓜书的推导来进行举例说明这个缺点:
在这里插入图片描述
缺点2:Sigmoid 的函数值是在0到1 之间,不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0, f=wTx+bx,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。而且针对这个问题下面的tanh函数就有很好的解决效果。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

3、Hyperbolic Tangent函数

在这里插入图片描述
函数 图像
在这里插入图片描述
可以看出他几乎和上面的sigmoid函数一样,但它的函数值是在[-1,1]之间的,就也可以有效地解决上述sigmoid函数的第二个问题,但是由于他们后函数形态几乎一样,所以第一个梯度消失和幂运算的问题依然存在。

4、Relu函数

它的函数解析式为 R e l u = m a x ( 0 , x ) Relu=max(0,x) Relu=max(0,x)
它相当于一个分段函数
R e l u ( x ) = { 0 , x < = 0 x , x > 0 Relu(x) = \left \{\begin{array}{cc} 0, &x <= 0\\ x, & x > 0 \end{array}\right. Relu(x)={0,x,x<=0x>0
函数 图像
**ReLU目前是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试 **
Relu函数图像
可以看出它的计算是非常快的,当输入大于零的时候,就直接output = input,另外在权值更新公式里面,也可以直观地想象一下,他的收敛速度也很快。
再来看它的 导函数 图像
在这里插入图片描述
很明显他没有梯度消失的问题,但这里需要注意的事情是,这个函数不是在整个区间可导的,我这里使用的是次梯度。而且之前提到的zero-centered的问题又出来了,另外有一个问题我还暂时没有理解,参考了别人的观点,然后迁移到我这里的,就是说Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
参数初始化我并不是很了解,所以在这里解释一下第二点,在上一张手写的解释中,我们知道学习率η控制着算法每一轮迭代中权重W的更新步长,学习率太大则容易振荡,太小则收敛速度又会过慢。一旦梯度小于零,输入的结果就是零而且永远都是零,权重为零那么这个神经元就再也不会有更新也就说这个神经元坏死了!依我个人的理解,我觉得unlucky的参数初始化可能也是这个原因。

5、Leaky ReLU函数

函数式是 LeakyRelu=max(0.01x,x)
L e a k y R e l u = m a x ( 0.01 x , x ) LeakyRelu=max(0.01x,x) LeakyRelu=max(0.01x,x)
很明显它就是针对上一个问题提出来的改进的函数,它也相当于一个分段函数 L e a k y R e l u ( x ) = { 0.01 x , x < = 0 x , x > 0 LeakyRelu(x) = \left \{\begin{array}{cc} 0.01x, &x <= 0\\ x, & x > 0 \end{array}\right. LeakyRelu(x)={0.01x,x,x<=0x>0
函数 图像
在这里插入图片描述

以上是它的实际图像,但由于参数0.01实在太小,画出来在负数轴的部分看起来是0,所以去哦调整了参数使得看起来更加直观↓
在这里插入图片描述
这个函数,继承了Relu函数的优点并且改进了它的缺点,但在实践好像并没有人证明LeakyRule总是比Relu好,只是在理论层面解决了那些可能出现的问题。
就在我画这个调整参数的图的时候,我在想为啥是0.01呢?为啥不是别的呢?然后我发现了一系列的同类型函数
P-ReLU 函数
L e a k y R e l u ( x ) = { a x , x < = 0 x , x > 0 LeakyRelu(x) = \left \{\begin{array}{cc} ax, &x <= 0\\ x, & x > 0 \end{array}\right. LeakyRelu(x)={ax,x,x<=0x>0
它的a不像上面的0.01是一个经验参数,这个a是一个参数,它的值取决于数据,它作为一个可学习的变量融入训练过程,解决参数不稳定的问题。
参数化ReLu在带来更大自由度的同时,可能增加模型过拟合风险。
还有一个Random-ReLu 函数
它的函数形式同上,但是这里的Random就是说我的这个a在训练过程是在一个均匀分布的数据集合中随机给的a~U(l,u) l,u∈[0,1),到了测试阶段它又变成了一个定值。
下面是几个函数的直观上的一个比较
在这里插入图片描述
图片来自链接: link.
ELU (Exponential Linear Units) 函数 E L U ( x ) = { a ( e x − 1 ) , x < = 0 x , x > 0 ELU(x) = \left \{\begin{array}{cc} a (e^x - 1), &x <= 0\\ x, & x > 0 \end{array}\right. ELU(x)={a(ex1),x,x<=0x>0
函数及导函数图像
在这里插入图片描述
这个函数优点是做到了均值为0,但存在着计算困难和数较小会趋于零的情况。

6、Softmax函数

ok,为了研究这个softmax函数我还跑去看了斯坦福大学CS224n课程,但没有更多的收获,不过,这个函数在句法分析器等等多分类问题上有比较的表现。
函数表达式
f ( x ) = e w i T x ∑ k = i K e w k T x f(x) = \frac{e^{w_i^{T}x}}{\sum _{k=i}^{K}e^{w_k^{T}x} } f(x)=k=iKewkTxewiTx
其中 w w w x x x是列向量。 e w i T x e^{w_i^{T}x} ewiTx可能被换成函数关于 x x x的函数 f ( x ) f(x) f(x).
通过softmax函数,可以使得P(i)的范围在[0,1]之间,在回归和分类问题中,通常/是待求参数,通过寻找使得 f ( x ) f(x) f(x)最大的 w w w,作为最佳参数。可以针对多个类别,预测出每个类别的归一化概率,所以通常softmax函数是在分类器的输出层使用。

7、MaxOut函数

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)首先均值为0很重要,可以加快收敛速度,所以从这个角度softmax、tanh其实比logistic好一些
(2)计算速度也很重要,Relu函数是好个选择,至于后面的一些扩展的,至今没有实际的实验证明它们更好,so,看你选择咯。当然拿来做交叉验证很不错的。
(3)哦,对了,使用Relu一定要注意参数的初始化和学习率避免神经元死掉哦
哈哈哈终于写完啦哈哈哈哈
在这里插入图片描述
在这里插入图片描述
开心到头掉
参考:《Understanding the difficulty of training deep feedforward neural networks》
《机器学习》
《maxout networks》
还有好多找不到了
。。。
链接: link.
链接: link.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值