干货 | 深入理解深度学习中的激活函数

理解深度学习中的激活函数

在这个文章中,我们将会了解几种不同的激活函数,同时也会了解到哪个激活函数优于其他的激活函数,以及各个激活函数的优缺点。

1. 什么是激活函数?

生物神经网络是人工神经网络的起源。然而,人工神经网络(ANNs)的工作机制与大脑的工作机制并不是十分的相似。不过在我们了解为什么把激活函数应用在人工神经网络中之前,了解一下激活函数与生物神经网络的关联依然是十分有用的。

一个典型神经元的物理结构由细胞体、向其他神经元发送信息的轴突以及从其他神经元接受信号或信息的树突组成。

? 图一 生物神经网络

? 图一中,红色的圆圈表示两个神经元连接的区域。神经元通过树突从其他神经元中接受信号。树突的信号强度称为突触权值,用于与传入信号相乘。树突传出的信号在细胞体中累积,如果最后的信号强度超过了某个阈值,神经元就会允许轴突中的信息继续传递。否则,信号就会被阻止而得不到进一步的传播。

? 激活函数决定了信号是否能够被通过。这个例子仅仅是个只有阈值这一个参数的简单的阶跃函数。现在,当我们学习了一些新东西(或者忘掉一些东西)时,阈值以及一些神经元的突触权重会发生改变。这在神经元中创造了新的连接从而使得大脑能学习到新的东西。

? 让我们在人工神经元的基础上来再次理解相同的概念。

? 图二 所示的例子是一个输入为\((x_1-x_n)\)的神经元,输入对应

? 的权重分布为\((w_1-w_n)\),偏置为(b),激活函数\((f)\)作用于输入

? 的权重之和上面。

? 图二中的\((x_1,...,x_n)\)是与权重\((w_1,...,w_n)\)相乘的信号向量,接着是累加(例如:总和+偏置b)。最后,激活函数f作用于这个累加的总和。请注意,权重\((w_1,...,w_n)\)和偏置b把输入信号转换为线性的。而另一方面,激活函数把信号转换为非线性的,而这种非线性使得我们能够学习到输入与输出之间任意复杂的变换关系。

? 这些年来,人们使用了各种各样的激活函数,但是寻找一个合适的激活函数使神经网络学习得更好更快依然是一个非常活跃的研究领域。

2. 网络是怎么学习的?

? 理解神经网络学习的基本概念是关键。假设网络原本应该得到的输出为y。网络产生的输出为\(y'\)。应该得到的输出与实际得到的输出之间的差值\((y-y')\)被转换为损失函数\((J)\)的度量。当神经网络的错误很多时,该损失很大,而当损失很小时则网络的错误也很少。整个训练过程就是在训练集上寻找使损失函数最小的权值和偏置。

? 图三 梯度下降

在图三中,损失函数的形状像一个碗。在训练过程中的任何一点,损失函数关于权值的偏导数只是在碗的当前位置上的斜率。可见通过向偏导数预测出的方向移动,我们可以到达碗的底部,从而最小化了损失函数。这个使用函数的偏导数来迭代找到局部最小值的方法称为梯度下降法。

? 在人工神经网络中,权值通过称为反向传播的方法来更新。损失函数关于权值的偏导数用于更新权值。在某种意义上来说,误差是在网络上用导数来反向传播的。这是用迭代的方式来完成的,在许多轮迭代之后,损失达到最小值,并且损失函数的导数变为0。

3. 激活函数的类型

  • 线性激活函数:形式为\(f(x)=x\)的简单的线性函数。基本上,输入不经过任何修正就传递给输出。

? 图四 线性激活函数

  • 非线性激活函数:这些函数用于分离非线性可分的数据,并且是最常使用的激活函数。一个非线性等式决定了从输入到输出的映射。不同类型的非线性激活函数分别有sigmod, tanh, relu, lrelu, prelu, swish等等。本文接下来会详细的讨论这些激活函数。

    ? 图五 非线性激活函数

4. 在一个人工神经网络中,我们为什么需要非线性激活函数?

? 神经网络用于实现复杂的函数,而非线性激活函数能够使神经网络逼近任意复杂的函数。如果没有激活函数引入的非线性,多层神经网络就相当于单层的神经网络。

