为什么必须在反向传播神经网络中使用非线性激活函数?

cor*_*zza 123 math machine-learning neural-network deep-learning

我一直在读神经网络上的一些东西,我理解单层神经网络的一般原理.我理解对aditional图层的需求,但为什么要使用非线性激活函数?

这个问题之后是这个问题:用于反向传播的激活函数的衍生物是什么?

dou*_*oug 156

激活功能的目的是将非线性引入网络

反过来,这允许您建模一个响应变量(也就是目标变量,类标签或分数),它与其解释变量非线性变化

非线性意味着输出不能从输入的线性组合再现(这与输出到直线的输出不同 - 这个词是仿射的).

想到它的另一种方式:如果网络中没有非线性激活函数,NN,无论它有多少层,都会表现得像单层感知器,因为对这些层进行求和会给你另一个线性函数(见上文定义).

>>> in_vec = NP.random.rand(10)
>>> in_vec
  array([ 0.94,  0.61,  0.65,  0.  ,  0.77,  0.99,  0.35,  0.81,  0.46,  0.59])

>>> # common activation function, hyperbolic tangent
>>> out_vec = NP.tanh(in_vec)
>>> out_vec
 array([ 0.74,  0.54,  0.57,  0.  ,  0.65,  0.76,  0.34,  0.67,  0.43,  0.53])
Run Code Online (Sandbox Code Playgroud)

在backprop(双曲正切)中使用的常见激活函数从-2到2进行评估:

在此输入图像描述

  • 一句话答案:*<<无论多少层的行为就像一个感知器(因为线性函数加在一起只是给你一个线性函数).>>*.太好了! (34认同)
  • 如果我们希望建模的数据是非线性的,那么我们需要在模型中考虑到这一点. (16认同)
  • 为什么我们要消除线性? (13认同)
  • 这有点误导 - 正如eski所提到的,经过纠正的线性激活函数非常成功,如果我们的目标只是建模/近似函数,那么在所有步骤中消除非线性并不一定是正确的答案.通过足够的线性零件,您几乎可以逼近任何非线性函数,从而获得高精度.我发现这是一个很好的解释为什么纠正线性单位工作:http://stats.stackexchange.com/questions/141960/deep-neural-nets-relus-removing-non-linearity (11认同)
  • @tegan**整流**线性激活函数是非线性的.我不确定你的评论与答案有什么关系. (8认同)
  • @doug:您的答案是否相当于说激活函数允许神经网络产生非线性决策边界? (3认同)
  • @ stackoverflowuser2010:是的. (3认同)

chi*_*ole 41

然而,可以在非常有限的场合使用线性激活功能.事实上,要更好地理解激活函数,重要的是要看普通的最小二乘或简单的线性回归.线性回归旨在找到最佳权重,当与输入结合时,最佳权重导致解释变量和目标变量之间的垂直效应最小.简而言之,如果预期输出反映了如下所示的线性回归,则可以使用线性激活函数:(上图).但如下图所示,线性函数不会产生预期的结果:(中图).但是,如下所示的非线性函数会产生预期的结果:(下图) 在此输入图像描述

激活函数不能是线性的,因为具有线性激活函数的神经网络只有一层深度有效,无论它们的架构有多复杂.对网络的输入通常是线性变换(输入*权重),但现实世界和问题是非线性的.为了使输入数据非线性,我们使用称为激活函数的非线性映射.激活函数是决策特征,其确定特定神经特征的存在.它映射在0和1之间,其中零表示没有特征,而一个表示它的存在.不幸的是,权重中发生的微小变化不能反映在激活值中,因为它只能采用0或1.因此,非线性函数必须是连续的并且在此范围之间是可微的.神经网络必须能够从-infinity到+ infinite进行任何输入,但它应该能够将它映射到范围在{0,1}之间或在某些情况下在{-1,1}之间的输出 - 因此需要激活功能.激活函数需要非线性,因为它在神经网络中的目的是通过权重和输入的非线性组合产生非线性决策边界.

  • 神经网络必须能够从-infinity到+ infinite进行任何输入,但它应该能够将它映射到介于{0,1}之间或{-1,1}之间的输出......这让我想起了ReLU的限制是它只应在神经网络模型的隐藏层中使用. (3认同)

