欢迎光临散文网 会员登陆 & 注册

深度学习中的参数初始化方法:Xavier详细推导+pytorch实现

2023-08-05 23:23 作者:風神ねこ  | 我要投稿

缓解梯度消失和梯度爆炸的参数初始化方式:Xavier

Xavier 初始化,也称为Glorot初始化,是一种在训练深度学习模型时用于初始化网络权重的策略。其核心思想是保持每一层输出的方差与输入的方差一致,以防止信号在深层网络中的爆炸或消失。如果方差过大,那么网络的层将会更难以学习;如果方差过小,那么该层的权重将会难以更新。

总体来说,如果初始化权重过大或过小,可能会导致在训练过程中出现梯度消失或梯度爆炸的问题。如果权重初始化过大,激活函数(如sigmoid或tanh)可能会饱和,导致梯度接近于零,这将减慢学习速度。另一方面,如果权重初始化过小,那么权重更新可能会非常慢或完全停止,导致网络无法学习。

例如下图,在对sigmoid反向传播时,输入很小或很大的参数值都会导致对参数的偏导几乎为0,在进行梯度下降时,参数更新非常慢,几乎无法进行学习(甚至可能在某一层导致梯度消失,切断了与后续的联系)

演示梯度消失

假设与符号说明

  1. 权重w_%7Bi%2Cj%7D%5Et(这里表示 第t层从t-1层的第i个神经单元连接到t层的第j个神经单元的权重)是从均值为0,方差为%5Csigma%5E2的分布中抽取的,并且符合独立同分布,权重矩阵为W_%7Bn_%7Bin%7D%5Ctimes%20n_%7Bout%7D%7D%5Et,可以认为是n_%7Bin%7D批次大小,每行是一个样本,这些样本有n_%7Bout%7D个特征

  2. t层第i个神经单元的输入h_i%5E%7Bt-1%7D(表示第t层的输入,即是t-1层的输出)服从均值为0的分布

  3. 没有非线性(即没有激活函数)的全连接层,输入维度为n_%7Bin%7D,输出维度为n_%7Bout%7D,满足%20h%5Et%3D(W%5Et)%5ETh%5E%7Bt-1%7D ,即t层的输出是来自t-1层输出的加权和,注意这里权重矩阵被转置了,满足n_%7Bout%7D%5Ctimes%20n_%7Bin%7D%5Cquad%20n_%7Bin%7D%5Ctimes1%5Cimplies%20n_%7Bout%7D%5Ctimes%201的维度关系

正向均值

正向均值,就是对t层的输出求数学期望,对于t层的任意一个神经单元i,其期望满足

%20E%5Bh_i%5Et%5D%3DE%5Cleft%20%5B%5Csum%5Climits_jw_%7Bi%2Cj%7D%5Eth_%7Bj%7D%5E%7Bt-1%7D%5Cright%20%5D%5Cxlongequal%7Bi%2Ci%2Cd%7D%5Csum%5Climits_%7Bj%7DE%5Bw_%7Bi%2Cj%7D%5Et%5DE%5Bh_j%5E%7Bt-1%7D%5D%3D0%20

这里意思是,第t层的任意一个神经单元i的输出h_i%5Et,是来自t-1层的所有输出与其对应权重(从j连接到i对应权重)积的和。由于我们假定了权重和输入都是零均值,所以第t层输出的数学期望依然是0。

并且注意这里的输入和权重的独立假设允许我们进行E(XY)%3DEX%2BEY

由于t层每个神经单元的输出均值都是0,因此t层的输出均值就是一个零向量

正向方差

%20Var(h_i%5Et)%3DE%5B(h_i%5Et)%5E2%5D-E%5Bh_i%5Et%5D%5E2

注意这里由于上面证明了输出的正向均值为0,因此这里的均值的平方项为0,将t层的第i个神经单元的输出展开有

E%5B(h_i%5Et)%5E2%5D%3DE%5Cleft%20%5B%5Cleft%20(%5Csum%5Climits_jw_%7Bi%2Cj%7D%5Eth_j%5E%7Bt-1%7D%5Cright%20)%5E2%5Cright%20%5D%20

注意到,如果将这个和式的平方展开后,会产生很多交叉项,它们的最高次数都是1,根据前面我们知道,对一次项求期望会因为零均值的假设导致整项为0,因此我们只需要保留自身与自身相乘的项(二次项)

