最近看论文,看到不少论文说明他们的卷积的权重初始化方式为Kaiming Uniform,我就好奇这是个什么东西,然后一查才知道,这是一种权重初始化方式,并且是Pytorch默认的一种初始化方式,那就想,这有啥好在论文中写的,显得厉害吧,那我以后也写。
注:以下内容全部来自ChatGPT.。
随机初始化是一种常用的神经网络权重初始化方法。它通过在训练开始时随机分配权重值来打破网络的对称性,使网络能够学习数据中的独特特征和模式。
最常用的随机初始化方法是从均值为0、方差为1的高斯分布中随机采样得到权重。这通常被称为“标准正态”分布。权重 w i j w_{ij} wij 在 i i i-th 输入神经元和 j j j-th 输出神经元之间的随机初始化公式为:
w i j ∼ N ( 0 , 1 ) w_{ij} \sim \mathcal{N}(0, 1) wij∼N(0,1)
其中, N ( 0 , 1 ) \mathcal{N}(0, 1) N(0,1) 表示均值为0,方差为1的高斯分布
。
随机初始化也可以使用均匀分布,其中权重从两个值之间的均匀分布中采样,通常为 -1 和 1。权重 w i j w_{ij} wij 的随机初始化公式为:
w i j ∼ U ( − 1 , 1 ) w_{ij} \sim \mathcal{U}(-1, 1) wij∼U(−1,1)
其中, U ( − 1 , 1 ) \mathcal{U}(-1, 1) U(−1,1) 表示介于-1和1之间的均匀分布
。
需要注意的是,随机初始化所使用的值的范围可能会对网络性能产生重大影响。如果权重以过大或过小的值初始化,可能会导致训练过程收敛缓慢甚至导致网络发散。因此,根据具体的网络架构和任务,选择适当的初始化分布范围非常重要。
总的来说,随机初始化是一种简单有效的神经网络权重初始化方法,通常被用作与更高级初始化技术进行比较的基准方法。
Xavier Initialization(也称为Glorot Initialization)是一种常用的神经网络权重初始化方法,旨在解决随机初始化可能导致的梯度消失或梯度爆炸问题。它的基本思想是根据上一层输入神经元的数量和下一层输出神经元的数量来确定权重初始化的范围。
Xavier Initialization的公式为:
W i j ∼ N ( 0 , 2 n i n + n o u t ) W_{ij} \sim \mathcal{N}(0, \sqrt{\frac{2}{n_{in} + n_{out}}}) Wij∼N(0,nin+nout2)
其中, W i j W_{ij} Wij 是连接第 i i i 个输入神经元和第 j j j 个输出神经元的权重, n i n n_{in} nin 是上一层输入神经元的数量, n o u t n_{out} nout 是下一层输出神经元的数量, N ( 0 , 2 n i n + n o u t ) \mathcal{N}(0, \sqrt{\frac{2}{n_{in} + n_{out}}}) N(0,nin+nout2) 表示均值为0,方差为 2 n i n + n o u t \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 Initialization是一种改进的神经网络权重初始化方法,它是Xavier Initialization的一个变体。与Xavier Initialization不同,He Initialization主要用于激活函数为ReLU
(Rectified Linear Unit)的神经网络。
He Initialization的公式为:
W i j ∼ N ( 0 , 2 n i n ) W_{ij} \sim \mathcal{N}(0, \sqrt{\frac{2}{n_{in}}}) Wij∼N(0,nin2)
其中, W i j W_{ij} Wij 是连接第 i i i 个输入神经元和第 j j j 个输出神经元的权重, n i n n_{in} nin 是上一层输入神经元的数量, N ( 0 , 2 n i n ) \mathcal{N}(0, \sqrt{\frac{2}{n_{in}}}) N(0,nin2) 表示均值为0,方差为 2 n i n \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的公式为:
W i j ∼ U ( − 1 , 1 ) W_{ij} \sim \mathcal{U}(-1, 1) Wij∼U(−1,1)
其中, W i j W_{ij} Wij 是连接第 i i i 个输入神经元和第 j j j 个输出神经元的权重, U ( − 1 , 1 ) \mathcal{U}(-1, 1) U(−1,1) 表示介于-1和1之间的均匀分布。
接下来,使用QR分解将初始权重矩阵正交化。具体地,将初始权重矩阵 W W W分解为 W = Q R W=QR W=QR,其中 Q Q Q是正交矩阵, R R R是上三角矩阵。然后将 Q Q Q作为正交化后的权重矩阵。
Orthogonal Initialization的优点
是可以有效地减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。然而,它的缺点
是计算复杂度较高,因此可能不适用于大型神经网络。
总的来说,Orthogonal Initialization是一种有效的神经网络权重初始化方法,尤其适用于需要减少冗余性和过拟合的情况。通过正交化权重矩阵,可以提高神经网络的泛化能力和性能。
正交初始化最初出现在2014年的论文《Exact solutions to the nonlinear dynamics of learning in deep linear neural networks》中。
Sparse Initialization是一种神经网络权重初始化方法,它的目标是将权重矩阵中的大部分元素设置为零
,从而实现稀疏性。稀疏性可以减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。Sparse Initialization常常用于卷积神经网络中。
Sparse Initialization的公式为:
W i j ∼ N ( 0 , σ 2 ) ∗ B W_{ij} \sim \mathcal{N}(0, \sigma^2) * \textbf{B} Wij∼N(0,σ2)∗B
其中, W i j W_{ij} Wij 是连接第 i i i 个输入神经元和第 j j j 个输出神经元的权重, N ( 0 , σ 2 ) \mathcal{N}(0, \sigma^2) N(0,σ2) 表示均值为0,方差为 σ 2 \sigma^2 σ2的高斯分布, B \textbf{B} B是大小为 m × n m \times n m×n的二元矩阵,其中 m m m是输入神经元的数量, n n n是输出神经元的数量。 B \textbf{B} B中的每个元素都是0或1,其中1的数量为 ρ m n \rho mn ρmn, ρ \rho ρ是一个控制稀疏度的参数。
在实践中,通常将 ρ \rho ρ设置为0.1或0.01,从而将权重矩阵中的大部分元素设置为零。这种稀疏性可以减少神经网络中的冗余性和过拟合,提高网络的泛化能力和性能。
需要注意的是,Sparse Initialization可能会导致权重矩阵中的一些元素过大或过小,从而影响网络的性能。因此,一些改进的技术,如权重剪枝和其变体,已经被提出来以进一步提高稀疏初始化的性能。
总的来说,Sparse Initialization是一种有效的神经网络权重初始化方法,尤其适用于需要减少冗余性和过拟合的情况。通过将权重矩阵中的大部分元素设置为零,可以提高神经网络的泛化能力和性能。
用pytorch搭建一个简单的卷积神经网络,并使用Xavier初始化卷积层的权重
以下是一个简单的卷积神经网络的搭建示例,其中卷积层的权重使用Xavier初始化方法进行初始化:
import torch
import torch.nn as nn
class 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