线性回归训练异常:权重优化正常但偏置参数始终为0求助
问题原因与解决方法
你的偏置参数b始终无法收敛到目标值7,核心问题出在数据未做缩放以及学习率、迭代次数设置不合理,具体分析和修复方案如下:
问题分析
- X的数值范围过大:你的X是1到999的整数,数值跨度极大。这会导致权重W的梯度(和X相乘)远大于偏置b的梯度,为了避免W更新震荡你设置的极小学习率
0.000001,对b的更新来说完全不够——每次b的增量微乎其微,80次迭代根本无法让b接近7。 - 迭代次数不足:仅80次迭代对于未缩放的数据来说,远远达不到收敛要求。
- 梯度量级不匹配:W的梯度计算涉及和X的点积,X数值大导致梯度值大;而b的梯度是(Y-y)的求和平均,两者不在同一数量级,用相同的学习率无法兼顾两者的更新效率。
修复方案
最有效的解决方式是对X做标准化处理,将X缩放到均值为0、标准差为1的范围,让W和b的梯度量级一致,再配合合理的学习率和迭代次数:
修改后的代码
import numpy as np # 生成数据并标准化X X = np.array(range(1, 1000)) # 标准化X:减去均值,除以标准差,将X缩放到[-1,1]附近 X = (X - np.mean(X)) / np.std(X) Y = 5 * X + 7 # 对应标准化后的X,目标方程保持形式一致 def forward(W, X, b): return W * X + b def getcost(Y, y): # 用len(X)代替硬编码的1000,增强代码通用性 return np.sum((Y - y) ** 2) / len(X) def backward(W, b, X, Y, y, lr): dW = -2 * np.dot((Y - y).T, X) / len(X) db = -2 * np.sum(Y - y) / len(X) W -= lr * dW b -= lr * db return W, b W = 0.0 b = 0.0 # 调整学习率为0.01,迭代200次 for i in range(200): y = forward(W, X, b) cost = getcost(Y, y) W, b = backward(W, b, X, Y, y, lr=0.01) # 每20次迭代打印一次结果 if i % 20 == 0: print(f"迭代次数 {i} | 损失值: {cost:.2f} | W: {W:.2f} | b: {b:.2f}")
其他可选方案
如果不想标准化X,可以:
- 增大学习率到
0.00001,同时将迭代次数增加到10000次以上,但这种方式效率低,且W容易出现更新震荡。 - 对W和b使用不同的学习率,但实现起来不如标准化简洁。
验证效果
运行修改后的代码,你会看到b快速收敛到7左右,W也会稳定趋近于5,损失值持续下降并趋于平稳。
内容的提问来源于stack exchange,提问作者Chaitanya Thombare
相关产品推荐
相关产品推荐

