本文以CNN的三个主要构成部件——卷积层、BN层、全连接层为切入点,分别介绍其初始化方法。
高斯初始化
从均值为0,方差为1的高斯分布中采样,作为初始权值。PyTorch中的相关函数如下:
torch.nn.init.normal_(tensor, mean=0, std=1)
kaiming高斯初始化
由FAIR的大牛Kaiming He提出来的卷积层权值初始化方法,目的是使得每一卷积层的输出的方差都为1,具体数学推导可以参考论文[1]. 权值的初始化方法如下:
其中,a为Relu或Leaky Relu的负半轴斜率, nl n l 为输入的维数,即 nl=卷积核边长2×channel数 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激活函数。
torch.nn.init.xavier_normal_(tensor, gain=1)
初始化
对于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)