数学基础回顾:梯度下降、链式法则与损失函数
说实话,很多做调参的同学一上来就调权重,调了半天效果不好,回头一看——梯度方向算错了。嗯,这种事我见过不少。所以这一章咱们把数学基础捋一遍,不搞花架子,只讲你调权重时真正用得上的东西。
梯度下降:你下山时迈的每一步
梯度下降说白了就是:你站在一座山上,想走到最低的谷底。但你蒙着眼,只能靠脚底的感觉判断哪边更陡,就往哪边迈一步。这个「陡峭程度」就是梯度,迈的步子大小就是学习率。
我刚开始做模型调优时,学习率设得太大,结果损失函数直接飞了——就像下山时一步跨太大,滚到对面山坡上去了。后来学乖了,先用小步试探。
数学上,梯度下降的更新公式很简单:
θ_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 做评价,效果就对了。记住:训练用损失函数,评估用评价函数,别混着用。
三者关系:一张图说清楚
下面这张图展示了梯度下降、链式法则、损失函数和评价函数在训练流程中的位置:
实际调权重时怎么用这些知识
咱们这门课的核心是调评价函数的权重。那这些数学基础到底怎么用?我给你拆成三步:
- 定义评价函数:比如你要平衡准确率和召回率,评价函数就是
E = w₁ · Accuracy + w₂ · Recall - 构造可微的损失函数:评价函数本身不可微,你得找一个可微的近似。比如用 Focal Loss 来近似 F1 分数
- 用链式法则求梯度:损失函数对权重 w₁、w₂ 求偏导,然后用梯度下降更新
核心要点:你最终想要优化的是评价函数,但实际训练时用的是损失函数。损失函数是评价函数的「可微替身」。权重调优的本质,就是让这个替身尽可能贴近真身。
小结
这一章我们讲了三个东西:
- 梯度下降:沿着梯度反方向迈步,步子大小看学习率
- 链式法则:复合函数求导的拆解工具,少拆一层就全错
- 损失函数 vs 评价函数:一个用来训练,一个用来验收,别搞混