为什么在反向传播neural network中必须使用非线性激活函数?
我一直在阅读neural network上的一些东西,并且我理解单层neural network的一般原理。 我理解对附加层的需求,但是为什么使用非线性激活函数呢?
这个问题之后是这个问题: 什么是反向传播中使用的激活函数的派生?
激活function的目的是将非线性引入到networking中
反过来,这就允许你build立一个与其解释variables非线性变化的响应variables(也就是目标variables,类标签或分数)
非线性意味着输出不能从input的线性组合(这不同于呈现为直线的输出 – 这个词是仿射的 )输出。
另一种思考的方式是:在networking中没有非线性激活函数的情况下,无论有多less层,neural network都会像单层感知器一样工作,因为将这些层合在一起会给你另一个线性函数(见上面的定义)。
>>> 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])
backprop( 双曲正切 )中使用的常用激活函数从-2到2进行计算:
线性激活function可以使用。 但是在非常有限的情况下。 事实上,为了更好地理解激活函数,看一下普通的最小二乘或简单的线性回归是很重要的。 线性回归的目的是find最优的权重,结合input时,解释variables和目标variables之间的垂直效应最小。 简而言之,如果超出期望的输出反映如下所示的线性回归,那么可以使用线性激活函数:(上图)。但是在下面的第二个图中,线性函数不会产生期望的结果:(中间数字)然而,如下所示的非线性函数会产生所需的结果:(下图)
激活函数不能是线性的,因为具有线性激活函数的neural network只有一层有效,不pipe它们的体系结构有多复杂。 networkinginput通常是线性变换(input*权重),但现实世界和问题是非线性的。 为了使input数据非线性,我们使用称为激活函数的非线性映射。 激活function是确定特定神经特征的存在的决策function。 它被映射在0和1之间,其中零表示该特征不存在,而一个表示该特征存在。 不幸的是,权重中发生的微小变化不能反映在激活值中,因为它只能取0或1,所以非线性函数必须在这个范围内是连续的和可微的。 一个neural network必须能够从-infinity到+ infinite的任何input,但在某些情况下它应该能够映射到范围在{0,1}或者{-1,1}之间的输出 – 因此需要激活function。 激活函数需要非线性,因为其在neural network中的目标是通过权重和input的非线性组合产生非线性决策边界。
如果我们只允许neural network中的线性激活函数,输出将只是input的线性变换 ,这不足以形成通用函数逼近器 。 这样的networking可以表示为一个matrix乘法,你不能从这样的networking获得非常有趣的行为。
对于所有神经元都具有仿射激活函数的情况(即forms为f(x) = a*x + c
的激活函数,其中a
和c
是常数,这是线性激活函数的泛化)这只会导致从input到输出的仿射变换 ,这也不是很令人兴奋。
neural network很可能包含具有线性激活function的神经元,例如在输出层中,但是这些要求神经元在networking的其他部分中具有非线性激活function。
正如我所记得的那样 – 使用sigmoid函数是因为它们适合BPalgorithm的导数很容易计算,像f(x)(1-f(x))一样简单。 我不记得确切的math。 实际上任何带有派生的函数都可以使用。
“本文利用Gallant和White的Stone-Weierstrass定理和余弦压缩器来确定使用abritrary压缩函数的标准多层前馈networking架构可以将任何感兴趣的函数逼近到任何期望的精度,只要提供足够多的隐藏单位可用。“ (Hornik等,1989, http ://weber.ucsd.edu/~hwhite/pub_files/hwcv-028.pdf)
挤压function例如是非线性的激活function,如S形激活function那样映射到[0,1]。
几个神经元的分层neural network可以用来学习线性不可分割的问题。 例如XORfunction可以通过两个步骤激活function获得。
这完全不是一个要求。 事实上, 整数线性激活函数在大型neural network中非常有用。 计算梯度速度要快得多,并且通过将最小边界设置为0来引起稀疏性。
有关更多详细信息,请参阅以下内容: https : //www.academia.edu/7826776/Mathematical_Intuition_for_Performance_of_Rectified_Linear_Unit_in_Deep_Neural_Networks
编辑:
关于整stream线性激活函数是否可以称为线性函数已经有了一些讨论。
是的,这在技术上是一个非线性函数,因为它在x = 0点不是线性的,但是在其他所有点上它是线性的,所以我认为这对于挑选这里是没有用的,
我可以select身份authenticationfunction,但这仍然是事实,但我select了ReLU作为例子,因为它最近stream行。