我读过一些关于神经网络的文章,我了解单层神经网络的一般原理。我理解需要额外的层,但为什么使用非线性激活函数?
这个问题之后是这个: 在反向传播中,激活函数的衍生物是什么?
我记得之所以使用 sigmoid 函数,是因为它们的导数很容易计算,比如 f (x)(1-f (x))。我不太记得具体数字了。实际上任何有导数的函数都可以用。
激活函数的目的是介绍 ABc0
反过来,这允许您对响应变量(又名目标变量、类标签或分数)建模,这些响应变量随其解释变量非线性变化
非线性 意味着输出不能从输入的线性组合复制(这与呈现为直线的输出不一样——这个词是 仿制的)。
换个角度来看,如果网络中没有一个激活函数,那么神经网络,不管它有多少层,其行为都会像一个单层感知器,因为把这些层加起来只会得到另一个线性函数(参见上面的定义)。
>>> 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])
一种常用的支撑激活函数(< em > 双曲正切 )的评价范围是 -2到2:
“本文利用 Stone-Weierstrass 定理和 Gallant 和 White 的余弦压缩器,建立了使用异常压缩函数的标准多层前馈网络结构,只要有足够多的隐藏单元,几乎可以近似任何感兴趣的函数,达到任何期望的精度。”(Hornik 等,1989,神经网络)
压缩函数就是一个非线性激活函数,它对应于[0,1] ,就像乙状结肠激活函数。
这根本不是必须的。事实上,矫正直线激活函数在大型神经网络中非常有用。计算梯度要快得多,而且它通过将最小界设置为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 + c上的一个激活函数,其中 a和 c是常数,这是线性激活功能的一个推广) ,这只会导致从输入到输出的 仿射变换,这也不是很令人兴奋。
f(x) = a*x + c
a
c
一个神经网络很可能包含具有线性激活功能的神经元,例如在输出层,但是这些神经元需要在网络的其他部分具有非线性激活函数。
注: 一个有趣的例外是 DeepMind 的 合成梯度,他们使用一个小型神经网络来预测反向传播过程中的梯度,给定激活值,他们发现使用一个没有隐藏层的神经网络,只有线性激活,他们可以逃脱惩罚。
线性激活函数可以使用,但只能在非常有限的场合使用。事实上,为了更好地理解激活函数,观察普通最小二乘法或简单的线性回归是很重要的。线性回归的目的是找出最佳的权重,使解释性变量和目标变量之间的垂直影响最小,当与输入相结合时。简而言之,如果预期产出反映了下面所示的线性回归,那么就可以使用线性激活函数:。但正如下图中的线性函数不会产生所期望的结果: (中图)。然而,如下所示的非线性函数将产生预期的结果:
激活函数不能是线性的,因为具有线性激活函数的神经网络只有一层有效,无论它们的结构有多复杂。网络的输入通常是线性映射的(输入 * 权重) ,但是现实世界和问题是非线性的。为了使输入的数据非线性,我们使用称为激活函数的非线性映射。激活函数是一种决策功能,它决定了特定神经特征的存在。它被映射在0和1之间,其中0表示没有特性,而1表示它的存在。不幸的是,权重中发生的微小变化不能反映在激活值中,因为它只能取0或1。因此,非线性函数在这个范围内必须是连续的和可微的。 一个神经网络必须能够接受从无穷到 + 无穷的任何输入,但是它应该能够将其映射到一个范围在{0,1}或在某些情况下在{-1,1}之间的输出——因此需要激活函数。激活函数需要非线性,因为神经网络的目的是通过权重和输入的非线性组合产生非线性决策边界。
有时纯线性网络可以提供有用的结果。假设我们有一个由三层组成的网络,它有各种形状(3,2,3)。通过将中间层仅限于二维空间,我们得到了原三维空间中的“最佳拟合平面”。
但是找到这种形式的线性变换有更简单的方法,如 NMF、 PCA 等。然而,在这种情况下,多层网络的行为方式不同于单层感知器。
一个具有线性激活和任意数量隐层的前馈神经网络等价于一个没有隐层的线性神经网络。例如,让我们考虑图中的神经网络与两个隐藏的层,没有激活
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层。这表明增加层数根本不会增加线性神经网络的逼近能力。我们需要非线性激活函数来逼近非线性函数,而现实世界中的大多数问题都是高度复杂和非线性的。事实上,当激活函数是非线性的时候,一个具有足够大数量隐藏单元的两层神经网络可以被证明是一个通用的函数逼近器。
n
要理解非线性 激活功能背后的逻辑,首先应该理解为什么使用激活函数。一般来说,现实世界的问题需要非线性的解决方案,而这些解决方案并不是微不足道的。所以我们需要一些函数来产生非线性。基本上,激活函数所做的就是产生这种非线性,同时将输入值映射到所需的范围。
然而,线性激活函数可以用于非常有限的情况下,你不需要隐藏层,如线性回归。通常,为这类问题生成一个神经网络是没有意义的,因为这个网络独立于隐藏层的数量,将生成一个线性组合的输入,可以在一个步骤中完成。换句话说,它表现得像一个单层。
对于激活函数(如 连续可微性连续可微性) ,还有一些更为理想的属性。由于我们使用的是反向传播,所以我们生成的函数必须在任何点都是可微的。我强烈建议您查看维基百科页面中的 给你激活函数,以便更好地理解这个主题。
神经网络用于模式识别,模式识别是一种非线性的技术。
假设为了便于讨论,我们对每个神经元使用一个线性激活函数 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。
对于最后一个隐藏层,更新的值将是 w { i } = w { i }-(alpha) * w { l } ... * w { i + 1} * X。
这导致我们将所有权重矩阵相乘,从而产生下列可能性: 由于渐变消失,w { i }几乎没有变化 由于爆炸梯度的影响,w { i }发生了剧烈而不准确的变化 C) w { i }变化很好,足以给我们一个很好的匹配分数
如果 C 发生了,那意味着我们的分类/预测问题很可能是一个简单的基于线性/逻辑回归的问题,并且从一开始就不需要神经网络!
无论你的神经网络有多么强大或者超调,如果你使用线性激活函数,你将永远无法解决非线性的模式识别问题
这里有几个不错的答案。指出克里斯托弗 · M · 毕晓普(Christopher M. Bishop)的《模式识别与机器学习》一书将会很有帮助。这是一本值得参考的书,可以更深入地了解机器学习的几个相关概念。节录自第229页(第5.1节) :
如果一个网络中所有隐单元的激活函数都是线性的,那么对于任何这样的网络,我们总能找到一个没有隐单元的等价网络。这是因为连续线性变换的组合本身就是一个线性映射。然而,如果隐藏单元的数量小于输入或输出单元的数量,那么网络能够产生的变换就不是最一般的从输入到输出的线性变换,因为信息在隐藏单元的降维中丢失了。在第12.4.2节中,我们展示了线性单元网络产生主成分分析。然而,一般而言,人们对线性单元的多层网络兴趣不大。
在神经网络中使用非线性激活函数非常重要,特别是在深层神经网络和反向传播中。根据题目中提出的问题,首先我要说明为什么需要使用非线性激活函数进行反向传播。
简单地说: 如果使用线性激活函数,成本函数的导数相对于输入是一个常数,所以输入(对神经元)的值不会影响权重的更新。这意味着我们不能找出哪些权重是最有效的创造一个良好的结果,因此我们被迫改变所有的权重平等。
深度: 一般情况下,权重更新如下:
W_new = W_old - Learn_rate * D_loss
这意味着新权重等于旧权重减去成本函数的导数。如果激活函数是一个线性函数,那么它的导数 w.r.t 输入是一个常数,输入值对权重更新没有直接影响。
例如,我们打算使用反向传播来更新最后一层神经元的权重。我们需要计算权重函数 w.r.t 权重的梯度。根据连锁规则,我们有:
H 和 y 分别是(估计的)神经元输出和实际输出值。X 是神经元的输入。Grad (f)是从输入的 w.r.t 激活函数推导出来的。从当前权重中减去上面计算的值(按一个因子) ,得到一个新的权重。现在我们可以更清楚地比较这两种类型的激活函数。
1-如果激活功能是 线性的功能,例如: F (x) = 2 * x
然后:
新的重量将是:
如你所见,所有的权重都是平均更新的,输入值是什么并不重要! !
2-但是如果我们使用像 Tanh (x)这样的激活函数,那么:
以及:
现在我们可以看到输入的直接影响在更新权重。
我认为上面的内容足以回答这个问题,但是提到使用非线性激活函数的其他好处还是很有用的。
正如在其他答案中提到的,非线性使得神经网络具有更多的隐层和更深的神经网络。一个具有线性激活函数的层序可以合并为一个层(与前面的函数组合) ,实际上是一个具有隐层的神经网络,它没有利用深层神经网络的优点。
非线性激活函数也可以产生归一化的输出。