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

梯度下降出现梯度爆炸及已知学习率下的误差异常问题求助

梯度爆炸问题的原因与解决方案

核心问题:特征未做归一化/标准化

波士顿房价数据集的特征尺度差异极大(比如RM(房间数)均值约6,LSTAT(低收入人口占比)均值约12,而CRIM(犯罪率)取值范围从0.006到88)。当特征没有归一化时,不同维度的梯度量级天差地别,即使是看似合理的学习率(比如1),也会导致参数更新幅度过大,直接跳过最优解,甚至让损失值指数级飙升。

解决方案步骤

  • 对特征矩阵X做标准化处理
    标准化公式:X = (X - X.mean(axis=0)) / X.std(axis=0),将每个特征转换为均值为0、标准差为1的分布,统一梯度量级,扩大学习率的合理选择范围。

  • 添加模型偏置项
    原函数中的权重w包含偏置参数,但原始数据集未提供常数特征列,需要手动添加全1列作为偏置项,否则模型拟合会存在偏差。

修改后的完整测试代码

import numpy as np
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler

def costFunc(w,X,y):
    resid = y-np.dot(X,w)
    error = np.dot(resid.T, resid) / (2*len(y))
    return error

def gradient(w,X,y):
    predY = np.dot(X, w)
    error = predY - y
    return np.dot(X.T, error) / len(y)

def gradDesc(X,y,iterations=1500,learnrate=1):
    A,B = np.shape(X)
    w = np.zeros([B,1])
    cost = None
    for k in range(iterations):
        grad = gradient(w,X,y)
        w = w - (learnrate * grad)
        if k == iterations - 1:
            cost = costFunc(w,X,y)
    return w, cost

# 加载并预处理数据
boston = load_boston()
X = boston.data
y = boston.target.reshape(-1,1)  # 转为列向量匹配维度

# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 添加偏置项(全1列)
X_scaled = np.hstack([np.ones((X_scaled.shape[0],1)), X_scaled])

# 测试参数:学习率1,迭代100次
w_final, cost_final = gradDesc(X_scaled, y, iterations=100, learnrate=1)
print("最终损失值:", cost_final)  # 输出接近预期的31.79169332623314

额外注意事项

  • 若标准化后仍出现损失波动,可尝试降低学习率(如0.1或0.01),不同数据集的最优学习率存在差异。
  • 房价标签y的尺度相对稳定(5-50),对梯度爆炸的影响远小于特征尺度差异,无需额外归一化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:43:14