PyTorch训练OpenAI Gym Pendulum智能体时Normal分布loc参数报错排查
报错原因说明
ValueError: The parameter loc has invalid values报错的核心原因是:传入torch.distributions.Normal的第一个参数(均值loc,对应代码中的out[0])包含非有限值(NaN、正无穷、负无穷),PyTorch分布类初始化时默认校验参数合法性,遇到非有限值就会抛出该错误。
此前out[1]未加绝对值时报scale参数错误也是同理:当时out[1]要么是负数,要么包含非有限值,加绝对值仅解决了负数问题,现在报错切换到loc,说明out[0]的非法值问题已显现。
触发场景及解决方法
- 第一步先在初始化分布前增加参数校验,确认非法值存在:
out = Lorian(torch.tensor(observation)) # 新增校验代码 assert torch.isfinite(out[0]).all(), f"loc参数存在非法值: {out[0]}" assert torch.isfinite(out[1]).all(), f"scale参数存在非法值: {out[1]}" distro = torch.distributions.Normal(out[0], torch.absolute(out[1]))
- 排查输入的
observation是否本身包含NaN/inf,确认Pendulum环境返回的观测未被污染,转tensor时不要做易溢出的类型转换(比如直接将float64转为float16)。 - 排查神经网络
Lorian训练过程是否出现梯度爆炸:- 适当降低学习率,避免参数更新步长过大导致溢出
- 反向传播后、优化器更新参数前增加梯度裁剪,限制梯度最大范数:
torch.nn.utils.clip_grad_norm_(Lorian.parameters(), max_norm=1.0) - 检查损失函数计算逻辑,确认没有除0、对负数/0取对数等操作,这类操作会产生NaN,反向传播后会污染网络参数,最终导致前向输出非法值。
内容的提问来源于stack exchange,提问作者muk.kesh
相关产品推荐
相关产品推荐

