增加一个不使用的线性层影响模型预测结果的原因[pytorch]

pytorch 版本:

1.11.0

出现问题:

固定了所有随机数种子,去掉模型中一个没有用到的线性层,模型训练后的准确率发生了变化。(下面是一个例子)
更改前:

class Model(nn.Module):
    def __init__(self, encoder, classifier):
        super(Model, self).__init__()
        self.dense1 = TimeDistributed(torch.nn.Linear(600, 100))  #没用到的线性层
        self.encoder = encoder
        self.classifier = classifier
    def forward(self, x, m):
        x = self.encoder(x, m)
        x = self.classifier(x)
        return x

更改后:

class Model(nn.Module):
    def __init__(self, encoder, classifier):
        super(Model, self).__init__()
        #self.dense1 = TimeDistributed(torch.nn.Linear(600, 100))  注释掉了之前的线性层
        self.encoder = encoder
        self.classifier = classifier
    def forward(self, x, m):
        x = self.encoder(x, m)
        x = self.classifier(x)
        return x

更改前后在经过1个epoch训练后的预测结果不同,原因解释在下面

解释:

pytorch在初始化模型时会用随机数生成器(PRNG)为每个参数层进行初始化,这个初始化是按顺序的。加一层或者打乱顺序会影响参数的初始值,一般模型经过很多趟epoch之后就没有区别了。
但是有的模型可能对参数初始值很敏感,可以使用更好的参数初始化函数让模型训练更鲁棒,比如nn.init.xavier_normal_()之类的初始化函数。

pytorch论坛上的解释:
在这里插入图片描述

上面解释的有道翻译:
每个层创建都会随机初始化参数(如果可用),并因此调用伪随机数生成器。如果你的训练对不同的种子很敏感,这些额外的层创建可以显著地改变训练结果,你应该看到相同的效果,删除层创建,只改变种子在你的脚本开始。

参考资料:

https://discuss.pytorch.org/t/unused-model-parameters-affect-optimization-for-adam/27563/11

https://discuss.pytorch.org/t/model-performance-changes-when-having-unused-components-in-model-init-method/102550

你可能感兴趣的:(pytorch,深度学习,python)