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

194
13个回答

208

激活函数的目的是为了在神经网络中引入非线性

进而使你能够对响应变量(也称为目标变量,类别标签或分数)进行建模,该变量与其解释变量呈现非线性关系。

非线性意味着输出不能从输入的线性组合中重现(这与输出呈现直线的情况不同--这种情况被称为仿射)。

另一种思考方式:如果网络中没有非线性激活函数,那么无论它有多少层,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])

在反向传播中常用的激活函数(双曲正切)在-2到2之间的取值:

enter image description here


21
为什么我们想要消除线性? - corazza
22
如果我们希望建模的数据是非线性的,那么我们需要在我们的模型中考虑这一点。 - doug
54
“不管有多少层,都会表现得像单个感知器一样(因为线性函数相加仍然是线性函数)。” 不错! - Autonomous
14
这段话有点误导性 - 正如eski所提到的,修正线性激活函数非常成功,如果我们的目标只是建模/逼近函数,消除所有步骤中的非线性并不一定是正确的答案。使用足够多的线性部分,您可以高度准确地逼近任何非线性函数。我认为这是一个说明“修正线性单元”为什么有效的好解释:http://stats.stackexchange.com/questions/141960/deep-neural-nets-relus-removing-non-linearity - tegan
24
修正线性激活函数是非线性的。我不确定你的评论与答案有什么关系。 - endolith
显示剩余5条评论

71
一个线性激活函数可以被使用,但只有在非常有限的情况下。事实上,为了更好地理解激活函数,重要的是要看一下普通最小二乘法或简单的线性回归。线性回归旨在找到产生最小垂直效应的最佳权重,这种效应在解释变量和目标变量相结合输入时产生,简而言之,如果预期输出反映如下所示的线性回归,则可以使用线性激活函数:(顶部图)。但是,如下面第二个图中所示,线性函数将无法产生所需的结果:(中间图)。然而,如下所示的非线性函数将产生所需的结果:

enter image description here

激活函数不能是线性的,因为只有使用线性激活函数的神经网络在深度达到一层时才有效,无论其架构多么复杂。网络的输入通常是线性变换(输入*权重),但现实世界和问题是非线性的。为了使传入的数据非线性化,我们使用称为激活函数的非线性映射。激活函数是一个决策函数,用于确定特定神经元是否存在。它被映射在0到1之间,其中零表示该特征不存在,而一表示其存在。不幸的是,权重中发生的微小变化无法反映在激活值中,因为它只能取0或1。因此,非线性函数必须在这个范围内连续且可微。
神经网络必须能够接受从负无穷到正无穷的任何输入,但它应该能够将其映射到{0,1}或在某些情况下为{-1,1}的输出范围内 - 因此需要激活函数。激活函数需要非线性,因为其在神经网络中的目标是通过权重和输入的非线性组合产生非线性决策边界。

1
+1,那么可以推断出非线性函数用于建立完美边界? - SIslam
1
是的,没错。它不仅可以产生0或1,而且可以产生0.4或0.78,使其在边界范围内连续。 - chibole
3
神经网络必须能够接收从负无穷到正无穷的任何输入,但应该能够将其映射到输出范围在 {0,1} 或 {-1,1} 之间......这让我想起了 ReLU 的限制,即它只应该在神经网络模型的隐藏层中使用。 - Cloud Cho

26
如果我们只允许神经网络中使用线性激活函数,那么输出将只是输入的线性变换linear transformation,这不足以形成universal function approximator。这样的网络只能表示为矩阵乘法,您将无法从这样的网络中获得非常有趣的行为。
同样的情况也适用于所有神经元都具有仿射激活函数(即形式为f(x) = a*x + c的激活函数,其中ac是常数,这是线性激活函数的一般化),这将仅导致从输入到输出的affine transformation,这也不是非常令人兴奋。
神经网络可能包含具有线性激活函数的神经元,例如在输出层中,但这些神经元需要与网络其他部分具有非线性激活函数的神经元配合使用。

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


