复制Aurelien Geron《Hands-On ML》第10章代码损失值异常过高求解
损失远高于示例的核心原因及解决方案
最常见原因(90%以上概率)
你在Jupyter Notebook中没有按顺序执行所有代码单元格,跳过了输入特征标准化的步骤:
原始California Housing数据集的输入特征数值跨度极大(比如住户收入字段取值可达数万,房龄、房间数字段仅为个位数到数十),未经过StandardScaler标准化直接输入神经网络会触发梯度爆炸,初始损失直接达到1e16量级,和你跑出的日志特征完全吻合。
其他可能原因
- 标签被意外放大:该数据集原始标签单位为10万美元,取值范围在0.15~5之间,如果你在处理数据时不小心将标签换算为美元为单位(放大1e5倍),MSE损失会直接放大1e10倍,也会出现损失过高的问题。
- 随机种子未生效:部分旧版本TensorFlow在GPU训练模式下,设置的全局随机种子无法完全固定权重初始化,极端情况下初始权重过大也会导致损失爆炸,但该情况概率极低。
修复步骤
- 重启Jupyter Notebook内核,按顺序从头执行所有代码单元格,执行完标准化步骤后打印
X_train[0],确认输出是均值为0、方差为1的小数值后,再运行模型训练代码。 - 打印
y_train[:5],确认标签取值在0~5区间,没有被意外缩放。 - 如果上述操作后问题仍存在,可将SGD优化器的学习率调整为
1e-4后重新训练。
内容的提问来源于stack exchange,提问作者Aajan Quail
相关产品推荐
相关产品推荐

