关于此实验
训练神经网络意味着沿着损失曲面向下移动。梯度下降法沿着梯度的反方向迈出一步,步长由学习率缩放。这个简单的规则背后隐藏着许多行为:步子太小会进展缓慢,步子太大会振荡甚至发散;狭窄的谷底会让它走出之字形,也可能使它陷入局部最小值。选择一个曲面并点击起点,然后在地图和损失曲线上逐步比较普通梯度下降法、动量法和 Adam。
学习目标
- 写出梯度下降的更新公式,并解释学习率的作用
- 推导二次损失的稳定性界限 η < 2/λ_max,并进行检验
- 解释为什么病态谷底会使梯度下降走出之字形,以及动量如何提供帮助
- 描述 Adam 如何利用梯度的滑动平均重新缩放各个坐标
- 识别收敛到的是局部最小值,而非全局最小值
使用方法
- 1在梯度下降法中选择“圆形碗”。尝试将学习率设为 0.1、1 和 2.1,并描述这三条路径。
- 2选择“狭窄山谷”。找出仍能收敛的最大学习率,并将其与滑块下方显示的稳定极限进行比较。
- 3在“狭窄山谷”中将 η 设为 0.05。数一数梯度下降法达到损失 1e-6 所需的步数,然后切换到 Momentum,将 β 设为 0.9,再数一次。
- 4选择“香蕉山谷”(Rosenbrock 函数)。比较运行 300 步后梯度下降法、Momentum 和 Adam 的表现。
- 5选择“两个极小值”。从默认起点运行梯度下降法会停在右侧较浅的谷底。在山脊两侧点击设置起点:哪些起点能到达更深的谷底?
- 6返回默认起点,切换到 Momentum,并将 β 设为 0.9、η 设为 0.1。为什么现在路径能滚过山脊?
模型
假设
- 梯度是精确的。在实际训练中,梯度由小批量数据估算,因此会引入噪声(随机梯度下降)。
- 损失曲面是固定的二元函数:圆形碗面 ½(x² + y²)、狭窄山谷 ½(0.5x² + 5y²)、Rosenbrock 函数 (1 − x)² + 10(y − x²)²,以及倾斜的双阱函数。
- 每次运行都使用固定学习率,并在 300 步后停止。没有学习率调度。
- 运行是确定性的:相同的起点和设置总会得到相同的路径。
在课堂上试试这个实验
- Q1在狭窄山谷中,稳定性极限由陡峭方向决定,但进展受平缓方向限制。请用因子 1 − ηλ 加以解释。
- Q2为什么动量法每步使用相同的梯度,却仍能更快收敛?
- Q3Adam 的步长大致为 η,不受曲面陡峭程度的影响。这在什么情况下是优势,又在什么情况下会成为问题?
- Q4神经网络的损失函数有数百万个维度。你认为局部极小值和鞍点,哪一个会成为更大的障碍?为什么?
- Q5请提出一种学习率调度方案,使模型既能在早期快速取得进展,又能精确收敛。
常见问题
为什么学习率过大会导致损失增大?
每一步都会越过谷底,落到对面更高的斜坡上。对于二次函数,每次越过都会使距离乘以 |1 − ηλ|;当 η 大于 2/λ 时,这个乘数就大于 1。
在狭窄的谷底,动量有什么作用?
横穿谷底的锯齿状梯度方向彼此相反,会在累积速度中相互抵消;而沿着谷底方向的较小梯度都指向同一方向,因此会相加。这样一来,运动轨迹会变得平直,并沿着谷底加速前进。
Adam 总是比梯度下降更好吗?
不。Adam 稳健且几乎不需要调参,因此常用于训练网络;但对于简单且条件良好的问题,普通梯度下降或动量法可能收敛得更快,或得到更好的解。