Hel*_*bye 20

如果我们只允许神经网络中的线性激活函数,则输出将只是输入的线性变换,这不足以形成通用函数逼近器.这样的网络可以表示为矩阵乘法,并且您将无法从这样的网络中获得非常有趣的行为.

所有神经元都具有仿射激活函数(即形式上的激活函数f(x) = a*x + c,其中ac是常数,这是线性激活函数的推广)的情况也是如此,这将导致从输入到输出的仿射变换,这也不是很令人兴奋.

神经网络可以很好地包含具有线性激活功能的神经元,例如在输出层中,但是这些神经网络需要在网络的其他部分中具有非线性激活功能的神经元.

注意:一个有趣的例外是DeepMind的合成梯度,他们使用一个小的神经网络来预测反向传播过程中给定激活值的梯度,他们发现他们可以使用没有隐藏层的神经网络而逃脱只有线性激活.

  • @eski不,你可以_not_只用线性激活函数来近似高阶函数,你可以只模拟线性(或仿射,如果你有一个额外的常量节点,但最后一层)函数和变换,无论你有多少层有. (4认同)

xas*_*hru 16

具有线性激活和任意数量隐藏层的前馈神经网络等价于没有隐藏层的线性神经网络。例如,让我们考虑图中具有两个隐藏层且没有激活的神经网络 在此处输入图片说明

y = h2 * W3 + b3 
  = (h1 * W2 + b2) * W3 + b3
  = h1 * W2 * W3 + b2 * W3 + b3 
  = (x * W1 + b1) * W2 * W3 + b2 * W3 + b3 
  = x * W1 * W2 * W3 + b1 * W2 * W3 + b2 * W3 + b3 
  = x * W' + b'
Run Code Online (Sandbox Code Playgroud)

我们可以做最后一步,因为几个线性变换的组合可以用一个变换代替,几个偏置项的组合只是一个偏置。即使我们添加一些线性激活,结果也是一样的。

所以我们可以用单层神经网络替换这个神经网络。这可以扩展到n层。这表明添加层根本不会增加线性神经网络的逼近能力。我们需要非线性激活函数来逼近非线性函数,而大多数现实世界的问题都是高度复杂和非线性的。事实上,当激活函数是非线性的,那么具有足够多隐藏单元的两层神经网络就可以证明是一个通用的函数逼近器。


har*_*nan 6

这里有几个很好的答案。最好指出 Christopher M. Bishop 的“模式识别和机器学习”一书。这是一本值得参考的书,可以更深入地了解几个 ML 相关概念。摘自第 229 页(第 5.1 节):

如果网络中所有隐藏单元的激活函数都是线性的,那么对于任何这样的网络,我们总能找到一个没有隐藏单元的等效网络。这是因为连续线性变换的组合本身就是一个线性变换。然而,如果隐藏单元的数量小于输入或输出单元的数量,那么网络可以生成的变换不是从输入到输出的最一般可能的线性变换,因为信息在降维过程中丢失了隐藏单位。在 12.4.2 节中,我们展示了线性单元网络引起了主成分分析。然而,一般来说,对线性单元的多层网络几乎没有兴趣。


alf*_*lfa 5

“本文利用 Stone-Weierstrass 定理和 Gallant 和 White 的余弦压缩器来建立使用随机压缩函数的标准多层前馈网络架构几乎可以将任何感兴趣的函数近似到任何所需的准确度,前提是有足够多的隐藏函数单位可用。” (霍尼克等人,1989 年,神经网络

例如,挤压函数是映射到 [0,1] 的非线性激活函数,就像 sigmoid 激活函数一样。