神经网络使用Xavier参数初始化的本质

本文深入探讨了Xavier参数初始化在神经网络中的作用,旨在维持正向传播和反向传播中数据流与梯度流的方差稳定性,避免梯度消失或爆炸。通过分析无偏置非线性全连接层,得出权重方差应满足的条件,以保持输入和输出的方差近似相等。
摘要由CSDN通过智能技术生成

参数初始化的意义和目的

深度学习中的各种参数初始化方法都旨在保持正向传播时数据流方差的稳定与反向传播时梯度流方差的稳定,从而缓解梯度消失或梯度爆炸问题。

先前在反向传播这篇文章里介绍过参数初始化对于深度学习的重要性,本文不再赘述。

在该文最后的例子中可以看到好的参数初始化策略确实能使神经网络的训练过程更趋稳定。在例子中,我们直接使用了一个Xavier初始化策略的标准差生成了高斯分布的权重,但没有说明这个标准差是如何得来的,本篇文章将在此基础上做个引申。

我们想使神经网络传播过程每层的数据流或梯度流输出的方差保持不变。

考虑一个非线性无偏置的简单全连接,隐藏层接受 n i n n_{in} nin 个输入并生成 n o u t n_{out} nout 个输出。具体来说,输入数据为 x x x ,共 n i n n_{in} nin 个特征,满足均值为0、方差为 γ 2 \gamma^2 γ2 ;每个神经元的输出为 o i o_i oi w i j w_{ij} wij 是输入 x x x 到输出 o i o_i oi 的权重,满足均值为0、方差为 σ 2 \sigma^2 σ2 ,且假设 x j x_j xj w i j w_{ij} wij 相互独立

对于前向传播, o i o_i oi 可表示为:

o i = ∑ j = 1 n i n w i j x j       ( 1 ) o_i=\sum_{j=1}^{n_{in}} w_{ij} x_j \ \ \ \ \ (1) oi=j=1ninwijxj     (1)

Xavier参数初始化意图使每一层输出的方差接近其输入的方差,即要使输出 o i o_i oi 的方差接近输入 x j x_j xj 的方差。

o i o_i oi 的均值 E ( o i ) E(o_i) E(oi)

由期望的定义及式 ( 1 ) (1) (1) 可得:

E ( w i j ) = 0       ( 2 ) E(w_{ij})=0 \ \ \ \ \ (2) E(wij)=0     (2)

E ( x j ) = 0       ( 3 ) E(x_j)=0 \ \ \ \ \ (3) E(xj)=0     (3)

E ( o i ) = ∑ j = 1 n i n E ( w i j x j )       ( 4 ) E(o_i)=\sum_{j=1}^{n_{in}} E(w_{ij} x_j) \ \ \ \ \ (4) E(oi)=j=1ninE(wijxj)     (4)

因为 x j x_j xj w i j w_{ij} wij 相互独立,所以 E ( w i j x j ) = E ( w i j ) E ( x j ) E(w_{ij} x_j)=E(w_{ij})E(x_j) E(wijxj)=E(wij)E(xj) ,代入式 ( 4 ) (4) (4) 可得:
E ( o i ) = ∑ j = 1 n i n E ( w i j x j ) = ∑ j = 1 n i n E ( w i j ) E ( x j ) = 0       ( 5 ) \begin{align} E(o_i) & = \sum_{j=1}^{n_{in}} E(w_{ij} x_j) \hspace{100cm} \\ &=\sum_{j=1}^{n_{in}} E(w_{ij})E(x_j) \\ &=0 \ \ \ \ \ (5) \end{align} E(oi)=j=1ninE(wijxj)=j=1ninE(wij)E(xj)=0     (5)

E ( w i j x j ) = E ( w i j ) E ( x j ) E(w_{ij} x_j)=E(w_{ij})E(x_j) E(wijxj)=E(wij)E(xj) 的证明

以下证明当随机变量 x 、 y x、y xy 相互独立时, E ( x y ) = E ( x ) E ( y ) E(xy)=E(x)E(y) E(xy)=E(x)E(y)

E ( x ) E(x) E(x):随机变量 x x x 的期望;

E ( y ) E(y) E(y):随机变量 y y y 的期望;

E ( x y ) E(xy) E(xy):随机变量 x 、 y x、y xy 乘积的期望。

根据期望的定义可知:
E ( x ) = ∑ i x i P ( x i )       ( 6 ) E(x)=\sum_ix_iP(x_i) \ \ \ \ \ (6) E(x)=ixiP(xi)     (6)
E ( y ) = ∑ j y j P ( y j )       ( 7 ) E(y)=\sum_jy_jP(y_j) \ \ \ \ \ (7) E(y)=jyjP(yj)     (7)
E ( x y ) = ∑ i , j x i y j P ( x i , y j )       ( 8 ) E(xy)=\sum_{i,j}x_iy_jP(x_i,y_j) \ \ \ \ \ (8) E(xy)=i,jxiyjP(xi,yj)     (8)

由于 x x x y y y 是相互独立的,有:
P ( x i , y j ) = P ( x i ) P ( y j ) P(x_i,y_j)=P(x_i)P(y_j) P(xi,yj)=P(xi)P(yj)

