今日给咱们共享一篇关于深度学习中激活函数的文章。文章翻译自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函数
嗯,这看起来很滑润,类似于阶跃函数。这有什么好处?先说最重要的一点,它本质上对错线性的。这个函数的组合也对错线性的!好极了,现在咱们能够叠加层。非二进制激活怎样办?是的!与阶跃函数不同,它将给出模仿激活,一起也有一个滑润的梯度。
你或许留意到了,在X值-2到2之间,Y值十分峻峭。这意味着,该区域中X值的任何细小改变都会导致Y值产生显著改变。这意味着该函数倾向于将 Y 值带到曲线的两端。
考虑到它的性质,它应该是是一个很好的分类器?确实是。它倾向于将激活带到曲线的任一侧(例如,高于x = 2和低于x = -2),这样就会在猜测上做出清晰的区别。
该激活函数的另一个长处是,与线性函数不同的是,它的输出总是在规模(0,1)内,而线性函数输出规模是(−∞-\infin,+∞+\infin)。因此咱们的激活被约束在一个规模内。很好,这样就不会让激活值过大了。
这很好,Sigmoid函数是当今最广泛运用的激活函数之一。那它又有什么问题呢?
你或许留意到了,在sigmoid函数的两端,Y值对X的改变呼应很小。这意味着什么呢?这个区域的梯度会很小,这就产生了“梯度消失”的问题。那么,当激活达到曲线两侧的挨近水平的部分时,会产生什么呢?
梯度很小或已消失(由于值极小,无法进行显著改变)。网络就不会进一步学习或速度十分慢(取决于用例,直到梯度/核算遭到浮点值约束)。不过仍是有一些办法能够解决这个问题,sigmoid在分类问题中的应用仍然十分广泛。
Tanh函数
另一个激活函数是tanh函数。
这看起来与sigmoid十分类似。事实上,它是一个缩放的sigmoid函数!
好的,现在它具有类似于咱们上面评论的sigmoid的特征。它本质上对错线性的,所以咱们能够叠加层!它的输出规模是(-1,1),所以不必担心激活值过大。需求留意的是,tanh的梯度比sigmoid强(导数更陡)。在sigmoid或tanh之间做出决议将取决于你对梯度强度的要求。和sigmoid相同,tanh也有梯度消失问题。
Tanh也是一个十分流行且被广泛运用的激活函数。
ReLU
后来,呈现了ReLu函数,
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大部分状况都是作为通用拟合器作业的!
在本文中,我企图描述一些常用的激活函数。还有其他激活函数,但整体思维是相同的。研究更优的激活函数作业仍在不断进行。期望你现已了解了激活函数背面的思维,为什么要运用它们,以及咱们怎样确认运用哪一个。