深度学习中激活函数的重要性及应用

释放双眼,带上耳机,听听看~!
本文介绍了深度学习中激活函数的重要性,讨论了不同类型的激活函数以及它们在神经网络中的应用。

今天给大家分享一篇关于深度学习中激活函数的文章。文章翻译自Avinash Sharma V的《Understanding Activation Functions in Neural Networks》-2017年3月31日,如果翻译有不到位的地方还请各位大佬指正。

原文地址:Understanding Activation Functions in Neural Networks | by Avinash Sharma V | The Theory Of Everything | Medium

分割线

最近,我的一位同事问我几个问题,比如“为什么我们有这么多激活函数?“,“为什么一个比另一个好?”,“我们怎么知道用哪一个(激活函数)?“,“这涉及到数学吗?“所以我想,为什么不写一篇关于它的文章,给那些只在基本水平上熟悉神经网络,也因此想知道激活函数和他们的“为什么-如何选-数学!“问题的人。

注意:本文假设您对人工神经元有基本的了解。我建议在阅读本文之前阅读神经网络的基础知识,以便更好地理解。

激活函数

那么人工神经元是做什么的呢?简单地说,它计算其输入的加权和,加上一个偏置值,然后决定是否应该激活(是的,激活函数可以做到这一点,先让我们按照这个流程来)。

来看一个神经元的例子。

【译者注:weight指的是输入指的权重,简单来说就是某个输入值对该神经元的影响;input就是输入;bias是偏差,或叫偏置】

深度学习中激活函数的重要性及应用

现在,Y的值可以是从负无穷到正无穷的任何值。神经元实际上并不知道值的范围。那么我们如何决定神经元是否应该激活(为什么要这样激活?因为我们从生物学中学到了这种激活模式,这是大脑工作的方式,而大脑是一个强大智能的系统的工作证明)。

为此,我们决定添加激活函数。检查一个神经元产生的Y值,并决定外部连接是否应该将这个神经元视为激活,或者更确切地说——激活与否。

阶跃函数

我们首先想到的是基于阈值的激活函数如何?如果Y的值大于某个值,则表明它已激活。如果它小于阈值,那么就说它没有激活。很好。这可能行得通!

Activation function A = “activated” if Y > threshold else not【译者注:threshold,阈值】

或者说,如果y大于阈值,则A = 1,否则A为0

好了,我们刚才做的是一个“阶跃函数”,见下图。

深度学习中激活函数的重要性及应用

当值大于0(阈值)时,其输出为1(激活),否则输出0(未激活)。

好极了,这毫无疑问就构成了一个神经元的激活函数。然而,这个方法存在某些缺点。为了更好地理解它,可以考虑以下问题。

假设您正在创建一个二元分类器。需要告诉它“是”或“否”(激活或不激活)。阶跃函数可以为你完成这项工作!这正是它所做的,输出1或0。现在,考虑一下,如果你希望连接多个这样的神经元以引入更多类别的用例,Class1、Class2、Class3等。如果有多个神经元被“激活”,会发生什么情况?所有神经元都会输出1(从阶跃函数中)。那你怎么确定结果?哪个类别是它?嗯,这很难,很复杂。

你会希望网络只激活1个神经元,其他神经元应该为0(只有这样你才能说它正确分类/识别了类)。啊!但是这种方式更难训练和收敛。如果激活不是二进制,而是说“50%激活”或“20%激活”等等,那就更好了。然后,如果超过1个神经元激活,你可以找到哪个神经元具有“最大激活值”等等(比max更好的方法,叫softmax,不过让我们先放一放)。

但在这种情况下,如果还是有多个神经元是“100%激活”,那么问题仍然存在。但是由于输出存在中间激活值,因此学习可以更平滑、更容易(不那么波动),并且与阶跃函数相比,在训练时多个神经元被100%激活的机会更小(这也取决于你训练的内容和数据)。

