怎样选择神经元权重等参数的初始值

关于神经元权重等参数的初始化,cs231n的课程中进行了详细的对比说明,下面我搬运和总结一下里面所讲述的内容,方便那些不想找视频看的同学,当然,如果想看视频的话,B站直接搜索cs231n,在课程的第6章中有一部分详细介绍了权重的初始化。
权重全部设为0或者相同的值怎样选择神经元权重等参数的初始值

当权重全部设为0或者相同的值时,输入神经元与权重进行矩阵乘法之后得到的输出神经元是相同的,这样在梯度向上传递时神经元会做出类似的更新。而我们想要得到的神经元最好是存在差异,协同处理信息的,并不需要高度一致。
权重设置为高斯分布抽样随机较小值接下来将权重设置为高斯分布(均值为0,方差0.01),代码如下:
W = 0.01* np.random.randn(D,H)经过实验发现,这样初始化对较浅网络效果良好,当神经网络变深后,输出神经元的分布中方差减小,大部分神经元的值都变为0,所以在反向传播求梯度时,导致大量神经元梯度为0,不再更新,原因在于怎样选择神经元权重等参数的初始值

下图是经过十层神经网络得到的各层输出神经元的分布图(激活函数选择tanh函数)
怎样选择神经元权重等参数的初始值

权重设置为方差为1的高斯分布抽样随机下图是经过十层神经网络得到的各层输出神经元的分布图
怎样选择神经元权重等参数的初始值

可以发现,随着网络变深之后,经过激活后的神经元向-1和1靠拢,在反向求梯度过程中,tanh函数在-1和1是趋近于0的,所以同样导致了梯度不再更新。
最常用的初始化方法W = np.random.radn(fan_in,fan_out)/np.sqrt(fan_in)其中fan_in为输入神经元个数,fan_out为输出神经元个数 下图是经过十层神经网络得到的各层输出神经元的分布图
怎样选择神经元权重等参数的初始值

可以发现,分布良好,不会出现较明显的聚集现象。
视频中也讲解了其他激活函数(ReLu)对初始化的影响和一些解决方法,这里不做介绍,感兴趣可以去观看视频和视频中推荐的相关论文。
参考内容
课程视频

■网友
【怎样选择神经元权重等参数的初始值】 权重合理初始化目的是了尽量避免随着网络层数的加深,而出现的梯度消失或者梯度爆炸的情况。关于权重的初始化要避免初始化为零,这样会出现对称的问题。

■网友
意思就是生成一系列符合高斯分布的随机数,最为初始权重。
■网友
CS231n Convolutional Neural Networks for Visual Recognition
■网友
事实上这个初始化方法的选择比较trick,没有特别有理论依据的方法。对实验结果影响也不大,大家更多采用的是-sqrt(6/(n_in+n_out))到sqrt(6/(n_in,n_out))的均匀分布。n_in是输入神经元个数,n_out是输出个数。
■网友
一般是随机的,但是需要根据数据量的大小来决定初始权值的量级,不然有可能不会收敛,尤其是对于随机梯度下降的学习方法
■网友
早期有文献试过非监督初始化权重,后来没人用了,因为好像不重要


    推荐阅读