梯度下降训练自定义线性回归时权重持续增大问题求助
线性回归梯度下降发散问题:原因与修复
问题现象
自行实现的梯度下降版线性回归,在数据点较少时拟合正常,但数据量增大后,参数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
相关产品推荐
相关产品推荐

