Deep learning 当培训带有某些冻结模块的模型时,是否应停用辍学?

Deep learning 当培训带有某些冻结模块的模型时,是否应停用辍学?,deep-learning,transfer-learning,dropout,Deep Learning,Transfer Learning,Dropout,我有一个由o模块组合而成的深度神经网络,如编码器、解码器等。在训练之前,我从预训练模型中加载其部分参数,仅用于模块的子集。例如,我可以加载一个预训练的编码器。然后我想冻结预训练模块的参数,这样它们就不会与其他模块一起训练。在Pytorch中: 子模型中参数的。参数() param.requires_grad=False 现在,我应该在学习时继续对这些冻结的模块应用辍学,还是应该停用它(参见下面的示例)?为什么? def MyModel(nn.Module): ... def前进(x): 如果冻

我有一个由o模块组合而成的深度神经网络,如编码器、解码器等。在训练之前,我从预训练模型中加载其部分参数,仅用于模块的子集。例如,我可以加载一个预训练的编码器。然后我想冻结预训练模块的参数,这样它们就不会与其他模块一起训练。在Pytorch中:

子模型中参数的
。参数()
param.requires_grad=False
现在,我应该在学习时继续对这些冻结的模块应用辍学,还是应该停用它(参见下面的示例)?为什么?

def MyModel(nn.Module):
...
def前进(x):
如果冻结子模块:
self.submodule.eval()#在冻结子模块时禁用退出
x=自前向(x)
如果冻结子模块:
self.submodule.train()
冻结模块 您可以通过设置
requires\u grad\u(False)
来冻结参数,该设置不太详细:

submodel.requires_grad_(False)
这将冻结所有
子模型
参数

您也可以将
与torch.no_grad
上下文管理器一起使用,而不是
子模型
转发
传递,但它确实不太常见

eval
运行
submodule.eval()
将某些层置于评估模式(
BatchNorm
drop
)。对于
辍学
(实际上是反向辍学),您可以检查它是如何工作的

Q:退出是否仍应适用于冻结参数

不,因为权重将无法补偿辍学的影响,这是它的目标之一(使其更加健壮,并将信息流传播到更多路径)。他们将无法做到这一点,因为他们无法训练

另一方面,退出会给架构增加更多的噪音和错误,可能会迫使网络中可训练的部分对此进行补偿,我会尝试一下

冻结预训练的子模块有助于避免其权重被忽略 由于训练而产生的梯度会把事情搞得一团糟 非预训练子模


视情况而定,
fastai
社区对预先训练的模块使用较小的学习率,仍然让它们可以进行培训(请参见),这很直观(任务的分布在某种程度上与您的主干预先训练的分布不同,因此有理由假设权重也需要调整一定量(可能很小).

我不太明白你的问题。为什么要冻结子模块?你到底想完成什么?@VictorZuanazzi冻结预训练子模块有助于避免其权重因训练非预训练子模块而导致的梯度而混乱。看,例如,或者。谢谢@Szymon,我也这么怀疑。然而,在Pytorch论坛上搜索“冻结参数”时,我唯一发现了建议使用
明确冻结参数的答案,即要求@u grad=False
。例如,或。直觉告诉我为什么?我上面的问题更一般:辍学是否仍然适用于冻结的参数?若然,原因为何?你有一些推荐信吗?@Lollo的答案有点混乱。此项已更正,不便之处,敬请原谅。