想象你进山找最低点,带了一双“防滑登山鞋”。向导告诉你:只要找到一块脚下不打滑的平地,那就是最低点。你照做了,却站上一处奇特的隘口——往前是上坡,往后是上坡,可左右两侧竟然都在下坡。你恍然大悟:脚下平,不等于最低点,也可能站在马鞍上。 真正的碗底长什么样?不光脚下要平,朝任何一个方向迈步都必须是上坡。可“任何一个方向”有无限多个,怎么查得完?今天的秘密武器是一台“碗形体检仪”——学名海森矩阵。它只需报出几个特征值,就能告诉你:这座山是不是一个规规矩矩的大碗(凸函数)。如果是碗,那么你找到的任何一个“脚下平”的点,都是全局最低点;如果不是碗,就别指望轻松捡到全局最优。 这就是机器学习里最常用的一招:二阶条件判定凸性。拿到一个损失函数,先体检,再决定用多大力气优化。
对 AI 从业者的价值:训练模型前先给损失函数做凸性体检,能避免在非凸“马鞍山”上浪费大量算力找不存在的全局最优,是选择优化算法、判断收敛结果可信度的基本功。
目录
可视化演示
展示海森矩阵构建与特征值分析、半正定判定方法、凸函数与非凸鞍点曲面对比,理解二阶凸性条件的几何意义。
本节配有交互动效(进入视口后自动加载,约 3KB)。
海森矩阵构建与特征值分析 海森矩阵由所有二阶偏导数构成 特征值符号决定函数凸性 H_ij = ∂²f/∂x_i∂x_j 对称矩阵描述曲率分布
凸函数定义:先认识“碗”本身
去超市买碗,你会怎么挑?你会仔细端详内壁:要是某一侧朝下弯,水一倒就会从那里翻出来,那叫漏碗。凸函数就是这么一口规规矩矩的大碗:内壁处处向上弯,任意两点之间拉一根绷紧的弦,弦永远悬在碗壁上方(或恰好贴着碗壁),绝不会嵌进碗壁里。
换句话说,如果你在碗口上抓两个点 x 和 y,站在两点之间某个位置 \(\theta x + (1-\theta)y\) 上,碗壁的高度不会超过两点高度按同一比例掺出来的值。这就是著名的 Jensen 不等式,它是凸函数最根本的“碗形定义”。
买碗只看一眼轮廓还不够,后面我们要学的是“摸”出它是不是碗——这就轮到二阶条件登场了。
- 插值权重 θ\(\theta\) 是 0 到 1 之间的小数,相当于在 x 走向 y 的路上走了百分之多少。\(\theta=0\) 站在 x 上,\(\theta=1\) 站在 y 上。
- 连线上的点\(\theta x + (1-\theta)y\) 是 x 和 y 连线段上的某个中间点,碗口上方的位置。
- 碗壁高度左边 \(f(\theta x + (1-\theta)y)\) 是中间点处函数图像(碗壁)的真实高度。
- 弦的高度右边 \(\theta f(x) + (1-\theta)f(y)\) 是把两点高度按同一比例掺出来的值,也就是绷紧的弦在中间点处的高度。
- 不等号方向弦的高度 ≥ 碗壁高度,说明弦悬在碗壁上方——这是“碗”的签名。若不等号反向,则是凹函数这口倒扣的锅盖。
二阶条件原理:从“脚下平”到“处处上弯”
回到开头的山谷。向导教你的“站在不滑的地方”是一阶条件:梯度等于零。可马鞍点同样不滑,你被坑了。问题在于一阶条件只关心“脚下平不平”,不关心“周围是不是都在上坡”。而“周围”的信息藏在二阶导里,也就是曲率。
数学上用泰勒展开把这句话精确化:函数在某个点附近的高度,可以拆成“当前高度 + 坡度带来的变化 + 弯曲带来的修正”。前两项是一阶信息,第三项里面出现了海森矩阵——它正是那台碗形体检仪的核心零件。
所以判定凸性的思路呼之欲出:站在梯度为零的点,再检查海森矩阵是否让“任何方向都向上弯”。若成立,这个点就是真正的碗底。接下来我们拆开这台体检仪,看看里面到底有什么零件。
- 零阶项,当前高度\(f(x)\) 是你现在站的位置的碗壁高度,泰勒展开的起点。
- 一阶项,坡度投影\(\nabla f(x)^\top p\) 是梯度(坡度向量)与位移 p 的内积,告诉你在 p 方向上高度是升还是降、坡有多陡。
- 二阶项,曲率修正\(\frac{1}{2}p^\top \nabla^2 f(x)\, p\) 是弯曲带来的修正,其中海森矩阵 \(\nabla^2 f(x)\) 把所有方向的弯折信息打包在一起。
- 近似条件这个等式在 p 足够小(走得够近)时成立,因为更高阶的小量可以忽略。
海森矩阵入门:碗形体检仪说明书
体检仪正面只有一个旋钮、一根探头,可原理图里全是密密麻麻的交叉线。海森矩阵就是那张原理图:它是一个 \(n \times n\) 的方阵,第 i 行第 j 列的元素,是函数先对第 i 个变量求导、再对第 j 个变量求导的结果。
对一维函数来说,它退化成一个数——二阶导 \(f''(x)\),也就是曲线的弯曲度。对二维函数,它变成 2×2 的矩阵,左上角管 x₁ 方向的弯曲,右下角管 x₂ 方向的弯曲,副对角线管两个方向的“交叉拉扯”。
有了这台体检仪,下一步就是学会读体检报告——也就是判断海森矩阵是不是“半正定”,这决定了函数是不是一口合格的碗。
- 行列下标i 和 j 分别表示矩阵的第 i 行、第 j 列,对应自变量 x_i 和 x_j 两个方向。
- 分子二阶偏导\(\partial^2 f\) 表示对函数做两次求导运算,捕捉“变化的加速度”。
- 分母两次方向\(\partial x_i \partial x_j\) 表示先对 x_j 求导、再对 x_i 求导。顺序写反含义不变,这就是著名的对称性。
- 漂亮的对称只要函数二阶连续可导,海森矩阵一定对称,即 \(H_{ij}=H_{ji}\),交叉方向的拉扯是相互的。
半正定判定:体检报告怎么看
拿到体检单,最醒目的指标是“特征值”。海森矩阵有 n 个特征值,每个特征值对应一个独立的“纯方向”:特征值正,说明沿这个方向碗壁向上弯;特征值负,说明沿这个方向碗壁向下弯;特征值为零,说明这个方向是平的、不弯不拐。
判定结论简单粗暴:把所有特征值扫一遍,只要全部 ≥ 0(半正定),函数就是凸的;只要有一个 < 0,函数就非凸。这比拿着二次型定义挨个方向验证快得多。
除了特征值法,还有两个常用判据:方向验证法(对任意非零 p,都有 \(p^\top H p \ge 0\))和主子式法(所有顺序主子式 ≥ 0)。三者各有利弊——特征值法最直观,主子式法适合手算小矩阵,方向验证法是定义本身。记住:全非负是底线,若全部特征值 > 0,就是更严格的“正定”,对应严格凸。
- 特征值\(\lambda_i\) 是海森矩阵的第 i 个特征值,对应第 i 个主方向上的曲率大小。
- 全非负每一个特征值都 ≥ 0,意思是所有主方向上都不能出现“向下弯”。
- 半正定记号\(H \succeq 0\) 是“半正定”的速记符号,读作“H 半正定”。
- 等价关系特征值全非负 与 半正定 是同一件事的两种表述,后者是矩阵层面的结论,前者是数值层面的检查方法。
常见函数凸性:几口常碰到的碗
食堂里常见的碗,你一眼就能认出来;优化里常见的函数,也要练就一眼定凸性的功夫。指数函数、二次函数、范数、线性函数,是机器学习里出现频率最高的四口“碗”。
指数函数 \(e^x\) 的一阶导、二阶导都是自己,永远大于零,所以它是一口永远不会漏的碗。线性函数 \(ax + b\) 的海森矩阵是零矩阵,零矩阵没有下弯的方向,也算半正定——它是一口“平板碗”,凸但不严格凸。范数函数 \(\|x\|_2\) 除了原点外,海森矩阵也处处半正定,高维空间里的“距离”天然是碗形。最值得记的是二次函数:它的海森矩阵就是二次项系数矩阵本身,体检结果一眼就能从矩阵看出来。
举一个实战例子:最小二乘的损失 \(\frac{1}{2}\|y - Xw\|^2\) 展开后是 w 的二次函数,它的海森矩阵是 \(X^\top X\)——这是统计里出了名的半正定矩阵,所以线性回归的目标函数永远是凸的,闭着眼睛梯度下降都能收敛到全局最优。
- 二次项\(x^\top A x\) 是曲面的“碗形骨架”,A 直接决定每个方向的弯曲大小。
- 一次项\(b^\top x\) 只是把碗平移、倾斜一下,不改变弯曲性质。
- 常数项c 只负责把碗整体抬高或降低,对凸性毫无影响。
- 核心结论求两次导后,海森矩阵恰好等于 A。所以判断二次函数凸不凸,就是判断 A 半不半正定。
几何意义:碗、马鞍与等高线
为什么特征值符号这么灵?因为几何上它讲了一个非常直白的故事。函数图像是一张地形曲面,海森矩阵的特征值告诉你:站在某一点,往各个方向看,地形是上坡、下坡还是平路。全部方向都上坡,你就是站在一口碗的碗底;全部方向都下坡,你是站在锅盖顶上;有的方向上坡、有的方向下坡,对不起,你站在马鞍上。
马鞍有两个特征值一正一负,它是非凸函数的标志性地貌。深度学习中,高维损失函数里密密麻麻都是马鞍点,梯度为零却既不是极大也不是极小。学会识别鞍点,是理解优化困难的关键一步。
几何直觉可以继续延伸到等高线:凸函数的等高线是一圈一圈的椭圆(碗从上面看就是同心椭圆),鞍点的等高线则是交叉的双曲线。下次画损失函数的等高线图,一眼就能分辨自己是掉进了碗里还是卡在了马上。
- 最小特征值\(\lambda_{\min}(H)\) 是碗壁最“塌”的那个方向,只要它是负的,就存在一个下坡方向。
- 最大特征值\(\lambda_{\max}(H)\) 是碗壁最“鼓”的方向,大于 0 说明至少有一个上坡方向。
- 鞍点判定一正一负同时出现,地形像马鞍——前后翘起、左右塌陷,梯度可以为零但绝不是碗底。
优化实战:体检之后怎么用
体检不是目的,治病才是。凸性判定在优化里的价值一句话就能说清:如果函数是凸的,那么任何局部最优都是全局最优;只要找到梯度为零的点,就可以放心交差。如果不是凸的,梯度为零的点可能只是马鞍或局部小坑,得靠多起点、随机扰动或启发式算法碰运气。
所以专业的做法是“先体检、再优化”:开工前把目标函数的海森矩阵(或它的近似)算一算,看半不正定。线性回归、岭回归、Logistic 回归的负对数似然都是凸的,可以大胆使用牛顿法、拟牛顿法奔着全局最优去;深度神经网络的损失几乎都是非凸的,那就老老实实用 SGD 系列,别指望找到全局最优。
这套流程落到 AI 开发中,就是给损失函数做体检:先看它是不是已知的凸函数(MSE、交叉熵在特定模型下是),再看海森矩阵特征值,最后决定优化策略。体检合格,放心冲全局最优;体检不合格,换个战场打游击。
- 梯度为零\(\nabla f(x^) = 0\) 表示在 x\ 处脚下是平的,满足一阶必要条件。
- 海森半正定\(H(x^*) \succeq 0\) 表示所有方向都向上弯,满足二阶必要条件。
- 充要条件在凸函数的前提下,这两个必要条件合起来变成充分条件——找到这样的点,就是全局最优。
- 记号含义\(\arg\min\) 表示“使函数取最小值的那个自变量取值”,也就是我们苦苦寻找的碗底坐标。
判定注意事项:别让体检单骗了你
最后提醒几个容易翻车的细节。第一,半正定允许特征值等于零,这意味着存在“平地”方向——函数仍然是凸的,但最优点可能是一整条线、一整片区域,而不是孤零零一个点。第二,如果要求“唯一的最小值点”,需要更强的正定条件(所有特征值 > 0),这叫严格凸。
第三,数值计算时特征值永远不会精确等于零,判断“非负”要留容差,例如把 \(\lambda \ge -10^{-8}\) 都视为半正定。第四,海森矩阵在某一点半正定只能说明这一点附近是碗形;要断言整个函数凸,需要海森矩阵在定义域的每一个点都半正定。这就像检查一口碗得从上到下摸遍内壁,只摸碗底一处不算数。
记住这些边界条件,你手里的碗形体检仪就不会误报。半正定说“可以凸”,正定说“严格凸”,区分清楚,才能在优化和建模中做出正确判断。
- 最小特征值大于零所有方向弯曲都严格为正,不允许出现“平的”方向。
- 正定矩阵\(H \succ 0\) 表示正定,比半正定多了一条“不能有零曲率”的硬性要求。
- 严格凸正定对应严格凸,函数图像像一口“尖底碗”,任何两点之间拉的弦都严格悬在碗壁上方,最小值点唯一。
AI 应用场景
场景一:损失函数凸性体检
阶段:模型训练前的目标函数设计
解决的问题:训练前不确定损失函数是否凸,梯度下降可能陷入局部最优还浑然不觉。先算海森矩阵并检查半正定,就能判断该用“直奔全局最优”的牛顿法,还是“接受局部解”的 SGD。
具体案例:数据科学家在搭建线性回归时,把 MSE 损失 \(\frac{1}{2}\|y-Xw\|^2\) 的海森矩阵 \(X^\top X\) 算出来,确认特征值全非负,于是放心使用共轭梯度法一次收敛到全局最优;同样的流程套到神经网络上,发现海森矩阵存在负特征值,立刻改用 Adam 并加入随机重启。
场景二:金融组合优化的碗形地板
阶段:优化求解环节
解决的问题:马科维茨最小方差组合的优化目标 \(\frac{1}{2}w^\top \Sigma w\) 中,协方差矩阵 Σ 天然半正定,目标函数是凸二次函数。确认凸性后,可直接用二次规划求解器拿到全局最优资产配置,不必担心局部最优。
具体案例:量化团队在构建组合时,先对协方差矩阵做特征值分解,发现最小的几个特征值接近零,判定半正定但非正定,于是额外加入 L2 正则项把矩阵“顶”成正定,保证唯一的最优组合,再交给 QP 求解器计算。
场景三:深度学习非凸地形的清醒认知
阶段:深度网络训练与调参
解决的问题:深度网络的损失函数高度非凸,海森矩阵特征值有正有负,训练轨迹上充满鞍点。理解这一点后,工程师不会傻等“全局最优”,而是用批归一化、动量、学习率调度绕过鞍点区域。
具体案例:训练 ResNet 时,训练损失在某个 epoch 后停滞,工程师检查了海森矩阵的最大特征值与最小特征值,发现最小特征值为负,判定模型卡在鞍点附近,于是调大动量并引入余弦退火学习率,成功跃过鞍区继续下降。
Python 演示
import numpy as np def hessian(f, x, h=1e-4): """Numerical Hessian via central finite differences.""" n = len(x) H = np.zeros((n, n)) for i in range(n): for j in range(n): ei = np.zeros(n) ej = np.zeros(n) ei[i] = h ej[j] = h f_pp = f(x + ei + ej) f_pm = f(x + ei - ej) f_mp = f(x - ei + ej) f_mm = f(x - ei - ej) H[i, j] = (f_pp - f_pm - f_mp + f_mm) / (4 * h * h) return H def check_convex(f, x): H = hessian(f, x) eig = np.linalg.eigvalsh(H) if np.all(eig >= -1e-8): print("Hessian is PSD, eigenvalues:", eig.round(4)) print("-> f is convex near this point (bowl shape).") else: print("Hessian is NOT PSD, eigenvalues:", eig.round(4)) print("-> f is non-convex near this point (saddle or lid).") def f1(x): return x[0] ** 2 + 2 * x[1] ** 2 + x[0] * x[1] def f2(x): return x[0] ** 2 - x[1] ** 2 if __name__ == "__main__": print("Test 1: f1 = x1^2 + 2x2^2 + x1*x2") check_convex(f1, np.array([1.0, 1.0])) print("Test 2: f2 = x1^2 - x2^2") check_convex(f2, np.array([1.0, 1.0]))
def hessian(f, x, h=1e-4):定义数值海森计算函数,f 是目标函数,x 是考察点,h 是差分步长。ei[i] = h构造仅在 i 方向偏移一小步的扰动向量,用于探测该方向的二阶变化。H[i, j] = (f_pp - f_pm - f_mp + f_mm) / (4 * h * h)中心差分公式:用四个偏移点的函数值组合出混合二阶偏导。eig = np.linalg.eigvalsh(H)对对称矩阵调用高效特征值分解,返回全部实数特征值。if np.all(eig >= -1e-8):特征值全非负(留 1e-8 数值容差)判为半正定,函数在该点凸。def f1(x): return x[0] ** 2 + 2 * x[1] ** 2 + x[0] * x[1]正定二次型,海森矩阵特征值全正,应判定为凸。def f2(x): return x[0] ** 2 - x[1] ** 2经典马鞍面,海森矩阵特征值一正一负,应判定为非凸。
常见误区
误区只要令梯度等于零解出来的点,肯定就是最小值点。我以前都这么干的,好像也没出过问题。
正解梯度为零只说明“脚下平”,可能是碗底(极小值)、锅盖顶(极大值),也可能是马鞍点。必须配合海森矩阵看曲率:所有特征值 ≥ 0 才是极小值点。就像在山谷和山顶风都吹不动你,要判断高低得看四面八方的坡向。
为何常见:一维函数的图像里,驻点往往就是极值,这个直觉得意地推广到高维,结果撞上马鞍。
误区海森矩阵的每个元素都大于零,那它就是半正定的,函数就是凸的。
正解半正定是对任意方向向量 p 满足 \(p^\top H p \ge 0\),跟元素正负没有直接关系。比如 \(\begin{bmatrix}0&1\\1&0\end{bmatrix}\) 所有元素非负,特征值却是 1 和 -1,不定;而 \(\begin{bmatrix}1&-1\\-1&1\end{bmatrix}\) 有负元素,特征值 0 和 2,半正定。
为何常见:把标量的“正数”直觉硬套到矩阵上,没意识到矩阵的正定性是“沿所有方向投影”后的事。
误区凸函数的图像是碗,碗就应该只有一个最低点,不然怎么叫碗?
正解半正定允许特征值为零,意味着某个方向可以是完全平的。比如 \(f(x,y)=x^2\) 的海森矩阵特征值是 2 和 0,它是凸函数,但整条 y 轴都是最低点。只有严格凸(海森正定、特征值全正)才保证唯一最小值点。
为何常见:把“凸”和“严格凸”混为一谈,忽略了特征值为零这条边界。
误区判断二元函数凸不凸,看 ∂²f/∂x₁² 大于零就行了,跟一元二次一样。
正解单个方向的二阶导只代表一个方向的曲率。交叉方向的混合偏导可能让另一个方向出现下弯,必须检查整个海森矩阵的所有特征值,或者所有方向上的二次型。
为何常见:一维情况海森退化为一个数,习惯了“看一个数”,升维后忘了方向数量也是指数级增加的。
误区损失函数不是凸的,优化就是碰运气,模型肯定训练不好。
正解深度学习的大多数损失都非凸,但 SGD 家族照样在实践里训练出顶尖模型。凸性保证的是“能找到全局最优”;非凸时我们接受一个足够好的局部解。判定凸性的意义在于选择正确的预期和策略,而不是一票否决。
为何常见:教材讲凸优化讲得太顺,让人以为只有凸问题才值得做,忽略了现实世界的非凸常态。
面试题
Q1. 设 \(f:\mathbb{R}\to\mathbb{R}\) 二阶可导,以下哪个条件能推出 f 是凸函数?
- A.f'(x)=0 在定义域内有解
- B.f''(x)≥0 在定义域内处处成立← 正确答案
- C.f'(x)>0 在定义域内处处成立
- D.f''(x) 在个别点大于 0
答案:B。一维凸函数的二阶充要条件是二阶导处处非负,就像碗壁每一处都向上弯。A 只保证有驻点、C 只保证单调上升、D 只保证个别点弯曲,都无法推出全局碗形。
Q2. 对二阶可导的多变量函数,海森矩阵半正定是函数凸的什么条件?
- A.充分不必要条件
- B.必要不充分条件
- C.充要条件← 正确答案
- D.既不充分也不必要条件
答案:C。在函数二阶连续可导的前提下,定义域内每一点海森矩阵都半正定,与函数凸等价。这是二阶条件的标准结论。A 和 B 都只说了一半,D 完全错误。
Q3. 函数 \(f(x_1,x_2)=x_1^2-x_2^2\) 的海森矩阵及凸性判断正确的是?
- A.[[2,0],[0,-2]],特征值一正一负,非凸← 正确答案
- B.[[2,0],[0,2]],特征值全正,凸
- C.[[1,-1],[-1,1]],半正定,凸
- D.[[-2,0],[0,2]],半正定,凸
答案:A。对 x₁ 求两次导得 2,对 x₂ 求两次导得 -2,交叉导为 0,所以海森矩阵是对角阵 [[2,0],[0,-2]],特征值 2 和 -2。一正一负说明它是一口马鞍,非凸。
Q4. 指数函数 \(f(x)=e^x\) 在实数域上的凸性如何?
- A.二阶导恒为正,函数凸← 正确答案
- B.一阶导恒为正,函数凸
- C.二阶导恒为正,函数凹
- D.无法判定
答案:A。e^x 求导还是 e^x,二阶导处处大于零,海森退化为正数,符合凸函数的二阶条件。B 的“一阶导为正”只能说明函数单调递增,与凹凸性无关。
Q5. 线性函数 \(f(x)=a^\top x+b\) 的海森矩阵及其凸性是?
- A.零矩阵,半正定,函数凸← 正确答案
- B.零矩阵,不定,函数不凸不凹
- C.一阶矩阵,正定,函数凸
- D.没有海森矩阵,线性函数不可判断
答案:A。线性函数求两次导全为零,海森矩阵是零矩阵。零矩阵的特征值全为 0,满足半正定,所以线性函数既是凸的也是凹的,是一口“平板碗”。
Q6. 关于鞍点处海森矩阵的特征值,下列说法正确的是?
- A.全部特征值大于 0
- B.全部特征值小于 0
- C.特征值既有正又有负← 正确答案
- D.特征值全部为 0
答案:C。鞍点的地形是一个方向向上弯、另一个方向向下弯,对应海森矩阵特征值一正一负。全正是碗底,全负是锅盖顶,全零是平地。记住“马鞍”两个字,特征值必然正负兼有。
Q7. 二次函数 \(f(x)=\frac{1}{2}x^\top A x+b^\top x+c\)(A 对称)为凸函数的充要条件是?
- A.A 的所有元素为正
- B.A 半正定← 正确答案
- C.A 的行列式大于 0
- D.A 的迹大于 0
答案:B。二次函数的海森矩阵就是 A,凸性直接等价于 A 半正定。元素为正既不充分也不必要;行列式大于 0 只能排除个别情况;迹大于 0 无法保证所有方向都上弯。
Q8. 以下哪些方法可以判断海森矩阵是否半正定?
- A.所有特征值 ≥ 0← 正确答案
- B.所有顺序主子式 ≥ 0← 正确答案
- C.矩阵所有元素为正
- D.对任意方向向量 p 有 \(p^\top H p \ge 0\)← 正确答案
答案:ABD。特征值法、主子式法、二次型定义法都是半正定的标准判据。C 是常见误区:元素全为正既不充分也不必要,矩阵的正定性是“对方向”而言的,不是“对元素”而言的。
Q9. 设 f 是凸函数,以下说法正确的有?
- A.f 的定义域必须是凸集← 正确答案
- B.f 的下水平集 \(\{x\mid f(x)\le c\}\) 是凸集← 正确答案
- C.f 的负函数 \(-f\) 仍是凸函数
- D.f 在凸集上的任意局部最小值都是全局最小值← 正确答案
答案:ABD。凸函数定义本身就要求定义域是凸集(A 对);下水平集是凸集是凸函数的基本性质(B 对);负函数会把碗倒扣成锅盖,变成凹函数(C 错);凸函数的关键福利就是局部最优即全局最优(D 对)。
Q10. 在机器学习中,关于凸性判定的实际意义,正确的有?
- A.MSE 损失对线性回归参数是凸的,可放心收敛到全局最优← 正确答案
- B.深度网络的损失一般非凸,仍可用梯度下降求近似解← 正确答案
- C.只要损失非凸,梯度下降就完全无法工作
- D.凸性体检结果决定了优化算法的选择← 正确答案
答案:ABD。MSE 的二次结构保证凸性(A 对);深度网络非凸但 SGD 在实践中很有效(B 对);非凸不等于不可优化,只是不保证全局最优(C 错);先体检再选算法正是凸性分析的价值(D 对)。