神经网络的参数学习、训练是一个凸优化的问题,在使用梯度下降算法进行优化时,参数初始值的选择会影响模型的泛化性能(局部最优解)、优化效率(梯度消失、梯度爆炸),因此其选择十分关键。
神经网络参数初始化通常有以下三种方式:
- 固定值初始化: 指的是对于一些特殊的参数,可以根据经验给出固定值进行初始化,如卷积层的偏置和卷积核参数可以分别固定为0.0和0.02,这种方法效果一般,适用性低,目前使用的频率也是越来越低。
def weights_init_normal(m):
classname = m.__class__.__name__
#print(classname)
if classname.find('Conv') != -1:
init.normal_(m.weight.data, 0.0, 0.02)
elif classname.find('Linear') != -1:
init.normal_(m.weight.data, 0.0, 0.02)
elif classname.find('BatchNorm') != -1:
init.normal_(m.weight.data, 1.0, 0.02)
init.constant_(m.bias.data, 0.0)
- 随机初始化: 固定值初始化对于神经网络某些层如激活层,在第一轮epoch时所有隐藏层神经元输出都相同,不同于固定值初始化,随机初始化是对每个参数都随机初始,是的不同神经元之间的区分性更好。
- 预训练初始化: 不同的参数初始化方式会收敛到不同的局部最优解,这些局部最优解在训练集上有误差小,但是泛化误差大。一个已经在大规模数据集上训练过的模型可以提供更好的参数初始值,这种方法称为预训练初始化,可以用于有监督、无监督训练任务。预训练初始化通常可以拥有更好的收敛性和泛化性,但是不能够在目标任务上根据需求任意调整网络结构,灵活性较低。
因此,值得讨论和探索的是一个好的随机初始化方法,通常有三类:基于固定方差的参数初始化、基于方差缩放的参数初始化、正交初始化。