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