学习日志(五):激活函数

1.为什么要使用激活函数?

  在其前面讲解感知机的时候我们就提到了单层感知机是无法解决异或门问题的,如图一所示。单层感知机的激活函数是符号函数sgn(.),而在深度神经网络的训练中我们经常会遇到比如sigmoid,relu等的激活函数,它们的作用我们很清楚就是给模型添加非线性,使得模型能够更好的拟合实际情况。那么如果我们给单层感知机加入sigmoid等的激活函数引入非线性能否解决异或问题?答案见下方参考文献1、2和3.
  最终异或门的问题还是要通过多层感知机来实现,当然多层感知机如果不使用激活函数同样无法解决异或门问题。那么什么是多层感知机?就是将多个单层感知器进行组合,就可以得到一个多层感知器(MLP——Multi-Layer Perceptron)结构。 多层感知器包含输入层,一个或多个隐藏层以及一个输出层。每层的神经元与下一层进行完全连接。如果网络中包含一个以上的隐层,则称其为深度人工神经网络。
说明:

  • 通常我们说的神经网络的层,指具有计算的层,因为输入层没有计算,因此,通常输入层不计入神经网络的层次。
  • 多层感知器(深度神经网络)可以解决线性不可分问题。
    图一                 图一

2.激活函数的概念:

  在神经网络中,激活函数用来为每一个结点(神经元)定义输出,该输出可以作为下一个结点(神经元)的输入。

3.激活函数的作用:

  激活函数提供网络的非线性建模能力。如果不使用激活函数,即使是多层神经网络,也无法解决线性不可分的问题。

4.激活函数怎么引入非线性?

  关于这一点我也没有找到很好的解释,比较容易理解的方法就是大家直接看各个激活函数和线性函数的图像的区别,非线性激活函数的图像会有不同程度的曲率(斜率、导数、梯度)的变化就算是Relu它的斜率也是有变化的。单层感知机之所以不能解决异或门问题或者是不能解决非线性问题主要是因为它不能“变”,是直的,太死板。非线性激活函数它善于变通,可以“拐”,因此可以解决非线性问题,这就是我的理解。

5.常用的激活函数:

sigmoid函数:

数学表达式:
在这里插入图片描述
函数图像:
在这里插入图片描述
导数图像:
在这里插入图片描述
优点:
  它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
  sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。

  • 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
  • Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0,f=wx+b那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
  • 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

tanh函数:

数学表达式:
在这里插入图片描述
函数图像:
在这里插入图片描述
导数图像:
在这里插入图片描述
优点:

  • 解决了Sigmoid的输出不关于零点对称的问题
  • 具有Sigmoid的优点平滑,容易求导

缺点:

  • 激活函数运算量大(包含幂的运算)
  • Tanh的导数图像虽然最大之变大,使得梯度消失的问题得到一定的缓解,但是不能根本解决这个问题

relu函数:

数学表达式:
在这里插入图片描述
函数图像:
在这里插入图片描述
  relu是个分段线性函数,显然其导数在正半轴为1,负半轴为0,这样它在整个实数域上有一半的空间是不饱和的。相比之下,sigmoid函数几乎全部区域都是饱和的.
  ReLu是分段线性函数,它的非线性性很弱,因此网络一般要做得很深。但这正好迎合了我们的需求,因为在同样效果的前提下,往往深度比宽度更重要,更深的模型泛化能力更好。所以自从有了Relu激活函数,各种很深的模型都被提出来了,一个标志性的事件是应该是VGG模型和它在ImageNet上取得的成功.
导数图像:
在这里插入图片描述
优点:

  • 解决了gradient vanishing问题 (在正区间)
  • 计算速度非常快,只需要判断输入是否大于0
  • 收敛速度远快于sigmoid和tanh

缺点:

  • relu的输出不是zero-centered
  • 某些神经元可能永远不会被激活(Dead ReLU Problem),导致相应的参数永远不能被更新,也就说所谓的稀疏性。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

参考文献:
1.多层感知器及常见激活函数-深度神经网络DNN及计算推导
2.神经网络激活函数的作用是什么?
3.形象的解释神经网络激活函数的作用是什么?
4.常用激活函数(激励函数)理解与总结
5.几种常见激活函数(笔记整理)

猜你喜欢

转载自blog.csdn.net/weixin_44825185/article/details/106475099