python - 如何检测pytorch中欠拟合和梯度消失的来源?
问题描述
如何检测pytorch中消失梯度的来源?
通过消失梯度,我的意思是训练损失不会低于某个值,即使在有限的数据集上也是如此。
我正在尝试训练一些网络,但我遇到了上述问题,我什至无法让网络过度拟合,但无法理解问题的根源。
我花了很长时间在谷歌上搜索,只找到了防止过度拟合的方法,但没有找到关于拟合不足,或者特别是渐变消失的方法。
我发现了什么:
Pytorch 论坛关于“坏梯度”的讨论。它仅指爆炸梯度和 nan 梯度,并导致此处和此处更相同。
我知道“使网络更大或更复杂”是一种导致过度拟合的一般建议方法(这是现在所需要的)。
我也知道非常深的网络可以让它们的梯度消失。
我不清楚一个更大的网络是否能解决问题,因为它可能会产生自己的问题,正如我刚才所说的,而且我不知道如何调试它,同时仍然看到大致相同的行为。
将架构更改为某些 res-net 可能会有所帮助,但也无济于事,因为该问题并未被确定为由网络深度引起的。
Dead Relu 可能会导致拟合不足,确实迁移到 LeakyRelu 会有所帮助,但仍然不够。
如何调试 Pytorch 中的欠拟合源,特别是由梯度消失引起的?
我希望能够正确地可视化我的网络中的梯度,而不是盲目地拍摄,尝试一些事情,以了解我实际上想要解决的问题,而不是猜测。
当然,我不是第一个有这个要求的人,为此目的创建了工具和方法。
我想了解它们,但不知道要查找什么。
我现在拥有的特定网络无关紧要,因为这是关于方法论的一般问题。
解决方案
您可以使用带有 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)
参考:
推荐阅读
- mysql - 手动安装 MySQL 的用户名
- ios - React-native:使用 zo0r/react-native-push-notification 显示前台通知,例如后台通知
- ios - 如何更改 CareKit 图表中的笔画宽度?
- xamarin - Android 构建 > 代码生成和运行时选项 > 启用启动跟踪?
- ruby - 是否有完整的 Ruby antlr4 语法和词法分析器?
- vue.js - 文本字段中的Vue检查值
- wordpress - Elementor 视频不透明度
- javascript - 自动格式化 html 输入类型 tel
- ios - 在 2 个 iOS 应用程序之间共享通用代码:Swift 包管理器?可可足类?单回购?
- go - 内存不足时如何在golang中创建堆转储?