基于均方误差推导的梯度下降实现后损失上升,求问题排查
梯度下降算法损失持续上升求助
已完成基于均方误差(SSE)的梯度下降算法数学推导,维度匹配且推导逻辑自洽,但实现时损失持续上升(损失趋势图如下),求助排查问题。
数据集生成代码
import pandas as pd import numpy as np testing = pd.DataFrame(np.random.randint(0,100,size=(100, 3)), columns=list('ABC')) testing.insert(0, 'W_o', 1) # 偏置项 testing.insert(-1, 'Y', np.random.randint(0,4,size=(100, 1))) # 目标变量
梯度下降实现代码
import matplotlib.pyplot as plt def grad_descent_SSE(X,y,T,lr): # 数据集形状 m,n = X.shape # 初始化参数 W = np.zeros(n) # W = OLS[0] # 记录损失变化 f = np.zeros(T) for i in range(T): # 当前参数下的损失值 f[i] = 0.5*np.linalg.norm(X.dot(W) - y)**2 # 计算梯度 W_update = np.matmul(X.T,np.matmul(X,W)-y) # W_update = np.transpose(X).dot(X.dot(W) - y) # 更新权重 W = W - lr * W_update return W,f, plt.plot(f,'b-o')
损失趋势图

问题排查与解决
学习率过大
这是损失发散最常见的原因。当学习率lr超出合理范围时,参数更新步长过大,会跳过最优解甚至导致参数持续偏离,最终损失上升。
解决:将学习率缩小10-1000倍(比如从0.01调整为0.0001),逐步测试找到合适值。特征未做归一化
你的特征(A、B、C)取值范围是0-100,而目标变量Y仅0-3,特征与目标的尺度差异极大。梯度下降对特征尺度敏感,未归一化会导致梯度更新不稳定,容易引发发散。
解决:对特征进行标准化处理(偏置项W_o无需归一化):from sklearn.preprocessing import StandardScaler # 提取特征(排除W_o和Y) X_features = testing.drop(['W_o', 'Y'], axis=1) scaler = StandardScaler() X_scaled = scaler.fit_transform(X_features) # 重新组合带偏置项的特征矩阵 X = np.hstack([np.ones((100,1)), X_scaled]) y = testing['Y'].values.flatten()维度匹配隐性问题
代码中y是(100,1)的二维数组,而X.dot(W)是(100,)的一维数组,numpy广播机制虽能计算,但可能导致梯度或损失计算出现偏差。
解决:将y转为一维数组:y = y.flatten()梯度计算验证
取少量样本手动计算梯度,和代码输出的W_update对比,确认梯度计算逻辑是否正确。比如取前2个样本,手动推导梯度值,验证代码结果是否一致。
内容的提问来源于stack exchange,提问作者ablam
相关产品推荐
相关产品推荐

