让女朋友都能听懂的激活函数(激活函数)

激活函数原理详解

向女朋友介绍系列之激活函数。通过激活一词的解释,循循引入神经网络为什么要激活函数。分析了几种常见的激活函数并且激活函数的特点。  

目录

激活函数原理详解

激活函数是什么

感知机中的激活函数

神经网络中的激活函数

下面咱们来具体看几个激活函数

sigmod激活函数

Tanh(双曲正切函数)激活函数

ReLU激活函数(最近最常使用的激活函数)

Leaky ReLU激活函数

输出层的激活函数

激活函数的特点



激活函数是什么

大管今天准备和大家来聊一聊激活函数,为了让女朋友也能够听的懂,我们还是从最简单的事情说起。

    上文的末尾说到了激活函数的作用在于决定如何来激活输入信号的总和。那究竟什么是激活呢?凭着我们最直观的感受就是从一种状态转变为另一种状态(突然想起以前有一种功能饮料——激活,你可以想想它的广告,一个人开始是疲惫不堪慢悠悠的状态,喝了激活之后,瞬间变成了精神抖擞的精神小伙,很好的诠释了激活一词的含义)。回归正题,神经网络毕竟是在模拟人脑的神经元,从生物学上来说,是因为人脑的细胞接受刺激从而产生活动,首先需要一定的阈值,没有达到阈值,几乎没用。而不同的刺激产生的输出也是不同的,达到一定值后就饱和了,再加大也没用。作为模拟人脑的人工神经网络,自然是需要某种机制来模拟这一种活动,这便是激活函数根本性的由来。

感知机中的激活函数

     在上文中大管一直提到了一个词"阈值",比如说,当x大于0,我们就把它输出为1,当其小于0,我们就把它输出为0,这样的函数我们称之为“阶跃函数”,如下图所示:

上图中,蓝色的线就是阶跃函数的线。它的实现非常简单:

def step_function(x):
    if x>0:
        return 1
    else:
        return 0

实际上,如果将阶跃函数换成其他的函数就进入了神经网络世界了(实现了阶跃的功能)。

神经网络中的激活函数

大管在这里和各位大佬聊几个常用的神经网络中的激活函数。

      在说之前,我们应该注意神经网络中的激活函数必须使用非线性函数。为什么不能使用线性函数作为激活函数呢,因为使用线性函数的话,加深神经网络的层数就没有意义了。那怎么就没有意义了呢?当我们使用线性函数作为神经网络的激活函数时,会发现总是存在与之等效的无隐藏层的神经网络。比如,我们将h(x)=cx作为神经网络的激活函数(c为常数),那么三层神经网络之后的激活函数可以写成y(x)=h(h(h(x))),将激活函数带入,得到y(x)=c*c*c*x,我们令c*c*c=a(都为常数),则y(x)=ax,这是我们发现它相当于没有了隐藏层。所以为了发挥隐藏层(深度学习中的深度)的优势(隐藏层即叠加层,它的优势在叠加感知机中体现了),激活函数必须使用非线性函数。

下面咱们来具体看几个激活函数

sigmod激活函数

其公式为:

看着公式我们将sigmod激活函数的代码实现如下:

def sigmod(x):
    y = 1/(1+np.exp(-x))
    return y

我们将其图像画出来:

      从sigmod的函数图像中看到它和阶跃函数的图像很像,当输入很小的时候,输出都接近于0,随着输入的增大,输出更加向1靠拢,不过输入信号有多少,输出信号总是在0-1之间。只不过它比阶跃函数更加平滑了许多(平滑性对神经网络的学习具有重要的意义),它的特点也显而易见,求导简单,是单调函数,在定义域内处处可导(先不考虑为什要求导),在x接近无穷时,导数接近于0,梯度接近消失(饱和性)。

Tanh(双曲正切函数)激活函数

其公式为:

看着公式我们将tanh激活函数的代码实现如下:

