作业 · 梯度下降优化 Beale 函数

Views: --

本实验不用神经网络,而是让梯度下降直接优化一个二维非凸函数。这样做的好处是变量只有 x1,x2x_1,x_2,每一步都能算清楚,也能直观看见“沿负梯度方向走”究竟发生了什么。

梯度下降作业的原始题目截图

原题截图引用了协同梯度下降作为背景,但本次要求是不实现该算法,而是自行完成普通梯度下降对 Beale 函数的优化。

Beale 函数

目标函数为:

f(x1,x2)=(1.5x1+x1x2)2+(2.25x1+x1x22)2+(2.625x1+x1x23)2\begin{aligned} f(x_1,x_2)= &(1.5-x_1+x_1x_2)^2\\ &+(2.25-x_1+x_1x_2^2)^2\\ &+(2.625-x_1+x_1x_2^3)^2 \end{aligned}

它的一个全局最小点是:

(x1,x2)=(3,0.5),f(x1,x2)=0(x_1^*,x_2^*)=(3,0.5),\qquad f(x_1^*,x_2^*)=0

令:

g1=1.5x1+x1x2,g2=2.25x1+x1x22,g3=2.625x1+x1x23g_1=1.5-x_1+x_1x_2, \quad g_2=2.25-x_1+x_1x_2^2, \quad g_3=2.625-x_1+x_1x_2^3

f=g12+g22+g32f=g_1^2+g_2^2+g_3^2。用链式法则可得:

fx1=2g1(x21)+2g2(x221)+2g3(x231)\frac{\partial f}{\partial x_1} =2g_1(x_2-1) +2g_2(x_2^2-1) +2g_3(x_2^3-1) fx2=2g1x1+4g2x1x2+6g3x1x22\frac{\partial f}{\partial x_2} =2g_1x_1 +4g_2x_1x_2 +6g_3x_1x_2^2

梯度就是:

f(x1,x2)=[f/x1f/x2]\nabla f(x_1,x_2)= \begin{bmatrix} \partial f/\partial x_1\\ \partial f/\partial x_2 \end{bmatrix}

梯度下降更新

每一步沿梯度反方向移动:

x(t+1)=x(t)ηf(x(t))\boldsymbol x^{(t+1)}= \boldsymbol x^{(t)}-\eta\nabla f(\boldsymbol x^{(t)})

作业采用:

设置数值
初始点(1,1)(1,1)
学习率 η\eta0.01
迭代次数2000

先做一次手算检查。初始点的函数值为:

f(1,1)=1.52+2.252+2.6252=14.203125f(1,1)=1.5^2+2.25^2+2.625^2=14.203125

此时 x21=x221=x231=0x_2-1=x_2^2-1=x_2^3-1=0,所以:

fx1=0\frac{\partial f}{\partial x_1}=0

而:

fx2=2(1.5)+4(2.25)+6(2.625)=27.75\frac{\partial f}{\partial x_2} =2(1.5)+4(2.25)+6(2.625)=27.75

因此第一步为:

(x1,x2):(1,1)(1,0.7225)(x_1,x_2):(1,1)\to(1,0.7225)

这与原实验报告记录的初始梯度和第一次更新一致,也可以作为检查实现是否写错梯度的小型单元测试。

实验结果

Beale 函数等高线、三维曲面与优化路径

红色轨迹从 (1,1)(1,1) 出发,先快速降低 x2x_2,再沿弯曲谷地逐步靠近 (3,0.5)(3,0.5)。二维等高线能看清参数路径,三维曲面则说明同样的移动对应函数高度不断降低。

经过 2000 次迭代,程序得到:

(x1,x2)=(2.999153,0.499789)(x_1,x_2)=(2.999153,0.499789) f(x1,x2)=1.149280×107f(x_1,x_2)=1.149280\times10^{-7}

它与理论最优点 (3,0.5)(3,0.5) 非常接近,说明在该初始点和学习率下成功收敛。误差没有恰好变成 0,是因为固定迭代次数、有限浮点精度以及固定学习率共同决定了最后的近似精度。

报告记录的关键节点为:

记录点x1x_1x2x_2函数值f/x1\partial f/\partial x_1f/x2\partial f/\partial x_2
初始1.0000001.00000014.2031200.00000027.750000
第 5 次1.1668290.4088134.655266-5.9527006.128977
第 1999 次2.9991530.4997891.149280×1071.149280\times10^{-7}-0.000256-0.000064

Beale 函数值在线性与对数尺度下的收敛曲线

线性坐标展示前期下降很快,对数坐标则能看见后期仍持续、近似指数式地减小。Notebook 每轮先记录当前位置再更新,因此最后一行是第 2000 个记录点,对应已完成 1999 次参数更新;上文沿用作业的“2000 次迭代”总预算口径。

为什么学习率重要

η\eta 决定每一步走多远:

  • 太小:方向正确,但需要大量迭代;
  • 适中:函数值稳定下降并较快到达谷底;
  • 太大:可能跨过谷底来回振荡,甚至数值发散。

Beale 函数的不同方向曲率差异明显,等高线不是圆而是狭长弯曲的谷地。固定学习率必须照顾陡峭方向,于是在平缓方向可能前进得很慢。这也是 Momentum、Adam、二阶方法和学习率调度存在的原因。

Notebook 还实际比较了学习率 0.001、0.005、0.01 与 0.02:

不同学习率下 Beale 函数的收敛比较

在同一初始点和 2000 次预算内,0.001 下降最慢,0.005 和 0.01 依次更快,0.02 在这四组中达到最低函数值。这个结果只说明 0.02 在已测试范围内更快,不能推出继续增大学习率仍会更好;跨过稳定区间后仍可能振荡或发散。

实现时应检查什么

数值梯度校验

解析梯度写完后,可以用中心差分检查:

fxif(x+hei)f(xhei)2h\frac{\partial f}{\partial x_i} \approx \frac{f(\boldsymbol x+h\boldsymbol e_i)-f(\boldsymbol x-h\boldsymbol e_i)}{2h}

若两者差异很大,先查求导或代码,不要急着调学习率。

不只看最终点

还应记录每轮函数值、梯度范数与参数轨迹。一个合理的收敛过程通常满足:

f(x(t+1))f(x(t))f(\boldsymbol x^{(t+1)})\lesssim f(\boldsymbol x^{(t)})

固定学习率并不严格保证每一步都下降,但若函数值长期剧烈上升,通常意味着步长太大或梯度实现有误。

多个初始点

本实验只从 (1,1)(1,1) 出发,能说明这一组配置成功,却不能证明任意初始点都能到达全局最优。非凸函数可能存在平坦区、鞍点和不同吸引域,更完整的实验应比较多个初始位置。

可改进方向

  • f<ε\|\nabla f\|<\varepsilon 或相邻函数值变化作为提前停止条件;
  • 在现有 0.001~0.02 对照之外继续搜索稳定步长边界;
  • 加入 Momentum 或 Adam,观察狭长谷地中的速度;
  • 比较固定学习率与学习率衰减策略;
  • 重复多个初始点,区分算法能力与一次幸运初始化。

实验结论

在初始点 (1,1)(1,1)、学习率 0.01 和 2000 次迭代的设置下,梯度下降把 Beale 函数从 14.203125 降到约 1.15×1071.15\times10^{-7},并到达理论最优点附近。这个小实验完整展示了机器学习训练的基本骨架:定义目标函数、计算梯度、选择步长、迭代更新,再用数值与曲线验证收敛。

评论