什么是梯度
蒙着眼睛站在山坡上,怎么走到山谷最低点?
蒙着眼睛下山
先把所有数学符号放一边,来做一个想象游戏。
你被蒙上眼睛,独自站在一片连绵起伏的山坡上。任务只有一个:走到这片山谷的最低点。 你看不见远处的地形,不知道最低点在哪个方向、有多远。你唯一能依靠的, 是脚底下的触感——抬起一只脚,往四周探一探,就能感觉到哪边是上坡、哪边是下坡,以及坡有多陡。
换作是你,会怎么走?几乎每个人都会想到同一个办法:
- 用脚探一圈,找出脚下最陡的下坡方向;
- 朝那个方向迈一小步;
- 站定,再探一圈,再迈一步……如此重复。
只要每一步都朝着「当前最陡的下坡」走,你迟早会走到一个四面都是上坡的地方——那就是谷底。 这个朴素到不能再朴素的办法,就是神经网络训练的核心思想。
接下来四站,我们要做的只有一件事:把「用脚感受坡度」这个动作,翻译成计算机能算的数学。 这条翻译之路会依次经过四个概念——导数、偏导数、方向导数,最后总结梯度。
导数:曲线在一点的斜率
先把问题简化到极致。假设我们退到足够远的地方,把这座山起起伏伏的走势抽象成平面上的一条函数曲线—— 比如下面这样一条简单的三次曲线。横轴 是你在地面上的位置,纵轴 是该位置的高度,整条曲线就是这座山的「侧影」。
看这张图:我们正端详着整条曲线,带着上帝视角——一眼就能看出谷底在哪、是该往左还是往右走才能到最低点。 可真正身处山中的那个人没有这种视角:他眼前一片漆黑,看不到整条曲线,只知道自己此刻所在的这一个点。 他能做的,只是朝左挪一点点、朝右挪一点点,感觉一下是升还是降,哪边下降就往哪边走。
把这个「左右试探」翻译成数学,靠的就是曲线在你脚下那一点的斜率:
- 斜率为正 → 曲线正在上升:往右( 增大)是上坡,往左才是下坡;
- 斜率为负 → 曲线正在下降:往右就是下坡。
斜率的正负告诉你哪边是下坡,斜率的大小告诉你坡有多陡。于是「该往哪走、走得多急」整个被归结成一个计算问题:怎么算出曲线在某一点的斜率?
麻烦在于:直线的斜率好算——任取两点,「竖直方向的上升量 ÷ 水平方向的移动量」,而且整条直线处处是同一个值; 可曲线是弯的,它在每一点的陡峭程度都不一样,根本没有一个统一的「上升 ÷ 移动」。 数学专门为「曲线在一点的斜率」造了一个工具,名字就叫导数(derivative),记作 。那它到底怎么算?
办法其实很自然:直线斜率要取两点,那就先在曲线上也取两点。设你站在位置 , 往旁边挪一小段 ,落到第二点 ;高度相应改变 。 连接曲线上这两点的直线叫割线,它的斜率 是这一小段上的平均斜率—— 可它还不是 那一点的斜率,跨度越大、偏差越大。
关键的一步来了:让 不断缩小、趋近于 ,第二个点就沿曲线滑回 , 割线也随之越转越贴合曲线,最终绷成只在 处轻轻擦过的切线。这条切线的斜率, 就是曲线在 这一点的精确斜率。用极限把它钉死,就得到导数的严格定义。
设函数 在点 的某个邻域内有定义。当自变量在 处取得增量(点 仍在该邻域内)、相应地函数取得增量 时,如果当 时极限
存在,就称函数 在点 处可导,并称这个极限值为 在点 处的导数,记作,也记作 。 如果上述极限不存在,就说函数在这一点不可导。
注意:导数 是一个具体的数,它依赖于你站在哪一点 。 如果这条曲线每一点都可导,那么每给定一个位置 ,就唯一对应一个斜率值 。 这种「位置 ↦ 斜率 」的对应关系,本身又构成一个新的函数, 叫做 的导函数(derivative function),记作 或 :
一句话分清这对容易混淆的概念:导数是某一点上的一个数(比如 );导函数是覆盖所有点的一整个函数(比如 )。把具体的 代进导函数,得到的就是那一点的导数。所以日常说的「求导」,通常是指先求出导函数 ,用到哪点再代入哪点。 不过有时候为了简单,也把导函数直接称之为导数——具体指哪一个,看上下文就知道。
下面用一条最简单的曲线,把上面的极限定义实地跑一遍——取一条开口向上的抛物线(它正是这类曲线里最简单的特例,只有一个谷底):
这条抛物线的最低点在 。我们不借助现成的求导公式,直接套用上面的定义, 把它的导函数从极限算出来:
于是得到导函数 。现在你站在 的位置,把它代进导函数,就得到这一点的导数:
这个 在告诉你两件事:
- 符号是负的 → 往右走( 增大)高度会下降,所以这一点往右是下坡。
- 大小是 6 → 坡挺陡的,挪一步高度掉得快。
所以「下坡」这件事,被一个数完全说清楚了:朝着让导数下降的方向走—— 也就是导数为负时往 增大的方向走,导数为正时往 减小的方向走。一句话:沿导数的反方向走,就是下坡。
偏导数:山其实是二维的
刚才那条「只能东西走」的小路太理想了。真实的山坡是一片开阔的二维地面: 你可以往东西(坐标 )走,也可以往南北(坐标 )走。海拔高度同时取决于两个坐标,写成 。
下面这张图,就是把高度 真正立起来看——一个开口朝上的碗。 用鼠标拖一拖,你能从任意角度打量它:碗底是最低点,越往边缘海拔越高。蒙着眼站在碗壁上的你,要做的就是滚到碗底。
可拖拽旋转 · 滚轮缩放
很自然的想法是分两次量:
- 先站着别往南北动,只往东西挪一点,量出东西方向的坡度;
- 再站着别往东西动,只往南北挪一点,量出南北方向的坡度。
这两个「只动一个方向、其余按住不动」量出来的坡度,就叫偏导数(partial derivative), 用一个圆头的 来写,区别于单变量的 :
「偏」这个字就是「偏心、只顾一个」的意思——求 时,把 当成钉死的常数, 只看 怎么影响高度。对刚才那个碗求两个偏导数:
假设你现在站在 。代进去:
现在你手里有了两个数。但问题来了:你真正想知道的,不是「沿东西」或「沿南北」的坡度, 而是「随便朝哪个方向迈步,坡度是多少」——尤其是哪个方向最陡。下一站解决它。
方向导数:朝任意方向看坡度
下山时你并不会傻乎乎地只沿正东或正南走——你会朝任意一个方向探脚,比如「东偏南 30°」。 沿着某个指定方向迈步时的坡度,就叫方向导数(directional derivative)。
神奇的是,你不需要对每个方向都重新实地测一遍。只要有了两个偏导数, 任意方向的坡度都能算出来。把你想走的方向写成一个单位向量 ,那么:
看右边这个式子——它正是第 2 课讲过的点积!把两个偏导数拼成一个向量,方向导数就等于它和方向 的点积。 而我们当时讲过,,几何上就是「投影」。
这一下就把问题点透了。沿用上一站的数:在 处那个「坡度向量」是 。 试几个方向,算算各自的坡度( 取单位向量):
这里藏着一个关键直觉。方向导数 = 坡度向量在 方向上的投影。 一个固定向量投影到不同方向上,什么时候投影最长?当 和它方向完全一致的时候。换句话说——坡度最陡的方向,就是那个「坡度向量」自己指的方向。
梯度:最陡方向,打包成一个向量
上一站那个反复出现的「坡度向量」,其实就是本课的主角。把所有偏导数排成一个向量, 它有一个正式的名字——梯度(gradient),记作 (读作 "nabla h"):
梯度不是新算出来的东西,它就是把第 3 站的几个偏导数装进一个向量。 但这个打包动作让它一下子有了两个极其有用的几何含义,正是第 4 站推出来的结论:
- 方向:梯度指向上升最快(坡最陡)的方向。
- 大小: 就是那个最陡方向上的坡度有多陡。
在 处,,指向「西偏北」——那是爬升最快的方向。 而我们要下山,所以朝它的正反方向走,也就是 =「东偏南」,这正是图 5-7 里最陡的下坡。 于是「蒙眼下山」的每一步,变成了一个干净的公式:
减号就是「朝梯度反方向走」; 是步长(迈多大步)。这个动作不断重复,就把你一步步带向谷底。 它有个正式名字,梯度下降(Gradient Descent)。
注意一个收束:第 4 站说「最陡方向就是坡度向量指的方向」,第 5 站给这个向量起名叫梯度。 所以梯度的全部意义,就是替你完成了「用脚探一圈、找最陡方向」这件事——而且是一次计算精确给出,无需试探。
从山坡到神经网络
最后,把场景换回 AI——你会发现神经网络训练就是一次「蒙眼下山」,只是换了套名字: 山的海拔高度,对应模型的损失(预测错得多离谱);你站的位置坐标, 对应模型的所有参数;脚下最陡的下坡方向,就是梯度的反方向。 走到谷底,就是把损失训练到最小。
唯一的区别是维度:山坡只有 、 两个坐标,而大模型有上千亿个参数 。 道理却一字不差——损失对每个参数都有偏导数,打包成梯度 ,再同时更新所有参数:
一次更新,就把上千亿个参数全部朝「损失更小」的方向推了一步。这就是神经网络训练的核心引擎。 至于下山路上的坑(会不会卡在小水洼里、步子 怎么选、上千亿个梯度如何高效算出来), 都留到后面的神经网络篇章再展开——梯度下降(第 12 课)和反向传播(第 13 课)会专门讲。
梯度就是「蒙眼下山时脚底感受到的最陡方向」的数学版本。 一维时它是导数(一个坡度数);多维时先对每根轴求偏导数, 任意方向的坡度由方向导数(梯度与方向的点积)给出; 而坡度最陡的方向,就是把偏导数打包成的向量——梯度 ∇L。 沿其反方向更新参数 w ← w − α·∇L,就是整个神经网络训练的核心机制。
这一课你一步步走过了
- 导数 dh/dx:单变量时的精确坡度,符号给方向、大小给陡峭程度。
- 偏导数 ∂h/∂x:多变量时「只动一根轴、其余按住」量出的坡度。
- 方向导数:任意方向的坡度 = 梯度与该方向的点积(投影),无需逐个实测。
- 梯度 ∇L:所有偏导数组成的向量,指向上升最陡的方向;下山就走它的反方向。
- 梯度下降:w ← w − α·∇L,一步把全部参数推向更低的损失。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
概率与信息
神经网络的输出为什么叫「概率」?——从频率的定义到交叉熵损失的来历