前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神经网络常用激活函

神经网络常用激活函

作者头像
用户7569543
发布2020-07-20 11:18:44
7050
发布2020-07-20 11:18:44
举报

前面我们说过神经网络的非线性主要是由激活函数实现的,如果没有激活函数的引入,那么无论多么复杂的神经网络其实都可以看成是多个单层神经网络的线性叠加,最后结果依然是线性的。

让我们看一个简单的例子来理解为什么神经网络一定要引入非线性的问题。我们用下图表示一个简单的XOR(异或)门。从图中我们可以看到,数据集中共有两个类,分别用交叉和圆圈来表示。当两个特征相同时,它们的类标签为红色交叉,否则就是蓝色圆圈。即当输入为(0,0)与(1,1)时,红色交叉的输出为0,当输入为(0,1)和(1,0)时,蓝色圆圈的输出为1。

注:异或门(英语:Exclusive-OR gate,简称XOR gate)是数字电路中的专用术语。它的基本规则是,若两个输入的电平相异,则输出为高电平1;若两个输入的电平相同,则输出为低电平0。即如果两个输入不同,则异或门输出1,反之则输出0。

通过上图我们可以看到,图中的数据点都是非线性可分的。也就是说,我们无法通过简单画一条直线来分开蓝色圆圈和红色交叉。因此,如果我们想将两个类准确分开,就需要通过非线性的决策边界来划分。所以如果没有激活函数引入非线性,神经网络就不能逼近XOR门,解决非线性可分的问题。然而遗憾的是,在我们的现实生活中,非线性可分的问题非常多!此外,激活函数对控制神经网络的输出范围也起着至关重要的作用。因为神经元的输出可以是很大的值,而这个输出,如果我们不经修饰就直接输入到下一层神经元中,就有可能演变成另一个更大的数,从而使整个计算过程变得难以处理(梯度爆炸)。而激活函数的任务之一就是将神经元的输出映射到某个范围内(例如:0到1之间)。接下来,我们将给大家分别介绍神经网络中几种常用的激活函数。

Sigmoid激活函数

Sigmoid也被称为逻辑激活函数(Logistic Activation Function),逻辑回归中常用,它能将一个实数值压缩到0到1的范围内。当我们的最终目标是预测概率时,它可以被应用到输出层。它最大的特点是,能将很大的负数向0转化,将很大的正数向1转变。在数学上表示为:

下图为sigmoid函数以及它的导数图像。

但Sigmoid激活函数在应用中也有一些缺点,它主要有以下几个方面的问题:

1.梯度消失 从Sigmoid函数图像可以看到,函数曲线在0和1附近是平坦的,也就是说,Sigmoid函数的梯度(导数)在0和1附近均为0。在反向传播过程中,当神经元的输出接近0或1时Sigmoid函数的梯度接近于0,这样的神经元被称为饱和神经元。因此,这些神经元的权值无法更新。不仅如此,与这些神经元相连接的神经元的权值也更新得非常缓慢,通常这个问题也被称为梯度消失。所以,想象如果有一个大型网络包含有许多处于饱和状态的Sigmoid激活函数的神经元,那么该神经网络将无法进行反向传播。

2.非零均值 Sigmoid函数图像不是关于原点对称,所以Sigmoid函数的输出不是零均值的。

3.计算量巨大 因为Sigmoid函数包含指数函数,它与其它非线性激活函数相比计算量相对较大。

注:Sigmoid 和 Softmax 两种函数间有一定的区别,Sigmoid通常用来解决二分类问题,Softmax通常用来解决多分类问题。Sigmoid可以看作是Softmax函数的特例,当任务是处理二分类问题时, Sigmoid 和 Softmax 是一样的。

Tanh激活函数

Tanh也被称为双曲正切激活函数,类似于Sigmoid激活函数,Tanh函数也是把一个实数值进行压缩。但与Sigmoid不同的是,Tanh函数在-1到1的输出范围内是零均值的。即可以把Tanh函数看做是两个Sigmoid叠加在一起。以下是Tanh函数图像以及它的导数图像。

在实际运用中,Tanh比Sigmoid更好。这主要是因为Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感,一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。而Tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解。与 Sigmoid 的区别是,Tanh 是 0 均值的,而Sigmoid是非0均值的。

但Tanh函数也存在着梯度消失的问题,当函数取值趋近正负无穷大时会导致梯度消失。为了解决梯度消失问题,让我们来看另一个被称为线性整流函数(ReLU)的非线性激活函数,它比我们前面讨论的两种激活函数都更好,并且也是在今天应用最为广泛的激活函数。

ReLU激活函数

Relu激活函数及其导数图像如下图所示:

在数学上,Relu激活函数可以用以下式子表示:

f(z)=max(0,z)

这意味着,当输入z<0时,输出为0。当输入z>0时,输出就是输入z本身。这个激活函数能够使神经网络更快收敛。没有饱和意味着至少在正数范围内,能够对梯度消失有抵抗能力,所以神经元至少在一半的输入范围内不会反向传播全部都是0的结果。Relu在计算效率上表现也非常不错,因为它是使用简单的阈值实现的。

下面我们来看看Relu函数是如何引入非线性的,所谓非线性,就是一阶导数不为常数。ReLu的定义是max(0, x),因此,Relu的导数为:

显然,Relu的导数在整个定义域内不是常数,所以Relu是非线性的。另外,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依赖关系,一定程度上缓解了过拟合问题。有些同学可能会说,ReLu函数的导数明明在大于0的区间是线性的,在小于等于0的部分也是线性的。但是,它整体不是线性的!因为在整个定义域内它不是一条直线,所以Relu函数是属于非线性函数。也就是说,线性和非线性都是就函数的整体而言的。Relu函数可以看成是通过构造很多的线形空间(类似于折叠的方式),去逼近非线性方程,解决非线性问题。

虽然Relu函数在一定程度上可以缓解梯度消失问题,但它也存在一定的问题,因为它将所有的输入负数变为0,在训练中可能很脆弱,很容易导致神经元失活,使得这些神经元在任何数据点上都不会再次被激活。简单地说,Relu可能导致某些神经元死亡,这就是所谓的dying Relu problem。

好了,本节课到此。有兴趣的同学可以在实践中分别尝试一下以上介绍的几种激活函数,对比一下它们的效果好坏。下节课准备给大家带来循环神经网络RNN,敬请期待!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 多赞云数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档