? 让我们看一个简单的例子来理解为什么没有非线性,神经网络甚至不可能逼近像XOR和XNOR门这样简单的函数。在图六中,我们用图表表示了XOR门。我们的数据集中有两个类,分别用交叉和圆圈来表示。当两个特征\(x_1\)和\(x_2\)相同时,类的标签为红色交叉,否则就是蓝色圆圈。当输入为(0,0)与(1,1)时红色交叉的输出为0,输入为(0,1)和(1,0)时的蓝色圆圈的输出为1。

? 图六 XOR门的图形表示

? 通过图六我们可以看到数据点都是非线性可分的。也就是说,我们无法画出一条笔直的直线来分开蓝色圆圈和红色交叉。因此,我们才需要非线性的决策边界来将它们分开。如果没有非线性,神经网络就不能逼近XOR门。

? 激活函数对控制神经网络的输出范围也起着至关重要的作用。神经元的输出\(\sum_i^n{w_ix_i+b}\)可以是非常大的值。而这个输出,若我们不经修改就输入到下一层神经元中,有可能演变成一个非常大的数从而使得计算过程非常难以处理。而激活函数的任务之一就是将神经元的输出映射到某个范围内(例如:0到1之间)。
接下来,我们准备去了解一下不同类型的激活函数。

5. 非线性激活函数的类型

5.1 Sigmoid激活函数

? Sigmoid也被称为逻辑激活函数(Logistic Activation Function)。它将一个实数值压缩到0至1的范围内。当我们的最终目标是预测概率时,它可以被应用到输出层。它使很大的负数向0转变,很大的正数向1转变。在数学上表示为
\[
\alpha(x)=\frac{1}{1+e^{-x}}
\]
下图为sigmoid函数以及它的导数图像。

? 图七 Sigmoid激活函数 图八 Sigmoid激活函数的导数

? Sigmoid激活函数的三个主要缺点是:

  • 梯度消失:sigmoid函数在0和1附近是平坦的。也就是说,sigmoid的梯度在0和1附近为0。在通过sigmoid函数网络反向传播时,当神经元的输出近似于0和1时它的梯度接近于0。这些神经元被称为饱和神经元。因此,这些神经元的权值无法更新。不仅如此,与这些神经元相连接的神经元的权值也更新得非常缓慢。这个问题也被称为梯度消失。所以,想象如果有一个大型网络包含有许多处于饱和动态的sigmoid激活函数的神经元,那么网络将会无法进行反向传播。
  • 不是零均值:sigmoid的输出不是零均值的。
  • 计算量太大:指数函数与其它非线性激活函数相比计算量太大了。

    下一个要讨论的是解决了sigmoid中零均值问题的非线性激活函数。

5.2 Tanh激活函数

? 图九 Tanh激活函数 图十 Tanh激活函数的导数

? Tanh也被称为双曲正切激活函数。类似sigmoid,tanh也是把一个实数值压缩到-1到1的范围内。与sigmoid不同的是,tanh在-1到1的输出范围内是零均值的。你可以把tanh函数看做是两个sigmoid加在一起。在实际运用中,tanh比sigmoid更好。负数的输入被认为是更大的负数,零值输入映射到零的附近,而正数的输入被认为是正的。Tanh唯一的缺点是:tanh函数也存在着梯度消失的问题,因此在饱和时会导致梯度消失。

? 为了解决梯度消失问题,让我们讨论另一个被称为线性整流函数(ReLU)的非线性激活函数,它比我们之前讨论的两个激活函数都更好,并且也是在今天应用最为广泛的激活函数。

5.3 线性整流函数(ReLU)

? 图十一 ReLU激活函数 图十二 ReLU激活函数的导数

? 如图十一所示,ReLU激活函数从底部进行了半矫正(half-rectified)。在数学上,它可以由这个简单的表达式表达:\[f(x)=max(x,0)\]

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

? 但是Relu神经元有几个缺点:

  • 不是零均值的:与sigmoid相同,它的输出不是零均值的。
  • Relu的另一个问题是,如果在前向传播的过程中\(x<0\),神经元保持没有被激活的状态并且在反向传播时抵消了梯度。此时权值得不到更新,网络无法学习。当\(x=0\)时,斜率在这个点是没有定义的,不过这个问题在实现的过程中通过选择左或者右梯度解决。

    为了解决relu激活函数在x<0时的梯度消失问题, 我们提出了被称为泄漏relu(Leaky Relu)的激活函数,这个激活函数试图解决ReLU激活函数”Dead ReLU”的问题。让我们详细了解一下leaky relu。

