深度学习中常用的权重初始化方式

news/2024/11/28 4:43:07/

最近看论文,看到不少论文说明他们的卷积的权重初始化方式为Kaiming Uniform,我就好奇这是个什么东西,然后一查才知道,这是一种权重初始化方式,并且是Pytorch默认的一种初始化方式,那就想,这有啥好在论文中写的,显得厉害吧,那我以后也写。

注:以下内容全部来自ChatGPT.。

深度学习中常用的权重初始化方式

  • 随机初始化(Random Initialization)
  • Xavier初始化(Xavier Initialization)
  • He初始化(He Initialization)
  • 正交初始化(Orthogonal Initialization)
  • 稀疏初始化(Sparse Initialization)
  • 使用Xavier初始化卷积层的权重
  • 参考资料

随机初始化(Random Initialization)

随机初始化是一种常用的神经网络权重初始化方法。它通过在训练开始时随机分配权重值来打破网络的对称性,使网络能够学习数据中的独特特征和模式。

最常用的随机初始化方法是从均值为0、方差为1的高斯分布中随机采样得到权重。这通常被称为“标准正态”分布。权重 wijw_{ij}wijiii-th 输入神经元和 jjj-th 输出神经元之间的随机初始化公式为:

wij∼N(0,1)w_{ij} \sim \mathcal{N}(0, 1)wijN(0,1)

其中,N(0,1)\mathcal{N}(0, 1)N(0,1) 表示均值为0,方差为1的高斯分布

随机初始化也可以使用均匀分布,其中权重从两个值之间的均匀分布中采样,通常为 -1 和 1。权重 wijw_{ij}wij 的随机初始化公式为:

wij∼U(−1,1)w_{ij} \sim \mathcal{U}(-1, 1)wijU(1,1)

其中,U(−1,1)\mathcal{U}(-1, 1)U(1,1) 表示介于-1和1之间的均匀分布

需要注意的是,随机初始化所使用的值的范围可能会对网络性能产生重大影响。如果权重以过大或过小的值初始化,可能会导致训练过程收敛缓慢甚至导致网络发散。因此,根据具体的网络架构和任务,选择适当的初始化分布范围非常重要。

总的来说,随机初始化是一种简单有效的神经网络权重初始化方法,通常被用作与更高级初始化技术进行比较的基准方法。

Xavier初始化(Xavier Initialization)

Xavier Initialization(也称为Glorot Initialization)是一种常用的神经网络权重初始化方法,旨在解决随机初始化可能导致的梯度消失或梯度爆炸问题。它的基本思想是根据上一层输入神经元的数量和下一层输出神经元的数量来确定权重初始化的范围。

Xavier Initialization的公式为:

Wij∼N(0,2nin+nout)W_{ij} \sim \mathcal{N}(0, \sqrt{\frac{2}{n_{in} + n_{out}}})WijN(0,nin+nout2)

其中,WijW_{ij}Wij 是连接第 iii 个输入神经元和第 jjj 个输出神经元的权重,ninn_{in}nin 是上一层输入神经元的数量,noutn_{out}nout 是下一层输出神经元的数量,N(0,2nin+nout)\mathcal{N}(0, \sqrt{\frac{2}{n_{in} + n_{out}}})N(0,nin+nout2) 表示均值为0,方差为2nin+nout\sqrt{\frac{2}{n_{in} + n_{out}}}nin+nout2的高斯分布。

Xavier Initialization的优点是可以有效地避免梯度消失或梯度爆炸问题,并且可以加速神经网络的收敛速度。然而,它的缺点在某些情况下可能会导致权重太小或太大,从而影响网络的性能。因此,一些改进的技术,如He Initialization和其变体,已经被提出来以进一步提高随机初始化的性能。

总的来说,Xavier Initialization是一种简单而有效的神经网络权重初始化方法,尤其适用于激活函数为tanh或sigmoid的情况。通过调整初始化权重的范围,可以有效地提高网络的训练速度和性能。

Xavier初始化最初出现在2010年的论文《Understanding the difficulty of training deep feedforward neural networks》中。

He初始化(He Initialization)

He Initialization是一种改进的神经网络权重初始化方法,它是Xavier Initialization的一个变体。与Xavier Initialization不同,He Initialization主要用于激活函数为ReLU(Rectified Linear Unit)的神经网络。

He Initialization的公式为:

Wij∼N(0,2nin)W_{ij} \sim \mathcal{N}(0, \sqrt{\frac{2}{n_{in}}})WijN(0,nin2)

