线性回归代价函数先降后升原因及训练异常问题咨询
问题1:机器学习:为何线性回归代价函数会先下降后上升?
首先得明确,线性回归的MSE(均方误差)代价函数本质是凸函数——它只有一个全局最小值,理论上正常的梯度下降应该持续逼近这个最小值,不会出现上升的情况。那出现先降后升的现象,最常见的原因就是学习率(alpha)设置得太大了:
- 刚开始训练时,参数离最优值很远,大学习率能让参数快速向最优值移动,代价函数自然下降;
- 但当参数接近最优值时,过大的学习率会让参数更新的步幅直接“跨过”最小值,导致参数开始偏离最优解,代价函数也就跟着上升了。
除此之外,还有两种可能:
- 特征未做归一化/标准化:如果不同特征的数值范围差异极大(比如一个特征是0-1,另一个是1000-10000),会导致不同参数的梯度幅度天差地别,学习率很难适配所有参数,部分参数更新步幅过大,也会引发代价函数震荡上升;
- 代码实现错误:比如梯度计算的符号搞反、梯度累加逻辑出错,但这种情况一般会直接导致代价函数持续上升,而非先降后升。
问题2:梯度下降训练中MSE先降后升的原因与解决办法
结合你的代码和现象来看,核心问题还是学习率alpha=0.1设置得过高,再结合你的实现细节,咱们一步步拆解:
现象背后的原因
你当前的实现类似随机梯度下降(SGD)——每个样本单独更新参数,但0.1的学习率对于这个Airbnb数据集来说太大了:
- 前712个epoch,参数还在向最优值靠近,所以MSE持续下降;
- 当参数接近最优解后,过大的学习率让每一步参数更新的步幅超过了最优点,开始在最优值附近来回震荡,甚至逐渐偏离,最终导致MSE缓慢上升。
另外,你的代码里没有对特征做归一化处理,不同特征的数值范围差异可能很大,这会放大学习率过高的负面影响——比如某个特征数值很大,对应的参数梯度也会很大,用0.1的学习率更新时,参数会跳得特别远,直接打乱整体的收敛节奏。
具体解决办法
- 降低学习率:把alpha从0.1降到0.01、0.001甚至更小,慢慢调试。比如先试0.01,观察MSE是否能稳定下降到最小值后保持平稳;如果还是上升,继续缩小学习率。
- 对所有特征做归一化/标准化:把所有特征缩放到相同的数值范围(比如归一化到0-1,或者标准化为均值0、方差1),这样每个特征对应的参数梯度幅度会更均衡,学习率更容易适配,收敛也会更稳定。
- 改用批量/小批量梯度下降:你现在的实现是每个样本更新一次参数(SGD),波动本来就大。可以改成先计算所有样本的梯度总和,再一次性更新参数(批量梯度下降),或者每次处理32/64个样本(小批量),这样梯度更新会更平滑,不容易震荡。比如把参数更新逻辑移到外层循环,先累加所有样本的梯度,再除以样本数后更新w和b。
- 添加学习率衰减:随着训练的进行,逐步降低学习率。比如每过100个epoch,把学习率乘以0.9,这样前期用较大的学习率快速逼近最优值,后期用小学习率精细调整,避免越过最优解。
- 简化代码逻辑:你当前逐个特征计算预测值的写法太冗余,可以用矩阵运算代替(比如把所有特征放到一个二维数组里,和权重数组做点积),既减少代码量,也能降低出错概率。
内容的提问来源于stack exchange,提问作者KingPat
相关产品推荐
相关产品推荐

