之旅(9)——线性层权值初始化"/>
Pytorch学习之旅(9)——线性层权值初始化
一、为什么要讨论权值的初始化问题?
神经网络一般包含多级全线性层,随着层数的增加,为了保持网络的稳定,对梯度提出了要求:不能出现梯度消失或者爆炸。
先来看一个三级全连接层网络:
此处乱入一个数学知识:
当某一层的输入和权值都满足 mean=0、std=1的标准正态分布时,有: 输出的方差 D=N(输入神经元的个数)
而方差反映了参数的离散程度,如果后一层方差为前一层方差的N倍,在多层神经网络进行反向求导的时候,就会出现梯度爆炸的情形。
二、如何解决初始化问题
如图三所示,令输入的方差和输出的方差相等,即
{ D ( o u t ) = ∑ i = 0 n − 1 D ( i n ) ∗ D ( w ) D ( o u t ) = D ( i n ) \left\{ \begin{array}{l} D(out) = \sum_{i=0}^{n-1}D(in)*D(w) \\ D(out)=D(in) \end{array} \right. {D(out)=∑i=0n−1D(in)∗D(w)D(out)=D(in)
即有:
D ( w ) = 1 n D(w)=\frac{1}{n} D(w)=n1
权值的方差为:输入神经元个数的倒数。
使用pytorch的正态分布函数初始化数据:
# m.weight.data:网络层m的权重值
# self.neural_num:输入神经元的个数
nn.init.normal_(m.weight.data, mean=0, std=np.sqrt(1/self.neural_num))
三、如果添加激活函数。。。
pytorch提供的十种初始化方法:
1、Xavier 均匀分布
2、Xavier正态分布
3、Kaiming均匀分布
4、Kaiming正态分布
5、均匀分布
6、正态分布
7、常数分布
8、正交矩阵初始化
9、单位矩阵初始化
10、稀疏矩阵初始化
它们各自对应着不同激活函数,详情请点击:初始化方案
更多推荐
Pytorch学习之旅(9)——线性层权值初始化
发布评论