背景
ReLU 神经网络的单个输出,限制在输入空间的一条线段 [xα, xβ] 上,是一个分段线性函数。每个斜率变化的"拐点"恰对应一个神经元的临界点 —— 找到全部拐点,是提取网络参数的关键一步。FindCriticalPoints 只用黑盒查询 f(x) 完成这件事,且查询次数为多项式级。
第 1–8 行:线性检测
先看中点函数值是否落在弦的中点上(第 3 行)。只看这一个条件不够:对称的双拐点也会通过。于是比较两端点处的数值斜率 mα、mβ(第 4–5 行):斜率不同 ⇒ 区间内有多个临界点;斜率相同则可能是"同一条直线"(无临界点),也可能是"两条平行线"(论文图 7a,多个临界点)——再用中点 x₀ 左右两侧的斜率区分(第 6–8 行)。
第 11–14 行:候选与三重验证
用过 (xα, yα) 斜率 mα 的直线与过 (xβ, yβ) 斜率 mβ 的直线的交点作为候选 x*。当且仅当三者同时成立才确认为临界点:(i) f(x*) = f̂(x*)(函数值与交点预测吻合);(ii) 左右导数不等(真的是拐点而非光滑点);(iii) x* 落在区间内。条件 (ii)(iii) 用于排除图 7c / 7d 的误报情形。
第 15 行:分裂递归
验证失败 ⇒ 区间内不止一个临界点(或没有),从中点一分为二递归。ε 是数值微商步长,论文要求"ε 充分小,使得没有其它神经元在 ε 范围内翻转":若某临界点恰落在某次分裂点的 ε 范围内,端点斜率估计会被污染,算法将分裂至深度上限而漏检 —— 这是算法完备性对该假设的真实依赖。演示中命中这种退化情形会自动换一组随机函数(右上角"退化跳过"如实计数),ε 越大越容易触发,可以拖动验证这一点。