%20%5Cimplies%20E%5Cleft%20%5B%5Csum%5Climits_j(w_%7Bi%2Cj%7D%5Et)%5E2(h_j%5E%7Bt-1%7D)%5E2%5Cright%20%5D

再根据期望性质,并且注意到,由于是零均值,对二次项求期望相当于求其方差

VarX%3DE%5BX%5E2%5D-(EX)%5E2%5Cxlongequal%7BEX%3D0%7DE%5BX%5E2%5D

从而有

%20Var%5Bh%5Et_i%5D%3D%5Csum%5Climits_j%20Var%5Bw_%7Bi%2Cj%7D%5Et%5DVar%5Bh_j%5E%7Bt-1%7D%5D%3Dn_%7Bin%7D%5Csigma%5E2Var%5Bh_j%5E%7Bt-1%7D%5D%20

由于我们希望输入与输出的方差相同,只需要让输入维度乘以权重来自分布的方差为1

%20n_%7Bin%7D%5Csigma%5E2%3D1%20

反向均值

根据反向传播的原理,先由损失函数对h%5Et求导,再由h%5Eth%5E%7Bt-1%7D求导,得到

%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt-1%7D%7D%3D%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt%7D%7D(W%5Et)%5ET%20

而同理正向传播,反向传播的均值和方差结果也是类似的,这里权重表示的是从t层的神经单元i连向t-1层的神经单元j的权重

E%5B%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt-1%7D_j%7D%5D%3DE%5Cleft%5B%5Csum%5Climits_i%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt%7D_i%7Dw_%7Bj%2Ci%7D%5Et%20%5Cright%5D

根据权重的独立同分布且零均值的特性,反向均值依然为0,即损失函数对t-1层任意神经单元的输出求导的值为0

反向方差

这里需要注意到,由于交叉项会出现一次项,而我们知道一次项的权重均值为0,因此我们只保留二次项(自己与自己相乘)

Var%5B%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt-1%7D_j%7D%5D%3DE%5Cleft%5B%5Cleft(%5Csum%5Climits_i%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt%7D_i%7Dw_%7Bj%2Ci%7D%5Et%20%5Cright)%5E2%5Cright%5D%3D%5Csum%5Climits_%7Bi%3D1%7D%5E%7Bn_%7Bout%7D%7DE%5B%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt%7D_i%7D%5D%5E2E%5Bw%5Et_%7Bj%2Ci%7D%5D%5E2%20

注意我们权重方差是假定好的,并且从i连接到j和从j连接到i的权重是一样的,有

%20Var%5B%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt-1%7D_j%7D%5D%3Dn_%0A%7Bout%7D%5Csigma%5E2Var%5B%20%5Cdfrac%20%7B%5Cpartial%20l%7D%7B%5Cpartial%20h%5E%7Bt%7D_i%7D%5D

我们同样希望反向传播的输入与输出的方差相同,因此需要

%20n_%7Bout%7D%5Csigma%5E2%3D1

权衡

由于n_%7Bout%7D%5Csigma%5E2%3Dn_%7Bin%7D%5Csigma%5E2难以成立,因为我们不可能每次输入输出维度都相同,因此Xavier采用%5Csigma%5E2%3D%5Cdfrac%7B2%7D%7Bn_%7Bout%7D%2Bn_%7Bin%7D%7D(即对两个结果进行算术平均)

并将参数从正态分布N%5Cleft(0%2C%5Cdfrac%7B2%7D%7Bn_%7Bout%7D%2Bn_%7Bin%7D%7D%5Cright)%20中随机生成

也可以采用均匀分布U%5Cleft%20(%E2%88%92%5Csqrt%7B%5Cdfrac%7B6%7D%7Bn_%7Bin%7D%2Bn_%7Bout%7D%7D%7D%2C%20%5Csqrt%7B%5Cdfrac%7B6%7D%7Bn_%7Bin%7D%2Bn_%7Bout%7D%7D%7D%20%20%5Cright)%20

相比于原来我们指定方差例如用N(0%2C1)初始化参数,Xavier通过计算得出其方差而不是我们人为指定

pytorch实现

只需要初始化时指定xavier_normal_即可

通过正态分布方差的最大似然估计,我们发现推导和结果是相符合的


深度学习中的参数初始化方法:Xavier详细推导+pytorch实现的评论 (共 条)

分享到微博请遵守国家法律