前言
How to initialize deep neural networks? Xavier and Kaiming initialization
Xavier(Understanding the difficulty of training deep feedforward
neural networks):http://proceedings.mlr.press/v9/glorot10a.htmlKaiming(Delving Deep into Rectifiers: Surpassing Human-Level
Performance on ImageNet
Classification):https://ieeexplore.ieee.org/document/7410480
初始化的重要性
偶然在知乎看到这张图对初始化重要性的体现相当直观。深度学习模型的优化过程常被比喻为下山,不断摸索,反复跳跃,调整步幅,希望能够尽可能地走到一个最低的点,在这个最低的空间点将会得到最小的loss(或者可以不严谨地说最好的performance)。将某一层权值的搜索过程描绘为如下非凸搜索空间,可以发现不同的起点会有不同的初始优势,有些点容易陷入较差的局部最优,有些点周围崎岖难以下降,而有些点周围平坦易下降,这时候初始点的重要性就出来了。
初始化策略要解决的问题就是:
- 能不能落到一个和谷底偏近的位置
- 能不能落到一个大下坡,能稳定快速地到谷底
随机初始化是神经网络初始化的经典方法,具体形式为
但是直接对所有weight进行相同规模的初始化会导致一些问题,梯度消失及梯度下降,由于深度神经网络反向传播的特性,链式法则梯度的叠加总是容易出现上述两个问题。
如下一个三层网络,对第一层进行更新时
▽
W
\bigtriangledown W
▽W可能由于激活函数梯度和
W
W
W的值而出现梯度消失(相乘元素小于1时)或者梯度下降(相乘元素大于0时)。神经网络的误差反向传播,忽略激活函数的偏导数时,相当于自后向前不停乘上网络每一层的权重。
激活函数梯度通过设计类似ReLU功能的激活函数可以缓解,而
W
W
W则需要一个合适的权值,这里我们就需要思考:
初始化权值可能会对训练过程有什么影响?为什么初始化权值要以方差作为衡量条件?
我认为网络学习的是训练数据的空间分布,即训练收敛时,整个输出空间应该是输入空间分布的某种稳定投影。从层的角度来看,假如2层网络:A->B,B希望获得稳定输出,但由于每次学习更新导致A也在变化,所以B想稳定就比较难。怎么办,保证A和B的分布一样,这样学习就简单一点,即可以理解成信息流通更流畅
训练过程中Batch Normalization这一技术能够规范,参考
https://blog.csdn.net/qq_29573053/article/details/79878437
https://blog.csdn.net/qq_29573053/article/details/79878437
Xavier和Kaiming
Xavier 和 Kaiming 的论文遵循非常相似的推理,唯一的区别是 Kaiming 论文考虑了激活函数,而 Xavier 没有(或者更确切地说,Xavier 将激活函数在 0 处的导数近似为 1)。因此我们这里以Kaiming为主,并夹杂介绍Xavier的区别所在。
正向传播
假设卷积神经网络有:
输出、输入分别为 y l y_l yl 、 x l x_l xl , x l x_l xl是 1 × c × k × k 1\times c\times k\times k 1×c×k×k的张量, y l y_l yl 是 1 × d × h × w 1\times d\times h\times w 1×d×h×w的张量, W l W _{l} Wl是 d × c × m × n d\times c\times m\times n d×c×m×n的张量,用 c × k 2 c\times k^{2} c×k2表示一个神经元的连接数量, l l l表示对卷积层的编号。具体表示如下,这里的 n l n_l nl是指输入通道数, d d d是输出通道数,即过滤器的个数。
首先我们 假定
W
l
W _{l}
Wl、
x
l
x _{l}
xl中元素各自独立同分布,且
W
l
W _{l}
Wl、
x
l
x _{l}
xl两者彼此独立。 在进行具体推导之前我们回顾一下方差、协方差、协方差矩阵的相关知识,可在此篇文章查看
接下来
又因为
w
i
,
j
w_{i,j}
wi,j 和
x
j
x_j
xj彼此独立,因此:
又因为
w
i
,
j
w_{i,j}
wi,j 和
x
j
x_j
xj分别否是同分布,因此
V
a
r
[
w
i
,
j
x
j
]
Var[w_{i,j}x_j]
Var[wi,jxj]始终等于一个共同的值,我们定义其为
V
a
r
[
w
l
x
l
]
Var[w_lx_l]
Var[wlxl],则:
按照完全相同的推理,得到:
偏差
b
b
b总是习惯被初始化为0,故而
V
a
r
[
b
l
]
=
0
Var[b_l]=0
Var[bl]=0,则
记住如下公式(2)
根据
V
a
r
[
w
l
x
l
]
=
V
a
r
[
w
l
]
V
a
r
[
x
l
]
Var[w_lx_l]=Var[w_l]Var[x_l]
Var[wlxl]=Var[wl]Var[xl]和
σ
2
=
E
(
X
2
)
−
μ
2
\sigma ^{2}=E\left ( X^{2} \right )-\mu ^{2}
σ2=E(X2)−μ2两个公式可得:
我们初始化时往往都是设定权值期望为0,故能够得到如上公式(3)。我们最终希望得到的是
V
a
r
[
y
]
Var[y]
Var[y]和
V
a
r
[
w
l
]
Var[w_l]
Var[wl]的关系,是否可以将
x
x
x相关部分去掉呢?
这里就是Xavier和Kaiming的不同点之一:Xavier没有考虑具体的激活函数,这里它假设激活函数是线性函数,而Kaiming是基于ReLU进行的。
可以看到如下公式,我们假设
w
l
−
1
w_{l-1}
wl−1是一个关于0对称的分布(期望为0时的正态分布就可以实现),并且
b
l
−
1
=
0
b_{l−1}=0
bl−1=0
则:
于是
m
a
x
(
0
,
y
l
−
1
)
max(0,y_{l-1})
max(0,yl−1)有1/2的概率大于0,和公式(3)的原理一样,可得:
结合公式(3),可得:
这是个递归的式子,我们依次计算可以得到
注意,这里的
n
l
n_l
nl指的是每层的输入通道数,每层可能是不一致的。
This formula is the one that lets us see what could go wrong without a proper initialization, and thus how to design the right one. The product is key. Indeed, if we have a lot of layers (so if L is large), we see that the variance of the last layer yL could be very small (if
1
/
2
n
l
V
a
r
[
w
l
]
1/2n_lVar[w_l]
1/2nlVar[wl] is below 1) or very large ( if
1
/
2
n
l
V
a
r
[
w
l
]
1/2n_lVar[w_l]
1/2nlVar[wl] is above 1). The proper value for what’s inside that product should thus be 1, and that is exactly the sufficient condition the Kaiming paper (and initialization) takes:
即每层卷积的权值方差与输入通道数的乘积的1/2应该始终等于1,注意这是一个充分不必要条件。
综上所述,Kaiming初始化建议初始化每层权值为一个均值为0标准差为
2
n
l
\sqrt{\frac{2}{n_l}}
nl2的高斯分布,并且偏差为0。
这里回忆一下Xavier假设激活函数为线性函数至少近似为线性,导数为1,大小约为0,因此没有了1/2的概率,最终
y
L
y_L
yL的公式应该为:
同理可得,Xavier初始化权重为一个均值为0标准差为
1
n
l
\sqrt{\frac{1}{n_l}}
nl1的高斯分布。
反向传播
与正向传播相比较,反向传播是对梯度做处理,依据反向梯度传播算法可得:
这里的
W
^
\widehat{W}
W
代表
W
W
W的转置,
Δ
y
l
\Delta y_l
Δyl可以看做
l
l
l层的输出误差,我们假定其为
n
l
^
×
1
\widehat{n_l}\times1
nl
×1的张量,注意这里的
n
l
^
\widehat{n_l}
nl
与
n
l
n_l
nl不一致,可以认为与
d
l
d_l
dl一致。
后向传播使用如下公式,
f
f
f指的是激活函数:
在Kaiming假设的ReLU的前提下对激活函数求导:
我们假设
f
′
(
y
l
)
{f}'(y_l)
f′(yl)和
Δ
x
l
+
1
\Delta x_{l+1}
Δxl+1彼此之间独立。因为
W
^
\widehat{W}
W
由上述假设可知均值为0,则
Δ
x
l
+
1
\Delta x_{l+1}
Δxl+1均值也为0。
故可以进一步推得:
继续推导得到如下公式(8):
于是:
和正向传导同理,可得Kaiming初始化建议初始化每层权值为一个均值为0标准差为
2
n
l
^
\sqrt{\frac{2}{\widehat{n_l}}}
nl
2的高斯分布,并且偏差为0。
对Xavier而言,
Xavier 和 Kaiming 论文采用了两种不同的方法。Xavier 建议最终初始化标准差取两个方向的平均值,这相当于用标准差的分布初始化权重:
Kaiming认为(5)和(10)都适当地调整了正向和反向信号。事实上,如果我们计算所有
l
l
l层上
n
l
n_l
nl和
n
l
^
\widehat{n_l}
nl
商的乘积,我们会发现一个常数,它只取决于网络开始和结束时的通道数。并且使用(5)和(10)中的一个都是安全的。
参考文献
- https://pouannes.github.io/blog/initialization/
- https://blog.csdn.net/tutuliangliang/article/details/85049286