花书入门——(第一部分)**函数,系列未完持续更新

前言

花书是一个比较系统的书籍,内容非常全面。说我看完了花书,我自己都不信。只是粗略的总结一下,毕竟研究生阶段时间有限。对于一些必须掌握的部分,率先进行整理。花书,我会反复看,也会持续更新。

一、**函数起源

1、生物中的**函数的性质

(1)**函数的输出表示神经元的活性值

(2)神经元只有兴奋和抑制两种活性值

2、理性化生物中的**函数

理想中的**函数是阶跃函数,它将输入值映射为输出值 “0”或“1”,显然 “1” 对应于神经元兴奋 , “0” 对应于神经元抑制。这种情况是最符合生物特性的。但它不连续,不光滑,同时0—1对特征的刻画过于简单。

花书入门——(第一部分)**函数,系列未完持续更新

3、生物中**函数与神经网络中**函数

阶跃函数具有不连续 、不光滑等性质,所以它无法被用于神经网络的结构。(为什么呢?)

1)不连续则不可导,如果**函数不可导则无法求梯度,导致网络不可更新。

2)不光滑说明一阶导数不一定连续,同时函数不是无穷阶可导。**函数的输出其实是“精度”,我们希望可以取到任意“精度值”。如果导数不连续,梯度变化会变大,使得网络出现收敛相关的问题。同时,因为不连续会导致即便**函数连续,但因为梯度的波动,也会出现无法得到任意值

二、**函数应用神经网络中的**函数

1、**函数作用

1)**函数的本质:

**函数并不是去**什么,而是指如何把“**神经元的特征”通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余)。(输入为正为“正样本” ,输出应也为正)

2)**函数的作用:

它的作用是将输入映射成输出,如何去映射特征的原理不明,但如果神经网络想要表达任何映射,就需要把线性映射化为非线性映射。实现非线性化映射是设计**函数的初衷。

2、**函数要求

1)非线性:

即导数不是常数。这个条件是多层神经网络的基础,保证多层网络不退化成单层线性网络。这也是**函数的意义所在。

2)几乎处处可微:

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

3)计算简单:

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

4)非饱和性(saturation):

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

5)单调性(monotonic) :

即导数符号不变。这个性质大部分**函数都有,除了诸如sincos等。单调性使得在**函数处的梯度方向不会改变,从而让训练更容易收敛。

6)输出范围有限:

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

7)接近恒等变换(identity):

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

8)归一化(normalization):

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

9) 参数少:

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

3、常见**函数

1Sigmoid 函数

优点:sigmoid函数和阶跃函数非常相似,但是解决了光滑和连续的问题,同时它还成功引入了非线性。

特点:值域处在0~1,因为值域有限,所以不惧怕较大的输出,网络比较稳定。

缺点:易出现饱和现象

花书入门——(第一部分)**函数,系列未完持续更新

2Tanh 函数

优点:tanh函数和sigmoid函数非常相似,但tanh收敛更快(斜率大)。

特点:过(0,0)点,所以收敛快。

缺点:还是会出现软饱和现象。

花书入门——(第一部分)**函数,系列未完持续更新

3)ReLu 函数

ReLu函数,在卷积神经网络和层次较深的神经网络中效果好。

特点:**函数的导数的绝对值最大为10所以它既不导致梯度消失也不导致梯度爆炸。因此解决梯度爆炸并缓解梯度消失问题。

缺点:大量神经元不工作出现“死区”,导致网络不收敛。

花书入门——(第一部分)**函数,系列未完持续更新

4)Leaky ReLu

Leaky ReLu函数,ReLu函数x<0部分调整为f(x)=ax

特点:继承了ReLu函数的优点,同时解决了死区问题。

缺点:有参数,相比于ReLu函数容易出现梯度消失。

花书入门——(第一部分)**函数,系列未完持续更新

6)参数化 ReLu

7)随机化 ReLu

随机化也是一种解决超参数设定的方法。随机化ReLu最早是用于Kaggle的一个数据竞赛上。具体实现上,a取值在训练阶段服从于一个均匀分布,而在测试阶段将其指定为均匀分布所对应的期望。

优点:保存了ReLu的优点。

特点:因为随机化解决过拟合问题。

缺点:仍有过拟合风险

8ELU

ELU, 指数化线性单元,是一个非常年轻的**函数(出生于2016年)。特点:超参数通常为1。(因为求导好算,这也是总引用指数的原因)。

花书入门——(第一部分)**函数,系列未完持续更新

优点:解决死区问题

缺点:指数运算会增加一些计算量。因为提出太晚,问题还没暴露。

9Swish 函数

就实践来看,目前Swish还没有普遍替代ReLu的趋势,还需要更多从理论和实验上来证明Swish函数优点的工作,现在还是等时间检验吧。

花书入门——(第一部分)**函数,系列未完持续更新

花书入门——(第一部分)**函数,系列未完持续更新

4、**函数选取

首先要认识到,目前没有一个公认的“最优的”**函数,不同的**函数可能在不同类型的数据上做到较好的效果。其次,由于tanh和sigmoid函数这两个最早的**函数由于其缺陷现在已经不太使用了,因而我们通常都是用ReLu函数起手。如果ReLu的效果不好(特别是发现有很多神经元长期失活),然后不妨试试看它的各种变体(新潮点可以选择Swish函数)。最后,如果能够不计时间调参的话,通常为了达到最好效果,可以简单在原来的**函数上自定义,通常是乘以一个常数的超参数来调节。