商城网站离不开支付系统,网络营销渠道策略,分销商城开发多少钱,网站开发人月薪一、概念 神经网络的初始化是深度学习中的一个关键步骤#xff0c;它指的是在训练开始前为神经网络的权重和偏置设置初始值。合适的初始化方法可以加速模型的收敛#xff0c;提高训练效果#xff0c;甚至影响模型的最终性能。当然#xff0c;目前我们使用Torch、TensorFlow…一、概念 神经网络的初始化是深度学习中的一个关键步骤它指的是在训练开始前为神经网络的权重和偏置设置初始值。合适的初始化方法可以加速模型的收敛提高训练效果甚至影响模型的最终性能。当然目前我们使用Torch、TensorFlow等深度学习库进行建模的过程中这些第三方库已经默认为我们选择了初始化的方式来设置神经网络的权重和偏置不同神经网络有不同的默认方法从而使得很多人往往都会忽略初始化竟然还能玩花样。
二、类型
1、随机初始化 随机初始化是神经网络中常用的一种权重初始化方法其基本思想是在训练开始前为网络的权重和偏置赋予随机值。随机初始化有助于打破网络的对称性使得不同的神经元可以学习不同的特征从而避免神经元之间冗余。随机初始化方法一般是从某个概率分布中随机抽取权重值常见的分布有
均匀分布Uniform Distribution权重从一个均匀分布中随机抽取通常范围是[−a,a]其中 a 是一个较小的正数可以根据网络的具体需求来设置。正态分布Normal Distribution权重从一个正态分布高斯分布中随机抽取均值为0标准差为 σ而标准差控制了权重值的分散程度。
import torch
import torch.nn as nn# 定义一个简单的神经网络
class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc1 nn.Linear(10, 50)self.fc2 nn.Linear(50, 1)# 初始化网络
net SimpleNet()# 应用随机初始化
def init_weights(m):if type(m) nn.Linear:# 均匀分布初始化nn.init.uniform_(m.weight, -0.1, 0.1)# 正态分布初始化# nn.init.normal_(m.weight, mean0.0, std0.01)# 初始化偏置为0nn.init.zeros_(m.bias)# 遍历网络中的所有模块并应用初始化
net.apply(init_weights)
2、Xaiver初始化 Xavier初始化也称为Glorot初始化由Xavier Glorot提出目的是解决在深度神经网络中随机初始化可能导致的梯度消失或梯度爆炸问题。Xavier初始化的基本思想是保持每一层输出的方差与输入的方差一致以防止信号在深度网络中的传播过程中出现衰减或放大。 Xavier初始化考虑了前一层的节点数和当前层的节点数。权重的初始化范围是到这个范围确保了权重既不会太小也不会太大从而避免了梯度消失或爆炸的问题。这个公式是基于保持激活值方差的稳定性来推导的使得每层的输出值激活值保持高斯分布。尽管Xavier初始化在很多情况下都非常有效但它假设激活函数是线性的因此更适合sigmoid或者tanh之类的激活函数这在实际中并不总是成立。例如在ReLU激活函数的网络中Xavier初始化可能不是最优的选择因此出现了He初始化作为替代。
import torch
import torch.nn as nn
import torch.nn.init as init# 定义一个简单的神经网络
class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc1 nn.Linear(10, 50) # 输入层到隐藏层self.fc2 nn.Linear(50, 1) # 隐藏层到输出层def forward(self, x):x torch.relu(self.fc1(x))x self.fc2(x)return x# 初始化网络
net SimpleNet()# 使用Xavier均匀分布初始化
init.xavier_uniform_(net.fc1.weight)
init.xavier_uniform_(net.fc2.weight)# 或者使用Xavier正态分布初始化
init.xavier_normal_(net.fc1.weight)
init.xavier_normal_(net.fc2.weight)# 打印初始化后的权重
print(net.fc1.weight)
print(net.fc2.weight)
3、He初始化 He初始化也称为Kaiming初始化由何凯明提出是一种专门为ReLU激活函数设计的权重初始化方法。He初始化的目的是为了解决在使用ReLU激活函数的深度神经网络中出现的梯度消失或爆炸问题。它通过合理设置权重的初始值使得在网络的前向传播和反向传播过程中激活值和梯度的方差保持相对稳定。 He初始化基于以下原理在ReLU激活函数下权重应该按照均值为0的正态分布进行初始化其标准差为其中是前一层的节点数。这样做的目的是为了保持每层激活值的方差大致相同从而避免梯度消失或爆炸。
import torch
import torch.nn as nn
import torch.nn.init as initclass SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc1 nn.Linear(10, 50) # 输入层到隐藏层self.fc2 nn.Linear(50, 1) # 隐藏层到输出层def forward(self, x):x torch.relu(self.fc1(x))x self.fc2(x)return x# 初始化网络
net SimpleNet()# 使用He初始化
init.kaiming_normal_(net.fc1.weight, modefan_in, nonlinearityrelu)
init.kaiming_normal_(net.fc2.weight, modefan_in, nonlinearityrelu)# 打印初始化后的权重
print(net.fc1.weight)
print(net.fc2.weight)
4、正交初始化 正交初始化Orthogonal Initialization核心目标是使权重矩阵正交化。这种方法通过确保权重矩阵的每一列变成单位向量并且每个列向量与其他列向量垂直从而减少神经网络中的冗余性和过拟合提高网络的泛化能力和性能。 正交初始化基于保持向量长度和角度的数学性质通过正交化权重矩阵来减少神经网络中的冗余性和过拟合。具体来说正交初始化的过程可以分为以下几个步骤
高斯分布初始化首先使用均值为0、方差为1的高斯分布随机生成权重矩阵中的每个元素的初始值。QR分解然后对初始权重矩阵进行QR分解或SVD分解得到两个正交矩阵。选择正交矩阵最后选择其中一个正交矩阵作为权重矩阵。
import torch
import torch.nn as nn
import torch.nn.init as initclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 nn.Linear(10, 20)self.fc2 nn.Linear(20, 10)def forward(self, x):x torch.relu(self.fc1(x))x self.fc2(x)return x# 初始化网络
net Net()# 应用正交初始化
def orthogonal_init(module):if isinstance(module, nn.Linear):init.orthogonal_(module.weight)if module.bias is not None:init.zeros_(module.bias)net.apply(orthogonal_init)