【问题标题】:Why must a nonlinear activation function be used in a backpropagation neural network? [closed]为什么必须在反向传播神经网络中使用非线性激活函数? [关闭]
【发布时间】:2023-03-11 19:28:01
【问题描述】:

我一直在阅读有关神经网络的一些内容,并且了解单层神经网络的一般原理。我知道需要额外的层,但为什么要使用非线性激活函数?

这个问题后面跟着这个问题:What is a derivative of the activation function used for in backpropagation?

【问题讨论】:

    标签: math machine-learning neural-network deep-learning


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      神经网络用于模式识别。而且模式查找是一种非常非线性的技术。

      假设为了论证,我们对每个神经元使用线性激活函数 y=wX+b 并设置类似 if 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】:

        在神经网络中使用非线性激活函数很重要,尤其是在深度神经网络和反向传播中。根据题目提出的问题,我先说一下反向传播需要使用非线性激活函数的原因。

        简单地说:如果使用线性激活函数,代价函数的导数相对于(wrt)输入是一个常数,所以输入(对神经元)的值不会影响权重的更新。这意味着我们无法确定哪些权重最能有效地创造出好的结果,因此我们不得不平等地改变所有权重。

        Deeper:一般来说,权重更新如下:

        W_new = W_old - Learn_rate * D_loss
        

        这意味着新权重等于旧权重减去成本函数的导数。如果激活函数是线性函数,那么它的导数w.r.t输入是一个常数,输入值对权重更新没有直接影响。

        例如,我们打算使用反向传播更新最后一层神经元的权重。我们需要计算权重函数 w.r.t weight 的梯度。使用链式法则,我们有:

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

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

        然后:

        新的权重是:

        如你所见,所有的权重都是一样的更新,输入值是什么并不重要!!

        2- 但是如果我们使用像 Tanh(x) 这样的非线性激活函数,那么:

        和:

        现在我们可以看到输入对更新权重的直接影响! 不同的输入值导致不同的权重变化

        我认为以上内容足以回答该主题的问题,但提及使用非线性激活函数的其他好处很有用。

        正如在其他答案中提到的,非线性使 NN 具有更多的隐藏层和更深的 NN。具有线性激活函数的层序列可以合并为一个层(与先前函数的组合),实际上是一个带有隐藏层的神经网络,它没有利用深度 NN 的优势。

        非线性激活函数也可以产生归一化的输出。

        【讨论】:

        • 您好 Mohammed,我相信您的回答不正确。使用线性激活函数时,“所有权重均等更新,输入值是什么并不重要!!”是不正确的。考虑具有一维输入 x 的单层单神经元神经网络。为简单起见,假设作为损失函数,我们最小化网络的输出。梯度(或只是导数)w.r.t.权重将等于 x * df / dz,其中 f 是线性激活函数 f(z) = z。如您所见,模型能够根据输入 x 调整权重。
        • Mohammed,如果你是对的,那么线性感知器将无法区分线性可分空间中的不同类别,这完全不正确。如果你愿意,你可以在线使用 Tensorflow (playground.tensorflow.org) 来构建一个线性感知器并进行检查。
        【解决方案4】:

        可以使用线性激活函数,但在非常有限的情况下。事实上,为了更好地理解激活函数,重要的是查看普通的最小二乘或简单的线性回归。线性回归旨在找到与输入相结合时导致解释变量和目标变量之间的垂直影响最小的最佳权重。简而言之,如果预期输出反映如下所示的线性回归,则可以使用线性激活函数:(上图)。但如下图第二张所示,线性函数不会产生预期的结果:(中图)。但是,如下所示的非线性函数会产生所需的结果:

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

        【讨论】:

        • +一个,那么可以推导出用非线性函数建立完美边界?
        • 是的,完全正确。在稳定只产生 0 或 1 的情况下,它可以产生 0.4 或 0.78,使其在边界范围内连续。
        • 神经网络必须能够接受从 -infinity 到 +infinite 的任何输入,但它应该能够将其映射到介于 {0,1} 或 {-1} 之间的输出, 1}...它提醒我 ReLU 的限制是它只能在神经网络模型的隐藏层中使用。
        【解决方案5】:

        要了解非线性activation functions 背后的逻辑,首先您应该了解为什么使用激活函数。一般来说,现实世界的问题需要非线性解决方案,这不是微不足道的。所以我们需要一些函数来产生非线性。基本上,激活函数所做的是在将输入值映射到所需范围时生成这种非线性。

        但是,线性激活函数可用于非常有限的情况下,您不需要隐藏层,例如线性回归。通常,为此类问题生成神经网络是没有意义的,因为独立于隐藏层的数量,该网络将生成输入的线性组合,只需一步即可完成。换句话说,它的行为就像一个单层。

        激活函数还有一些更理想的属性,例如连续可微性。由于我们使用反向传播,我们生成的函数必须在任何时候都是可微的。我强烈建议您查看来自here 的激活函数的维基百科页面,以便更好地理解该主题。

        【讨论】:

          【解决方案6】:

          具有线性激活和任意数量隐藏层的前馈神经网络等效于没有隐藏层的线性神经网络。例如,让我们考虑图中具有两个隐藏层且没有激活的神经网络

          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 层。这表明添加层根本不会增加线性神经网络的逼近能力。我们需要非线性激活函数来逼近非线性函数,而现实世界中的大多数问题都是高度复杂和非线性的。事实上,当激活函数为非线性时,可以证明具有足够多隐藏单元的两层神经网络是通用函数逼近器。

          【讨论】:

            【解决方案7】:

            如果我们在神经网络中只允许线性激活函数,输出将只是输入的linear transformation,不足以形成universal function approximator。这样的网络只能表示为矩阵乘法,而您将无法从这样的网络中获得非常有趣的行为。

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

            神经网络很可能包含具有线性激活函数的神经元,例如在输出层中,但这些需要在网络的其他部分中包含具有非线性激活函数的神经元。

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

            【讨论】:

            • 高阶函数可以通过使用多个隐藏层的线性激活函数来近似。通用逼近定理特定于只有一个隐藏层的 MLP。
            • 实际上,我相信您关于仿射激活函数导致仿射变换的说法是正确的,但是变换是通过反向传播(或任何其他方式)学习的事实使其并非完全无用,因为就最初的问题而言。
            • @eski 不,您可以仅使用线性激活函数来近似高阶函数,您只能建模线性(或仿射,如果您在每个但最后一层)函数和转换,不管你有多少层。
            • 说激活函数的主要目的是让神经网络产生一个非线性的决策边界对吗?
            • @stackoverflowuser2010 这将是看待它的一种方式。但是激活函数的作用远不止于此。维基百科关于 activation functions 的文章列出了几个激活函数,所有(除了一个)都是非线性的,并比较了激活函数可以具有的不同质量。
            【解决方案8】:

            有时纯线性网络可以提供有用的结果。假设我们有一个具有形状 (3,2,3) 的三层网络。通过将中间层限制为仅二维,我们得到的结果是原始三维空间中的“最佳拟合平面”。

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

            【讨论】:

              【解决方案9】:

              “本文利用 Stone-Weierstrass 定理和 Gallant 和 White 的余弦 squasher 来确定使用 abritrary squashing 函数的标准多层前馈网络架构几乎可以将任何感兴趣的函数逼近到任何所需的准确度,前提是有足够多的隐藏单位可用。” (Hornik et al., 1989, Neural Networks)

              压缩函数是例如映射到 [0,1] 的非线性激活函数,类似于 sigmoid 激活函数。

              【讨论】:

                【解决方案10】:

                激活函数的目的是将非线性引入网络

                反过来,这允许您对随解释变量非线性变化的响应变量(也称为目标变量、类别标签或分数)建模

                non-linear 意味着输出不能从输入的线性组合中再现(这与呈现为直线的输出不同——这个词是 仿射)。

                另一种思考方式:如果网络中没有非线性激活函数,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 评估:

                【讨论】:

                • 我们为什么要消除线性?
                • 如果我们希望建模的数据是非线性的,那么我们需要在我们的模型中考虑到这一点。
                • 一句话回答:>。不错!
                • 这有点误导 - 正如 eski 所提到的,修正的线性激活函数非常成功,如果我们的目标只是对函数进行建模/近似,那么在所有步骤中消除非线性并不一定是正确答案。有了足够多的线性片段,您几乎可以高精度地逼近任何非线性函数。我发现这很好地解释了整流线性单元为何起作用:stats.stackexchange.com/questions/141960/…
                • @tegan Rectified 线性激活函数是非线性的。我不确定您的评论与答案有什么关系。
                【解决方案11】:

                这根本不是要求。事实上,rectified linear activation function 在大型神经网络中非常有用。计算梯度要快得多,并且通过将最小界限设置为 0 来诱导稀疏性。

                查看以下内容了解更多详情:https://www.academia.edu/7826776/Mathematical_Intuition_for_Performance_of_Rectified_Linear_Unit_in_Deep_Neural_Networks


                编辑:

                关于整流后的线性激活函数是否可以称为线性函数,已经有一些讨论。

                是的,从技术上讲,它是一个非线性函数,因为它在点 x=0 处不是线性的,但是,说它在所有其他点处是线性的仍然是正确的,所以我认为它对在这里挑剔,

                我本可以选择恒等函数,但它仍然是正确的,但我选择 ReLU 作为示例,因为它最近很流行。

                【讨论】:

                • 修正后的线性激活函数也是非线性的(尽管它的名字)。它只是正值的线性
                • 您在技术上是正确的,它在整个域中不是线性的,特别是在 x=0 时(实际上对于 x
                • 他不仅在技术上是正确的,而且在实践中(或类似的东西)也是正确的。正是 ReLU 的非线性使它们变得有用。如果它们是线性的,它们就会有一个f(x) = a*x 形式的激活函数(因为这是唯一的线性激活函数类型),它是 useless 作为激活函数(除非你将它与非线性激活函数结合使用)。
                • 整流线性单元 (ReLU) 不是线性的,它不仅仅是人们吹毛求疵的“次要细节”,它是为什么它有用的一个重要原因。具有单位矩阵或用作激活函数的常规线性单元的神经网络将无法对非线性函数进行建模。仅仅因为它在 0 以上是线性的,并不意味着它实际上是一个线性函数。泄漏的 ReLU 在 0 以下也是“线性”的,但它仍然不是线性函数,绝对不能只用恒等函数代替。非线性绝对是一项要求。
                • 实际上是一个叫做分段线性函数的概念。
                【解决方案12】:

                多个神经元的分层 NN 可用于学习线性不可分问题。例如,XOR 函数可以通过两层的阶跃激活函数获得。

                【讨论】:

                  【解决方案13】:

                  我记得 - 使用 sigmoid 函数是因为它们适合 BP 算法的导数很容易计算,比如 f(x)(1-f(x))。我不记得确切的数学。实际上可以使用任何带导数的函数。

                  【讨论】:

                  • 我记得该函数仍然希望单调递增。所以,不是任何函数。
                  猜你喜欢
                  • 2019-12-11
                  • 2015-03-03
                  • 2012-02-21
                  • 2011-01-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-10-24
                  • 2014-01-18
                  相关资源
                  最近更新 更多