这篇文章写一下如何初始化神经网络结构
来看一下正态分布
如果均值=0,方差=1,则属于标准正态分布
均值:mean,average,x_bar=sum(xi,i=1…n)/n,一组数据它的中心趋势的衡量
标准差:standard deviation,sigma=sqrt(sum((xi-x_bar)^2,(i=1…n))/(n-1))
方差:标准差^2=方差
举个例子:
X=(x1,x2,x3,x4,x5)=1,2,3,4,5
x_bar=(1+2+3+4+5)/5=15/5=3
sigma=((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
假如有一个神经网络:
输入x:一半是0,一半是1,一共1000个神经元的输入层
结果:一半个0消失了,剩下的500个1,加上b,分布:标准差:sqrt(501)=22.4
模拟一个以0为均值,以22.4为标准差的正态分布:
可以看到以上图像中,z很多都远远大于1,或者远远小于-1,根据sigmoid函数:
输出的值都接近0和1,当权重变化时,更新量很小,对于更新后面的层,更新量很小,学习的很慢。
使隐藏层饱和了,跟之前我们说的输出层饱和问题相似,对于输出层,我们用改进的cost函数,比如cross-entropy函数可以改进输出层饱和问题,但是对于隐藏层,我们无法通过cost函数来改进
有其他更好的方法来初始化权重吗?
新的方法:正态分布均值=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)
大部分z在1和-1之间,神经元没有饱和,学习过程不会被减慢