目录
激活函数
一个写的很全的整理文档(https://blog.csdn.net/u012347027/article/details/80639331)另一位博主写的。
激活函数可视化:
https://dashee87.github.io/deep%20learning/visualising-activation-functions-in-neural-networks/
1、几种常见的激活函数
(1)sigmoid function
优点:无论输入的X是多少,都将在输出的时候调整到[0,1]之间的数。
缺点:有的三点。首先饱和神经元会使得梯度消失,如图三所示。
其次,非零中心的输出会为反向传播带来麻烦,如图四所示。 当X都为正数的时候,我们的local 梯度是df/dw,即x,因此整体的梯度由上一层传下来,x恒为正,所以整体的梯度也会保持上一层的符号不发生变化。这就是为什么常采用零均值(既存在正值又存在负值)的数据。
最后就是使用e的指数所带来了一定的计算问题。
(2)、tans function
优点:无论输入的X是多少,都将在输出的时候调整到[-1,1]之间的数。是零均值的。
缺点:还是会存在饱和神经元使得梯度消失的问题。
(3)、relu function
优点:relu的收敛速度是tans和sigmoid的6倍,在x为正的时候不会出现梯度消失,因为只进行max操作,所以计算速度很高。
缺点:x为负的时候,还是会出现梯度消失,而且不是零均值。
什么时候会出现梯度消失呢?1、初始化的权值太差;2、学习率太大,权值波动太大,relu单元被数据的多样性所淘汰(10%-20%的relu单元挂掉了,多半训练出了问题,这种情况时常发生,刚开始训练没有问题,后来就有问题了);利用一些bias值来增大初始化的时候激活的可能性(这句话我没咋明白……)
(4)、Leaky Relu和PRelu
(5)、ERelu
优点:有relu的所有优点,零均值的输出,建立了一个负饱和机制。对噪声的鲁棒性更强。
缺点:e指数引入的计算量的问题。
(6)、Maxout单元
优点:是在泛化relu和leaky relu,取了两者中的最大值。不会出现神经元饱和不会梯度消失
缺点:参数是之前那些方法的2倍。
总结:
使用relu的时候,要注意学习率,不合适的学习率会使得10%到20%的神经元被kill
根据不同的情况尝试使用leaky relu,maxout,Elu,看看会不会有较好的performance
tanh也是备选项之一,但不要给予厚望
sigmoid已经过时了……
数据预处理
零均值处理。对整个训练数据集求平均值。
对于一般的图像,减去整张均值数值的图像、或是每个通道的均值。两者没有太大区别
权值的初始化
(1)、所有权值是小的随机数
对于小的网络是OK的,深层网络不成
增大α,变成1,那么将会导致梯度为0,权值就不更新了,不成。
初始化的权值太小,网络崩溃;太大,神经元饱和。
(2)、Xaviar初始化
初始化W的公式:
如果有少量的输入,将除以很小的值。从而得到大的权重;(少量的输入,每个输入乘以权值,也就需要很大的权重才能保证得到相同的输出方差;相反,大量的输入,只需要很小的权重就能保证其在输出中获得相同的传播)
想得到单位高斯的权值作为每层的输入,为了能够初始化单位高斯的权值,就使用Xaviar公式进行初始化。以上提及的初始化过程使用的是tanh激活函数,且处在tanh的有效的激活区域。但对于relu来说,有一半的神经元将被kill(因为当输入小于0的时候,输出为0),这使得方差减半了。如果还用之前的初始化方程,那得到的输入分布就如下图所示,将有越来越多的峰值(我理解的是输入的神经元)趋于零,神经元就失活了(图15所示),因此改变了方程式,添加了/2的操作(图16),这样输入还能保持很好的高斯分布(图17)。
MSRA也是一种权值初始化方法。