Pytorch参数初始化--数学原理

13 篇文章 1 订阅
5 篇文章 0 订阅

预备知识

  • 假设x是一个随机变量,它的均值和方差的定义为:

                                                         

  • 假设x,y是两个随机变量,记z=xy,则随机变量z的均值和方差为:

                                                     

  • 特别地,当x,y独立的时候,则有:

                                                

  • 均匀分布的期望、方差:

                                                        

为什么要初始化weights?

      权值初始化的目的是防止层激活输出在深度神经网络的正向传递过程中爆炸或消失。如果发生任何一种情况,损失梯度要么太大,要么太小,无法有利地向后流动,如果网络能够这样做,则需要更长的时间才能收敛

仿真实验

  • case - 1  
x = torch.randn(512, 1)  # N(0,1) 
for i in range(100):
    A = torch.randn(512, 512) # 用 N(0,1) 来初始化weights
    x = torch.mm(A, x)
x.mean(), x.std()  # (tensor(nan), tensor(nan))
  • case - 2 
x = torch.randn(512, 1)  # N(0,1) 
for i in range(100):
    A = torch.randn(512, 512) * 0.01 # 用 N(0,1e-4) 来初始化weights
    x = torch.mm(A, x)
x.mean(), x.std()  # (tensor(0.), tensor(0.))
  • case - 3

                                             

  1. num_iter = 10000
    mean, var = 0.0, 0.0 
    for i in range(num_iter):
        x = torch.randn(512, 1)
        A = torch.randn(512, 512) # 用 N(0,1) 来初始化weights
        y = torch.mm(A, x)
        # 考虑y的每个维度,计算公式参考预备知识
        mean += y.mean().item()  # E(xy) = E(x)E(y)
        var  += y.var().item()   # Var(xy) = Var(x)Var(y)
    mean/num_iter, var/num_iter  # (-0.004299676742777228, 512.4343985168457) ~ (0, 512)
    # Remark : 这也解释了为什么case - 1会出现nan!
  2. num_iter = 10000
    mean, var = 0.0, 0.0 
    for i in range(num_iter):
        x = torch.randn(512, 1)
        A = torch.randn(512, 512) /math.sqrt(512) # 核心操作
        y = torch.mm(A, x)
        # 考虑y的每个维度,计算公式参考预备知识
        mean += y.mean().item()  # E(xy) = E(x)E(y)
        var  += y.var().item()   # Var(xy) = Var(x)Var(y)
    mean/num_iter, var/num_iter  # (-0.0001050436558551155, 0.9986829454898835) ~ (0, 1)

Remark : 通过仿真实验,如果采用Naive的初始化方式[case-1或者case-2],可能会导致模型在前向传播时出现信号过大或者过小,这非常不利于模型训练、收敛!接下来介绍的Xavier_normalKaiming_normal的motivation就基于此,它们可以使得信号强度(体现在Variance)在网络的训练过程中保持不变,从而加速网络的收敛速度!  

Xavier_normal

这里参考了[2]中的分析,以网络的FC层为例[Conv层同理] : Y = WX + B,这里W\in R^{u\times d}X\in R^{ d}Y,B\in R^{ u}均为随机变量。若想在前向、后向传播时保持信号的强度不变,则有:Var(Y) = Var(X), Var(delta_X) = Var(delta_Y).

Kaiming_normal

参考文献

[1]. https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79

[2]. https://www.zhihu.com/search?type=content&q=xavier_normal

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReLuJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值