想象你被蒙住眼睛,空降在大雾弥漫的山中。
每次往哪走、走多远,机器是怎么算出来的?
你被蒙住双眼,空降在大雾弥漫的山中。看不见全貌,只知道:必须尽快走到山谷最低点。
你唯一的工具是——脚。你能感知脚下地面的坡度。于是你本能地会:
用脚试探四周,找出最陡的下坡方向
朝那个方向迈出小小的一步
停下,再试探,再迈步,直到脚下平坦
| 山的世界 | 机器学习 |
|---|---|
| 海拔高度 | 损失函数 Loss(越高 = 误差越大) |
| 你所在的位置 | 模型参数(Weights) |
| 脚下的坡度 | 梯度 Gradient(告诉往哪走) |
| 迈步下山 | 更新参数 |
| 山谷底部 | 最优解(Loss 最低) |
这个公式说的是:每次把 x 往最小值的方向挪一点点。
就好比你站在山坡上,要往山谷底部走:
你当前在哪个位置。参数值。
这一步要挪多远、往哪边挪。
挪完之后的下一个位置。
重复这个动作很多次,x 最终会停在 f(x) 的最低点。
找 f(x) = x² 的最低点,从 x = 3 开始,η = 0.1:
| 步骤 | 当前位置 x | 坡度 f′(x) | 挪动 η·f′ | 新位置 x_new | 函数值 f(x) |
|---|---|---|---|---|---|
| 0 | 3 | +6 | 0.1×6 = 0.6 | 2.4 | 9.00 |
| 1 | 2.4 | +4.8 | 0.1×4.8 = 0.48 | 1.92 | 5.76 |
| 2 | 1.92 | +3.84 | 0.1×3.84 = 0.38 | 1.54 | 3.69 |
| ... | 一直重复,慢慢逼近 x=0 | ||||
每次都往最低点挪一点,x 从 3 → 2.4 → 1.92 → ... → 越来越接近 0。
公式里 η · f′(x) 这一项,代表"这一步要挪多远"。它由两部分组成:
基础步长基数。你决定每一步最多走多远。比如 η=0.1,就是最多走 0.1。
坡度有多陡。陡坡就多走几步,平坡就少走几步——这是自动调节的部分。
这个设计非常巧妙——完全不需要人工调节步长:
| 地形 | 坡度 f′(x) | 步长 η·f′(x) | 效果 |
|---|---|---|---|
| 陡坡(离谷底远) | 大 | 大 | 大步快跑 ✅ |
| 接近谷底 | 小 | 小 | 小步精找 ✅ |
| 谷底 | 0 | 0 | 自动停止 ✅ |
这就是自适应步长:坡陡就大步,坡缓就小步,算法自动完成。
假设你在 x = 3,f′(3) = 6(正数)。
坡度 = +6
(正,右边高左边低)
要往左走
→ 减小 x
3 − 6 = −3
✅ 方向正确
坡度正 → 最低点在左边 → 减正数 → x 减小 → 往左走 ✅
假设你在 x = −3,f′(−3) = −6(负数)。
坡度 = −6
(负,右边低左边高)
要往右走
→ 增大 x
−3 + 6 = 3
✅ 方向正确
坡度负 → 最低点在右边 → 减负数(加正数)→ x 增大 → 往右走 ✅
这就是减法的精妙之处!不需要判断坡度正负再决定是加还是减,直接一个减号,全部搞定。
坡度 f′(x) 是一个"信号",告诉你方向和相对力度。但它不能直接拿来当步长用。
因为如果坡度太大,直接用会出问题:
假设 f′ = 1000(悬崖边)
直接减 → 一步跳过了整个山谷
0.1 × 1000 = 100
还是有点大,但可控制了
0.001 × 1000 = 1
安全步长,慢慢逼近
坡度 f′(x) 是一个无量纲的比值,η 把这个比值转换成具体的移动距离。
| 情况 | 现象 | 结果 |
|---|---|---|
| η 太大 | 步子迈太大 | 跳过山谷,Loss 震荡/发散 ⚠️ |
| η 太小 | 步子像蚂蚁 | 收敛极慢,收敛时间太长 ⏰ |
| η 合适 | 步子适中 | 稳步下山,快速收敛 ✅ |
实际工程中 η = 0.01 ~ 0.1 是常用范围。需要通过实验调整。
你可以试试:拖动滑块设置起点和学习率,点击「下一步」或「自动播放」,看梯度下降怎么走。
x_new = x − η·f′(x)。每次把参数往 Loss 最低的方向挪一小步。
坡陡大步,坡缓小步,完全自动。f′(x) 充当动态调节器。
无论坡度正负,统一减法,自动找对方向。
把坡度信号转成实际步长。太大跳过谷底,太小爬不动。