1 零初始化
将所有的权重和偏置初始化为零。
2 随机初始化
parameters[f"W{l}"] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01 parameters[f"b{l}"] = np.zeros((layer_dims[l], 1))
3 xavier初始化
1 思路
根据每层输入和输出的神经元数量来调整权重的初始值,以确保信号在前向传播和反向传播过程中能够在不同层之间均匀传播
2 作用
意味着对于每个神经元,其输入和输出的方差应该相等,从而避免在网络的不同层之间引入过大或过小的方差,有助于缓解梯度消失或梯度爆炸问题
3 公式
eg:前一层是输入层,有100个神经元,后一层是隐藏层1本身,有80个神经元。根据公式,我们可以计算权重初始范围a:a = sqrt(6 / (100 + 80)) ≈ 0.136。现在,我们可以从均匀分布[-0.136, 0.136]中随机初始化隐藏层1的权重矩阵。
4 pytorch实现`torch.nn.init.xavier_uniform_`函数来初始化权重
import torch
import torch.nn as nn# 定义一个5层的神经网络
class MyNetwork(nn.Module):
def __init__(self):
super(MyNetwork, self).__init__()
self.fc1 = nn.Linear(100, 80) # 隐藏层1
self.fc2 = nn.Linear(80, 60) # 隐藏层2
self.fc3 = nn.Linear(60, 40) # 隐藏层3
self.fc4 = nn.Linear(40, 10) # 输出层# 使用Xavier初始化来初始化权重
nn.init.xavier_uniform_(self.fc1.weight)
nn.init.xavier_uniform_(self.fc2.weight)
nn.init.xavier_uniform_(self.fc3.weight)
nn.init.xavier_uniform_(self.fc4.weight)def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = torch.relu(self.fc3(x))
x = self.fc4(x)
return x# 创建网络实例
net = MyNetwork()# 打印网络结构和权重
print(net)
print(net.fc1.weight)
print(net.fc2.weight)
print(net.fc3.weight)
print(net.fc4.weight)