今天学习激活函数~
首先介绍不同的激活函数
(具体的可以访问https://www.cnblogs.com/XDU-Lakers/p/10557496.html)
该函数有3个缺点:
- 其函数容易饱和使梯度消失。为了防止饱和,必须特别设置初始化权重,如果初始化权重过大,很多神经元就会得到一个比较小的梯度,会导致其更新权重变慢。
- 其函数输出不是以0为中心,按照下面公式,如果输入的x为同一个符号,反向传播中w的梯度(即x)也是同一种符号,即权值变化要么全正要么全负,故如果要到达最优值必须要走“之”字型路线,优化的效率就会十分低下,拟合过程缓慢。
- 指数函数的计算消耗资源
tanh解决了前者输出的"非零中心"的问题,但是还是容易饱和、指数运算。
优点:解决了梯度消失的问题,在正区间内神经元不会饱和;由于其线性、非饱和的形式能快速收敛;计算速度快。
缺点:其输出不是以0为中心;训练中间,神经元会永久性死亡,权重无法更新。(如果学习率设置过高,将导致相当一部分神经元会死掉)
优点:神经元不会死亡;正负区间都不会饱和;快速收敛;计算速度快;
缺点:函数中α需要通过先验知识人工赋值。对于Leaky ReLU给出了一个很小的负数梯度值α,这个值是很小的常数。比如:0.01。这样即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。但是这个α通常是通过先验知识人工赋值的。
在训练过程中,α是从高斯分布中随机选出来,再在测试过程中修正。
优点:包含ReLU所有优点;神经元不会死亡;激活函数输出均值接近0;
缺点:包含指数运算。
优点:包含ReLU所有优点;神经元不会死亡;
缺点:因为每个神经元有两组w,导致参数数量激增。
关于权重
设置初始化权重同样也非常重要:
如果设置初始化权重过大(如下图),不同层激活值就会趋于-1和1,趋于饱和。
如果设置初始化权重过小(如下图),激活值就会越来越趋近于0导致网络无法正常工作。
有一种方法(Xavier初始化)通过保持输入输出前后方差一致来计算初始权重。(见下图)