关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。这个问题似乎与帮助中心定义的范围内的编程无关。 1年前关闭。改进这个问题
我一直在阅读有关神经网络的一些东西,并且我了解单层神经网络的一般原理。我知道需要额外的层,但为什么要使用非线性激活函数?
这个问题之后是这个问题:What is a derivative of the activation function used for in backpropagation?
激活函数的目的是将非线性引入网络
反过来,这允许您对随解释变量非线性变化的响应变量(也称为目标变量、类标签或分数)进行建模
非线性意味着输出不能从输入的线性组合中再现(这与呈现为直线的输出不同——这个词是仿射的)。
另一种思考方式:如果网络中没有非线性激活函数,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
可以使用线性激活函数,但是在非常有限的情况下。事实上,为了更好地理解激活函数,重要的是查看普通的最小二乘或简单的线性回归。线性回归旨在找到与输入相结合时导致解释变量和目标变量之间的垂直影响最小的最佳权重。简而言之,如果预期输出反映如下所示的线性回归,则可以使用线性激活函数:(上图)。但如下图第二张所示,线性函数不会产生预期的结果:(中图)。但是,如下所示的非线性函数会产生所需的结果:
https://i.stack.imgur.com/EoiEP.png
激活函数不能是线性的,因为具有线性激活函数的神经网络只有一层有效,无论其架构有多复杂。网络的输入通常是线性变换(输入 * 权重),但现实世界和问题是非线性的。为了使输入数据非线性,我们使用称为激活函数的非线性映射。激活函数是一种决策函数,用于确定特定神经特征的存在。它映射在 0 和 1 之间,其中 0 表示不存在该特征,而 1 表示存在该特征。不幸的是,权重中发生的微小变化无法反映在激活值中,因为它只能取 0 或 1。因此,非线性函数在此范围内必须是连续且可微的。神经网络必须能够接受从 -infinity 到 +infinite 的任何输入,但在某些情况下,它应该能够将其映射到范围在 {0,1} 或 {-1,1} 之间的输出 - 因此需要激活函数。激活函数需要非线性,因为它在神经网络中的目标是通过权重和输入的非线性组合产生非线性决策边界。
如果我们在神经网络中只允许线性激活函数,输出将只是输入的 linear transformation,不足以形成 universal function approximator。这样的网络只能表示为矩阵乘法,而您将无法从这样的网络中获得非常有趣的行为。
对于所有神经元都具有仿射激活函数(即 f(x) = a*x + c
形式的激活函数,其中 a
和 c
是常数,这是线性激活函数的推广)的情况也是如此,这将只是导致从输入到输出的affine transformation,这也不是很令人兴奋。
神经网络很可能包含具有线性激活函数的神经元,例如在输出层中,但是这些需要在网络的其他部分中与具有非线性激活函数的神经元一起使用。
注意: 一个有趣的例外是 DeepMind 的 synthetic gradients,他们使用一个小型神经网络在给定激活值的情况下预测反向传播过程中的梯度,他们发现他们可以使用没有隐藏层且只有线性激活的神经网络。
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
层。这表明添加层根本不会增加线性神经网络的逼近能力。我们需要非线性激活函数来逼近非线性函数,而现实世界中的大多数问题都是高度复杂和非线性的。事实上,当激活函数是非线性的时,具有足够多隐藏单元的两层神经网络可以被证明是一个通用函数逼近器。
这里有几个很好的答案。最好指出 Christopher M. Bishop 的《模式识别和机器学习》一书。这是一本值得参考的书,可以更深入地了解几个与 ML 相关的概念。摘自第 229 页(第 5.1 节):
如果一个网络中所有隐藏单元的激活函数被认为是线性的,那么对于任何这样的网络,我们总能找到一个没有隐藏单元的等价网络。这是因为连续线性变换的组合本身就是线性变换。但是,如果隐藏单元的数量小于输入或输出单元的数量,那么网络可以生成的变换不是从输入到输出的最一般的可能线性变换,因为信息在降维时丢失了。隐藏单位。在第 12.4.2 节中,我们展示了线性单元网络引起了主成分分析。然而,一般来说,对线性单元的多层网络几乎没有兴趣。
“本文利用 Stone-Weierstrass 定理和 Gallant 和 White 的余弦 squasher 来确定使用 abritrary squashing 函数的标准多层前馈网络架构几乎可以将任何感兴趣的函数逼近到任何所需的准确度,只要有足够多的隐藏单位可用。” (Hornik et al., 1989, Neural Networks)
例如,挤压函数是映射到 [0,1] 的非线性激活函数,类似于 sigmoid 激活函数。
有时纯线性网络可以提供有用的结果。假设我们有一个具有形状 (3,2,3) 的三层网络。通过将中间层限制为仅二维,我们得到的结果是原始三维空间中的“最佳拟合平面”。
但是有更简单的方法可以找到这种形式的线性变换,例如 NMF、PCA 等。但是,在这种情况下,多层网络的行为方式与单层感知器不同。
神经网络用于模式识别。模式查找是一种非常非线性的技术。
假设为了论证,我们对每个神经元使用线性激活函数 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,这意味着我们的分类/预测问题很可能是一个简单的基于线性/逻辑回归量的问题,并且从一开始就不需要神经网络!
不管你的神经网络有多健壮或高度调整,如果你使用线性激活函数,你将永远无法解决需要非线性的模式识别问题
我记得 - 使用 sigmoid 函数是因为它们适合 BP 算法的导数很容易计算,比如 f(x)(1-f(x))。我不记得确切的数学。实际上可以使用任何带导数的函数。
要首先了解非线性 activation functions 背后的逻辑,您应该了解为什么使用激活函数。一般来说,现实世界的问题需要非线性解决方案,这不是微不足道的。所以我们需要一些函数来产生非线性。基本上,激活函数所做的是在将输入值映射到所需范围时生成这种非线性。
但是,线性激活函数可用于非常有限的一组不需要隐藏层的情况,例如线性回归。通常,为此类问题生成神经网络是没有意义的,因为独立于隐藏层的数量,该网络将生成输入的线性组合,只需一步即可完成。换句话说,它的行为就像一个单层。
激活函数还有一些更理想的属性,例如连续可微性。由于我们使用反向传播,我们生成的函数必须在任何时候都是可微的。我强烈建议您查看 wikipedia 页面以了解 here 中的激活函数,以便更好地理解该主题。
在神经网络中使用非线性激活函数很重要,尤其是在深度神经网络和反向传播中。根据题目中提出的问题,我先说一下反向传播需要使用非线性激活函数的原因。
简单地说:如果使用线性激活函数,成本函数的导数相对于(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 的优势。
非线性激活函数也可以产生归一化的输出。
多个神经元的分层 NN 可用于学习线性不可分问题。例如,XOR 函数可以通过具有阶跃激活函数的两层来获得。
这根本不是要求。事实上,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 作为示例,因为它最近很受欢迎。
f(x) = a*x
形式的激活函数(因为这是唯一的线性激活函数类型),作为激活函数无用(除非你将它与非线性激活函数结合起来)。
不定期副业成功案例分享