您的位置:首页 > 理论基础 > 计算机网络

PyTorch —— 神经网络权重初始化

2019-05-16 10:07 776 查看

权重初始化

神经网络从错误中学习,但是错误要能够被定位到。如果不能定位到错误那么就无法改正。

对于神经网络中的参数来说,如果所有参数全部一样(比如初始化为全0),那么就面临一个问题:梯度往哪里下降是最快呢??

看一个例子

神经网络很难判断哪些权重需要更改,因为每个层级的神经元输出是一样的。为了避免神经元具有相同的输出,我们使用独特权重。我们还可以随机选择权重,避免每个周期后的损失都陷于局部最低点。

如果使用正态(normal)或者uniform(均匀),结果就会好得多。随机的权重是很重要的。

权重初始化函数(均匀):

def weights_init_uniform(m):
classname = m.__class__.__name__
# for every Linear layer in a model..
if classname.find('Linear') != -1:
# apply a uniform distribution to the weights and a bias=0
m.weight.data.uniform_(0.0, 1.0)
m.bias.data.fill_(0)

应用方法:

model_uniform = Net()
model_uniform.apply(weights_init_uniform)

以一般法则进行初始化的函数 。分布和使用一般法则初始化权重的模型;范围是−y,y-y,y−y,y其中 y=1/ny=1 / \sqrt{n}y=1/n​

def weights_init_uniform_rule(m):
classname = m.__class__.__name__
# for every Linear layer in a model..
if classname.find('Linear') != -1:
# get the number of the inputs
n = m.in_features
y = 1.0/np.sqrt(n)
m.weight.data.uniform_(-y, y)
m.bias.data.fill_(0)

#
4000
create a new model with these weights
model_rule = Net()
model_rule.apply(weights_init_uniform_rule)

利用正态进行初始化:

## complete this function
def weights_init_normal(m):
'''Takes in a module and initializes all linear layers with weight
values taken from a normal distribution.'''

classname = m.__class__.__name__
# for every Linear layer in a model
# m.weight.data shoud be taken from a normal distribution
# m.bias.data should be 0
if classname.find('Linear') != -1:
m.weight.data.normal_(0.0, 0.05)
m.bias.data.fill_(0)

利用helper来进行比较:

import helpers

# put them in list form to compare
## evaluate the behavior using helpers.compare_init_weights

model_list = [(model_2, 'No'),
(model_normal_rule, 'Normal Distribution')]

# evaluate behavior
helpers.compare_init_weights(model_list,
'No vs Normal',
train_loader,
valid_loader)

结果显示正态有更低的训练误差。

和更高的验证精确度

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: