梯度下降出现梯度爆炸及已知学习率下的误差异常问题求助
梯度爆炸问题的原因与解决方案
核心问题:特征未做归一化/标准化
波士顿房价数据集的特征尺度差异极大(比如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
相关产品推荐
相关产品推荐

