在机器学习模型中寻找最优参数本质上是一个优化问题。这个寻找过程的难易程度很大程度上取决于我们想要最小化的函数的特点,通常我们称之为损失函数或目标函数。在这些特点中,凸性是一种显著的性质,当它存在时,会极大简化优化过程。让我们来看看凸性为何如此重要。凸集在讨论凸函数之前,我们需要理解凸集。向量空间中的一个集合$C$被称为凸集,如果对于集合$C$中任意两点$x$和$y$,连接$x$和$y$的整个线段也包含在$C$中。数学上,这意味着对于任意介于0和1之间(含0和1)的标量$\lambda$,点$\lambda x + (1-\lambda)y$也必须是$C$的元素。简单的几何形状可以说明这个思想:实心球体、立方体或任何实心三角形都是凸的。相反,像新月形或甜甜圈(环面)一样的集合不是凸的,因为可以在集合中找到某些点对,它们之间的线段会部分地落在集合之外。在许多机器学习优化情形中,我们在整个$\mathbb{R}^d$空间(其中$d$是参数的数量)上优化参数,这本身就是一个凸集。然而,有时会施加限制(例如,参数的非负性限制),这可能为优化定义一个更具体的凸定义域。凸函数在确立了凸集的定义之后,我们可以定义凸函数。一个定义域为凸集$C$的函数$f$如果满足以下条件,则被归类为凸函数:其图形在连接图上任意两点的线段上方从不向上弯曲。形式上,对于$C$中任意两点$x, y$和任意标量$\lambda \in [0, 1]$,以下不等式必须成立: $$f(\lambda x + (1-\lambda)y) \le \lambda f(x) + (1-\lambda)f(y)$$ 这个不等式表达了核心思想:在插值点($\lambda x + (1-\lambda)y$)处计算的函数值小于或等于原始点$x$和$y$处函数值的线性插值。如果当$x \neq y$且$\lambda$严格介于0和1之间(即$\lambda \in (0, 1)$)时,此不等式严格成立($<$),该函数被称为严格凸函数。严格凸函数具有一个更强的性质:它们严格地向上弯曲,远离任何切线。凸性的可视化考虑函数$f(x) = x^2$。如果你在其抛物线图上选择任意两点,并在它们之间画一条直线(弦),抛物线本身将始终位于该线下方或触及该线。它从不会在弦上方凸起。这是凸性的视觉标志。{"layout":{"xaxis":{"title":"参数值 (x)","range":[-2.5,2.5]},"yaxis":{"title":"损失函数 f(x)","range":[-1,6.5]},"title":"凸性示例","showlegend":true,"legend":{"yanchor":"top","y":0.99,"xanchor":"left","x":0.01}},"data":[{"x":[-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5],"y":[6.25,4,2.25,1,0.25,0,0.25,1,2.25,4,6.25],"mode":"lines","name":"f(x) = x^2 (凸函数)","line":{"color":"#339af0","width":2}},{"x":[-2,1.5],"y":[4,2.25],"mode":"lines","name":"弦","line":{"color":"#f03e3e","dash":"dash","width":2}},{"x":[-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5],"y":[1.84039,0.71563,0.31201,1.00062,2.14836,2.7,2.14836,1.00062,0.31201,0.71563,1.84039],"mode":"lines","name":"g(x) (非凸函数)","line":{"color":"#ae3ec9","width":2}},{"marker":{"color":["#1c7ed6","#1c7ed6"],"size":8},"mode":"markers","name":"凸函数上的点","x":[-2,1.5],"y":[4,2.25]}]}蓝色曲线($f(x)=x^2$)展示了凸性;连接曲线上两点的虚线红色弦始终位于曲线之上或与曲线接触。紫色曲线表示一个非凸函数,在这种情况下,弦可以穿过函数图的一部分下方。凸性为什么能简化优化:全局最小值优化凸函数的主要好处源于一个显著的性质:凸函数找到的任何局部最小值都被保证是全局最小值。设想你正在使用像梯度下降这样的优化算法。如果算法在某点$x^$停止,因为它在当前附近找不到更低的值(使得$x^$成为局部最小值),凸性保证$x^*$实际上是整个定义域上函数值最低的点。你无需担心算法会陷入次优的“山谷”,而其他地方存在更深的山谷。直观理解: 假设$x^$是一个局部最小值,但存在另一个点$y$,使得$f(y) < f(x^)$。由于$f$是凸函数,沿着从$x^$到$y$的线段上的函数值必须位于连接$(x^, f(x^))$和$(y, f(y))$的弦下方。那么,该线段上任意接近$x^$的点将具有低于$f(x^)$的函数值。这与$x^$是局部最小值的前提相矛盾。因此,不存在这样的$y$使得$f(y) < f(x^*)$。唯一性: 如果函数是严格凸的,那么这个全局最小值也是唯一的。只有一个点可以达到最低的可能值。最小值集合: 对于非严格凸的凸函数(例如常数函数$f(x) = c$),实现全局最小值的点集本身也是一个凸集。梯度下降在凸函数上的行为当处理可微分的凸函数时,梯度$\nabla f(x)$会可靠地指向“上坡”方向。沿着相反方向,即$-\nabla f(x)$移动,能保证函数值降低。标准的梯度下降算法,使用$x_{t+1} = x_t - \eta \nabla f(x_t)$规则更新参数,理论上保证会收敛到全局最小值,前提是使用了合适的步长(学习率)$\eta$。尽管达到最小值的路径可能呈锯齿状,尤其是在更高维度中,它最终会达到全局最优解,而不会永久地停留在其他地方。凸性在机器学习实践中的应用许多基础的机器学习算法都受益于凸目标函数:使用均方误差(MSE)损失的线性回归。使用对数损失(交叉熵损失)的逻辑回归。使用铰链损失的支持向量机(SVMs)(以其标准原形式或对偶形式)。然而,当我们转向深度学习时,情况发生了巨大变化。深度神经网络相关的损失函数通常是高度非凸的。它们表现出复杂的几何形状,包含许多局部最小值、鞍点和平坦区域(高原),使优化变得更具挑战性。尽管如此,理解凸性仍然十分重要:基准: 它为分析提供了一个理论基准。对于凸问题表现良好的算法,通常作为开发非凸问题方法的起点。直观认识: 分析更简单的凸情况有助于建立对优化器行为的直观认识。识别难点: 它突出了非凸性带来的具体困难(例如区分局部最小值和全局最小值,或逃离鞍点),我们将在第1.5节(“非凸优化的挑战”)中讨论这些内容。检查凸性:海森矩阵对于二次可微分的函数,我们可以使用海森矩阵,记作$\nabla^2 f(x)$,来判断凸性。海森矩阵是一个包含$f$的二阶偏导数的方阵: $$[\nabla^2 f(x)]_{ij} = \frac{\partial^2 f}{\partial x_i \partial x_j}$$ 一个函数$f$在其凸定义域上是凸的,当且仅当其海森矩阵$\nabla^2 f(x)$在该定义域上的所有$x$处都是**半正定(PSD)的。如果对于所有非零向量$v$,矩阵$H$满足$v^T H v \ge 0$,则称$H$为半正定矩阵。 如果海森矩阵是正定(PD)**的(即对于所有$v \neq 0$,满足$v^T H v > 0$),那么函数$f$是严格凸的。尽管这提供了一个具体的数学检验方法,但计算海森矩阵并检查其定性对于大型机器学习模型来说,计算成本通常过高。具有$d$个参数的模型的海森矩阵有$d^2$个条目,当$d$达到数百万或数十亿时,这不切实际地难以存储或分析。尽管如此,这个思想对于理论理解和分析较小的问题仍然很重要。总之,凸性是优化中一个理想的性质,它保证局部最优解是全局最优解,并简化了梯度下降等算法的收敛性分析。尽管在深度学习等许多复杂机器学习场景中不具备凸性,但凸优化的研究为构建和理解更高级的优化技术奠定了基础。识别优化问题是否为凸问题是选择合适方法并设定其性能预期的第一步。