Debug Pytorch: BCE无法收敛无法学习

欢迎关注我的公众号:YueTan

最近在使用pytorch训练模型时,发现无法收敛。模型无法学到任何有效知识。经过几天的debug,能够解决无法学习和无法收敛的问题,但还是没有从根本上理解原因,因此通过本文进行一个记录。

若干天实验之后才发现如下问题:

无法学习无法收敛

 nn.CrossEntropyLoss(reduction="mean")
 - 标签采用label encoder形式

可以学习可以收敛

nn.BCEWithLogitsLoss()
- 标签采用one hot形式

分析

虽然对pytorch不熟,但确实很谜,不知道为啥换Cross entropy就没问题

  • 尝试1,BCE变为 BCE * torch.sigmois(pred)
  • 尝试2,检查数据,是否需要mask之类。比如很多类别可能都是0

回想到数据本身的特点,由于不平衡,可能导致训练集中有些类别都压根没有。是否会导致奇怪现象呢。也就是二分类如果真实标签全都是0,

当把类别中数量少的样本都增加到训练集中,而不是测试集时,可以发现使用BCE也基本可以达到相对好的效果,虽然目前只有68,但已经可以学习到一些东西了。也就是说使用BCE很可能需要训练更多的epochs。

  • 调参数。apex = False 影响很大,由于不太懂单精的影响。拿自己以前的pipeline 跑的结果,竟然影响很大

CrossEntropy必须用long的形式,BCE则不一定。非常有可能是因为使用了torch的单精度训练导致的

APEX=False
Debug Pytorch: BCE无法收敛无法学习_第1张图片
Apex=True
Debug Pytorch: BCE无法收敛无法学习_第2张图片

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