当模型在训练过程中的前向传播中产生 NaN(Not a Number)时,这通常表明模型在某一步骤的计算中出现了数值不稳定性的问题。处理这种情况的方法通常包括以下步骤:
-
数值检查: 首先,检查输入数据和模型参数是否包含 NaN 或 Inf(无穷大)值。这可以通过在前向传播之前添加检查语句来完成。
assert not torch.isnan(inputs).any(), "Input data contains NaN!" assert not torch.isnan(model.parameters()).any(), "Model parameters contain NaN!"
-
数值稳定性操作: 在模型的计算中,使用数值稳定性的操作,例如使用稳定的数学函数(如
torch.nn.functional.stable_softmax
)、梯度裁剪等来防止数值溢出或除零等问题。 -
梯度裁剪: 如果模型在梯度更新时出现爆炸性梯度,可以考虑使用梯度裁剪,限制梯度的范围,以防止梯度过大导致数值不稳定。
torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)
-
梯度裁剪是一种用于控制梯度大小的技术,通常用于防止梯度爆炸的问题。在深度学习中,梯度裁剪通过将梯度的范数限制在一个预定的阈值范围内来实现。
在 PyTorch 中,梯度裁剪可以通过
torch.nn.utils.clip_grad_norm_
-