神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性?还有哪些属性是好的属性但不必要的?

对于这个问题,很多人的回答是实现非线性。但是我感觉这是结果,而不是原因。从最原始理论里激活函数是阶跃函数,激活函数就是模拟神经元的激活状态和非激活状态。后来实际中因为需要优化,需要求导,才采用sigmoid这些变种的激活函数。如果仅仅是为了实现非线性,那任何的非线性函数都可以作为激活函数?实现非线性的手段有非常多,但这显然不是这样的。那么我的问题是什么样的激活函数才是好的激活函数呢?激活函数的真正意义…
关注者
399
被浏览
14,950

11 个回答

补充一篇Google Brain[10] 的观点。这篇文章里基于RL对激活函数进行了搜索,包括很多一元函数和二元函数的组合:

最终发现了一些表现最好的激活函数:

在搜索过程中,他们发现表现比较好的激活函数都比较简单(由两个以内的单元组成)且由原始输入x组合成(即b(x, g(x)))。同时,它们都是光滑的(与ReLU不同),而且有些并不是单调的(比如表现最好的Swish函数)。

对应于原回答中的特性,其中的1、2、3、4、7(从图中可以看出,大部分函数都具有线性区)、8都被这篇文章的实验所验证,比较有争议的就是单调性。

----------------------------原回答的分割线----------------------------------

说说我对一个好的激活函数的理解吧,有些地方可能不太严谨,欢迎讨论。(部分参考了Activation function。)

1. 非线性:即导数不是常数。这个条件前面很多答主都提到了,是多层神经网络的基础,保证多层网络不退化成单层线性网络。这也是激活函数的意义所在。

2. 几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU,只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响[1]。

3. 计算简单:正如题主所说,非线性函数有很多。极端的说,一个多层神经网络也可以作为一个非线性函数,类似于Network In Network[2]中把它当做卷积操作的做法。但激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。

4. 非饱和性(saturation):饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。最经典的例子是Sigmoid,它的导数在x为比较大的正值和比较小的负值时都会接近于0。更极端的例子是阶跃函数,由于它在几乎所有位置的梯度都为0,因此处处饱和,无法作为激活函数。ReLU在x>0时导数恒为1,因此对于再大的正值也不会饱和。但同时对于x<0,其梯度恒为0,这时候它也会出现饱和的现象(在这种情况下通常称为dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是为了解决这一问题。

5. 单调性(monotonic):即导数符号不变。这个性质大部分激活函数都有,除了诸如sin、cos等。个人理解,单调性使得在激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。

6. 输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH。但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。因此现在这类函数仅用于某些需要特定输出范围的场合,比如概率输出(此时loss函数中的log操作能够抵消其梯度消失的影响[1])、LSTM里的gate函数。

7. 接近恒等变换(identity):即约等于x。这样的好处是使得输出的幅值不会随着深度的增加而发生显著的增加,从而使网络更为稳定,同时梯度也能够更容易地回传。这个与非线性是有点矛盾的,因此激活函数基本只是部分满足这个条件,比如TanH只在原点附近有线性区(在原点为0且在原点的导数为1),而ReLU只在x>0时为线性。这个性质也让初始化参数范围的推导更为简单[5][4]。额外提一句,这种恒等变换的性质也被其他一些网络结构设计所借鉴,比如CNN中的ResNet[6]和RNN中的LSTM。

8. 参数少:大部分激活函数都是没有参数的。像PReLU带单个参数会略微增加网络的大小。还有一个例外是Maxout[7],尽管本身没有参数,但在同样输出通道数下k路Maxout需要的输入通道数是其它函数的k倍,这意味着神经元数目也需要变为k倍;但如果不考虑维持输出通道数的情况下,该激活函数又能将参数个数减少为原来的k倍。

9. 归一化(normalization):这个是最近才出来的概念,对应的激活函数是SELU[8],主要思想是使样本分布自动归一化到零均值、单位方差的分布,从而稳定训练。在这之前,这种归一化的思想也被用于网络结构的设计,比如Batch Normalization[9]。


参考文献:

[1] Goodfellow I, Bengio Y, Courville A. Deep learning[M]. MIT press, 2016.

[2] Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.

[3] Maas A L, Hannun A Y, Ng A Y. Rectifier nonlinearities improve neural network acoustic models[C]//Proc. ICML. 2013, 30(1).

[4] He K, Zhang X, Ren S, et al. Delving
deep into rectifiers: Surpassing human-level performance on imagenet
classification[C]//Proceedings of the IEEE international conference on
computer vision. 2015: 1026-1034.

[5] Glorot X, Bengio Y. Understanding the
difficulty of training deep feedforward neural networks[C]//Proceedings
of the Thirteenth International Conference on Artificial Intelligence
and Statistics. 2010: 249-256.

[6] He K, Zhang X, Ren S, et al. Deep
residual learning for image recognition[C]//Proceedings of the IEEE
conference on computer vision and pattern recognition. 2016: 770-778.

[7] Goodfellow I J, Warde-Farley D, Mirza M, et al. Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013.

[8] Klambauer G, Unterthiner T, Mayr A, et al. Self-Normalizing Neural Networks[J]. arXiv preprint arXiv:1706.02515, 2017.

[9] Ioffe S, Szegedy C. Batch
normalization: Accelerating deep network training by reducing internal
covariate shift[C]//International Conference on Machine Learning. 2015:
448-456.

[10] Ramachandran P, Zoph B, Le Q V. Swish: a Self-Gated Activation Function[J]. arXiv preprint arXiv:1710.05941, 2017.

机器学习的神经网络虽然受到了生物学启发,但并不是照搬生物。


我认为只要连续,有平缓的和陡峭些的部分就行。


哪怕是sin都可能有用。