神经网络学习(五)优化方法:激活函数

系列博客是博主学习神经网络中相关的笔记和一些个人理解,仅为作者记录笔记之用,不免有很多细节不对之处。
主要参考了几篇博文:几种常见的激活函数、几种常用激活函数的简介、ReLu(Rectified Linear Units)激活函数 和 The Activation Function in Deep Learning 浅谈深度学习中的激活函数

激活函数

下面几个激活函数的公式

神经网络学习(五)优化方法:激活函数_第1张图片

1. sigmod函数

在sigmod函数中我们可以看到,其输出是在(0,1)这个开区间内,这点很有意思,可以联想到概率,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。

sigmod函数本身是有一定的缺陷的。

  1. 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,我们都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmod函数,这个链条上的微分就很小很小了,况且还可能经过很多个sigmod函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。
  2. 函数输出不是以0为中心的,这样会使权重更新效率降低。因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。
  3. sigmod函数要进行指数运算,这个对于计算机来说是比较慢的。

2. ReLU函数

ReLU. 近年来,ReLU 变的越来越受欢迎。它的数学表达是: f(x)=max(0,x) f ( x ) = m a x ( 0 , x ) 。很显然,从上图可以看出,输入信号 <0时,输出为0,>0时,输出等于输入。ReLU的优点如下:

  1. 优点1:Krizhevsky发现使用 ReLU 得到的SGD的收敛速度会比sigmoid/tanh 快很多。有人说这是因为它是linear,而且梯度不会饱和
  2. 相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。

ReLU的缺点如下:

  1. ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
  2. 我们发现ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。

实验

在上一节中,我们实现了一个BP神经网络,这一节我们用这段代码做个GUI,方便我们进行实验测试(本节相关程序可以在这里下载)。GUI界面如下图所示。这里我们对上节的程序进行下修改,把隐层的激活函数换成可指定的方式,输出层仍旧使用sigmoid函数。隐层总共有9种激活函数可选:Sigmoid,Linear,Tanh,ArchTan,Relu,Parameteric ReLU(PReLU),ELU,SoftPlus和BentLinear。左下的Figure是用来显示激活函数和它的导数的,左上是测试数据(颜色表示类别),右上图是预测结果(颜色表示类别),右下是精度曲线。这个实验的数据是圆环2数据模式,训练数据5000,测试数据1000。下面是仅改变隐层神经元的一个对比。

神经网络学习(五)优化方法:激活函数_第2张图片ReLU激活函数,隐层神经元30个,最后分类精度为95.8% 神经网络学习(五)优化方法:激活函数_第3张图片sigmoid激活函数,隐层神经元30个,分类精度未发生改善,至于为什么会有这种情况不太清楚。在隐层神经元过多时候容易出现。可能是因为出现了过拟合,模型对训练数据匹配得较好,梯度非常小,模型不再更新
神经网络学习(五)优化方法:激活函数_第4张图片ReLU激活函数,隐层神经元20个,相对于30个神经元时,精度稍有提高。如果进行多次训练取平均值的话,两个差别不大
神经网络学习(五)优化方法:激活函数_第5张图片sigmoid激活函数,隐层神经元20个,分类精度明显提高
神经网络学习(五)优化方法:激活函数_第6张图片ReLU激活函数,隐层神经元10个,神经元数量太少,分类精度降低
神经网络学习(五)优化方法:激活函数_第7张图片
sigmoid激活函数,隐层神经元10个,分类精度降低

上面仅仅是一个实验示例。经过几天实验,得到以下几点认识 (这个实验得到的认识可能不是十分准确,甚至是错误的,因为这个BP程序只有一个隐层。也可以设置多个隐层,但是效果并不好):

  1. 数据比较复杂时,mini_batch的值设置的相对大一些,这样每次能覆盖不同的类型,训练的效果会更好
  2. 在训练次数相同时,ReLU激活函数的训练效果确实优于sigmoid函数。在大量次数(几十万次以上)训练后相差不大。
  3. sigmoid更容易出现过拟合。对于这个实验,隐层神经元为30个的时候,sigmoid会出现过拟合现象,几乎不能分类,在隐层神经元为10个的时候,能够进行部分分类,但是效果比不上ReLU的分类效果
  4. ReLU在小batch(比如10)时效果不好,总结下ReLU的特点,隐层比sigmoid需要的神经元多,学习速率相对要小一点,mini_batch的数量要大一些。

    -

你可能感兴趣的:(神经网络)