好的,所以我们需要一些能够给出中间(模拟)激活值的东西,而不是说“已激活”或“未激活”(二进制)。

我们首先想到的就是线性函数。

线性函数

A = cx

一个直线函数,其中激活与输入成比例(输入是神经元的加权和)。【译者注:激活值指A,输入值指x】

这种方式可以给出一系列激活值,因此它不是二进制激活。我们肯定可以将几个神经元连接在一起,如果有多个神经元被激活,我们可以取最大值(或softmax),并根据此进行决策。所以这也可以。那么这种方法有什么问题呢?

如果你熟悉梯度下降训练法的话,你会注意到对于这个函数,导数是一个常数。

A = cx,A对x的导数为c。这意味着,梯度与X无关。这是一个恒定的梯度,下降将在恒定的梯度上进行。如果在预测中存在误差,则通过反向传播进行的改变是恒定的,并且不取决于输入delta(x)的变化!!!

这个方式还不算太好!(不总是,但请容忍我)。还有一个问题。考虑连接起来的层。每一层由线性函数激活,该激活进而作为输入进入下一层,第二层计算该输入的加权和,然后根据另一个线性激活函数进行激活。

无论我们有多少层,如果所有层都是线性的,最后一层的最终激活函数只不过是第一层输入的线性函数!停下来仔细想想这个问题。

这意味着这两个层(或N个层)可以由单个层代替。啊!我们失去了以这种方式堆叠层的能力。无论我们如何堆叠,整个网络仍等效于具有线性激活的单层网络(线性函数以线性方式的组合仍然是另一个线性函数)。

我们继续,好吗?

Sigmoid函数

A=11+e−xA=frac{1}{1+e^{-x}}

深度学习中激活函数的重要性及应用

嗯,这看起来很平滑,类似于阶跃函数。这有什么好处?先说最重要的一点,它本质上是非线性的。这个函数的组合也是非线性的!好极了,现在我们可以叠加层。非二进制激活怎么办?是的!与阶跃函数不同,它将给出模拟激活,同时也有一个平滑的梯度。

你可能注意到了,在X值-2到2之间,Y值非常陡峭。这意味着,该区域中X值的任何微小变化都会导致Y值发生显著变化。这意味着该函数倾向于将 Y 值带到曲线的两端。

考虑到它的性质,它应该是是一个很好的分类器?确实是。它倾向于将激活带到曲线的任一侧(例如,高于x = 2和低于x = -2),这样就会在预测上做出明确的区分。

该激活函数的另一个优点是,与线性函数不同的是,它的输出总是在范围(0,1)内,而线性函数输出范围是(−∞-infin,+∞+infin)。因此我们的激活被限制在一个范围内。很好,这样就不会让激活值过大了。

这很好,Sigmoid函数是当今最广泛使用的激活函数之一。那它又有什么问题呢?

你可能注意到了,在sigmoid函数的两端,Y值对X的变化响应很小。这意味着什么呢?这个区域的梯度会很小,这就产生了“梯度消失”的问题。那么,当激活达到曲线两侧的接近水平的部分时,会发生什么呢?

梯度很小或已消失(由于值极小,无法进行显著变化)。网络就不会进一步学习或速度非常慢(取决于用例,直到梯度/计算受到浮点值限制)。不过还是有一些方法可以解决这个问题,sigmoid在分类问题中的应用仍然非常广泛。

Tanh函数

另一个激活函数是tanh函数。

f(x)=tanh(x)=21+e−2x−1f(x)=tanh(x)=frac{2}{1+e^{-2x}}-1

深度学习中激活函数的重要性及应用

这看起来与sigmoid非常相似。事实上,它是一个缩放的sigmoid函数!

tanh(x)=2Sigmoid(2x)−1tanh(x)=2Sigmoid(2x)-1