5.4泄漏ReLU激活函数(leaky relu)

? 图十三 Leaky ReLU激活函数

? Leaky ReLU激活函数是一个想要缓解relu消亡问题的尝试。它的函数表达式如下:

? \[f(x)=max(0.1x,x)\]

? Leaky relu的思想就是当\(x<0\)时,会有个很小0.1的正斜率。这个函数多少消除了relu的消亡问题,但是它的结果并不一致。虽然它具有relu激活函数的所有特征,例如:计算效率高、收敛速度快、在正区域不饱和等。

? 它的思想可以进一步的扩展。如用一个常数项代替乘以x,从而使我们能够将这个常数项乘以一个能够使leaky relu更好工作的超参数。这个leaky relu的拓展被称为parametric relu(参数relu)。

5.5 参数ReLU激活函数(Parametric ReLU)

? PRelu的函数为:\(f(x)=max(\alpha{x},x)\)

? 其中\(\alpha\)为超参数。PRelu的思想是引进任意超参数\(\alpha\),而这个\(\alpha\)可以通过反向传播学习。这赋予了神经元在负区域内选择最好斜率的能力,因此,他们可以变成单纯的ReLU激活函数或者Leaky ReLU激活函数。

? 总之,它优于ReLU,但是你可以通过实验使用Leaky ReLU或者Parametric ReLU来观察它们是否能对你的问题给出最好的结果。

5.6 SWISH激活函数

?

? 图十四 SWISH激活函数

? Swish也被称为self-gated(自门控)激活函数,最近由谷歌研究人员发布。它的数学表达式为:
\[
\alpha{(x)}=\frac{x}{1+e^{-x}}
\]
? 通过阅读论文我们可以了解到,swish激活函数的表现比relu更好。从图十四中我们可以观察到swish激活函数在x轴的负区域内末端的图像形状与relu激活函数是不同的,这是因为swich激活函数即使输入的值在增加,它的输出也可以减少。大部分的激活函数都是单调的,即他们的输出值在输入增加的时候是不会减少的。Swish在0点具有单边有界性,平滑且不单调。

参考:
https://www.learnopencv.com/understanding-activation-functions-in-deep-learning/

推荐阅读

原来CNN是这样提取图像特征的。。。
算力限制场景下的目标检测实战浅谈
开源 | 用深度学习让你的照片变得美丽
面试时让你手推公式不在害怕 | 线性回归
深度学习在计算机视觉各项任务中的应用

原文地址:https://www.cnblogs.com/CV-life/p/10449293.html

时间: 2024-07-30 17:23:09

干货 | 深入理解深度学习中的激活函数的相关文章

如何理解深度学习中的Transposed Convolution?

知乎上的讨论:https://www.zhihu.com/question/43609045?sort=created 不过看的云里雾里,越看越糊涂. 直到看到了这个:http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic 讲的非常清楚非常好

利用Theano理解深度学习——Multilayer Perceptron

一.多层感知机MLP 1.MLP概述 对于含有单个隐含层的多层感知机(single-hidden-layer Multi-Layer Perceptron, MLP),可以将其看成是一个特殊的Logistic回归分类器,这个特殊的Logistic回归分类器首先通过一个非线性变换Φ(non-linear transformation)对样本的输入进行非线性变换,然后将变换后的值作为Logistic回归的输入.非线性变换的目的是将输入的样本映射到一个空间,在该空间中,这些样本是线性可分的.这个中间层

深度学习中的常见问题汇总(一)

