梯度下降
梯度下降算法是机器学习中最基础的优化算法。
01 核心原理(大白话版)
你做了一锅汤,觉得不够好喝,想改进配方。你可以调整盐的用量——多了太咸,少了没味。怎么找到刚好的量?
一个笨方法:试一点,尝一下,感觉往哪边调更好,就往那边调一点点,再尝,再调……反复几次,越来越接近最好喝的配方。
梯度下降就是这个过程的数学版:把"好不好喝"换成"损失函数",把"往哪边调"换成"梯度方向",把"调一点点"换成"学习率"。
只有三件事
用一个数字衡量模型现在预测得有多烂。这个数字就叫"损失值",我们想让它越小越好。
梯度告诉你:参数往哪个方向调,损失会上升最快。那反过来,往反方向调,损失就下降最快。
不能步子太大——一下跨过最低点就麻烦了。用学习率控制每次只调一小步,慢慢逼近最优解。
反复执行这三步,损失值会越来越小,模型越来越准。停下来的时机:梯度接近零(已经在谷底了),或者达到设定的最大迭代次数。
学习率:步子大小是关键
步子太大
像下山时迈大步,一脚踩空到对面山坡,反复横跳永远到不了谷底,损失值震荡甚至越来越大。
步子太小
像蚂蚁挪窝,方向没错但慢得离谱,要迭代几万次才能收敛,实际中根本耗不起。
实践中学习率通常从 0.01 开始试,根据损失曲线再调整。
一步步构建梯度下降
光说不练没用,我们来从零把代码搭出来。
用一个二次函数 f(x) = x² 模拟"损失函数"——它有一个最低点,我们的目标就是找到它。
我们先把他画出来看看:
问题很明显:x + 1 是盲目乱走,不知道该往哪边走才能让 f(x) 变小。
导数(梯度)告诉我们函数在当前点的"坡度"和"方向"。沿负梯度方向走,就是在下坡:
我们已经得到梯度下降的核心雏形。加上收敛判断、可视化就是完整版——看下面的完整代码。
02 代码
03 学术性讲解
梯度下降算法是机器学习中最基础的优化算法。无论是线性回归、神经网络还是深度学习,都离不开梯度下降的身影。它的核心思想非常简单:像下山一样,每一步都往最陡的下坡方向走,直到到达山谷。
什么是梯度?
梯度可以理解为当前位置最陡的上升方向。想象你站在一个山谷的斜坡上,梯度指向的是让高度增加最快的方向(往高处走)。
为什么要沿负梯度方向走?
假设你在山上迷路了,想要尽快下山。最直觉的做法就是:每一步都往最陡的下坡方向走。这正是梯度下降的核心思想!
梯度怎么算?
梯度下降的目标是最小化损失函数,所以梯度是损失对参数的偏导,而不是对预测函数本身求导。
以线性回归为例,预测函数是 ŷ = wx + b,单个样本的损失是误差的平方:
令 err = wx + b − y,用链式法则分别对 w 和 b 求偏导:
b 那项的 x 变成 1,因为 b 对 ŷ 的导数是 1。
实际训练时有 n 个样本,损失取平均,即 MSE(均方误差):
1/n 是常数,直接提出来,偏导变成:
2/n 就是单样本导数里的 2 乘以 MSE 定义里的 1/n。代码里的循环正是在累加 errᵢ · xᵢ,循环后乘以 2/n,与公式完全对应。
学习率:每一步走多远
学习率(Learning Rate)控制着每一步走的长度。它是梯度下降中最重要的超参数之一。
学习率过大
- 步子太大,容易越过最低点
- 可能导致震荡发散,永远无法收敛
- 损失值会在最低点附近来回跳动
学习率适中
- 步子适中,能够稳步下降
- 可以到达局部或全局最低点
- 这是我们想要的效果
学习率过小
- 步子太小,下降非常缓慢
- 需要大量迭代才能收敛
- 容易陷入局部最优
其中 α 是学习率,∇J(θ) 是梯度。学习率一般选择 0.001、0.01、0.1 等。
如何判断收敛?
梯度下降需要在某个时刻停下来,否则会无限运行下去。常见的收敛判断标准有:
1. 设置迭代次数
最简单的做法是设置一个固定的迭代次数。缺点是需要反复尝试找到合适的值。
2. 损失值变化小于阈值
当两次迭代之间的损失值变化很小时,认为已经收敛。
3. 梯度模长小于阈值
当梯度接近于零时,说明已经到达最低点附近。
核心要点回顾
找到损失函数的最小值,即模型最优解
沿负梯度方向,即最陡下降方向前进
由学习率控制每一步移动的距离
梯度接近零或达到最大迭代次数
损失曲面 3D 可视化
下图展示了你正在优化的损失函数 J(w, b) = sin(w)·cos(b) + w²/8 + b²/8 的曲面形状。高处(暖色)表示损失值大,低处(冷色)表示损失值小。