有关深度神经网络参数初始化的1.思考

初始化参数不能为零?

Plan A

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils import data
features = torch.randn((100, 3))
labels = torch.randn(100, 1)

dataset = data.TensorDataset(features, labels)
dat_iter = data.DataLoader(dataset, batch_size=10)

net = nn.Sequential(nn.Linear(3, 2), nn.Linear(2, 1))
loss = nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.03)
# plan A
net[0].weight.data.fill_(0)
net[0].bias.data.fill_(0)

net[1].weight.data.fill_(0)
net[1].bias.data.fill_(0)
num_epochs = 3
for epoch in range(num_epochs):
    for x, y in data_iter:
        print('W: ', net[0].weight.data, '\tb: ', net[0].bias.data)
        l = loss(net(x) ,y)
        optimizer.zero_grad()
        l.backward()
        optimizer.step()
        print('W_grad: ', net[0].weight.grad, '\tb_grad: ', net[0].bias.grad)
        input()
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

输出结果

在这里插入图片描述

Plan B

# plan A
net[0].weight.data = torch.tensor([[1., 2, 3], [1, 2, 3]])
net[0].bias.data.fill_(0)

net[1].weight.data.fill_(0)
net[1].bias.data.fill_(0)

输出结果

在这里插入图片描述

结论

根据Plan A的结果,如果将模型参数全部设置为0,则由于对称性,导致隐藏层的每个神经单元的输入保持一致,在反向传播时也会导致同一层中不同神经元的梯度保持一致,进而造成在隐藏层中不同神经元的参数始终保持一致,导致模型退化成一个每一层只有一个神经元的网络结构。
同理,根据Plan B的结果,如果模型参数设置的具有对称性,即同一层中不同神经元初始化一致,同样也会造成模型退化。

打破对称性

Plan C

# plan C
net[0].weight.data.fill_(0)
net[0].bias.data = torch.tensor([1.1, 0.2])

net[1].weight.data.fill_(0)
net[1].bias.data.fill_(0)

输出结果

在这里插入图片描述

本文只简单介绍了模型初始化参数不能全为零的原因。暂没有考虑为什么要随机初始化,以及初始化参数大小对模型收敛速度的影响。

参考:为什么神经网络参数不能全部初始化为全0?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值