ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。这个问题似乎与帮助中心定义的范围内的编程无关。 1年前关闭。改进这个问题

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

这个问题之后是这个问题:What is a derivative of the activation function used for in backpropagation?


d
doug

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

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

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

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

https://i.stack.imgur.com/W6vkA.png


为什么我们要消除线性?
如果我们希望建模的数据是非线性的,那么我们需要在我们的模型中考虑到这一点。
一句话回答:<<不管有多少层都表现得像一个感知器(因为线性函数加在一起只会给你一个线性函数)。>>。好的!
这有点误导 - 正如 eski 所提到的,修正后的线性激活函数非常成功,如果我们的目标只是对函数进行建模/近似,那么在所有步骤中消除非线性不一定是正确的答案。有了足够多的线性片段,您几乎可以高精度地逼近任何非线性函数。我发现这很好地解释了整流线性单元为何起作用:stats.stackexchange.com/questions/141960/…
@tegan 整流线性激活函数是非线性的。我不确定您的评论与答案有什么关系。
i
iambr

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

https://i.stack.imgur.com/EoiEP.png

激活函数不能是线性的,因为具有线性激活函数的神经网络只有一层有效,无论其架构有多复杂。网络的输入通常是线性变换(输入 * 权重),但现实世界和问题是非线性的。为了使输入数据非线性,我们使用称为激活函数的非线性映射。激活函数是一种决策函数,用于确定特定神经特征的存在。它映射在 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 的限制是它只能在神经网络模型的隐藏层中使用。
H
HelloGoodbye

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

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

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

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


高阶函数可以通过使用多个隐藏层的线性激活函数来近似。通用逼近定理特定于只有一个隐藏层的 MLP。
实际上,我相信您关于仿射激活函数导致仿射变换的说法是正确的,但事实上,变换是通过反向传播(或任何其他方式)学习的,就原始问题而言,它并非完全没用。
@eski不,你不能只用线性激活函数来近似高阶函数,你只能模拟线性(或仿射,如果你在除最后一层之外的每一层都有一个额外的常数节点)函数和变换,不管你有多少层有。
说激活函数的主要目的是让神经网络产生非线性决策边界是否正确?
@stackoverflowuser2010 这将是一种看待它的方式。但是激活函数的意义远不止于此。 Wikipedia 关于 activation functions 的文章列出了几个激活函数,所有(除了一个)都是非线性的,并比较了激活函数可以具有的不同质量。
x
xashru

https://i.stack.imgur.com/KEFNX.png

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


d
desertnaut

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

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


H
Henrik

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

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


m
markemus

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

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


d
desertnaut

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

假设为了论证,我们对每个神经元使用线性激活函数 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,这意味着我们的分类/预测问题很可能是一个简单的基于线性/逻辑回归量的问题,并且从一开始就不需要神经网络!

不管你的神经网络有多健壮或高度调整,如果你使用线性激活函数,你将永远无法解决需要非线性的模式识别问题


A
Atilla Ozgur

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


我记得,该函数仍然希望单调递增。所以,没有任何功能。
S
Safak Ozdek

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

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

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


m
mohammad javad

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

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

Deeper:通常,权重更新如下:

W_new = W_old - Learn_rate * D_loss

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

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

https://i.stack.imgur.com/y5CRr.png

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

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

然后:

https://i.stack.imgur.com/la2oK.png

新的权重为:

https://i.stack.imgur.com/6HtM7.png

正如你所看到的,所有的权重都是平等更新的,输入值是什么都没有关系!!

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

https://i.stack.imgur.com/cy1tA.png

和:

https://i.stack.imgur.com/i5oPh.png

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

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

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

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


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

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


e
eski

这根本不是要求。事实上,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 < 0 它是线性的,因为 f(x) = 0 是一个线性函数)。它也是不可微的,因此梯度函数也不是完全可计算的,但在实践中,这些技术问题很容易克服。
他不仅在技术上是正确的,而且在实践中(或类似的东西)也是正确的。正是 ReLU 的非线性使它们变得有用。如果它们是线性的,它们就会有一个 f(x) = a*x 形式的激活函数(因为这是唯一的线性激活函数类型),作为激活函数无用(除非你将它与非线性激活函数结合起来)。
整流线性单元 (ReLU) 不是线性的,它不仅仅是人们吹毛求疵的“小细节”,它也是为什么它一开始就有用的一个重要原因。具有单位矩阵或用作激活函数的常规线性单元的神经网络将无法对非线性函数进行建模。仅仅因为它在 0 以上是线性的,并不意味着它实际上是一个线性函数。泄漏的 ReLU 在 0 以下也是“线性”的,但它仍然不是线性函数,绝对不能只用恒等函数代替。非线性绝对是一个要求。
它实际上是一个称为分段线性函数的概念。