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

梯度下降训练自定义线性回归时权重持续增大问题求助

线性回归梯度下降发散问题:原因与修复

问题现象

自行实现的梯度下降版线性回归,在数据点较少时拟合正常,但数据量增大后,参数w0、w1持续增大,最终触发RuntimeWarning: overflow encountered in multiply数值溢出警告。

核心原因

  • 未做梯度归一化:线性回归的MSE损失函数是基于样本平均定义的,对应的梯度也应该是样本梯度的平均值。你当前代码直接用sum计算梯度总和,没有除以样本数量,导致梯度值随样本数线性放大。
  • 步长不匹配:固定步长(0.001)乘以被放大的梯度,会让参数更新幅度过大,模型不仅无法收敛,反而出现梯度爆炸,参数值不断增大直到超出浮点数范围。
  • 少量数据正常的原因:样本数少的时候,求和得到的梯度值较小,步长0.001的更新幅度刚好能让模型收敛,所以不会出现问题。

代码修复方案

修改_get_gradient_matrix方法,将梯度计算改为基于样本平均:

def _get_gradient_matrix(self):
    n = self.x_vector.shape[0]  # 获取样本总数
    predictions = self._get_predicted_values(self.x_vector)
    
    # 用np.mean计算平均梯度,替代sum求和
    w0_hat = np.mean(self.y_vector - predictions)
    w1_hat = np.mean((self.y_vector - predictions) * self.x_vector)

    gradient_matrix = np.array([w0_hat, w1_hat])
    gradient_matrix = -2 * gradient_matrix

    return gradient_matrix

也可以保留sum但手动除以样本数:

w0_hat = sum(self.y_vector - predictions) / n
w1_hat = sum((self.y_vector - predictions) * self.x_vector) / n

额外优化:如果不想修改梯度计算,也可以尝试调小步长(比如改为0.0001),但梯度归一化是更通用的解决方案——它让梯度值不受样本数量影响,步长选择无需随数据量调整。

修复效果验证

修改后运行大量数据的测试代码,参数会收敛到正确值(w0≈-7,w1≈5),不会再出现溢出警告。


内容的提问来源于stack exchange,提问作者LNTR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:43:10