人工智能训练的核心秘密:梯度下降与L1/L2正则化 一、机器学习在解决什么问题假设我们要让计算机学会一个规律输入一个数字 x输出它的两倍即 y 2x。计算机不知道这个规律它只能看到一组数据输入 x对应的输出 y12计算机现在的任务根据这组数据猜出背后的规律是什么。计算机决定用一个简单的公式来模拟这个规律y_pred w × x这里w是一个未知数计算机需要从数据中推算出w应该是几。如果算出来w 2那模型就完美复现了规律y 2x。但计算机一开始完全不知道w该是多少它随机猜了一个值w 10。问题转化为如何利用数据把 w 从 10 修正到 2二、梯度下降如何修正一个参数2.1 误差有多大定义损失函数当前模型y_pred w × x 10 × 1 10真实答案y_true 2预测值 10 比真实值 2 大了 8模型错了。定义一个函数用来量化错得有多严重。这个函数叫损失函数我们用均方误差Loss(w) (y_pred - y_true)²把y_pred w × x w × 1 w代入Loss(w) (w - 2)²当w 10时Loss(10) (10 - 2)² 64这个 64 代表当前模型的错误程度。2.2 往哪个方向改梯度的含义我们想知道如果把 w 增大一点点损失会变大还是变小分别算两个临近点的损失w 的值损失 Loss (w-2)²10641181从 10 增加到 11损失从 64 增加到 81。所以w 增大损失增大我们应该减小 w。但这只是粗略看方向我们需要精确知道每改变一个单位损失变化多少。这个精确的变化率就是导数梯度。展开损失函数Loss(w) (w - 2)² w² - 4w 4对 w 求导逐项求w²的导数是2w-4w的导数是-44的导数是0所以梯度 d(Loss)/dw 2w - 4代入当前w 10梯度 2×10 - 4 16梯度 16 的意义w 每增加 1 个单位损失大约增加 16 个单位。正数说明增加 w 会让损失更大所以应该减小 w数值 16 决定了每次要改多大的步幅2.3 更新公式迈出第一步更新规则w_new w_old - 学习率 × 梯度学习率lr 0.1是一个事先设定的控制步长的系数。代入w_new 10 - 0.1 × 16 10 - 1.6 8.4第一步更新结束w 从 10 降到了 8.4。2.4 不断迭代重复每一步做同样的事情用当前 w 计算预测值用预测值计算损失用损失对 w 求导得到梯度用梯度更新 w轮次当前 w预测值 w×1损失 (w-2)²梯度 2w-4更新后 w w - 0.1×梯度初始101064168.418.48.440.9612.87.1227.127.1226.2110.246.1036.106.1016.788.205.2845.285.2810.746.564.6254.624.626.875.244.10103.073.071.142.142.86202.162.160.0260.322.13302.032.030.0010.062.02..................收敛2.002.00002.002.5 为什么最终停在 2当w 2时预测值2 × 1 2与真实值完全一致损失(2-2)² 0梯度2×2 - 4 0梯度为 0更新公式变为w_new 2 - 0.1×0 2w 不再变化因为损失已经降到最低无法再降低了。2.6 一个重要澄清梯度下降不是一直变小如果初始 w -5损失(-5-2)² 49梯度2×(-5) - 4 -14梯度是负数 -14更新w_new -5 - 0.1×(-14) -5 1.4 -3.6w 变大了从 -5 增加到 -3.6。所以梯度下降的方向是如果 w 在最佳值左侧就增大如果在右侧就减小。最终所有路径都汇聚到最佳值 2。三、为什么需要正则化3.1 测量误差导致的问题上面假设数据完全没有误差。现实中的数据往往有测量误差。假设真实规律仍然是y 2x但我们采集的数据有一个微小的误差输入 x真实值无误差采集到的值有误差122.1误差只有 0.1很小。如果不用正则化模型会怎么做损失函数Loss(w) (w×1 - 2.1)² (w - 2.1)²这个损失在w 2.1时等于 0因为(2.1-2.1)² 0。模型会学到w 2.1把训练数据上的损失完美降到 0。但现在来了一个测试数据x 2正确答案应该是2×2 4。用w 2.1预测2.1×2 4.2偏差 0.2如果用w 2.0预测2.0×2 4.0偏差 0问题模型为了拟合训练数据里那 0.1 的测量误差把 w 从 2 推到了 2.1导致在新数据上表现变差。这就是过拟合模型记住了训练数据中的噪声反而学坏了。3.2 正则化的核心思想正则化在损失函数中增加一项惩罚防止参数变得太大。新的损失函数 原来的损失 惩罚项惩罚项不依赖于数据只依赖于参数本身。参数越大惩罚越大。这样模型在选择参数时就要权衡拟合数据让原损失小控制参数大小让惩罚项小四、L2 正则化权重衰减4.1 L2 正则化的形式L2 正则化在损失函数中增加λ × w²Loss_L2(w) (w - 2.1)² λ × w²这里的 λ 叫正则化系数控制惩罚的力度。我们设λ 0.5。Loss_L2(w) (w - 2.1)² 0.5 × w²这个式子要求模型同时做两件事让(w - 2.1)²尽量小拟合数据让0.5 × w²尽量小不让 w 太大4.2 L2 正则化的梯度对两项分别求导对(w - 2.1)²求导2 × (w - 2.1) 2w - 4.2对0.5 × w²求导0.5 × 2 × w w总梯度梯度_L2(w) (2w - 4.2) w 3w - 4.24.3 一个常见的错误直觉很多人会想加了正则化只是让 w 稍微小一点最后应该还是停在 2.1 附近吧我们来验证假设 w 2.1误差部分梯度2×(2.1-2.1) 0数据已经完美拟合误差部分不想再改 w惩罚部分梯度2×0.5×2.1 2.1惩罚部分依然在说w 太大必须减小总梯度 0 2.1 2.1正数因为总梯度为正更新公式w_new w - lr×正数会让 w减小。结论w 2.1 站不住脚会被惩罚项强行拉下来。4.4 真正的平衡点在哪里模型最终停下来的条件是总梯度 0两股力量完全抵消。令3w - 4.2 03w 4.2→w 4.2/3 1.4验证当 w 1.4 时误差部分梯度2×(1.4-2.1) 2×(-0.7) -1.4负数表示误差想把 w 拉大因为 1.4 比 2.1 小惩罚部分梯度2×0.5×1.4 1.4正数表示惩罚想把 w 拉小因为 1.4 比 0 大两者刚好抵消-1.4 1.4 0。平衡。4.5 对比有无正则化的收敛结果方法损失函数梯度收敛点无正则化(w-2.1)²2w-4.22.1L2 正则化 (λ0.5)(w-2.1)² 0.5w²3w-4.21.4L2 让 w 收敛到 1.4而不是 2.1。在训练数据上的损失(1.4-2.1)² 0.49没有降到 0在新数据x2上的预测1.4×2 2.8离 4 更远了比 2.1 更差等等这里有个重要细节如果真实规律是 y2x那么 L2 正则化让 w1.4 实际上比 w2.1 更差因为真正的 w 是 2。那 L2 正则化到底好在哪里关键在于我们刚才的推导假设真实规律是 y2x但机器并不知道这一点。如果训练数据只有一组机器无法判断到底哪个 w 是正确的。L2 正则化选择了一个更小的 w在数据不足的情况下小参数通常泛化能力更强。更重要的是当有多个参数时L2 正则化的作用会更清晰。五、多参数场景现实世界的真实情况5.1 为什么必须引入多参数真实问题不可能只有一个输入特征。预测房价需要面积、卧室数、房龄、地段……模型需要多个参数y_pred w₁×x₁ w₂×x₂ w₃×x₃ ...每个特征有自己的权重机器需要同时找到所有 w 的最佳值。5.2 两个参数的完整示例真实规律y 2×x₁ 3×x₂机器看到的数据x₁x₂y_true128验证2×1 3×2 26 8数据符合规律。机器使用模型y_pred w₁×x₁ w₂×x₂随机初始化w₁ 5w₂ 5损失函数Loss(w₁, w₂) (w₁×1 w₂×2 - 8)² (w₁ 2w₂ - 8)²对 w₁ 的梯度偏导数把 w₂ 当作常数只对 w₁ 求导。设u w₁ 2w₂ - 8Loss u²d(Loss)/dw₁ 2×u × d(u)/dw₁d(u)/dw₁ 1w₁ 的系数是 1所以梯度_w₁ 2×(w₁ 2w₂ - 8)×1代入w₁5, w₂5梯度_w₁ 2×(510-8)×1 14对 w₂ 的梯度偏导数把 w₁ 当作常数只对 w₂ 求导。d(u)/dw₂ 2w₂ 的系数是 2所以梯度_w₂ 2×(w₁ 2w₂ - 8)×2代入w₁5, w₂5梯度_w₂ 2×7×2 28同时更新两个参数w₁_new 5 - 0.1×14 3.6w₂_new 5 - 0.1×28 2.2验证3.6×1 2.2×2 3.6 4.4 8完美拟合。5.3 多参数的关键观察每个参数的梯度为什么不同梯度的通用公式对第 k 个参数梯度_wk 2×(y_pred - y_true)×x_kw₁ 的梯度2×7×1 14因为 x₁ 1w₂ 的梯度2×7×2 28因为 x₂ 2同一个误差 7乘以不同的输入特征得到不同的梯度。如果某个输入特征很大比如面积是 100 平米那么对应参数的微小变化会导致预测值剧烈变化梯度就大更新步幅也大。每个参数独立更新互不干扰。5.4 多参数带来的新问题解不唯一根据一组数据(x₁1, x₂2, y8)有无数种参数组合都能让预测值等于 8(w₁2, w₂3)→2×13×28真实规律(w₁4, w₂2)→4×12×28(w₁3.6, w₂2.2)→3.6×12.2×28(w₁100, w₂-46)→100×1-46×28参数越多解越不唯一。模型可能学到任何一种组合。如果数据有噪声模型为了拟合噪声会把参数调到极端值如 100 和 -46 互相抵消这样在新数据上必然崩溃。这就是多参数场景下过拟合更严重的原因。5.5 L2 正则化在多参数下的作用损失函数Loss_L2(w₁,w₂) (w₁2w₂-8)² λ×(w₁² w₂²)惩罚项是所有参数平方的和。任何参数过大都会增加惩罚。设 λ 0.5初始 w₁5, w₂5对 w₁ 的梯度误差部分2×(510-8)×1 14惩罚部分2×0.5×w₁ 1×5 5总梯度145 19更新5 - 0.1×19 3.1对 w₂ 的梯度误差部分2×7×2 28惩罚部分2×0.5×w₂ 1×5 5总梯度285 33更新5 - 0.1×33 1.7L2 对每个参数独立施加惩罚惩罚力度与参数大小成正比。L2 正则化的收敛点推导多参数令两个总梯度都为 02×(w₁2w₂-8)×1 2×0.5×w₁ 0... ①2×(w₁2w₂-8)×2 2×0.5×w₂ 0... ②化简 ①(2w₁4w₂-16) w₁ 0→3w₁ 4w₂ 16化简 ②(4w₁8w₂-32) w₂ 0→4w₁ 9w₂ 32解方程组由①得w₁ (16 - 4w₂)/3代入②4×(16-4w₂)/3 9w₂ 32(64 - 16w₂)/3 9w₂ 3264 - 16w₂ 27w₂ 9611w₂ 32→w₂ ≈ 2.91w₁ (16 - 4×2.91)/3 (16 - 11.64)/3 ≈ 1.45收敛点(w₁≈1.45, w₂≈2.91)不加正则时针对这组数据有无数个解但加了 L2 正则后解唯一且所有参数都被拉向 0。5.6 扩展到任意 N 个参数对于 N 个参数模型为y_pred w₁×x₁ w₂×x₂ ... w_N×x_N损失函数Loss (y_pred - y_true)²第 k 个参数的梯度通用公式梯度_wk 2×(y_pred - y_true)×x_kL2 正则化的梯度梯度_wk 2×(y_pred - y_true)×x_k 2×λ×w_k更新规则对每个参数同时执行w_k_new w_k_old - lr × 梯度_wk六、L1 正则化特征选择6.1 L1 正则化的形式L1 正则化在损失函数中增加λ×|w|Loss_L1(w) (w - 2.1)² λ×|w|这里的|w|是 w 的绝对值。设 λ 0.5。Loss_L1(w) (w - 2.1)² 0.5×|w|6.2 L1 正则化的梯度对(w-2.1)²求导2w - 4.2对0.5×|w|求导当 w 0 时|w| w导数为0.5当 w 0 时|w| -w导数为-0.5当 w 0 时不可导工程上通常用次梯度取 [-0.5, 0.5] 之间的值关键区别L1 的惩罚梯度是一个常数0.5 或 -0.5不随 w 的大小变化。6.3 计算第一次更新w10 0误差部分梯度2×10 - 4.2 15.8惩罚部分梯度0.5总梯度15.8 0.5 16.3更新10 - 0.1×16.3 8.376.4 L1 vs L2 的收敛对比轮次无正则化L1 正则化 (λ0.5)L2 正则化 (λ0.5)初始10.0010.0010.0018.428.377.4227.127.035.5936.106.004.3054.664.552.71103.183.081.50202.362.281.41302.142.101.40收敛2.102.001.406.5 L1 为什么能让 w 变成 0观察 w 接近 0 时两种正则化的表现。假设当前 w 0.1误差部分梯度约为2×0.1 - 4.2 ≈ -4.0想把 w 拉向 2.1L2惩罚梯度 2×0.5×0.1 0.1很小总梯度 -4.0 0.1 -3.9负数更新w_new 0.1 - 0.1×(-3.9) 0.1 0.39 0.49w 增大了远离 0L1惩罚梯度 0.5常数总梯度 -4.0 0.5 -3.5仍然为负更新w_new 0.1 - 0.1×(-3.5) 0.1 0.35 0.45w 也增大了但原因不同再往 0 靠近假设 w 0.01L2惩罚梯度 2×0.5×0.01 0.01几乎为零总梯度 ≈ -4.0w 被迅速拉大L2 在 0 附近几乎没有抵抗力L1惩罚梯度 0.5依然是常数总梯度 -3.5w 仍然被拉大等等那 L1 到底是怎么让 w 归零的上面的分析有个遗漏当 w变号时L1 的惩罚梯度会改变方向。当 w 从正值被拉向 0一旦越过 0 变成负值惩罚梯度从0.5变成-0.5如果 w 是负的-0.5表示惩罚想把 w 拉大向 0 靠近此时总梯度 误差梯度可能是负的想把 w 拉向正数 2.1 惩罚梯度是正的想把 w 拉向 0如果误差梯度较小比如 -0.3而惩罚梯度是 0.5总梯度 0.2正数更新会让 w减小从负值变得更负远离 0。所以 L1 的机制是当 w 在 0 附近时L1 的恒定惩罚形成了一个死区任何越过 0 的尝试都会被反向弹回最终卡在 0。L2 没有这个特性因为 L2 在 0 附近的惩罚梯度趋近于 0无法形成有效的死区。6.6 L1 在多参数下的特征选择当有多个参数时L1 正则化会把不重要的参数直接推到 0对真正重要的参数误差梯度大能抵抗住 L1 的恒定惩罚保持非零对不重要的参数误差梯度小L1 的恒定惩罚占主导不断把 w 推向 0最终归零结果模型变成稀疏的只依赖少数几个真正重要的特征。七、代码实现7.1 无正则化梯度下降PyTorchimport torch w torch.tensor([10.0], requires_gradTrue) x torch.tensor([1.0]) y_true torch.tensor([2.1]) lr 0.1 for i in range(30): y_pred w * x loss (y_pred - y_true) ** 2 loss.backward() with torch.no_grad(): w - lr * w.grad w.grad.zero_() print(f轮次{i1}: w {w.item():.4f})7.2 L2 正则化内置 weight_decayimport torch import torch.optim as optim w torch.tensor([10.0], requires_gradTrue) x torch.tensor([1.0]) y_true torch.tensor([2.1]) lr 0.1 optimizer optim.SGD([w], lrlr, weight_decay0.5) for i in range(30): optimizer.zero_grad() y_pred w * x loss (y_pred - y_true) ** 2 loss.backward() optimizer.step()7.3 L1 正则化手动添加import torch w torch.tensor([10.0], requires_gradTrue) x torch.tensor([1.0]) y_true torch.tensor([2.1]) lr 0.1 lambda_l1 0.5 for i in range(30): y_pred w * x loss (y_pred - y_true) ** 2 lambda_l1 * torch.abs(w) loss.backward() with torch.no_grad(): w - lr * w.grad w.grad.zero_()7.4 多参数完整示例PyTorchimport torch w1 torch.tensor([5.0], requires_gradTrue) w2 torch.tensor([5.0], requires_gradTrue) x1 torch.tensor([1.0]) x2 torch.tensor([2.0]) y_true torch.tensor([8.0]) lr 0.1 lambda_l2 0.5 for i in range(20): y_pred w1 * x1 w2 * x2 loss (y_pred - y_true) ** 2 lambda_l2 * (w1**2 w2**2) loss.backward() with torch.no_grad(): w1 - lr * w1.grad w2 - lr * w2.grad w1.grad.zero_() w2.grad.zero_() print(f轮次{i1}: w1{w1.item():.4f}, w2{w2.item():.4f})八、总结方法解决的问题梯度公式对参数的作用梯度下降如何找到让损失最小的参数梯度 2×误差×x_k让每个参数朝损失减小的方向移动L2 正则化防止参数过大导致过拟合梯度 2×误差×x_k 2×λ×w_k所有参数都变小但不归零解唯一L1 正则化识别并删除不重要的特征梯度 2×误差×x_k λ×sign(w_k)不重要的参数直接变成 0梯度下降是引擎驱动所有参数向最优值移动。L2 是刹车让所有参数都别跑太快整体收缩。L1 是筛选器把不重要的参数直接剔除让模型变稀疏。梯度下降不是机器学习的专属工具。它是整个AI领域共享的“底层语法”——无论是最早期的感知机还是最新的大语言模型都在执行同一套更新规则。L2正则化让所有参数变小但不归零。L1正则化把不重要的参数直接清零。两者配合梯度下降在“拟合数据”和“保持参数合理”之间寻找平衡——这就是AI模型从数据中“学会”规律同时避免“死记硬背”的全部逻辑。