如何解决如何检测pytorch中欠拟合和消失梯度的来源?
如何检测pytorch中消失梯度的来源?
梯度消失是指即使在有限的数据集上,训练损失也不会低于某个值。
我正在尝试训练一些网络,但我遇到了上述问题,我什至无法让网络过度拟合,但无法理解问题的根源。
我花了很长时间在谷歌上搜索这个,只找到了防止过度拟合的方法,但没有找到关于拟合不足,或者特别是梯度消失的方法。
我发现了什么:
Pytorch forum discussion 关于“糟糕的渐变”。它仅指爆炸梯度和 nan 梯度,并导致 here 和 here 大致相同。
我知道“使网络更大或更复杂”是导致过度拟合的一般建议方法(现在需要)。
我也知道非常深的网络可以让它们的梯度消失。
我不清楚更大的网络是否会解决这个问题,因为它可能会产生它自己的问题,正如我刚才所说的,而且我不知道如何调试它,同时仍然看到大致相同的行为。
将架构更改为某种 res-net 可能有帮助,但也无济于事,因为问题并未被确定为由网络深度引起。
Dead Relu 会导致欠拟合,而改用 LeakyRelu 确实有帮助,但仍然不够。
如何调试 Pytorch 中欠拟合的来源,特别是由消失的梯度引起的?
我希望能够正确地可视化网络中的梯度,而不是盲目地尝试解决问题,而不是盲目地尝试解决问题。
当然,我不是第一个提出此要求的人,为此目的创建了工具和方法。
我想阅读有关它们的信息,但不知道要查找什么。
我现在拥有的具体网络无关紧要,因为这是关于方法论的一般问题。
解决方法
您可以将 tensorboard 与 Pytorch 结合使用来可视化训练梯度。在训练期间将梯度添加到张量板直方图。
例如...
让:
-
model
成为您的 pytorch 模型 -
model_input
是模型输入的示例 -
run_name
是您培训课程的字符串标识符
from torch.utils.tensorboard import SummaryWriter
summary_writer = SummaryWriter(comment=run_name)
summary_writer.add_graph(model,model_input,verbose=True)
# Training loop
for step_index in ...:
# Calculate loss etc
for name,param in model.named_parameters():
summary_writer.add_histogram(f'{name}.grad',param.grad,step_index)
参考文献:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。