深度学习中的神经网络初始化:为什么正态分布的标准差要设为1/sqrt(n_in)
深度学习中的神经网络初始化:为什么正态分布的标准差要设为1/sqrt(n_in)
在深度学习中,神经网络的初始化是一个非常重要的环节。不当的初始化方法可能导致神经元的激活值分布不合理,从而影响模型的学习效率和性能。本文将详细探讨如何使用正态分布进行神经网络的初始化,并通过具体的数学推导说明为什么传统的初始化方法存在缺陷,以及如何改进。
让我们首先回顾一下正态分布的基本概念:
如果均值为0,方差为1,则属于标准正态分布。均值(mean)是衡量一组数据中心趋势的指标,计算公式为:
mean = x_bar = sum(xi, i=1…n) / n
标准差(standard deviation)衡量数据的离散程度,计算公式为:
sigma = sqrt(sum((xi - x_bar)^2, (i=1…n)) / (n-1))
方差则是标准差的平方。
举个简单的例子:
X = (x1, x2, x3, x4, x5) = 1, 2, 3, 4, 5
x_bar = (1+2+3+4+5) / 5 = 15 / 5 = 3
sigma = sqrt(((1-3)^2 + (2-3)^2 + (3-3)^2 + (4-3)^2 + (5-3)^2) / (5-1)) = sqrt((4+1+0+1+4) / 4) = sqrt(2.5) = 1.58
方差 = 1.58^2 = 2.5
现在,我们来看一个具体的神经网络初始化问题。假设我们有一个神经网络,其输入层有1000个神经元,其中一半输入为0,另一半输入为1。在这种情况下:
- 一半的0消失了,剩下的500个1加上偏置项b,会导致输出的分布标准差为sqrt(501) ≈ 22.4。
如果我们模拟一个以0为均值、以22.4为标准差的正态分布,会发现:
从图中可以看出,大部分的z值都远远大于1或远远小于-1。根据sigmoid激活函数的特性,这会导致输出值接近0或1,权重更新量变得很小,从而影响后续层的学习效率。
为了解决这个问题,我们可以采用一种新的初始化方法:让正态分布的均值为0,标准差等于1/sqrt(n_in),其中n_in是输入层神经元的数量。
具体来说:
- 当输入为500个1和500个0时,z分布的标准差变为sqrt(3/2) ≈ 1.22。
证明过程如下:
- 标准差 = 1/sqrt(n_in) => 方差 = 1/n_in
- n_in = 1000, 方差 = 1/1000
- 不等于0的x有500个,因此z的方差为500 * (1/1000) + b = 1/2 + 1 = 3/2
- z的标准差 = sqrt(3/2) ≈ 1.22
通过这种初始化方法,大部分的z值将分布在-1到1之间,避免了神经元的饱和问题,从而提高了模型的学习效率。
总结来说,合理的权重初始化对于深度学习模型的训练至关重要。通过调整正态分布的参数,我们可以有效地避免神经元饱和问题,加速模型的收敛过程。