实现梯度下降算法时遇Numpy溢出错误,求修复方案
解决梯度下降中Numpy exp/square溢出问题的实用方案
标准化输入特征
溢出的核心原因之一是输入特征数值范围过大,导致exp或square运算直接超出浮点数范围。用Z-score标准化把特征缩放到均值为0、标准差为1的区间:# 手动实现标准化 X_scaled = (X - X.mean(axis=0)) / X.std(axis=0) # 或用sklearn工具 from sklearn.preprocessing import StandardScaler X_scaled = StandardScaler().fit_transform(X)调小学习率
学习率过大时,参数更新幅度过猛,会让权重/偏置快速膨胀到极大值,触发运算溢出。把学习率从0.1这类大值降到0.01、0.001,甚至更小:learning_rate = 0.001 # 替代原大学习率也可以加动态衰减:每轮迭代后让学习率乘以
0.95这类系数,逐步缩小更新幅度。替换数值不稳定的计算逻辑
如果是逻辑回归场景,直接计算sigmoid(z)当z为负数且绝对值很大时,exp(-z)会溢出。改用稳定版Sigmoid实现:def sigmoid(z): return np.where(z >= 0, 1 / (1 + np.exp(-z)), np.exp(z) / (1 + np.exp(z)))交叉熵Loss计算时,先把预测值限制在
1e-10到1-1e-10之间,避免log(0)或极端值导致的溢出:def cross_entropy_loss(y_pred, y_true): y_pred = np.clip(y_pred, 1e-10, 1 - 1e-10) return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))添加梯度裁剪
参数更新前限制梯度的最大范数,防止梯度爆炸导致参数突变到极大值:max_grad_norm = 1.0 grad_norm = np.linalg.norm(gradients) if grad_norm > max_grad_norm: gradients = gradients * (max_grad_norm / grad_norm) # 用裁剪后的梯度更新参数 weights -= learning_rate * gradients清理数据异常值
数据中的极端异常值会拉偏特征尺度,迫使模型参数异常增大。用Z-score法剔除异常值(比如保留Z-score绝对值小于3的样本):z_scores = np.abs((X - X.mean(axis=0)) / X.std(axis=0)) X_clean = X[(z_scores < 3).all(axis=1)] y_clean = y[(z_scores < 3).all(axis=1)]
内容的提问来源于stack exchange,提问作者Mhhany
相关产品推荐
相关产品推荐

