深度学习入门--权重初始值的优化
2019-04-07 本文已影响10人
爱吃西瓜的番茄酱
在神经网络的学习中,权重的初始值特别重要,它经常关系到神经网络的学习能否成功。
权重初始值的优化有三个要点(结论):
- 权重初始值必须是随机生成的。
- 当激活函数使用
sigmoid
或tanh函数(正切函数)
等S型曲线函数时,初始值使用Xavier初始值
。 - 当激活函数使用
ReLU
时,权重初始值使用He初始值
。
随机生成的权重初始值就像这样:
0.01 * np.random.randn(10, 100) # 标准差为0.01 的高斯分布
为什么要随机生成权重初始值呢?因为只有这样,才能发挥多层神经网络的学习效果。
各层的激活值的分布都要求有适当的广度(分布均匀),因为在各层之间传递多样性的数据,神经网络就可以进行高效地学习。反过来,如果传递的都是有所偏向的数据(分布不均匀),就会出现梯度消失或者“表现力受限”的问题,导致学习可能无法顺利进行。
接下来看看各种初始值以及对应的激活函数的激活值的不同分布,
权重初始值为标准差是1的高斯分布,激活函数为sigmoid
如上图,各层激活值呈偏向0和1的分布,会出现梯度消失的问题
权重初始值为标准差是0.01的高斯分布,激活函数为sigmoid
这次的激活值集中在0.5附近,会出现表现力受限的问题。
权重初始值为Xavier初始值,激活函数为sigmoid
Xavier初始值
即是标准差为sqrt(1/n)
的高斯分布:
w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num)
效果如下:
可以看出,各层激活值的分布更有广度,所以sigmoid函数的表现力不受限制,有望进行高效地学习。
权重初始值为He初始值,激活函数为sigmoid
He初始值
即是标准差为sqrt(2/n)
的高斯分布:
w = np.random.randn(node_num, node_num) * np.sqrt(2.0 / node_num)
效果如下:
可以看出,当激活函数为sigmoid
时,He初始值
的效果仍然不错。
激活函数使用ReLU时,不同权重初始值的激活值分布的变化
- 权重初始值为标准差是0.01的高斯分布时:
- 权重初始值为Xavier初始值时:
- 权重初始值为He初始值时:
总结,当激活函数使用ReLU,权重初始值使用He初始值
;当激活函数使用sigmoid时,权重初始值使用Xavier初始值
。
基于MNIST数据集的权重初始值的比较:
这里以标准差为0.01的高斯分布
、Xavier初始值
、He初始值
三种初始值进行实验。
并且由上一篇文章的知识可知,权重偏置等参数的更新有四种方式:
- SGD
- Momentum
- AdaGrad
- Adam
用SGD更新参数的条件下,基于MNIST数据集的三种权重初始值的比较如下图:
如上图,std=0.01
时,完全无法进行学习,当权重初始值为He初始值
时,学习效果最好,进度最快。
用Adam更新参数的条件下,基于MNIST数据集的三种权重初始值的比较如下图:
如上图,三种权重初始值都能得到较好的学习效果,其中仍然是权重初始值为He初始值
的学习效果最佳。说明一个好的更新参数的方法带来的优势可以抵消不良的权重初始值带来的劣势。
用一句话总结今天的文章:如果不知道使用什么权重初始值,那就使用
He初始值
;Adam方法
带来的影响大于初始值带来的影响。
每天学习一点点,每天进步一点点。