深度学习中的常见问题汇总(一) 转自 卷积神经网络的复杂度分析 关于感受野的总结 1.CNN复杂度分析 在深度学习基础网络不断进化的过程中,可以发现新的模型不仅性能有极大地提升,网络的复杂度通常也会更低.深度学习网络模型的复杂度直接关系到其实际应用中的速度与可行性,因此这里总结一下 CNN 复杂度的含义与计算方式. 1.1时间复杂度 通常,我们假设计算机运行一行基础代码需要一次运算,那么模型的时间复杂度即为模型的运算次数,用浮点运算次数 FLOPs(FLoating-point OPeratio

浅谈深度学习中潜藏的稀疏表达

浅谈深度学习中潜藏的稀疏表达 “王杨卢骆当时体,轻薄为文哂未休. 尔曹身与名俱灭,不废江河万古流.” — 唐 杜甫<戏为六绝句>(其二) [不要为我为啥放这首在开头,千人千面千理解吧] 深度学习:概述和一孔之见 深度学习(DL),或说深度神经网络(DNN), 作为传统机器学习中神经网络(NN).感知机(perceptron)模型的扩展延伸,正掀起铺天盖地的热潮.DNN火箭般的研究速度,在短短数年内带来了能“读懂”照片内容的图像识别系统,能和人对话到毫无PS痕迹的语音助手,能击败围棋世界冠军.引

深度学习中得数学,高效计算基础与线性分类器

深度学习说到底就是要调节网络中得权重,使网络的分类结果更接近于训练值.这个重复迭代的过程又是一个线性回归的问题.在这种可能会用到高数,线性代数,概率论中的知识. 一.数学基础提一提. 1.高数中得知识. 高数中最重要的就是微积分了,那在深度学习中出现最多的一个概念就是梯度.什么是梯度呢?要说导数,学过高数的肯定都知道.其实梯度就是当把标量x变成向量X时,对X求导就是梯度.那为什么要用梯度呢?因为梯度等于0在凸函数中往往代表着一个极小值点.我们要求得就是损失函数的极小值,这正是我们需要的.梯度是指

如何正确理解深度学习(Deep Learning)的概念

现在深度学习在机器学习领域是一个很热的概念,不过经过各种媒体的转载播报,这个概念也逐渐变得有些神话的感觉:例如,人们可能认为,深度学习是一种能够模拟出人脑的神经结构的机器学习方式,从而能够让计算机具有人一样的智慧:而这样一种技术在将来无疑是前景无限的.那么深度学习本质上又是一种什么样的技术呢? 深度学习是什么 深度学习是机器学习领域中对模式(声音.图像等等)进行建模的一种方法,它也是一种基于统计的概率模型.在对各种模式进行建模之后,便可以对各种模式进行识别了,例如待建模的模式是声音的话,那么这种

资深程序员带你玩转深度学习中的正则化技术(附Python代码)!

目录 1. 什么是正则化? 2. 正则化如何减少过拟合? 3. 深度学习中的各种正则化技术: L2和L1正则化 Dropout 数据增强(Data augmentation) 提前停止(Early stopping) 4. 案例:在MNIST数据集上使用Keras的案例研究 1. 什么是正则化? 在深入该主题之前,先来看看这几幅图: 之前见过这幅图吗?从左到右看,我们的模型从训练集的噪音数据中学习了过多的细节,最终导致模型在未知数据上的性能不好. 换句话说,从左向右,模型的复杂度在增加以至于训练

卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)

卷积可能是现在深入学习中最重要的概念.卷积网络和卷积网络将深度学习推向了几乎所有机器学习任务的最前沿.但是,卷积如此强大呢?它是如何工作的?在这篇博客文章中,我将解释卷积并将其与其他概念联系起来,以帮助您彻底理解卷积. 已经有一些关于深度学习卷积的博客文章,但我发现他们都对不必要的数学细节高度混淆,这些细节没有以任何有意义的方式进一步理解.这篇博客文章也会有很多数学细节,但我会从概念的角度来看待他们,在这里我用每个人都应该能够理解的图像表示底层数学.这篇博文的第一部分是针对任何想要了解深度学习中

关于深度学习中的batch_size

5.4.1 关于深度学习中的batch_size batch_size可以理解为批处理参数,它的极限值为训练集样本总数,当数据量比较少时,可以将batch_size值设置为全数据集(Full batch cearning). 实际上,在深度学习中所涉及到的数据都是比较多的,一般都采用小批量数据处理原则. 小批量训练网络的优点: 相对海量的的数据集和内存容量,小批量处理需要更少的内存就可以训练网络. 通常小批量训练网络速度更快,例如我们将一个大样本分成11小样本(每个样本100个数据),采用小批量