[转] sigmoid函数的意义

知乎上看到一个关于sigmoid的理解,角度独特,给人启发,答主大概率是数学系的
转之,存之~
 
作者:傻儿鱼庄
链接:https://www.zhihu.com/question/24259872/answer/623699200
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个答案有点偏题,主要回答下面这个问题:

为什么早期神经网络要采用sigmoid函数作为激活函数。

为了回答这个问题,首先我们稍微回顾一下神经网络背后的数学原理:

任何连续多元函数都能被一组一元函数的有限次叠加而成,其中每一个一元函数的自变量都是一组连续单变量函数的有限次加权叠加。而这内层的每一个单变量函数的自变量都是一个(即一维)变量。

举个例子,x*y = exp(log(x+1)+log(y+1))-(x+0.5)-(y+0.5)。在这个式子中,exp(log(x+1)+log(y+1))是一元函数,其自变量log(x+1)+log(y+1)是两个连续单变量函数的和;(x+0.5)和(y+0.5)也都是一元函数。

Remark:

  1. 这个数学原理被称为Kolmogorov-Arnold representation theorem是对于Hilbert第13问题的部分回答。
  2. 两层有限次叠加足够准确表示任何多元函数。这比多项式逼近要厉害多了,用多项式去准确表示一个连续多元(非多项式)函数需要无穷多项。

这个叠加定理被封存了很多年,因为没法用。它只是说明了存在性,却没有告诉我们如何去构造内层和外层的这些一元函数(就算构造出来,能不能算也是麻烦)。

即便如此,大概1990年左右被研究神经网络的数学家挖出来,作为“指导哲学”:固定一种统一的有限层计算网络结构,调整每个节点的参数和每层节点之间叠加计算的权重,一致逼近任意一个多元函数。更进一步,这些数学家还希望每个节点的一元函数都具有统一的形式,(比如都是sigmoidal-type,也就是说每个节点都是sigmoid函数,只不过参数不一样)。

1989年,George Cybenko在Approximation by Superpositions of a Sigmoidal Function 中提出了这一设想,并证明(存在性)只要一个隐藏层并使用sigmoidal-type函数就能一致逼近任意一个多元连续函数。不过隐藏层的单元数可能会非常大。这一结论不基于KST,而是基于Stone-Weierstrass定理。

1990年,Kurt Hornik在Approximation Capabilities of Multilayer Feedforward Networks 中指出,如果仅考虑一致逼近,关键不在于sigmoidal-type的激活函数函数,而是多层网络的前馈结构。他写道:

it is not the specific choice of the activation function, but rather the multilayer feedforward architecture itself which gives neural networks the potential of being universal learning machines

除了sigmoidal-type,也可以选择其他激活函数,只要他们在连续函数空间上稠密,例如(exp,atan)。他的这一结论也没有用到KST,也基于Stone-Weierstrass定理。(当然这并不是一个非常出人意料的结论,傅里叶级数一直都能做这样的事情)他在最后指出,

"it should be emphasized that our results does not mean that all activation functions will perform equally well in specific learning problems. In applications, additional issues as, for example, minimal redundancy or computational efficiency, have to be taken into account as well."

以上这种思路:基于稠密函数族的一致逼近,是目前的主流。KST在这里仅仅扮演了一个哲学指导的作用。对于任意给定的精度,任意连续的多元函数都能通过有限个节点多层的神经网络来表示。但是表示效率(节点和层数越少越好)就取决于具体问题和具体的激活函数。

另一个不算主流的思路就是去逼近KST所揭示的精确表示。1991年,捷克数学家Vera Kurkova 在Kolmogorov's Theorem and Multilayer Neural Networks 中提出了这一观点,他写道:

"by sacrificing exactness of a representation, we can eliminate this difficulty. We give an approximation version of Kolmogorov's theorem, where all one-variable functions are finite linear combinations of affine transformations with an arbitrary sigmoidal function."

并尝试估计用sigmoidal-type激活函数的隐藏层节点数。

至于他们怎么想的,请聪明的读者们顺藤摸瓜吧。

当然解决了这个问题,又有一大波新问题来了。就算用sigmoidal type作为激活函数的神经网络可以准确表示任何多元函数,可是这些参数和权重怎么算?如果用迭代法(比如梯度反向传播)计算这些参数和权重,能在收敛到那组(可能很多组最佳逼近的参数和权重上吗?如果能收敛,那么又能多快的收敛呢?

顺带提一下:

  1. 由上文所述,“激活函数是用来引入非线性的”,这个说法是不完全正确的。它确实引入了非线性,但是并不是每一种形式的非线性函数都能作为激活函数。最基本的要求是这个函数族得在连续函数空间稠密。其次高效的激活函数(可能还)需要满足KST的要求,而sigmoid恰好做到了。至于其他计算方面的优点,那取决于怎么算权重。比如基于梯度的计算方法当然需要容易计算导数的激活函数。
  2. KST并没有说一个网络中只能有一种激活函数。
posted @ 2021-06-08 13:39  凌波微步_Arborday  阅读(649)  评论(0编辑  收藏  举报