神经网络参数初始化

简介: **神经网络参数初始化**是深度学习的关键步骤。权重常通过**Xavier**或**He**初始化来打破对称性,适用于ReLU激活;而偏置通常初始化为0。初始化方法还包括**均匀分布**、**正态分布**、**全零**、**全一**和**固定值**。在PyTorch中,`torch.nn.init`模块提供了如`xavier_uniform_`和`kaiming_normal_`等初始化函数。预训练模型也可用于初始化,通过微调提升性能。

一、引入


深度学习和机器学习的世界中,神经网络是构建智能系统的重要基石,参数初始化是神经网络训练过程中的一个重要步骤。在构建神经网络时,我们需要为权重和偏置等参数赋予初始值。对于偏置,通常可以将其初始化为0或者较小的随机数。然而,对于权重w的初始化,我们通常会采用更加复杂的方法,以确保网络能够更好地学习数据的特征。



二、神经网络的结构


我们先给机器一个架构,如下图的两个隐藏层,还有这些神经元,还有给定激活函数,让机器去找w 的取值!就是找出一组参数使得输出效果好,这就是机器学习的意义。


常见的网络参数初始化方法:


  1. 均匀分布初始化:这种方法通过在特定区间内均匀随机地选择权重参数的初始值。通常,这个区间是(-1/√d, 1/√d),其中d是每个神经元的输入数量。这种初始化方式有助于打破神经元之间的对称性,促进网络的多样性和学习能力。


  1. 正态分布初始化:在这种初始化方法中,权重参数从均值为0,标准差为1的高斯分布中随机取样。这种方法可以确保权重参数有较小的初始值,有助于模型的稳定训练。


  1. 全零初始化:将所有权重和偏置参数初始化为零。虽然这种方法简单直接,但它可能导致所有神经元在学习过程中更新相同,从而引发梯度消失问题。


  1. 全一初始化:将所有权重和偏置参数初始化为一。与全零初始化类似,这种方法也可能导致对称性问题,因为所有神经元学到的东西会相同。


  1. 固定值初始化:使用某个固定的小数值来初始化所有的权重和偏置参数。


  1. Kaiming初始化(也称为He初始化):这是一种特别针对使用ReLU激活函数的神经网络设计的初始化方法。它根据前一层的神经元数量来设置权重的初始范围。


  1. Xavier初始化(也称为Glorot初始化):这种初始化方法根据前一层和后一层的神经元数量来计算权重的初始范围。这种方法旨在保持信号的方差不变,从而有效地初始化神经网络中的权重。


三、参数初始化代码


import torch
import torch.nn as nn
import torch.nn.init as init
 
# 均匀分布初始化
def uniform_init(m):
    if isinstance(m, nn.Linear):
        init.uniform_(m.weight, -1/(m.in_features**0.5), 1/(m.in_features**0.5))
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# 正态分布初始化
def normal_init(m):
    if isinstance(m, nn.Linear):
        init.normal_(m.weight, mean=0, std=1)
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# 全零初始化
def zero_init(m):
    if isinstance(m, nn.Linear):
        init.constant_(m.weight, 0)
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# 全一初始化
def one_init(m):
    if isinstance(m, nn.Linear):
        init.constant_(m.weight, 1)
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# 固定值初始化
def fixed_value_init(m, value):
    if isinstance(m, nn.Linear):
        init.constant_(m.weight, value)
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# Kaiming初始化(He初始化)
def kaiming_init(m):
    if isinstance(m, nn.Linear):
        init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')
        if m.bias is not None:
            init.constant_(m.bias, 0)
 
# Xavier初始化(Glorot初始化)
def xavier_init(m):
    if isinstance(m, nn.Linear):
        init.xavier_uniform_(m.weight)
        if m.bias is not None:
            init.constant_(m.bias, 0)


在PyTorch中,一般我们在构建网络模型时,每个网络层的参数都有默认的初始化方法,如果需要自定义参数的初始化,可以使用torch.nn.init模块中提供的各种初始化方法。例如,使用torch.nn.init.xavier_uniform_或torch.nn.init.kaiming_normal_来实现Xavier和Kaiming初始化。  


↓ ↓ ↓ ↓ ↓ ↓ ↓


简化写法:


def func01():
 
    linear = nn.Linear(5, 3)  # 输入和输出维度
    # 均匀分布
    nn.init.uniform_(linear.weight)
    print(linear.weight.data)
 
 
def func02():
    # 固定值赋值
    linear = nn.Linear(5, 3)
    nn.init.constant_(linear.weight, 5)
    print(linear.weight.data)


❄️torch.nn.init 是 PyTorch 中用于初始化神经网络层(如线性层、卷积层等)权重和偏置的模块。这个模块提供了多种预定义的初始化方法,用户可以根据需要选择合适的方法来初始化网络参数。