代入式 ( 8 ) (8) (8) ,得:

E ( x y ) = ∑ i , j x i y j P ( x i ) P ( y j ) E(xy)=\sum_{i,j}x_iy_jP(x_i)P(y_j) E(xy)=i,jxiyjP(xi)P(yj)

由于 x x x y y y 是独立的,我们可以将求和重新拆组一下:

E ( x y ) = ( ∑ i x i P ( x i ) ) ( ∑ j y j P ( y j ) ) E(xy)=(\sum_{i}x_i P(x_i)) (\sum_{j} y_jP(y_j)) E(xy)=(ixiP(xi))(jyjP(yj))

由式 ( 6 ) 、 ( 7 ) (6)、(7) (6)(7) ,可得:
E ( x y ) = E ( x ) E ( y ) E(xy)=E(x) E(y) E(xy)=E(x)E(y)

o i o_i oi 的方差 V a r ( o i ) Var(o_i) Var(oi)

先来证明 V a r ( o i ) = E ( o i 2 ) − ( E ( o i ) ) 2       ( 9 ) Var(o_i)=E(o_i^2)−(E(o_i))^2 \ \ \ \ \ (9) Var(oi)=E(oi2)(E(oi))2     (9)

证明对于随机变量 o o o V a r ( o ) = E ( o 2 ) − ( E ( o ) ) 2 Var(o)=E(o^2)−(E(o))^2 Var(o)=E(o2)(E(o))2

方差定义为随机变量的所有可能取值与其均值之差的平方的加权平均:

V a r ( o ) = ∑ i ( x i − u ) 2 n Var(o)={\sum_i (x_i-u)^2 \over{n}} Var(o)=ni(xiu)2

其中 u u u 是均值、 1 n 1 \over n n1 表示随机变量 o o o 的每一项 x i x_i xi 的概率 p ( x i ) p(x_i) p(xi) ,所以也可以表示为:

V a r ( o ) = ∑ i ( x i − u ) 2 p ( x i ) = E ( ( x i − u ) 2 )       ( 10 ) Var(o)=\sum_i (x_i-u)^2 p(x_i)=E((x_i-u)^2) \ \ \ \ \ (10) Var(o)=i(xiu)2p(xi)=E((xiu)2)     (10)

对于随机变量 o o o 及其均值 E ( o ) = u E(o)=u E(o)=u ,继续推导:
V a r ( o ) = ∑ i ( x i − E ( o ) ) 2 P ( x i ) = ∑ i ( x i 2 + E ( o ) 2 − 2 x i E ( o ) ) P ( x i ) = ∑ i x i 2 P ( x i ) + ∑ i ( E ( o ) ) 2 P ( x i ) − ∑ i 2 x i ( E ( o ) ) P ( x i ) = ∑ i x i 2 P ( x i ) + ( E ( o ) ) 2 ∑ i P ( x i ) − 2 ( E ( o ) ) ∑ i x i P ( x i ) = E ( o 2 ) + ( E ( o ) ) 2 − 2 ( E ( o ) ) 2 = E ( o 2 ) − ( E ( o ) ) 2 \begin{align} Var(o) & = \sum_i(x_i−E(o))^2 P(x_i) \hspace{100cm} \\ &=\sum_i(x_i^2+E(o)^2-2x_i E(o)) P(x_i) \\ &=\sum_i x_i^2 P(x_i) + \sum_i (E(o))^2 P(x_i) - \sum_i 2x_i (E(o)) P(x_i) \\ &=\sum_i x_i^2 P(x_i) + (E(o))^2 \sum_i P(x_i) - 2(E(o)) \sum_i x_i P(x_i) \\ &=E(o^2)+(E(o))^2-2(E(o))^2 \\ &=E(o^2)-(E(o))^2 \end{align} Var(o)=i(xiE(o))2P(xi)=i(xi2+E(o)22xiE(o))P(xi)=ixi2P(xi)+i(E(o))2P(xi)i2xi(E(o))P(xi)=ixi2P(xi)+(E(o))2iP(xi)2(E(o))ixiP(xi)=E(o2)+(E(o))22(E(o))2=E(o2)(E(o))2
其中:

E ( o ) = ∑ i x i ⋅ P ( x i ) E(o)=\sum_i x_i⋅P(x_i) E(o)=ixiP(xi)

E ( o 2 ) = ∑ i x i 2 ⋅ P ( x i ) E(o^2)=\sum_i x_i^2⋅P(x_i) E(o2)=ixi2P(xi)

∑ i P ( x i ) = 1 \sum_i P(x_i)=1 iP(xi)=1