1
高阶函数可以使用多个隐藏层的线性激活函数来近似。通用逼近定理仅适用于仅具有一个隐藏层的MLP。 - eski
6
不,你不能仅使用线性激活函数来近似高阶函数,无论有多少层,你只能模拟线性(或仿射,如果每层除最后一层外都有一个额外的常数节点)函数和转换。 - HelloGoodbye
激活函数的主要目的是允许神经网络产生非线性决策边界,这种说法正确吗? - stackoverflowuser2010
@stackoverflowuser2010 这是一种看待它的方式。但激活函数不仅仅如此。维基百科关于激活函数的文章列举了几个激活函数,其中(除一个之外)全部都是非线性的,并比较了激活函数可能具有的不同特点。 - HelloGoodbye
@HelloGoodbye:Softmax被用作损失函数,而不是激活函数。 - stackoverflowuser2010
显示剩余4条评论

26
一个具有线性激活和任意数量隐藏层的前馈神经网络等同于没有隐藏层的线性神经网络。例如,考虑图中具有两个隐藏层且没有激活的神经网络。enter image description here
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'

我们可以完成最后一步,因为多个线性变换的组合可以被替换为一个变换,而多个偏置项的组合只是一个单一的偏置项。即使添加一些线性激活,结果仍然相同。
所以我们可以用一个单层神经网络替换这个神经网络。这可以扩展到 n 层。这表明,添加层数根本不会增加线性神经网络的逼近能力。我们需要非线性激活函数来逼近非线性函数,而大多数实际问题都非常复杂和非线性。事实上,当激活函数是非线性的时,具有足够多的隐藏单元的两层神经网络可以被证明是通用函数逼近器。

9
这里有几个不错的答案。值得指出的是,Christopher M. Bishop的书《模式识别和机器学习》。这本书对于理解几个与机器学习相关的概念很有价值。摘自第229页(第5.1节):
如果一个网络中所有隐藏单元的激活函数都被视为线性的,那么对于任何这样的网络,我们总是可以找到一个等效的无隐藏单元网络。这是因为连续的线性变换的组合本身就是一个线性变换。然而,如果隐藏单元的数量小于输入或输出单元的数量,则网络可以产生的变换不是从输入到输出最一般的可能的线性变换,因为在隐藏单元的降维过程中会丢失信息。在第12.4.2节中,我们展示了线性单元网络产生主成分分析的情况。然而,总体上,多层线性单元网络并没有太大的兴趣。

6
本文利用Stone-Weierstrass定理和Gallant和White的余弦压缩器,证明了标准的多层前馈网络结构使用任意压缩函数可以近似地表示任何感兴趣的函数,并且可以达到任何所需的精度,只要有足够多的隐藏单元可用。(Hornik et al., 1989, Neural Networks)
例如,压缩函数是一种非线性激活函数,将映射到[0,1],如Sigmoid激活函数。

3
神经网络用于模式识别。而模式发现是一种非常非线性的技术。
假设我们为每个神经元使用线性激活函数y=wX+b,并设置类似于如果y>0->class 1 else class 0。
现在我们可以使用平方误差损失计算我们的损失并进行反向传播,以便模型学习得很好,正确吗?
错误。
对于最后一个隐藏层,更新值将为w{l}=w{l}-(alpha)*X。
对于倒数第二个隐藏层,更新值将为w{l-1}=w{l-1}-(alpha)*w{l}*X。
对于第i个隐藏层,更新值将为w{i}=w{i}-(alpha)*w{l}...*w{i+1}*X。
这导致我们将所有权重矩阵相乘,从而产生以下可能性: A)由于梯度消失,w{i}几乎不会改变 B)由于梯度爆炸,w{i}会发生剧烈而不准确的变化 C)w{i}变化足够好,以给我们一个良好的拟合分数
如果发生C情况,那么我们的分类/预测问题很可能是一个简单的线性/逻辑回归器,根本不需要神经网络!
无论您的NN有多么强大或者经过多么良好的超调,如果您使用线性激活函数,您将永远无法解决需要非线性模式识别的问题。

3