❄️torch.nn是PyTorch中用于定义神经网络的模块,它包含了构建神经网络所需的各种层和损失函数


  1. 网络层:torch.nn提供了多种类型的网络层,包括线性层(Linear)、卷积层(Conv2d)、池化层(MaxPool2d)、循环层(如RNN)等,这些层是构建神经网络的基本单元。


 2.损失函数:为了训练网络,需要计算损失函数,torch.nn提供了多种损失函数,如交叉熵损失(CrossEntropyLoss)、均方误差损失(MSELoss)等。


 3.激活函数:激活函数用于引入非线性,torch.nn包含了常见的激活函数,如ReLU、Sigmoid、Tanh等。


 4.优化器接口:虽然优化器本身不直接包含在torch.nn模块中,但PyTorch提供了torch.optim模块,与torch.nn紧密集成,用于网络参数的优化。


 5.容器类:torch.nn还提供了一些容器类,如Sequential和ModuleList,它们帮助用户组织和管理网络中的各层。


 6.功能性操作:除了网络层和损失函数,torch.nn还提供了一些功能性操作,如functional子模块中的函数,它们对张量进行逐元素操作,如relu、softmax等。


相关文章
|
5天前
|
机器学习/深度学习 数据采集 监控
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
**神经网络与AI学习概览** - 探讨神经网络设计,包括MLP、RNN、CNN,激活函数如ReLU,以及隐藏层设计,强调网络结构与任务匹配。 - 参数初始化与优化涉及Xavier/He初始化,权重和偏置初始化,优化算法如SGD、Adam,针对不同场景选择。 - 学习率调整与正则化,如动态学习率、L1/L2正则化、早停法和Dropout,以改善训练和泛化。
5 0
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
|
17天前
|
存储 机器学习/深度学习 弹性计算
阿里云ECS计算型c8i服务器测评_网络PPS_云盘IOPS性能参数
阿里云ECS计算型c8i实例采用Intel Xeon Emerald Rapids或Sapphire Rapids CPU,主频2.7 GHz起,支持CIPU架构,提供强大计算、存储、网络和安全性能。适用于机器学习、数据分析等场景。实例规格从2核到192核,内存比例1:2,支持ESSD云盘,网络带宽高达100 Gbit/s,具备IPv4/IPv6,vTPM和内存加密功能。详细规格参数表包括不同实例的vCPU、内存、网络带宽、IOPS等信息,最高可达100万PPS和100万IOPS。
|
17天前
|
存储 弹性计算 网络协议
阿里云服务器ECS计算型c7实例详解_网络PPS_云盘IOPS性能参数
阿里云ECS计算型c7实例,基于三代神龙架构,采用Intel Ice Lake CPU,2.7 GHz基频,3.5 GHz全核睿频,提供高性能计算、存储和网络能力。支持vTPM和Enclave特性,适用于高网络负载、游戏、数据分析等场景。实例规格从2核4GB至128核256GB,最大网络收发包可达2400万PPS。详细规格及性能参数见官方页面。
|
18天前
|
机器学习/深度学习 算法 大数据
神经网络之超参数
超参数在神经网络的设计和训练中起着至关重要的作用。它们是在开始训练之前设置的参数,与网络的结构、训练过程和优化算法有关。正确的超参数选择对于达到最优模型性能至关重要。
8 1
|
24天前
|
计算机视觉
【YOLOv8改进 - 特征融合NECK】 HS-FPN :用于处理多尺度特征融合的网络结构,降低参数
MFDS-DETR是针对白细胞检测的创新方法,它通过HS-FPN和可变形自注意力解决规模差异和特征稀缺问题。HS-FPN利用通道注意力模块增强特征表达,改善多尺度挑战。代码和数据集可在给定链接获取。此方法在WBCDD、LISC和BCCD数据集上表现优越,证明了其有效性和通用性。YOLO系列文章提供了更多目标检测改进和实战案例。
|
12天前
|
网络协议 Linux 开发工具
计算机网络--TCP中的参数配置
计算机网络--TCP中的参数配置
|
1月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
49 1
|
4天前
|
Linux
linux网络统计信息和端口占用情况基本语法
linux网络统计信息和端口占用情况基本语法
|
11天前
|
网络协议 安全 Ubuntu
7 个有用的免费 Linux 网络隧道
【7月更文挑战第4天】
47 0
7 个有用的免费 Linux 网络隧道
|
23天前
|
安全 物联网 Linux
学习Linux对网络安全的重要性
**学习Linux对网络安全至关重要:** 1. 开源操作系统广泛应用于服务器、网络设备,掌握Linux是安全专家必备技能。 2. Linux内置安全特性,如最小权限和防火墙,加上丰富的安全工具,提供强大保障。 3. 可定制性允许灵活配置,满足安全需求,开源社区提供持续更新和教育资源。 4. 学习Linux能提升攻防能力,用于系统加固和渗透测试,适应跨平台安全场景。 5. 随着云计算和物联网发展,Linux在网络安全中的角色日益关键。
48 3