def tanh(x):
    y = (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
    return y

我们将其函数图像画出来:

      从图像上看它和sigmod激活函数图像也很相似,只是相当于将sigmod向下平移。但是仔细观察图像,它和sigmod函数的图像又有区别,它解决了sigmod函数的输出不关于零点对称问题,虽然它的最大值最小值有所调整,但是也不能解决梯度消失的问题,同时它的计算量也很大,包含幂运算。

ReLU激活函数(最近最常使用的激活函数)

其公式为:

我们将ReLU激活函数的代码实现如下:

def ReLU(x):
    y = np.maximum(0,x)
    return y

我们将其图像画出来:

      从图像上看,它和前两种激活函数有很大的区别。右侧为单调函数,虽然ReLU在数学上的定义x=0处是不可导的,但是实际中为了解决这个问题直接将处的导数设置为1 ,当x>0时,Relu’(x) = 1,   当x<=0时,Relu’(x) = 0。它计算量小,相对于之前使用sigmoid和Tanh激活函数需要进行指数运算,缓解了在深层网络中使用sigmoid和Tanh激活函数造成了梯度消失的现象,同时也缓解了过拟合的问题,由于函数会使小于零的值变成零,使得一部分神经元的输出为0,造成特征的稀疏性,如果特征是稀疏的,那就有更大的线性可分的可能性,高维的稀疏特征空间上会被映射到一个更加简单的低维流形面上,减少参数相互依赖的关系缓解过拟合的问题(划重点)。但是Relu激活函数在小于0的部分都会为0,使得小于0的部分的信息完全丢弃(死亡)。为了解决这一问题,有专家又对其进行了改进,我们来看其中的一种激活函数。

Leaky ReLU激活函数

其公式为:

我们将Leaky ReLU激活函数的代码实现如下:

def ReLU(x,a):
    y = np.maximum(ax,x)
    return y

我们将其图像画出来:

      从图像中看它对Relu函数进行了优化,思路就是让函数小于0的部分不直接为0,而是等于一个很小的数,使得负轴的信息不至于完全丢弃。

输出层的激活函数

      神经网络可以用在分类问题和回归问题上,不过需要依据现实情况改变输出层的激活函数。大体上说,回归问题使用恒等函数,分类为问题使用softmax函数。

恒等函数会将输入按照原样进行输出,对输入信息不加以任何的改动。

softmax函数可以使用下面的公式表示:

      输出层有n个神经元,计算第k个神经元的输出yk。通过公式可以看到,其输出时0—1之间的实数,并且其输出值的和总是1,因此我们可以将softmax函数的输出看做“概率”。需要注意的是,即使输出层使用了softmax函数,各个神经元之间的大小关系也不会改变,输出值最大的神经元的位置也不会改变,神经网络只是把输出值最大的神经元对应的类别作为识别的结果。所以神经网络进行分类时,输出层的softmax函数可以省略。

如果要使用softmax函数时,因为公式里有指数运算,需要格外当心溢出的问题。经常使用如下方法对softmax函数进行改进:

原则上上述的C'可以使用任何值,但是为了防止溢出的发生,一般使用输入信号中的最大值。

我们将softmax函数实现如下:


def softmax(a):
    c = np.max(a)
    e_a = np.exp(a - c)
    sum_e_a = np.sum(e_a)
    y = e_a/sum_e_a
    return y

激活函数的特点

     上文比较了几个常见的激活函数,那具体什么样子的函数适合做激活函数呢(激活函数有什么共同的特点呢)?

首先是非线性,前面有过解释,如果是线性的激活函数就会失去深度学习的意义;

其次是几乎处处可微,可微的条件使得激活函数的梯度优化具有可能性,对于分段线性函数比如ReLU,只满足几乎处处可微,但是对于SGD算法来说,有限的不可微点对于优化结果不会有很大的影响;

还有计算简单,这也是Relu激活函数受欢迎的原因之一;

保证某些区间导数不为0(非饱和性),某些区间梯度的消失会使得参数无法进行更新,比如说Leaky ReLU的出现正式改进了Relu在小于0的区间梯度消失;

单调性,激活函数的单调性使得梯度的方向不经常发生改变,从而更容易收敛;

多内容下载机器学习资料请扫描下方二维码关注小编公众号:程序员大管

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值