其中,WijW_{ij}Wij 是连接第 iii 个输入神经元和第 jjj 个输出神经元的权重,ninn_{in}nin 是上一层输入神经元的数量,N(0,2nin)\mathcal{N}(0, \sqrt{\frac{2}{n_{in}}})N(0,nin2) 表示均值为0,方差为2nin\sqrt{\frac{2}{n_{in}}}nin2的高斯分布。

He Initialization的优点是可以有效地避免梯度消失或梯度爆炸问题,并且可以加速神经网络的收敛速度。与Xavier Initialization相比,He Initialization更适用于ReLU激活函数,因为它可以更好地适应ReLU的非线性性质。

需要注意的是,He Initialization虽然在大多数情况下表现良好,但在某些情况下可能会导致权重太小或太大,从而影响网络的性能。因此,一些改进的技术,如LeCun Initialization和其变体,已经被提出来以进一步提高随机初始化的性能。

总的来说,He Initialization是一种简单而有效的神经网络权重初始化方法,尤其适用于激活函数为ReLU的情况。通过调整初始化权重的范围,可以有效地提高网络的训练速度和性能。

He初始化最初出现在2015年的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中。

正交初始化(Orthogonal Initialization)

Orthogonal Initialization是一种神经网络权重初始化方法,它的目标是使权重矩阵正交化。正交化是指将权重矩阵中的每一列变成单位向量,并且每个列向量与其他列向量垂直。正交矩阵具有很好的数学性质,例如它们保持向量的长度和角度,因此可以有效地减少神经网络中的冗余性和过拟合。

Orthogonal Initialization的公式为:

Wij∼U(−1,1)W_{ij} \sim \mathcal{U}(-1, 1)WijU(1,1)

其中,WijW_{ij}Wij 是连接第 iii 个输入神经元和第 jjj 个输出神经元的权重,U(−1,1)\mathcal{U}(-1, 1)U(1,1) 表示介于-1和1之间的均匀分布。

接下来,使用QR分解将初始权重矩阵正交化。具体地,将初始权重矩阵WWW分解为W=QRW=QRW=QR,其中QQQ是正交矩阵,RRR是上三角矩阵。然后将QQQ作为正交化后的权重矩阵。

Orthogonal Initialization的优点可以有效地减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。然而,它的缺点计算复杂度较高,因此可能不适用于大型神经网络

总的来说,Orthogonal Initialization是一种有效的神经网络权重初始化方法,尤其适用于需要减少冗余性和过拟合的情况。通过正交化权重矩阵,可以提高神经网络的泛化能力和性能。

正交初始化最初出现在2014年的论文《Exact solutions to the nonlinear dynamics of learning in deep linear neural networks》中。

稀疏初始化(Sparse Initialization)

Sparse Initialization是一种神经网络权重初始化方法,它的目标是将权重矩阵中的大部分元素设置为零,从而实现稀疏性。稀疏性可以减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。Sparse Initialization常常用于卷积神经网络中

Sparse Initialization的公式为:

Wij∼N(0,σ2)∗BW_{ij} \sim \mathcal{N}(0, \sigma^2) * \textbf{B}WijN(0,σ2)B

其中,WijW_{ij}Wij 是连接第 iii 个输入神经元和第 jjj 个输出神经元的权重,N(0,σ2)\mathcal{N}(0, \sigma^2)N(0,σ2) 表示均值为0,方差为σ2\sigma^2σ2的高斯分布,B\textbf{B}B是大小为m×nm \times nm×n的二元矩阵,其中mmm是输入神经元的数量,nnn是输出神经元的数量。B\textbf{B}B中的每个元素都是0或1,其中1的数量为ρmn\rho mnρmnρ\rhoρ是一个控制稀疏度的参数。

在实践中,通常将ρ\rhoρ设置为0.1或0.01,从而将权重矩阵中的大部分元素设置为零。这种稀疏性可以减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。

需要注意的是,Sparse Initialization可能会导致权重矩阵中的一些元素过大或过小,从而影响网络的性能。因此,一些改进的技术,如权重剪枝和其变体,已经被提出来以进一步提高稀疏初始化的性能。

总的来说,Sparse Initialization是一种有效的神经网络权重初始化方法,尤其适用于需要减少冗余性和过拟合的情况。通过将权重矩阵中的大部分元素设置为零,可以提高神经网络的泛化能力和性能。

使用Xavier初始化卷积层的权重

用pytorch搭建一个简单的卷积神经网络,并使用Xavier初始化卷积层的权重

