Skip to content

梯度下降

一、梯度下降是什么?

梯度下降本质上是一种找函数最小值的方法,你可以把它想象成下山找山脚:目标函数就是一座山,我们站在山上的某个位置,梯度就是当前位置最陡的下坡方向,我们沿着这个方向一步步走,就能慢慢靠近山的最低点(函数的最小值)。

虽然深度学习里很少直接用梯度下降,但它是随机梯度下降等高级优化算法的基础,理解它才能搞懂更复杂的优化逻辑。

二、一维梯度下降:先从简单的情况入手

1. 基本逻辑

我们用一个最简单的函数举例: ,这个函数就像一个开口向上的抛物线,最低点在 的位置。 这个函数的梯度就是它的导数 ,也就是当前位置的 “下坡方向”。梯度下降的更新规则是: 这里的 就是学习率,可以理解成下山时每一步的步长。

比如我们从 (相当于站在抛物线的 “山顶”)开始,设置 ,迭代 10 次后, 就会接近 0,就像一步步从山顶走到了山脚。

2. 学习率的两个大坑

学习率的大小直接决定了能不能顺利走到山脚:

  • 学习率太小:就像下山时一步只挪 1 厘米,走 10 步还离山脚很远。比如当 时,10 次迭代后 还在 3.48,离 0 的最低点还差很远。

  • 学习率太大:就像下山时一步跨太大,直接冲过了山脚,还往另一边的山上跑了。比如当 时, 会越来越大,直接 “发散”,离最低点越来越远。

3. 局部最小值的陷阱

如果函数不是 “凸函数”(比如 ,这个函数有很多小土坑),梯度下降可能会掉进一个小坑里出不来 —— 也就是找到局部最小值,而不是整个函数的全局最小值。比如用大学习率的时候,就很容易卡在一个不是最低的小坑里。

三、多维梯度下降:多个变量的情况

现实中我们遇到的问题大多是多个变量的,比如有两个变量 ,目标函数是 ,这个函数的最小值在 的位置。 这时候梯度就是每个变量的偏导数,也就是 ,每次更新的时候, 都沿着各自的下坡方向走。

我们从初始位置 开始,设置 迭代 20 次,就会慢慢靠近 ,就像在一个二维的山坡上,沿着最陡的下坡方向一步步走到最低点。

四、自适应方法:解决学习率难调的问题

梯度下降的最大问题就是学习率太难调了,自适应方法就是为了解决这个问题而生的。

1. 牛顿法:利用曲率的 “聪明下山法”

梯度下降只看了当前的下坡方向(一阶导数),而牛顿法还看了山坡的曲率(二阶导数,也就是 Hessian 矩阵),这样就能更准确地知道该走多大步。 比如对于 ,牛顿法一步就能走到最低点,因为它知道这个山坡的曲率,直接一步就跨到山脚了。

但牛顿法有个致命缺陷:如果函数是非凸的,Hessian 矩阵可能是负的,这时候它会往山上走,反而离最低点更远。这时候可以给它加个小学习率,比如 ,就能正常收敛了。

2. 预处理:给不同变量定制步长

有时候不同变量的 “尺度” 不一样,比如一个变量的单位是毫米,另一个是公里,这时候梯度下降就很难调学习率。预处理就是给每个变量设置不同的步长,相当于给每个变量定制了一个专属学习率,这样就能更快收敛。

3. 线搜索:自动找最合适的步长

线搜索的思路是:先确定下坡方向,然后用二分搜索找到最合适的步长,让这一步走下去函数值最小。但深度学习里用不了这个方法,因为每次线搜索都要遍历整个数据集,太费时间了。

五、小结

  1. 学习率是梯度下降的核心:太小会导致更新缓慢,太大则会让模型发散,找不到最小值。

  2. 梯度下降可能陷入局部最小值,无法找到全局最优解,尤其是在非凸函数中。

  3. 多维问题里调学习率更复杂,预处理可以帮我们给不同变量定制步长,提升效率。

  4. 牛顿法在凸问题里收敛很快,但在非凸问题里不能直接用,需要调整后才能使用。

京ICP备2024093538号-1