首页 > 解决方案 > 如何检测pytorch中欠拟合和梯度消失的来源?

问题描述

如何检测pytorch中消失梯度的来源?

通过消失梯度,我的意思是训练损失不会低于某个值,即使在有限的数据集上也是如此。

我正在尝试训练一些网络,但我遇到了上述问题,我什至无法让网络过度拟合,但无法理解问题的根源。

我花了很长时间在谷歌上搜索,只找到了防止过度拟合的方法,但没有找到关于拟合不足,或者特别是渐变消失的方法。


我发现了什么:

Pytorch 论坛关于“坏梯度”的讨论。它仅指爆炸梯度和 nan 梯度,并导致此处此处更相同。

我知道“使网络更大或更复杂”是一种导致过度拟合的一般建议方法(这是现在所需要的)。
我也知道非常深的网络可以让它们的梯度消失。
我不清楚一个更大的网络是否能解决问题,因为它可能会产生自己的问题,正如我刚才所说的,而且我不知道如何调试它,同时仍然看到大致相同的行为。
将架构更改为某些 res-net 可能会有所帮助,但也无济于事,因为该问题并未被确定为由网络深度引起的。

Dead Relu 可能会导致拟合不足,确实迁移到 LeakyRelu 会有所帮助,但仍然不够。


如何调试 Pytorch 中的欠拟合源,特别是由梯度消失引起的?

我希望能够正确地可视化我的网络中的梯度,而不是盲目地拍摄,尝试一些事情,以了解我实际上想要解决的问题,而不是猜测。
当然,我不是第一个有这个要求的人,为此目的创建了工具和方法。

我想了解它们,但不知道要查找什么。

我现在拥有的特定网络无关紧要,因为这是关于方法论的一般问题。

标签: pythondeep-learningpytorchtensorboardbackpropagation

解决方案


您可以使用带有 Pytorch 的 tensorboard 来可视化训练梯度。在训练期间将梯度添加到张量板直方图。


例如...

让:

  • 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)

参考:


推荐阅读