本文介绍了多种激活函数,并比较了激活函数的优缺点。本文假定您对人工神经网络(AAN)有基本的了解。如果没有,建议先阅读机器之心介绍的相关文章:DNN概览论文:前馈、卷积和循环神经网络技术详解1.什么是激活函数?生物神经网络启发了神经网络的发展人工神经网络。然而,人工神经网络并不是大脑工作方式的近似表示。但在我们理解为什么在人工神经网络中使用激活函数之前,了解激活函数在生物神经网络中的相关性是很有用的。典型神经元的物理结构包括细胞体、向其他神经元发送信号的轴突,以及从其他神经元接收信号或信息的树突。在生物神经网络的上图中,红色圆圈表示两个神经元进行通信的区域。神经元通过树突接收来自其他神经元的信号。树突的权重称为突触权重,它将与接收到的信号相乘。来自树突的信号在细胞体内不断积累,如果信号强度超过某个阈值,神经元就会将信息传递给轴突。否则,信号将被该神经元“杀死”,无法进一步传播。激活函数决定是否传递信号。在这种情况下,只需要一个带有一个参数(阈值)的简单阶跃函数。现在,当我们学习新事物(或不学习某些事物)时,某些神经元的阈值和突触权重会发生变化。这在神经元之间建立了新的联系,大脑学习了新事物。让我们再次理解这个概念,但这次使用人工神经元。上图中的(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。基本上,从输入到输出没有修改。线性激活函数非线性激活函数:用于分离非线性可分数据,是最常用的激活函数。非线性方程控制输入到输出的映射。非线性激活函数有Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish等,下面将详细介绍这些激活函数。非线性激活函数4.为什么人工神经网络需要非线性激活函数?神经网络用于实现复杂的功能,非线性激活函数可以使神经网络随意逼近复杂的功能。没有了激活函数带来的非线性,多层神经网络和单层没有区别。现在让我们看一个简单的例子来帮助我们理解为什么神经网络甚至不能在没有非线性的情况下逼近像XOR门、XNOR门等简单函数。下图是异或门函数。十字和圆圈代表数据集的两个类别。当x_1和x_2的两个特征相同时,类别标签为红叉;如果不相同,则为蓝色圆圈。两个红叉对输入值(0,0)和(1,1)输出值为0,两个蓝色圆圈对输入值(0,1)输出值为1和(1,0)。异或门功能说明从上图我们可以看出数据点是非线性可分的。也就是说,我们不能画一条直线将蓝色圆圈与红色十字分开。因此,我们需要一个非线性决策边界来将它们分开。激活函数对于将神经网络的输出压缩到特定范围内也很重要。一个神经元的输出值可以非常大。当未经修改地馈送到下一层神经元时,该输出可以转换为更大的值,这一过程需要巨大的计算能力。激活函数的一项任务是将神经元的输出映射到有界区域(例如,0和1之间)。有了这些背景知识,我们就可以理解不同类型的激活函数。5.不同类型的非线性激活函数(1)SigmoidSigmoid又称为Logistic激活函数,将实数值压缩到0到1的范围内,也可以用在预测概率的输出层。该函数将大的负数转化为0,大的正数转化为1。数学公式为:下图展示了Sigmoid函数及其导数:Sigmoid激活函数Sigmoid导数Sigmoid函数的三个主要缺陷是:梯度消失:注意:当Sigmoid函数趋近于0和1时,变化率变平,即Say,sigmoid的梯度趋近于0。当神经网络使用sigmoid激活函数进行反向传播时,输出接近的神经元的梯度0或1接近于0。这些神经元称为饱和神经元。因此,这些神经元的权重不会更新。此外,连接到此类神经元的神经元的权重更新非常缓慢。这个问题称为梯度消失。所以想象一下,如果一个大型神经网络包含sigmoid神经元,其中许多神经元已经饱和,则该网络无法执行反向传播。非零中心:sigmoid输出是非零中心的。计算量大:与其他非线性激活函数相比,exp()函数的计算量大。下一个要讨论的非线性激活函数解决了sigmoid函数中的范围期望不为零的问题。(2)TanhTanh激活函数Tanh导数Tanh激活函数又称为双曲正切激活函数(hyperbolictangentactivationfunction)。和sigmoid函数一样,tanh函数也使用真值,但是tanh函数将其压缩到-1到1的区间。与Sigmoid不同的是,tanh函数的输出以0为中心,因为区间在-1到1之间.你可以把Tanh函数想象成两个sigmoid函数放在一起。在实践中,Tanh函数优先于Sigmoid函数使用。负输入被视为负值,零输入值映射接近零,正输入被视为正值。唯一的缺点:Tanh函数也存在梯度消失的问题,因此它在饱和时也会“杀死”梯度。为了解决梯度消失的问题,我们来讨论另一种非线性激活函数——整流线性单元(ReLU),它明显优于前两个函数,是现在使用最广泛的函数。(3)Correctedlinearunit(ReLU)ReLU激活函数ReLU导数从上图可以看出,ReLU是一个从底下开始进行了半修正的函数。数学公式为:当输入x<0时,输出为0,当x>0时,输出为x。这个激活函数使网络收敛得更快。它不会饱和,即它抵抗梯度消失问题,至少在正区域(x>0),因此神经元不会反向传播至少一半区域中的所有零。由于使用了简单的阈值,ReLU在计算上是高效的。但ReLU神经元也有一些缺点:不以零为中心:与Sigmoid激活函数类似,ReLU函数的输出不以零为中心。在正向传播过程中,如果x<0,神经元将保持不活动状态,并在反向传播过程中“杀死”梯度。这样权重无法更新,网络也无法学习。当x=0时,该点的梯度未定义,但这在实现中通过向左或向右取梯度来解决。为了解决ReLU激活函数中的梯度消失问题,当x<0时,我们使用LeakyReLU-这个函数试图修复deadReLU问题。让我们仔细看看LeakyReLU。(4)LeakyReLULeakyReLU激活函数这个函数试图缓解deadReLU问题。数学是:LeakyReLU的概念是当x<0时,它获得0.1的正梯度。这个函数在一定程度上缓解了deadReLU问题,但是使用这个函数的结果并不一致。虽然它具有ReLU激活函数的所有特点,如计算效率高、收敛速度快、正区不饱和等。LeakyReLU可以扩展更多。让x乘以超参数,而不是将x乘以常数项,这似乎比LeakyReLU更有效。这个扩展是参数ReLU。(5)ParametricReLUPReLU函数的数学公式为:其中为超参数。这里引入了一个随机超参数,它可以被学习,因为你可以反向传播它。这使得神经元能够在负区域选择最佳梯度,并且具有这种能力,它们可以成为ReLU或LeakyReLU。总之,使用ReLU更好,但是您可以尝试使用LeakyReLU或ParametricReLU,看看它们是否更适合您的问题。(6)SwishSwish激活函数这个函数也叫self-gated激活函数。它最近由谷歌研究人员发布。数学公式为:根据论文(https://arxiv.org/abs/1710.05941v1),Swish激活函数优于ReLU函数。根据上图,我们可以观察到x轴负值区域的曲线形状与ReLU激活函数的形状不同,因此Swish激活函数的输出可能会随着输入值的增加而下降增加。大多数激活函数是单调的,即输出值不可能随着输入值的增加而减少。当Swish函数为0时,具有单边有界的特性,是平滑的非单调的。改一行代码,看看它的性能,似乎很有趣。原文:https://www.learnopencv.com/understanding-activation-functions-in-deep-learning/【本文为机器之心专栏原文翻译,微信公众号“机器之心”Machine(id:almosthuman2014)》]点此阅读更多本作者好文
