参数初始化往往是模型训练前比较重要的一步,主要是因为其可以加快梯度下降收敛的速度,并且尽量的使其收敛于全局最优。
参数初始化的条件:
Glorot条件:优秀的初始化应该保证以下两个条件:
- 各个层的激活值(输出值)的方差要保持一致(前向传播)
- 各个层对输入的梯度的方差要保持一致(反向传播)
注意事项:
- 参数不能全部初始化为0,也不能全部初始化同一个值;
- 最好保证参数初始化的均值为0,正负交错,正负参数大致上数量相等;
- 初始化参数不能太大或者是太小,参数太小会导致特征在每层间逐渐缩小而难以产生作用,参数太大会导致数据在逐层间传递时逐渐放大而导致梯度消失发散,不能训练。
参数初始化的主要方法:
- 正态分布随机初始化
- 均匀分布随机初始化
- Xavier 初始化
Pytorch中对网络参数初始化:
先定义初始化函数,然后通过apply()函数调用到网络中的每一层。
def weight_init(m):
classname = m.__class__.__name__
if classname.find('Conv') != -1:
m.weight.data.normal_(0.0, 0.02)
elif classname.find('BatchNorm') != -1:
m.weight.data.normal_(1.0, 0.02)
m.bias.data.fill_(0)
model = net()
model.apply(weight_init)