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

SGD实现线性回归拟合正弦波效果异常 闭式解正常问题排查

问题诊断

你的SGD梯度计算公式本身是正确的,拟合失效是实现细节缺失导致的,具体问题如下:

  • 迭代轮数严重不足:当前实现仅遍历1次数据集(仅1个训练epoch)。SGD是逐样本更新的迭代优化算法,权重从0-1均匀分布的初始值收敛到最优解,通常需要几十到上百轮反复遍历数据集,单轮更新的结果离最优点极远,自然拟合效果差。
  • 未做特征缩放,学习率难以适配:5次多项式基的特征尺度差异极大:x∈[0,0.5]时,1阶项最大值为0.5,5阶项最大值仅为0.5^5=0.03125,尺度差达16倍。这种情况下不存在一个合适的全局学习率能同时适配所有维度的更新步长:步长太大会让大尺度特征的权重更新震荡,步长太小会让小尺度特征的权重几乎不更新,单轮训练看不到有效拟合结果是必然的。
  • 采样代码存在笔误:你描述的拟合目标是sin(2πx),但采样逻辑中写的是y = sin(x)。不过这个问题不会造成SGD和闭式解的效果差异——既然你的闭式解能得到符合预期的拟合结果,说明这只是提问时的笔误,不影响实际运行。
  • 采样环节的噪声添加逻辑没有问题:高斯噪声是独立同分布的,打乱样本后再加噪声不会改变数据分布,不会干扰拟合结果。
修正方法
  1. 增加多轮迭代逻辑,每轮遍历前打乱样本顺序减少更新偏差,直到损失收敛再停止训练,修正后的SGD代码参考:
def sgd(phi, Y, W, lr, epochs):
    sample_num = len(Y)
    for _ in range(epochs):
        # 每轮打乱样本顺序
        shuffle_idx = np.random.permutation(sample_num)
        phi_shuffled, Y_shuffled = phi[shuffle_idx], Y[shuffle_idx]
        for i in range(sample_num):
            y_pred = np.dot(W, phi_shuffled[i])
            grad = (y_pred - Y_shuffled[i]) * phi_shuffled[i]
            W -= lr * grad
    return W
  1. 对多项式特征做标准化:除常数项列外,将phi的每一列特征减去列均值、除以列标准差,让所有维度特征尺度统一,大幅降低学习率调参难度。
  2. 调配合适的学习率:特征标准化后,学习率可从0.01、0.1量级开始测试,观察损失下降情况调整,避免步长过大震荡、步长过小收敛过慢。

补充:你用的闭式解是直接通过矩阵运算得到最小二乘的全局最优解,不需要迭代,只要特征矩阵计算正确就能一次性输出最优权重,和SGD的迭代优化逻辑有本质区别,不存在“相同数据下闭式解有效就代表SGD逻辑写错”的必然对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.17 16:16:01