训练深度神经网络通常与优化线性回归或支持向量机等更简单的机器学习模型感觉不同。这种差异很大程度上源于我们要最小化的函数本质,即其“地形”。与在较简单情境中遇到的相对规整的凸碗状地形不同,深度网络的“地形”是一个复杂、高维且充满意想不到特征的空间。了解这些特点有助于理解为何某些优化策略在深度学习中表现更优。高维度与非凸性神经网络的优化空间具有高维度。现代神经网络可以拥有数百万甚至数十亿个参数(权重和偏置)。每个参数代表优化空间中的一个维度。在数十亿维空间中可视化函数是不可能的,因此我们通常基于2D或3D例子形成的直觉可能会产生误导。从数学角度看,深度网络的损失函数 $L(\theta)$(其中 $\theta$ 代表所有参数的向量)几乎总 是非凸的。这意味着与凸函数(看起来像一个碗)不同,损失函数可以有多个局部最小值:即在其直接邻域内损失值较低的点,但这些点不一定是整个空间中可达到的最低损失(全局最小值)。为何存在非凸性?连续层中使用的非线性激活函数(如ReLU、sigmoid、tanh)以及网络的组合结构($output = f_L(...f_2(f_1(input; \theta_1); \theta_2)...; \theta_L)$)共同作用,在参数 $\theta$ 与最终损失 $L$ 之间建立了高度复杂、非线性的关系。简单的操作,例如在某一层中交换两个相同的隐藏单元,可以产生完全相同的网络输出,但却对应于参数空间 $\theta$ 中的不同点,这直接意味着存在多个等价的最小值,从而导致非凸性。鞍点的普遍性尽管最初认为存在众多局部最小值是非凸优化的主要困难,但研究表明,对于深度学习中常见的高维问题,鞍点可能是一个更重要的障碍。鞍点是梯度 $\nabla L(\theta)$ 为零(或非常接近零)的位置,就像最小值或最大值一样,但它不是局部极值点。相反,函数在某些方向上向上弯曲,在另一些方向上向下弯曲,就像马鞍或山隘。从数学角度看,在鞍点处,海森矩阵 $\nabla^2 L(\theta)$(二阶偏导数矩阵)同时具有正负特征值。为何鞍点会带来问题?梯度为零: 梯度下降等一阶优化方法仅依靠梯度 $\nabla L(\theta)$ 来确定更新方向。在鞍点附近,梯度变得非常小,导致优化器速度急剧下降,可能需要指数级长的时间才能逃离。高维度的普遍性: 在高维度空间中,鞍点的数量远多于局部最小值。要使一个点成为局部最小值,海森矩阵必须是半正定(所有特征值 $\ge 0$)。而要成为鞍点,海森矩阵只需要有一些正特征值和一些负特征值。随着维度的增加,遇到梯度接近零的鞍点的概率会显著提高。简单的SGD在有效处理鞍点时可能遇到困难。结合动量或自适应学习率的方法(在第三章中介绍)通常能更好地处理鞍点,通过积累速度或根据梯度历史调整步长,有助于“越过”与鞍点相关的平坦区域。二阶方法利用海森信息,可以明确识别逃逸方向(负曲率方向),但对于大型网络来说,计算海森矩阵通常过于昂贵。{ "layout": { "title": "2D损失特点", "xaxis": { "title": "参数 1 (\u03b8\u2081)", "showgrid": false, "zeroline": false, "visible": false }, "yaxis": { "title": "参数 2 (\u03b8\u2082)", "showgrid": false, "zeroline": false, "visible": false }, "hovermode": false, "margin": { "l": 10, "r": 10, "t": 40, "b": 10 } }, "data": [ { "type": "contour", "z": [ [10, 9, 8, 7.5, 8, 9, 10], [9, 7, 5, 4, 5, 7, 9], [8, 5, 2, 1, 2, 5, 8], [7.5, 4, 1.5, 1.8, 1.5, 4, 7.5], [8, 5, 3, 3.5, 3, 5, 8], [9, 7, 6, 6.5, 6, 7, 9], [10, 9, 8, 7.5, 8, 9, 10] ], "colorscale": [ [0, "#a5d8ff"], [0.2, "#74c0fc"], [0.4, "#4dabf7"], [0.6, "#339af0"], [0.8, "#228be6"], [1, "#1c7ed6"] ], "contours": { "coloring": "heatmap", "start": 1, "end": 10, "size": 1 } }, { "type": "scatter", "x": [3], "y": [2], "mode": "markers+text", "marker": { "color": "#f03e3e", "size": 12, "symbol": "x" }, "text": ["局部最小值"], "textposition": "top right" }, { "type": "scatter", "x": [3], "y": [3], "mode": "markers+text", "marker": { "color": "#7048e8", "size": 12, "symbol": "circle-open" }, "text": ["鞍点"], "textposition": "bottom center" }, { "type": "scatter", "x": [1.5, 4.5], "y": [4, 4], "mode": "markers+text", "marker": { "color": "#82c91e", "size": 10, "symbol": "diamond" }, "text": ["平坦区域", "平坦区域"], "textposition": "middle right" }, { "type": "scatter", "x": [3.5], "y": [0.5], "mode": "markers+text", "marker": { "color": "#f03e3e", "size": 12, "symbol": "x" }, "text": ["尖锐最小值"], "textposition": "bottom left" } ] }简化的2D投影,展示了潜在的特征:局部最小值、鞍点(梯度平坦,但曲率变化)以及更平坦的高原区域。实际的“地形”存在于更高的维度中。高原区域与平坦区域另一个常见特点是存在大片相对平坦的区域,称为高原区域。在这些区域,损失函数在参数空间中经过较大距离时变化非常缓慢,这意味着梯度 $\nabla L(\theta)$ 始终很小。在高原区域进行优化可能会变得极其缓慢,类似于鞍点附近的减速。这种现象有时与非常深的神经网络中梯度消失问题相关联,在该问题中,梯度难以通过许多层进行反向传播。归一化(本章后面会讨论)和残差连接等技术在一定程度上被提出,以缓解这些平坦区域并改善梯度流动。尖锐最小值与平坦最小值并非所有最小值在泛化能力方面都是相同的。设想两个最小值,A和B,它们在训练数据上达到大致相同的低损失值。最小值A是尖锐的:如果您在参数空间中稍微偏离最小值点,损失会非常迅速地增加。最小值B是平坦的:损失在最小值点周围的更宽广区域内保持较低。越来越多的证据表明,收敛到更平坦最小值的优化器通常能使模型对未见数据具有更好的泛化能力。其道理是,如果损失在解决方案附近是平坦的,那么输入数据的微小变化(导致略微不同的最优参数设置)不太可能引起损失的大幅增加或模型预测的显著改变。有趣的是,优化算法的选择及其参数(如批量大小和学习率)可以影响优化器是倾向于找到尖锐最小值还是平坦最小值。例如,在SGD中使用更大的批量大小通常与收敛到尖锐最小值相关,而较小的批量大小(引入更多噪声)可能会进行更充分的搜寻并找到更平坦的最小值。Adam等自适应方法也在此背景下被研究,尽管它们之间的关系复杂且仍在进行中。认识这些多种多样的特点——高维度、非凸性、鞍点多于局部最小值、高原区域,以及尖锐最小值和平坦最小值之间的区别——非常重要。这些特点解释了为何优化深度网络充满挑战,以及为何从自适应学习率到归一化层和仔细的初始化等特定技术已成为标准做法。这些特点直接影响我们所用优化算法的行为、收敛速度和泛化性能。