一、为什么要讨论权值的初始化问题?
神经网络一般包含多级全线性层,随着层数的增加,为了保持网络的稳定,对梯度提出了要求:不能出现梯度消失或者爆炸。
先来看一个三级全连接层网络:
此处乱入一个数学知识:
当某一层的输入和权值都满足 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、稀疏矩阵初始化
它们各自对应着不同激活函数,详情请点击:初始化方案