接着式 ( 9 ) (9) (9) 的推导:
V a r ( o i ) = E ( o i 2 ) − ( E ( o i ) ) 2 = ∑ j = 1 n i n E ( w i j 2 x j 2 ) − 0 = ∑ j = 1 n i n E ( w i j 2 ) E ( x j 2 ) = ∑ j = 1 n i n E ( ( w i j − 0 ) 2 ) E ( ( x j − 0 ) 2 ) = ∑ j = 1 n i n V a r ( w i j ) V a r ( x j ) = n i n σ 2 γ 2       ( 11 ) \begin{align} Var(o_i) & = E(o_i^2)−(E(o_i))^2 \hspace{100cm} \\ &=\sum_{j=1}^{n_{in}} E(w_{ij}^2 x_j^2)-0 \\ &=\sum_{j=1}^{n_{in}} E(w_{ij}^2) E(x_j^2) \\ &=\sum_{j=1}^{n_{in}} E((w_{ij}-0)^2) E((x_j-0)^2)\\ &=\sum_{j=1}^{n_{in}} Var(w_{ij}) Var(x_{j}) \\ &=n_{in} \sigma^2 \gamma^2 \ \ \ \ \ (11) \end{align} Var(oi)=E(oi2)(E(oi))2=j=1ninE(wij2xj2)0=j=1ninE(wij2)E(xj2)=j=1ninE((wij0)2)E((xj0)2)=j=1ninVar(wij)Var(xj)=ninσ2γ2     (11)
其中:

因为 E ( o i ) = 0 E(o_i)=0 E(oi)=0 ,故 ( E ( o i ) ) 2 = 0 (E(o_i))^2=0 (E(oi))2=0

类比式 ( 10 ) (10) (10) ,且 w i j w_{ij} wij 的均值 E ( w i j ) = 0 E(w_{ij})=0 E(wij)=0 ,可得 V a r ( w i j ) = E ( ( w i j − E ( w i j ) ) 2 ) = E ( ( w i j − 0 ) 2 ) Var(w_{ij})=E((w_{ij}-E(w_{ij}))^2)=E((w_{ij}-0)^2) Var(wij)=E((wijE(wij))2)=E((wij0)2)

至此,我们已求出 o i o_i oi 方差的表达式,要使输出 o i o_i oi 的方差接近输入 x j x_j xj 的方差,则要满足:

n i n σ 2 = 1       ( 11 ) n_{in} \sigma^2=1 \ \ \ \ \ (11) ninσ2=1     (11)

( 11 ) (11) (11) 只是前向传播过程中数据流方差不变的条件,同样需要考虑反向传播(反向传播过程和前向传播类似)的梯度流,对于同一个权重 w i j w_{ij} wij ,此时输出 o o o 层变成输入层,相当于 n o u t n_{out} nout 成了 n i n n_{in} nin ,可类比上述过程推导出:

n o u t σ 2 = 1       ( 12 ) n_{out} \sigma^2=1 \ \ \ \ \ (12) noutσ2=1     (12)

为了同时满足式 ( 11 ) 、 ( 12 ) (11)、(12) (11)(12) ,只需使:

σ = 2 n i n + n o u t \sigma =\sqrt{2 \over{n_{in}}+n_{out}} σ=nin+nout2

这就是使用Xavier参数初始化后权重方差应满足的条件,通常,Xavier初始化从均值为0,方差 σ 2 = 2 n i n + n o u t \sigma^2={2 \over{n_{in}+n_{out}}} σ2=nin+nout2 的高斯分布中采样权重。

再次回看文章开头所述文章反向传播里所提的例子,其所使用的标准差 σ = 1 5 \sigma={1 \over 5} σ=51 正是因为权重矩阵的形状为 ( n i n = 5 , n o u t = 5 ) (n_{in}=5,n_{out}=5) (nin=5,nout=5) ,而 σ = 2 n i n + n o u t = 2 5 + 5 = 1 5 \sigma =\sqrt{2 \over{n_{in}}+n_{out}}={2 \over 5+5}={1 \over 5} σ=nin+nout2 =5+52=51

另外,对于均匀分布,使用Xavier参数初始化的标准差应满足:

σ = 6 n i n + n o u t \sigma =\sqrt{6 \over{n_{in}}+n_{out}} σ=nin+nout6

在pytorch中,可使用如下两个方法对权重进行Xavier初始化:

#xavier高斯分布
nn.init.xavier_normal_(w)
#xavier均匀分布
nn.init.xavier_uniform_(w) 
  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PyTorch实现BP神经网络回归并使用ReLU函数进行参数初始化的示例代码: ```python import torch import torch.nn as nn # 定义BP神经网络回归模型 class Net(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(Net, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.fc2 = nn.Linear(hidden_size, output_size) self.relu = nn.ReLU() def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 初始化模型参数 def weights_init(m): classname = m.__class__.__name__ if classname.find('Linear') != -1: n = m.in_features + m.out_features std = np.sqrt(2.0 / n) m.weight.data.normal_(0, std) m.bias.data.fill_(0) # 示例数据 x = torch.randn(10, 5) y = torch.randn(10, 1) # 初始化模型 model = Net(5, 10, 1) model.apply(weights_init) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(100): # 前向传播 outputs = model(x) loss = criterion(outputs, y) # 反向传播并优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失值 print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 100, loss.item())) ``` 在上述代码中,weights_init函数使用了Xavier初始化方法来初始化模型参数。在初始化Linear层的权重和偏置时,需要根据输入维度和输出维度计算标准差,然后从一个正态分布中随机生成数值作为初值。最后,利用apply函数将初始化函数应用到整个模型上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值