有时候,一个纯线性的网络可以给出有用的结果。比如说我们有一个三层网络,形状为(3,2,3)。通过将中间层限制在只有两个维度上,我们可以得到一个在原始的三维空间中是“最佳适合平面”的结果。

但是,有更简单的方式来找到这种形式的线性变换,例如NMF,PCA等。然而,在这种情况下,多层网络与单层感知器的行为不同。


3
在神经网络中使用非线性激活函数非常重要,特别是在深度神经网络和反向传播中。根据主题中提出的问题,首先我会解释需要在反向传播中使用非线性激活函数的原因。
简单来说:如果使用线性激活函数,则损失函数的导数关于输入是一个常数,因此输入(到神经元)的值不会影响权重的更新。这意味着我们无法确定哪些权重对于产生良好结果最有效,因此我们被迫平均改变所有权重。
更深入地讲,在一般情况下,权重的更新如下:
W_new = W_old - Learn_rate * D_loss

这意味着新的权重等于旧权重减去成本函数的导数。如果激活函数是线性函数,则其对输入的导数为常数,而输入值对权重更新没有直接影响。
例如,我们打算使用反向传播来更新最后一层神经元的权重。我们需要计算权重函数相对于权重的梯度。通过链式法则,我们有:

enter image description here

"h和y分别是(估计的)神经元输出和实际输出值,x是神经元的输入。grad(f)是从输入到激活函数的导数。上面计算出来的值(乘以一个因子)从当前权重中减去,得到一个新的权重。现在我们可以更清楚地比较这两种类型的激活函数。

1- 如果激活函数是线性函数,例如:F(x) = 2 * x,则:

"

enter image description here

新的重量将是:

enter image description here

如您所见,所有的权重都被平等地更新,输入值并不重要!
2- 但是,如果我们使用一个非线性的激活函数,比如tanh(x):

enter image description here

并且:

enter image description here

现在我们可以看到输入对更新权重的直接影响了!不同的输入值会导致不同的权重变化。我认为上面已经足以回答主题问题,但提到使用非线性激活函数的其他好处也是有用的。正如其他答案中提到的那样,非线性使NN具有更多的隐藏层和更深的NN。具有线性激活器函数的一系列层可以合并为一层(通过先前函数的组合),实际上是具有隐藏层的神经网络,它没有利用深度NN的好处。非线性激活函数还可以产生归一化输出。

嗨,Mohammed,我认为你的答案是错误的。使用线性激活函数时,“所有权重都被平等更新,输入值无关紧要”这种说法是不正确的!考虑简单的单层单神经元神经网络,具有1D输入x。假设为了简单起见,我们将输出最小化作为损失函数。权重相对于梯度(或者仅是导数)将等于x * df / dz,其中f是线性激活函数f(z) = z。正如您所看到的,模型能够根据输入x调整权重。 - Mr. President
如果你是正确的,Mohammed,那么线性感知器将无法在线性可分空间中区分不同的类别,这显然是不正确的。如果你愿意,可以使用Tensorflow在线工具(http://playground.tensorflow.org/)来构建一个线性感知器并验证一下。 - Humberto Fioravante Ferro
如果激活函数是一个常数,会有什么后果?谢谢。 - Sophia

2
了解非线性激活函数背后的逻辑,首先应该了解为什么使用激活函数。一般来说,实际问题需要非平凡的非线性解决方案。因此,我们需要一些函数来生成这种非线性。基本上,激活函数所做的就是在映射输入值到期望范围的同时,生成这种非线性。
然而,在一些极少数情况下可以使用线性激活函数,例如线性回归中不需要隐藏层的情况。通常情况下,对于这种类型的问题,生成神经网络是没有意义的,因为无论隐藏层数量如何,这个网络都会生成一个输入的线性组合,这只需要一步就可以完成。换句话说,它的行为就像一个单层网络。
激活函数还有一些更加理想的属性,例如连续可微性。由于我们使用反向传播,所以我们生成的函数必须在任何点处都可微分。我强烈建议您查看这里的激活函数维基百科页面,以更好地了解这个主题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接