卷积神经网络的权值初始化方法

本文以CNN的三个主要构成部件——卷积层、BN层、全连接层为切入点,分别介绍其初始化方法。

卷积层

高斯初始化

 从均值为0,方差为1的高斯分布中采样,作为初始权值。PyTorch中的相关函数如下:

torch.nn.init.normal_(tensor, mean=0, std=1)

kaiming高斯初始化

 由FAIR的大牛Kaiming He提出来的卷积层权值初始化方法,目的是使得每一卷积层的输出的方差都为1,具体数学推导可以参考论文[1]. 权值的初始化方法如下:

W l ~ N ( 0 , 2 ( 1 + a 2 ) × n l )

其中,a为Relu或Leaky Relu的负半轴斜率, n l 为输入的维数,即 n l = 2 × c h a n n e l
在PyTorch中,相关函数如下:

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

 上述输入参数中,tensor是torch.Tensor变量,a为Relu函数的负半轴斜率,mode表示是让前向传播还是反向传播的输出的方差为1,nonlinearity可以选择是relu还是leaky_relu.

xavier高斯初始化

 Glorot正态分布初始化方法,也称作Xavier正态分布初始化,参数由0均值,标准差为sqrt(2 / (fan_in + fan_out))的正态分布产生,其中fan_in和fan_out是分别权值张量的输入和输出元素数目. 这种初始化同样是为了保证输入输出的方差不变,但是原论文中([2])是基于线性函数推导的,同时在tanh激活函数上有很好的效果,但不适用于ReLU激活函数。

std = gain × 2 fan_in + fan_out

在PyTorch中,相关函数如下:

torch.nn.init.xavier_normal_(tensor, gain=1)


BatchNorm层

回顾
BatchNorm

初始化

 对于scale因子 γ ,初始化为1;对于shift因子 β ,初始化为0.

全连接层

 对于全连接层,除了可以使用卷积层的基于高斯分布的初始方法外,也有使用均匀分布(uniform distribution)的初始化方法,或者直接设置为常量(constant)。

还有其它这里没有细讲的初始化方法,包括:
Orthogonal:用随机正交矩阵初始化。
sparse:用稀疏矩阵初始化。
TruncatedNormal:截尾高斯分布,类似于高斯分布,位于均值两个标准差以外的数据将会被丢弃并重新生成,形成截尾分布。PyTorch中似乎没有相关实现。

参考

[1] Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification — He, K. et al. (2015)
[2] Understanding the difficulty of training deep feedforward neural networks — Glorot, X. & Bengio, Y. (2010)

猜你喜欢

转载自blog.csdn.net/hyk_1996/article/details/82118797