You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现梯度下降算法时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:25:21