神经网络基础-参数初始化

部署运行你感兴趣的模型镜像

1. 常见的参数初始化方式

  • 均匀分布参数初始化

    权重参数初始化从区间均匀随机取值。即在(-1/√d,1/√d)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。

    import torch
    import torch.nn.functional as F
    import torch.nn as nn
    # 1. 均匀分布随机初始化
    def test01():
        linear = nn.Linear(5,3)
        # 从0-1军训分布产生参数
        nn.init.uniform_(linear.weight)
        print(linear.weight.data)
    test01()
    

    输出结果:

    tensor([[0.0519, 0.6466, 0.4425, 0.0084, 0.5593],
            [0.9492, 0.0310, 0.6264, 0.7057, 0.5127],
            [0.6505, 0.3993, 0.4759, 0.7502, 0.7433]])
    
  • 正态分布初始化

    随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化。

    def test02():
        linear = nn.Linear(5,3)
        nn.init.normal_(linear.weight,mean=0,std=1)
        print(linear.weight.data)
    

    输出结果:

    tensor([[-0.7075,  0.0591, -0.0338, -0.4440,  0.5881],
            [-1.1390,  0.3642, -1.0053,  0.1796,  0.2626],
            [-0.0512, -1.2517,  0.0404,  1.3875,  1.0531]])
    
  • 全0初始化

    将神经网络中的所有权重参数初始化为 0。

    def test03():
        linear = nn.Linear(5,3)
        nn.init.zeros_(linear.weight)
        print(linear.weight.data)
    test03()
    

    输出结果:

    tensor([[0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0.]])
    
  • 全1初始化

    将神经网络中的所有权重参数初始化为 1。

    def test04():
        linear = nn.Linear(5,3)
        nn.init.ones_(linear.weight)
        print(linear.weight.data)
    test04()
    

    输出结果:

    tensor([[1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.],
            [1., 1., 1., 1., 1.]])
    
  • 固定值初始化

    将神经网络中的所有权重参数初始化为某个固定值。

    def test05():
        linear = nn.Linear(5,3)
        nn.init.constant_(linear.weight,5)
        print(linear.weight.data)
    

    输出结果:

    tensor([[5., 5., 5., 5., 5.],
            [5., 5., 5., 5., 5.],
            [5., 5., 5., 5., 5.]])
    
  • kaiming 初始化,也叫做 HE 初始化

    HE 初始化分为正态分布的 HE 初始化均匀分布的 HE 初始化

    • 正态分布的 HE 初始化:stddev = sqrt(2 / fan_in)

    • 均匀分布的 HE 初始化:它从 [-limit,limit] 中的均匀分布中抽取样本, limit是 sqrt(6 / fan_in)

    • fan_in 是输入神经元个数。

    def test06():
        # kaiming 正太分布初始化
        linear = nn.Linear(5,3)
        nn.init.kaiming_normal_(linear.weight)
        print("kaiming 正太分布初始化")
        print(linear.weight.data)
    
        # kaiming 均匀分布初始化
        linear = nn.Linear(5, 3)
        nn.init.kaiming_uniform_(linear.weight)
        print("kaiming 均匀分布初始化")
        print(linear.weight.data)
    
    test06()
    

    输出结果:

    kaiming 正太分布初始化
    tensor([[-0.6198, -0.0808,  0.2645, -0.3550,  0.7477],
            [ 0.5089, -1.0295, -0.5749,  0.0841,  1.1368],
            [-0.9525, -0.7566, -1.2219, -1.1113,  0.5066]])
    kaiming 均匀分布初始化
    tensor([[ 0.8102,  0.2296,  0.7930,  0.5076,  0.2385],
            [ 0.2151,  0.3236,  1.0300, -0.4173,  0.1993],
            [ 0.3759, -0.2592, -0.9096, -0.3680, -0.5448]])
    
  • xavier 初始化,也叫做 Glorot初始化

    该方法也有两种,一种是正态分布的 xavier 初始化、一种是均匀分布的 xavier 初始化

    • 正态分布的 xavier 初始化:stddev = sqrt(2 / (fan_in + fan_out))。

    • 均匀分布的 xavier 初始化:[-limit,limit] 中的均匀分布中抽取样本, limit 是 sqrt(6 / (fan_in + fan_out))。

    • fan_in 是输入神经元的个数, fan_out 是输出的神经元个数。

    def test07():
        # xavier 正太分布初始化
        linear = nn.Linear(5, 3)
        nn.init.xavier_normal_(linear.weight)
        print("xavier 正太分布初始化")
        print(linear.weight.data)
    
        # xavier 均匀分布初始化
        linear = nn.Linear(5, 3)
        nn.init.xavier_uniform_(linear.weight)
        print("xavier 均匀分布初始化")
        print(linear.weight.data)
    
    test07()
    

    输出结果:

    xavier 正太分布初始化
    tensor([[-0.3723,  0.8458, -0.4177, -0.2791,  0.5923],
            [ 0.6423, -1.1029, -0.0885,  0.8489, -0.2789],
            [ 0.2199,  0.2240,  0.1618,  0.2031,  0.6326]])
    xavier 均匀分布初始化
    tensor([[-0.4944, -0.6697,  0.6152,  0.6275, -0.3991],
            [ 0.2024, -0.5227, -0.1500, -0.4836, -0.2145],
            [ 0.7836,  0.4441,  0.1632, -0.0380, -0.8434]])
    

2. 初始化方法选择

一般我们在使用 PyTorch 构建网络模型时,每个网络层的参数都有默认的初始化方法,优先选择 kaming 的初始化,xavier 初始化方式。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值