初始化方法由Bengio等人在2010年的论文《Understanding the difficulty of training deep feedforward neural networks》中提出。
它为了保证前向传播和反向传播时每一层的方差一致,根据每层的输入个数和输出个数来决定参数随机初始化的分布范围,是一个通过该层的输入和输出参数个数得到的分布范围内的均匀分布。
公式如下:
U[−6–√nin+nout−−−−−−−−√,6–√nin+nout−−−−−−−−√]
U
[
−
6
n
i
n
+
n
o
u
t
,
6
n
i
n
+
n
o
u
t
]
其中: nin n i n 和 nout n o u t 分别表示该层输入和输出的参数(权重)个数。
具体推导如下:
假设某层激活函数为线性(非线性与之类似),输入输出关系如下:
y=∑i=1nwixi+b
y
=
∑
i
=
1
n
w
i
x
i
+
b
定义 D(xi) D ( x i ) 和 D(wi) D ( w i ) 分别为随机变量 xi x i 和 wi w i 的方差,根据方差公式有:
D(wixi)=E(wi)2D(xi)+E(xi)2D(wi)+D(wi)D(xi)
D
(
w
i
x
i
)
=
E
(
w
i
)
2
D
(
x
i
)
+
E
(
x
i
)
2
D
(
w
i
)
+
D
(
w
i
)
D
(
x
i
)
设计网络时,我们通常会用一些tricks使每层的输入和权值的均值为0,,则有:
D(wixi)=D(wi)D(xi)
D
(
w
i
x
i
)
=
D
(
w
i
)
D
(
x
i
)
假设输入 xi x i 和权值 wi w i 独立同分布:
D(y)=nD(wi)D(xi)
D
(
y
)
=
n
D
(
w
i
)
D
(
x
i
)
由于输入和输出方差相同: D(y)=D(x) D ( y ) = D ( x ) ,所以有:
D(w)=1n
D
(
w
)
=
1
n
对于多层网络,正向传播时第 i 层的输出方差 D(yi) D ( y i ) 可用前面各层方差的乘积表示:
D(yi)=D(xi)∏k=0i−1nkD(wk)
D
(
y
i
)
=
D
(
x
i
)
∏
k
=
0
i
−
1
n
k
D
(
w
k
)
其中, D(xi) D ( x i ) 为第 i 层的输入, nk n k 和 wk w k 分别为前面第 k 层的参数数量和长度为 nk n k 的权值向量。
反向传播时,与正向传播类似:
D(∂L∂wi)=D(∂L∂wm)∏p=imnp+1D(wp)
D
(
∂
L
∂
w
i
)
=
D
(
∂
L
∂
w
m
)
∏
p
=
i
m
n
p
+
1
D
(
w
p
)
其中,L 为最高层第 m 层的损失函数。
对于每一层的权值向量
wi
w
i
,正向与反向传播的方差
D(xi)
D
(
x
i
)
相等:
niD(wi)=1
n
i
D
(
w
i
)
=
1
ni+1D(wi)=1
n
i
+
1
D
(
w
i
)
=
1
由于通常相邻两层的权重参数的数量不同,因此选择:
D(wi)=2ni+ni+1
D
(
w
i
)
=
2
n
i
+
n
i
+
1
为了满足在某个关于原点对称的范围内实现均匀分布,所以Xavier的初始化为在如下范围内的均匀分布:
U[−6–√nin+nout−−−−−−−−√,6–√nin+nout−−−−−−−−√]
U
[
−
6
n
i
n
+
n
o
u
t
,
6
n
i
n
+
n
o
u
t
]