前言
深度学习中参数的初始化也有很多trick,这些trick却对训练结果起到了至关重要的作用,
本文介绍一个权值初始化的策略。
介绍
针对神经网络权值初始化许多的方法,其中最常用的方法是用随机数进行初始化。
用代码表示就是W=randn(D,H)
,其中randn
从均值为0,标准差为1的单位高斯分布中采样,因此神经节点
在初始化时有一个随机的方向。
这种初始化有一个问题就是,每个神经元节点输出值的方差会随着神经元节点输入样本的数量而增加。下面用公式说明这个问题。
Var(s)=Var(∑inwixi)=∑inVar(wixi)=∑in[E(wi)]2Var(xi)+[E(xi)]2Var(wi)+Var(xi)Var(wi)=∑inVar(xi)Var(wi)=(nVar(w))var(x)(1)(2)(3)(4)(5)(1)Var(s)=Var(∑inwixi)(2)=∑inVar(wixi)(3)=∑in[E(wi)]2Var(xi)+[E(xi)]2Var(wi)+Var(xi)Var(wi)(4)=∑inVar(xi)Var(wi)(5)=(nVar(w))var(x)
其中第3步到第4步我们假设输入值均值为0,即 E[xi]=E[wi]=0E[xi]=E[wi]=0
当然一般而言输入值均值不会为0,例如采样ReLU作为激活函数的话均值恒大于0。
第4到第5步我们假设所有 wi,xiwi,xi是独立同分布的。
每一步的推导都是根据方差相关性质得出。
其中第2步到第3步需要解释一下:
Var(XY)=E(X2Y2)−E2(XY)=E(X2)E(Y2)−(E(X)E(Y))2=(E2(X2)+Var(X))∗(E2(Y2)+Var(Y))−E2(X)E2(Y)=E2(X)Var(Y)+E2(Y)Var(X)+Var(X)Var(Y)(6)(7)(8)(9)(6)Var(XY)=E(X2Y2)−E2(XY)(7)=E(X2)E(Y2)−(E(X)E(Y))2(8)=(E2(X2)+Var(X))∗(E2(Y2)+Var(Y))−E2(X)E2(Y)(9)=E2(X)Var(Y)+E2(Y)Var(X)+Var(X)Var(Y)
从上面可以看出,如果我们希望ss与xx有相同的方差那么ww在初始化是应该乘以1/n−−−√
1/n,即W=randn(D,H)/sqrt(n)