以下是一个简单的卷积神经网络的搭建示例,其中卷积层的权重使用Xavier初始化方法进行初始化:

import torch
import torch.nn as nnclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 定义卷积层self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)# 定义池化层self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 定义全连接层self.fc1 = nn.Linear(in_features=64 * 8 * 8, out_features=512)self.fc2 = nn.Linear(in_features=512, out_features=10)# 使用Xavier初始化卷积层的权重nn.init.xavier_uniform_(self.conv1.weight)nn.init.xavier_uniform_(self.conv2.weight)def forward(self, x):# 前向传播x = self.conv1(x)x = nn.functional.relu(x)x = self.pool(x)x = self.conv2(x)x = nn.functional.relu(x)x = self.pool(x)x = torch.flatten(x, start_dim=1)x = self.fc1(x)x = nn.functional.relu(x)x = self.fc2(x)return x

在这里,我们定义了一个名为SimpleCNN的类,继承自nn.Module。在类的构造函数中,我们定义了两个卷积层、一个池化层和两个全连接层,并使用nn.init.xavier_uniform_()函数对卷积层的权重进行了Xavier初始化。在前向传播函数中,我们按照卷积层、激活函数、池化层、全连接层、激活函数和全连接层的顺序构建了卷积神经网络的结构。

需要注意的是,该示例中仅仅对卷积层的权重使用了Xavier初始化方法,其他层的权重初始化方式可以使用类似的方式指定。另外,该示例仅仅是一个简单的卷积神经网络,实际应用中可能需要根据具体任务需求进行更加复杂的网络设计。

参考资料

ChatGPT


http://www.ppmy.cn/news/41125.html

相关文章

插值,卷积,反卷积

1.为什么插值可以越插越小,一般不是越插越大吗 插值的结果取决于所用的插值方法和数据的分布情况。在某些情况下,插值可以越插越小。 例如,如果我们使用插值方法来逼近一段连续函数,且插值点越来越密集,那么插值误差…

Qt Quick - 分隔器综述

Qt Quick - 分隔器综述一、概述二、MenuSeparator 控件1. 用法:三、ToolSeparator 控件1. 用法一、概述 Qt Quick Controls 提供了多种分隔符,其实就是分割一下MenuBar和ToolBar里面的内容。 控件功能MenuSeparator将菜单中的一组项目与相邻项目分开To…

一种供水系统物联网监测系统

1.1供水系统 1.1.1监测范围选择依据 (1)管网老化区域管网 管网建设年代久远,通常管网发生破损问题较大,根据管网本身属性和历史发生事件的统计分析,结合数理统计,优先选择管网老化区域的管段所在区域进行…

SQL中部分函数使用方法

一、SQL中 decode() 函数使用介绍 decode(skaccnum.def4,~,0,skaccnum.def4) 这是一个 Oracle SQL 中的 DECODE 函数的使用示例。DECODE 函数通常用于根据某些条件返回不同的值。在这个例子中,DECODE 函数的第一个参数是 skaccnum.def4,第二个参数是 ~&a…

如何提升智能文档处理识别精度?合合信息“版面分析”实现新突破

春季是繁忙的播种季,学生党迎来了开学季和紧张的研究生复试,职场人士也需要处理新签业务带来的大量不同类型的文件,比如合同、发票、档案等。这些文件在被拍照、扫描成电子文档的过程中,时常存在漏字、错位现象。究其原因&#xf…

OpenAI-ChatGPT最新官方接口《AI绘图》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(二)(附源码)

ChatGPT-AI绘图Image generation Beta 图片生成前言IntroductionUsageGenerationsEdits 编辑VariationsLanguage-specific tips 特定语言提示Python 语言Using in-memory image data 使用内存中的图像数据Operating on image data 操作图像数据Error handlingNode.js 语言Using…

AB91-1 HESG437479R1 HESG437899

AB91-1 HESG437479R1 HESG437899 以硅为基材的集成电路共有Si BJT(Si-Bipolar Junction Transistor)、Si CMOS、与结合Bipolar与CMOS 特性的Si BiCMOS(Si Bipolar Complementary Metal Oxide Semiconductor)等类。由于硅是当前半导体产业应用最为成熟的材料,因此&am…

gdb 跟踪调式core

自己编译的问题出现段错误: 编译:使用gdb调试core文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上-g编译命令选项。 gdb调试core文件的步骤 gdb调试core文件的步骤常见的有如下几种,推荐第一种。 具体步骤一: (1)启动gdb,进入core文…