3

深度学习中的参数初始化及其数学分析

 2 years ago
source link: https://allenwind.github.io/blog/7832/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在深度学习中,模型的权重可以看作是随机向量或随机矩阵,在模型训练前往往需要参数初始化。参数初始化方法有很多,包括固定值初始化、随机初始化、预训练初始化。对于大型模型来说,好的初始化能够帮助模型收敛;差的初始化可能让模型效果变差,甚至根本无法收敛。

本文讨论深度学习中模型参数的初始化,其中随机向量与随机矩阵及其在深度学习中的讨论,见历史文章浅谈随机向量与随机矩阵

常数初始化

某些特殊的参数全部取0或者1,不过也需要考虑例外:

  • 如无特殊情况Dense中的偏置bias一般都是0,注意把bais初始化为0并不等于不设置bias。对于Dense,bias的存在往往很重要
  • 对于使用ReLU的神经元, 可以将偏置bias设为α=0.01α=0.01, 使得训练初期更容易激活, 从而获得一定的梯度来进行误差反向传播
  • 在LSTM网络的遗忘门中, 偏置bias通常初始化为1遗忘门或2, 使得时序上的梯度变大

随机初始化

参数初始化的基本思想是,对于一个模型层f(x)f(x)来说,输出

y=f(x)y=f(x)

输入xx​和输出yy​的方差和均值保持不变。保持统计特征的不便有利于模型的稳定与收敛。

随机初始化(Random Initialization)让参数从某个概率分布总采样。随机初始化就更好理解了,既然不知道什么值更好,那就乱取一通好了。这里的关键是从什么分布中采样。常见的初始化分布有:

  • 截断正太分布

正太分布和均匀分布的采样很好理解,而截断正太分布是考虑样本满足给定的均值、方差且在一定的区间内x∈[a,b]x∈[a,b]​,概率密度表示,

f(x;μ,σ,a,b)=1σϕ(x−μσ)Φ(b−μσ)−Φ(a−μσ)f(x;μ,σ,a,b)=1σϕ(x−μσ)Φ(b−μσ)−Φ(a−μσ)

通常是0中心,即均值为零,取值区间为,

−2σ<xi<2σ−2σ<xi<2σ

由于正太分布的取值区间是整个实数域,在极端情况下会采样到非常大的值,例如以标准差为1,从正太分布中采样1000000000个数,最大值可以达到6,远大于3σ3σ。因此使用正太分布初始化,一般都使用截断正太分布。本文接下来提到的正太分布均指截断正太分布

那么截断的正太分布初始化和均匀分布初始化如何选择?我认为和其他网络组建保持一致即可。

预训练初始化

这是CV中常用的初始化方式。模型训练前使用在大规模数据上训练过的模型所获得的好的参数作为初始值。随后在当前模型进行fine-tuning。预训练参数初始化可以起到正则化作用,相对与随机初始化,前者在训练时能够在更小的参数空间中搜索最优解。

预训练模型在从头训练是也需要初始化,常见方法是方差缩放初始化。

方差缩放初始化

方差缩放初始化方法通过对方差缩放,以达到层的输出、输出信号的方差和均值保存不变。

对于正太分布,方差缩放初始化每个参数采样自,

xi∼N(0,dn)xi∼N(0,dn)

nn的取值有三种,分别是输入维度、输出维度、输入维度与输出维度的平均。d>0d>0是缩放因子,用来确定正太分布的方差σ2σ2。

最常用的初始化方法GlorotNormal,nn值使用输入维度与输出维度的平均,d=2d=2,

xi∼N(0,2di+do)xi∼N(0,2di+do)

初始化方法HeNormal,

xi∼N(0,2di)xi∼N(0,2di)

这里注意到relu激活函数会把一半输出置零。

初始化方法LecunNormal,取d=1d=1,

xi∼N(0,1di)xi∼N(0,1di)

对于均匀分布,方差缩放初始化每个参数采样自,

xi∼U(−√3dn,√3dn)xi∼U(−3dn,3dn)

这里主要是考虑,采样自该分布,方差保持不变,

(b−a)22=(√3dn−(−√3dn))212=dn(b−a)22=(3dn−(−3dn))212=dn

同上,GlorotUniform、HeUniform、LecunUniform只是在d,nd,n上的取值有差异。

正交初始化

正交初始化要求参数矩阵具有正交性,即

W⊤W=IW⊤W=I ∥Wx∥2=(Wx)⊤(Wx)=x⊤(W⊤W)x=X⊤Ix=∥x∥2‖Wx‖2=(Wx)⊤(Wx)=x⊤(W⊤W)x=X⊤Ix=‖x‖2

也就是说,在正交矩阵的线下变换下,xx具有模长不变性。这样一来,在反向传播中,

δ(l−1)=(W(l))⊤δ(l)δ(l−1)=(W(l))⊤δ(l)

涉及到矩阵W(l)W(l)的连续乘积就会近似于单位矩阵,这就解决了梯度爆炸或梯度消失问题。

获得正交矩阵的方法:

  1. 独立采样xij∼N(0,1)xij∼N(0,1)​获得矩阵WW
  2. 对矩阵WW进行SVD分解,W=UΣV−1W=UΣV−1​​
  3. 获得两个正交矩阵,使用其中一个作为参数权重

另外还有一种方法在浅谈随机向量与随机矩阵提到,从向量可以推广到矩阵,假设矩阵Wn×n=[aij]Wn×n=[aij]​,如果每个元素均采样自正太分布,

wij∼N(0,1n)wij∼N(0,1n) WW⊤≈IWW⊤≈I

也就是说满足一定采样条件的随机矩阵几乎正交。事实上,对于W∈Rm×n,m≥nW∈Rm×n,m≥n​的矩阵也成立。也就是说,对于某一层,

y=W×xy=W×x

xx的输入时nn维,输出是mm维,且m≥nm≥n,是一个生维过程且保持模长不变。

QR分解有称为正交三角分解也是获得正交矩阵的方法之一,假设有列向量线性无关的矩阵A,那么可分解成,

Am×n=Q×RAm×n=Q×R

Q∈Rm×nQ∈Rm×n是正交矩阵,即Q×Q⊤=IQ×Q⊤=I,R∈Rn×nR∈Rn×n​是上三角矩阵。

因此正交矩阵的获取方法:

  • 矩阵的SVD分解
  • 矩阵的QR分解
  • 以一定的规则随机初始化矩阵

参数初始化:对于大型模型来说,好的初始化能够帮助模型收敛;差的初始化可能让模型效果变差,甚至根本无法收敛。使用更好的参数初始化方法,有利于SGD等方法的优化效率,最终会关系到模型的泛化能力。正所谓,先天足,后天强。

[1] https://en.wikipedia.org/wiki/Multivariate_random_variable

[2] https://en.wikipedia.iwiki.uk/wiki/Stochastic_matrix

[3] https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test

[4] https://en.wikipedia.org/wiki/Truncated_normal_distribution

转载请包括本文地址:https://allenwind.github.io/blog/7832/
更多文章请参考:https://allenwind.github.io/blog/archives/


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK