我已经阅读了有关神经网络的一些知识,并且了解了单层神经网络的一般原理。我知道需要附加层,但是为什么要使用非线性激活函数?
这个问题之后是这个问题:用于反向传播的激活函数的导数是什么?
我已经阅读了有关神经网络的一些知识,并且了解了单层神经网络的一般原理。我知道需要附加层,但是为什么要使用非线性激活函数?
这个问题之后是这个问题:用于反向传播的激活函数的导数是什么?
Answers:
激活功能的目的是将非线性引入网络
反过来,这使您可以对响应变量(又称目标变量,类标签或分数)建模,该变量随其解释变量非线性变化
非线性表示不能从输入的线性组合中复制输出(这与呈现为直线的输出不同-表示仿射)。
另一种思考方式:在网络中没有非线性激活函数的情况下,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:
可以使用线性激活函数,但是在非常有限的情况下。实际上,要更好地理解激活函数,重要的是要看普通的最小二乘或简单的线性回归。线性回归的目的是找到最佳权重,当与输入值结合使用时,该权重将在解释变量和目标变量之间产生最小的垂直影响。简而言之,如果预期输出反映了如下所示的线性回归,则可以使用线性激活函数:(上图)。但是如下面的第二个图所示,线性函数将无法产生预期的结果:(中间图)。但是,如下所示的非线性函数将产生所需的结果:
激活函数不能是线性的,因为具有线性激活函数的神经网络仅在一层深度有效,而无论其结构多么复杂。网络输入通常是线性变换(输入*权重),但现实世界和问题是非线性的。为了使输入数据非线性,我们使用称为激活函数的非线性映射。激活功能是一种决策功能,可确定特定神经功能的存在。它映射在0和1之间,其中零表示不存在特征,而一个表示不存在特征。不幸的是,权重中发生的细微变化不能反映在激活值中,因为它只能取0或1。因此,非线性函数必须是连续的并且在此范围之间是可微的。神经网络必须能够接受从-infinity到+ infinite的任何输入,但是在某些情况下,它应该能够将其映射到介于{0,1}或{-1,1}之间的输出-因此,需要激活功能。激活函数需要非线性,因为其在神经网络中的目的是通过权重和输入的非线性组合产生非线性决策边界。
如果我们仅允许神经网络中的线性激活函数,则输出将只是输入的线性变换,这不足以形成通用函数逼近器。这样的网络只能表示为矩阵乘法,您将无法从这样的网络获得非常有趣的行为。
对于所有神经元都具有仿射激活函数(即形式上的激活函数f(x) = a*x + c
,其中a
和c
是常数,这是线性激活函数的泛化)的情况也是如此,这只会导致从输入到输出的仿射变换,这也不是很令人兴奋。
神经网络可能很好地包含具有线性激活功能的神经元,例如在输出层中,但是这些神经网络需要在网络的其他部分具有非线性激活功能的神经元。
注意: DeepMind的合成梯度是一个有趣的例外,对于合成梯度,他们使用一个小型神经网络来预测在给定激活值的情况下反向传播过程中的梯度,并且他们发现使用无隐藏层的神经网络可以避免这种情况。仅线性激活。
具有线性激活和任意数量的隐藏层的前馈神经网络等效于没有隐藏层的线性神经网络。例如,让我们考虑图中的神经网络,它具有两个隐藏层并且没有激活
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
各层。这表明增加层根本不会增加线性神经网络的近似能力。我们需要非线性激活函数来近似非线性函数,而大多数现实世界中的问题都是高度复杂和非线性的。实际上,当激活函数是非线性的时,具有足够大量隐藏单元的两层神经网络可以证明是通用函数逼近器。
“本文利用Stone-Weierstrass定理和Gallant和White的余弦压扁器,建立了使用简单压扁功能的标准多层前馈网络体系结构,几乎可以将任何感兴趣的函数近似化为任何所需的精度,但前提是有足够多的隐藏单位可用。” (Hornik等,1989,神经网络)
挤压函数例如是类似于S形激活函数的映射到[0,1]的非线性激活函数。
要首先了解非线性激活函数背后的逻辑,您应该了解为什么使用激活函数。通常,现实世界中的问题需要非平凡的非线性解决方案。因此,我们需要一些函数来生成非线性。激活函数的基本作用是在将输入值映射到所需范围内时生成此非线性。
但是,在不需要隐藏层(例如线性回归)的情况非常有限的情况下,可以使用线性激活函数。通常,针对此类问题生成神经网络是没有意义的,因为与隐藏层的数量无关,该网络将生成输入的线性组合,只需一步即可完成。换句话说,它的行为就像一个单层。
激活函数还有一些更理想的属性,例如连续可微性。由于我们使用反向传播,因此我们生成的函数在任何时候都必须是可微的。我强烈建议您从此处检查维基百科页面的激活功能,以更好地理解该主题。
这里有几个好的答案。最好指出克里斯托弗·毕晓普(Christopher M. Bishop)的著作《模式识别与机器学习》。对于深入了解与ML相关的几个概念,这是一本值得参考的书。摘自第229页(第5.1节):
如果将网络中所有隐藏单元的激活函数都视为线性,那么对于任何这样的网络,我们总能找到一个没有隐藏单元的等效网络。这是基于以下事实:连续线性变换的组成本身就是线性变换。但是,如果隐藏单元的数量小于输入或输出单元的数量,则网络可以生成的变换不是从输入到输出的最一般的线性变换,因为信息在降维时丢失了。隐藏的单位。在第12.4.2节中,我们表明线性单位网络引起了主成分分析。然而,通常,对线性单元的多层网络几乎没有兴趣。
我记得-使用sigmoid函数是因为它们的适合BP算法的导数易于计算,就像f(x)(1-f(x))这样简单。我不完全记得数学。实际上,任何带导数的函数都可以使用。
让我尽可能简单地向您解释一下:
神经网络用于模式识别正确吗?模式查找是一种非常非线性的技术。
假设出于争论的目的,我们对每个神经元使用线性激活函数y = wX + b,并设置类似y> 0-> class 1 else class 0的值。
现在,我们可以使用平方误差损失来计算损失,并将其反向传播,以便模型可以很好地学习,对吗?
错误。
对于最后一个隐藏层,更新后的值将为w {l} = w {l}-α* X。
对于倒数第二个隐藏层,更新后的值将为w {l-1} = w {l-1}-α* w {l} * X。
对于第i个最后一个隐藏层,更新后的值将为w {i} = w {i}-α* w {l} ... * w {i + 1} * X。
这导致我们将所有权重矩阵相乘,从而得出以下可能性:A)w {i}由于梯度消失而几乎没有变化B)w {i}由于爆炸梯度C)w {i}急剧变化而变化不大足以给我们一个很好的得分
如果发生C,这意味着我们的分类/预测问题很可能是基于线性/逻辑回归的简单回归模型,并且一开始就不需要神经网络!
无论您的神经网络有多健壮或超调,如果您使用线性激活函数,您将永远无法解决非线性要求的模式识别问题
完全不是必需的。实际上,整流的线性激活函数在大型神经网络中非常有用。计算梯度要快得多,并且通过将最小范围设置为0会引起稀疏性。
有关更多详细信息,请参见以下内容:https : //www.academia.edu/7826776/Mathematical_Intuition_for_Performance_of_Rectified_Linear_Unit_in_Deep_Neural_Networks
编辑:
关于整流线性激活函数是否可以称为线性函数已经进行了一些讨论。
是的,它在技术上是非线性函数,因为它在点x = 0处不是线性的,但是,说它在所有其他点上都是线性的仍然是正确的,所以我认为在这里nitpick没什么用,
我本可以选择身份函数,但它仍然是正确的,但是由于ReLU最近很流行,所以我选择了ReLU作为示例。
f(x) = a*x
(因为这是唯一一种线性激活函数的有),这是无用的激活功能(除非你具有非线性激活功能结合起来)。