数学基础回顾:梯度下降、链式法则与损失函数

说实话,很多做调参的同学一上来就调权重,调了半天效果不好,回头一看——梯度方向算错了。嗯,这种事我见过不少。所以这一章咱们把数学基础捋一遍,不搞花架子,只讲你调权重时真正用得上的东西。

梯度下降:你下山时迈的每一步

梯度下降说白了就是:你站在一座山上,想走到最低的谷底。但你蒙着眼,只能靠脚底的感觉判断哪边更陡,就往哪边迈一步。这个「陡峭程度」就是梯度,迈的步子大小就是学习率。

我刚开始做模型调优时,学习率设得太大,结果损失函数直接飞了——就像下山时一步跨太大,滚到对面山坡上去了。后来学乖了,先用小步试探。

数学上,梯度下降的更新公式很简单:

θ_new = θ_old - η · ∇J(θ_old)

其中:

  • θ 是你要优化的参数(比如评价函数的权重)
  • η 是学习率(步长)
  • ∇J(θ) 是损失函数对参数的梯度
我的习惯:刚开始调权重时,我会把学习率设成 0.01 或 0.001,先跑 50 轮看看损失曲线。如果震荡太厉害,就减半;如果下降太慢,就翻倍。别一上来就追求一步到位。

链式法则:拆解复杂函数的「螺丝刀」

链式法则其实就一句话:复合函数的导数等于外层导数乘内层导数。但实际用起来,很多人就晕了。

举个例子,假设你的评价函数长这样:

L = w₁ · f₁(x) + w₂ · f₂(x)

你想知道 L 对 w₁ 的梯度是多少?

用链式法则拆解:

∂L/∂w₁ = (∂L/∂f₁) · (∂f₁/∂w₁) = f₁(x) · 1 = f₁(x)

就这么简单。但如果你在 f₁ 里面又套了一层激活函数,那就得继续往下拆。

避坑指南:我曾经在调一个多目标评价函数时,忘了链式法则里还有一层 softmax 的导数,结果梯度算出来全是错的,模型训了三天没收敛。后来一查,是链式法则少拆了一层。所以,写代码前先在纸上把链式展开一遍,花不了五分钟,但能省三天时间。

损失函数 vs 评价函数:两个完全不同的东西

这个问题我几乎每带一个新人就要解释一遍。很多人把这两个混为一谈,结果调参时思路全乱。

维度 损失函数 (Loss Function) 评价函数 (Evaluation Function)
用途 训练时用来计算梯度、更新参数 评估模型最终效果、做决策
是否可微 必须可微(否则没法求梯度) 可以不可微(比如准确率、F1 分数)
优化目标 最小化损失 最大化评价指标(或最小化误差)
更新频率 每个 batch 都更新 通常每个 epoch 或训练结束后计算
典型例子 MSE、交叉熵、Huber Loss 准确率、召回率、BLEU、AUC

你想想看,如果你拿准确率当损失函数去求梯度——准确率是离散的,梯度根本不存在。这就是为什么我们得用可微的损失函数来训练,再用评价函数来验收。

我曾经踩过的坑:有次做推荐系统排序模型,我直接用 NDCG 当损失函数去优化,结果梯度算出来全是 0,模型一动不动。后来改成用 ListNet 损失(可微的排序损失)来训练,再用 NDCG 做评价,效果就对了。记住:训练用损失函数,评估用评价函数,别混着用。

三者关系:一张图说清楚

下面这张图展示了梯度下降、链式法则、损失函数和评价函数在训练流程中的位置:

梯度下降、链式法则、损失函数与评价函数关系图 训练流程中的数学基础关系图 输入数据 X 模型预测 ŷ 损失函数 L(ŷ, y) 链式法则求梯度 梯度下降更新权重 评价函数评估效果 更新参数 θ 不参与梯度计算 💡 关键理解: 损失函数必须可微 → 链式法则计算梯度 → 梯度下降更新权重 → 评价函数只看最终效果,不参与训练过程。

实际调权重时怎么用这些知识

咱们这门课的核心是调评价函数的权重。那这些数学基础到底怎么用?我给你拆成三步:

  1. 定义评价函数:比如你要平衡准确率和召回率,评价函数就是 E = w₁ · Accuracy + w₂ · Recall
  2. 构造可微的损失函数:评价函数本身不可微,你得找一个可微的近似。比如用 Focal Loss 来近似 F1 分数
  3. 用链式法则求梯度:损失函数对权重 w₁、w₂ 求偏导,然后用梯度下降更新
核心要点:你最终想要优化的是评价函数,但实际训练时用的是损失函数。损失函数是评价函数的「可微替身」。权重调优的本质,就是让这个替身尽可能贴近真身。

小结

这一章我们讲了三个东西:

  • 梯度下降:沿着梯度反方向迈步,步子大小看学习率
  • 链式法则:复合函数求导的拆解工具,少拆一层就全错
  • 损失函数 vs 评价函数:一个用来训练,一个用来验收,别搞混