好的,现在它具有类似于我们上面讨论的sigmoid的特征。它本质上是非线性的,所以我们可以叠加层!它的输出范围是(-1,1),所以不用担心激活值过大。需要注意的是,tanh的梯度比sigmoid强(导数更陡)。在sigmoid或tanh之间做出决定将取决于你对梯度强度的要求。和sigmoid一样,tanh也有梯度消失问题。

Tanh也是一个非常流行且被广泛使用的激活函数。

ReLU

后来,出现了ReLu函数,

A(x)=max(0,x)A(x)= max(0,x)

ReLu函数如上所示。如果x为正,则输出x,否则输出0。

深度学习中激活函数的重要性及应用

乍一看,它似乎和线性函数具有相同的问题,因为它在正轴上是线性的。首先,ReLu本质上是非线性的。ReLu的组合也是非线性的!(事实上它是一个很好的拟合器,任何函数都可以用ReLu的组合来拟合。这意味着我们可以层层叠加。但它并不受约束。ReLu的范围是(0,+∞)(0,+infin)。这意味着它可能导致激活值过大。

我想在这里讨论的另一点是激活的稀疏性。想象一个有很多神经元的大型神经网络。使用sigmoid或tanh将导致几乎所有神经元被模拟激活(还记得吗?).这意味着几乎所有的激活都将被处理来描述网络的输出。换句话说,激活太密集了,这个代价太高了。理想情况下,我们希望网络中的一些神经元不被激活,从而使稀疏激活而有效。

ReLu给予了我们这个好处。想象一个具有随机初始化权重(或归一化)的网络,由于ReLu的特性(x为负值时输出0),几乎50%的网络产生0激活。这意味着更少的神经元被激发(稀疏激活),网络更轻量。很好!ReLu看起来很棒!是的,但没有什么是完美无瑕的,即便是ReLu。

由于ReLu中的水平线(对于负X),梯度可能会趋近于0。对于ReLu的该区域中的激活,梯度将为0,因此权重将在下降期间不会得到调整。这意味着,进入该状态的神经元将停止对错误/输入的变化做出响应(简单地说,因为梯度为0,没有任何变化)。这就是所谓的死亡ReLu问题。这个问题可能会导致几个神经元“死亡”,而不是作出反应,导致网络的大部分被动。ReLu中有一些变量,可以通过简单地将水平线变为非水平分量来缓解此问题。例如,对于x<0,y = 0.01x<将使其成为稍微倾斜的线而不是水平线,这就是Leaky ReLu。还有其他的变式。其主要思想是让梯度为非零,并最终在训练过程中恢复。

ReLu比tanh和Sigmoid的计算成本更低,因为它涉及更简单的数学运算。当我们设计深度神经网络时,这是一个很值得被考虑的点。

好了,现在我们用哪一个?

现在到底该使用哪个激活函数。这是否意味着我们不管做什么都使用ReLu?还是Sigmoid或tanh?是,也不是。当你知道你试图拟合的函数具有某些特征时,你就可以选择更拟合它的激活函数,从而加快训练过程。例如,一个sigmoid可以很好地用于一个分类器(看看sigmoid的图,它不是显示了理想分类器的属性吗?)因为将分类器函数拟合为sigmoid的组合比使用ReLu更容易。这将导致训练过程和收敛加快。您也可以使用自己的自定义函数!.如果你不知道要学习的函数的性质,那么也许我会建议从ReLu开始,然后倒着学。ReLu大部分情况都是作为通用拟合器工作的!

在本文中,我试图描述一些常用的激活函数。还有其他激活函数,但总体思想是一样的。研究更优的激活函数工作仍在不断进行。希望你已经了解了激活函数背后的思想,为什么要使用它们,以及我们如何确定使用哪一个。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

飞桨动态图模式在DeepXDE中PINN方法用例实现、验证及评估的具体流程

2023-12-20 21:32:14

AI教程

ChatGPT:AI聊天程序的功能及工作原理

2023-12-20 21:41:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索