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

基于均方误差推导的梯度下降实现后损失上升,求问题排查

梯度下降算法损失持续上升求助

已完成基于均方误差(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')

损失趋势图

损失上升趋势图


问题排查与解决

  1. 学习率过大
    这是损失发散最常见的原因。当学习率lr超出合理范围时,参数更新步长过大,会跳过最优解甚至导致参数持续偏离,最终损失上升。
    解决:将学习率缩小10-1000倍(比如从0.01调整为0.0001),逐步测试找到合适值。

  2. 特征未做归一化
    你的特征(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()
    
  3. 维度匹配隐性问题
    代码中y是(100,1)的二维数组,而X.dot(W)是(100,)的一维数组,numpy广播机制虽能计算,但可能导致梯度或损失计算出现偏差。
    解决:将y转为一维数组:

    y = y.flatten()
    
  4. 梯度计算验证
    取少量样本手动计算梯度,和代码输出的W_update对比,确认梯度计算逻辑是否正确。比如取前2个样本,手动推导梯度值,验证代码结果是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:40:35