泰勒展开的前提是“函数足够光滑”(可导,甚至二阶可导)。但真实世界里到处是“不可导”的函数,怎么办?
答案是:用其他工具替代泰勒展开。我们分三个层次来说。
层次一:为什么不可导就没法用泰勒?
泰勒展开的本质是用多项式去匹配各阶导数。
- 一阶近似需要 (f’(x_0)) 存在
- 二阶近似需要 (f’'(x_0)) 存在
如果函数在某个点尖刺、折断、有角,导数根本不存在,那泰勒展开就没有意义(不能直接套用)。
例:(f(x) = |x|) 在 (x=0) 处
- 左导数 = -1,右导数 = +1
- 导数不存在 → 无法写出泰勒展开
层次二:那怎么近似不可导的函数?
方法 1:分段处理
把不可导点当作分界点,在每一段内部函数是光滑的,分别泰勒展开。
例:(f(x) = |x|)
- (x<0):(f(x) = -x),泰勒就是它自己
- (x>0):(f(x) = x),泰勒也是它自己
- 在 (x=0) 处不展开,只做左右极限
这是工程上最常用的方法:避开“坏点”。
方法 2:用次导数 / 次梯度(优化领域)
对于凸但不可导的函数(如 (|x|)、ReLU),有次导数的概念:
- 在 (x=0) 处,(f(x)=|x|) 的次导数是 ([-1, 1])(任何介于 -1 和 1 之间的数都可以算“广义斜率”)
机器学习里的ReLU(max(0,x)\max(0,x)max(0,x))在 (x=0) 也不可导,但实践中直接取 0 或 1 作为“伪导数”,就是用了次梯度思想。
方法 3:数值差分(不要解析导数)
如果你没有公式,只有函数值,可以用差商代替导数:
f′(x0)≈f(x0+h)−f(x0)h f'(x_0) \approx \frac{f(x_0+h) - f(x_0)}{h}f′(x0)≈hf(x0+h)−f(x0)
即使函数在 (x_0) 不可导,这个差分仍然有定义,只是不收敛到唯一值。
这是计算机做近似优化的常用手段。
层次三:泰勒展开的地位——光滑函数的特权
| 函数类型 | 泰勒展开 | 替代方案 |
|---|---|---|
| 光滑(无穷可导) | ✅ 最理想,高精度 | — |
| 有限次可导(如 (x^{1.5}) 在 0) | ⚠️ 可用,但余项不同 | 用低阶展开,注意误差 |
| 连续但不可导(如 ( | x | )) |
| 不连续 | ❌ 完全无效 | 其他数值方法(插值、逼近论) |
泰勒展开是“光滑函数”的专属利器。遇到不可导,就要换工具。
真实案例:机器学习中的 ReLU
ReLU 函数:(f(x) = \max(0, x))
- (x<0):(f=0),导数为 0
- (x>0):(f=x),导数为 1
- (x=0):不可导
实践中怎么用泰勒?
不直接用。而是:
- 在 (x\neq 0) 时用一阶近似
- 在 (x=0) 处人为规定“次导数”为 0 或 1(通常取 0)
- 这称为次梯度下降,是深度学习的标准做法
本质:放弃严格的泰勒展开,改用广义的“近似更新规则”。
一句话总结
泰勒展开要求函数可导。如果不可导,你有三条路:
1️⃣ 避开坏点,分段展开
2️⃣ 用次导数(广义斜率)
3️⃣ 用数值差分代替导数现实世界不总是光滑的,所以我们需要一整套**“不需要导数”的近似工具**。
我们直接算一个不可导函数f(x)=∣x∣f(x) = |x|f(x)=∣x∣在x0=0x_0 = 0x0=0附近的例子。
你会看到:泰勒展开在这里彻底失效,但数值差分仍然能给你一个“能用的近似”。
第一步:为什么泰勒展开失效?
在x0=0x_0 = 0x0=0处:
- 左导数:limx→0−∣x∣−0x=−xx=−1\lim_{x \to 0^-} \frac{|x| - 0}{x} = \frac{-x}{x} = -1limx→0−x∣x∣−0=x−x=−1
- 右导数:limx→0+∣x∣−0x=xx=1\lim_{x \to 0^+} \frac{|x| - 0}{x} = \frac{x}{x} = 1limx→0+x∣x∣−0=xx=1
导数不存在 → 无法写出f(0)+f′(0)⋅Δxf(0) + f'(0) \cdot \Delta xf(0)+f′(0)⋅Δx。
强行“假装”可导会怎样?
如果你硬选一个“伪导数”(比如取 0),你得到:
f(0.1)≈0+0×0.1=0 f(0.1) \approx 0 + 0 \times 0.1 = 0f(0.1)≈0+0×0.1=0
但真实值是0.10.10.1→ 误差 100%。
第二步:用数值差分(不要解析导数)
数值差分不依赖导数存在,只依赖函数值。
前向差分公式:
f′(0)≈f(0+h)−f(0)h f'(0) \approx \frac{f(0+h) - f(0)}{h}f′(0)≈hf(0+h)−f(0)
取h=0.1h = 0.1h=0.1:
∣0.1∣−00.1=0.10.1=1 \frac{|0.1| - 0}{0.1} = \frac{0.1}{0.1} = 10.1∣0.1∣−0=0.10.1=1
取h=−0.1h = -0.1h=−0.1(从左逼近):
∣−0.1∣−0−0.1=0.1−0.1=−1 \frac{|-0.1| - 0}{-0.1} = \frac{0.1}{-0.1} = -1−0.1∣−0.1∣−0=−0.10.1=−1
结果不同,但这恰好反映了真实情况:左、右斜率不同。
第三步:用差分结果做“类泰勒近似”
我们想预测f(0.1)f(0.1)f(0.1),但0.1>00.1 > 00.1>0,所以用右差分得到的斜率111更合理。
构造“数值一阶近似”:
f(0.1)≈f(0)+(右差分)×0.1=0+1×0.1=0.1 f(0.1) \approx f(0) + (\text{右差分}) \times 0.1 = 0 + 1 \times 0.1 = 0.1f(0.1)≈f(0)+(右差分)×0.1=0+1×0.1=0.1
✅ 完全精确!(因为∣x∣|x|∣x∣在x>0x>0x>0就是直线)
如果预测f(−0.1)f(-0.1)f(−0.1),用左差分 (-1):
f(−0.1)≈0+(−1)×(−0.1)=0.1 f(-0.1) \approx 0 + (-1) \times (-0.1) = 0.1f(−0.1)≈0+(−1)×(−0.1)=0.1
真实值也是0.10.10.1✅
第四步:如果函数更“不可导”呢?
考虑f(x)=∣x∣0.5f(x) = |x|^{0.5}f(x)=∣x∣0.5在x=0x=0x=0附近(尖刺更严重)
| x | 真实值 | 一阶近似(用右差分 h=0.01) | 误差 |
|---|---|---|---|
| 0.01 | 0.1 | 0.1(斜率≈10,近似 0+10×0.01=0.1) | 0 |
| 0.04 | 0.2 | 0.4(斜率≈10,近似 0+10×0.04=0.4) | 100% |
❌ 误差巨大,因为函数不是线性的,即使做了差分,一阶近似在更大步长下仍然失败。
第五步:结论对比表(以x=0.04x=0.04x=0.04为例)
| 方法 | 预测f(0.04)f(0.04)f(0.04) | 真实值 0.2 | 适用性 |
|---|---|---|---|
| 假装可导 + 泰勒 | 无法定义 | — | ❌ 根本不能用 |
| 数值差分 + 线性近似 | 0.4 | 0.2 | ⚠️ 误差 100% |
| 分段精确表达式 | 0.2 | 0.2 | ✅ 完美(但需要知道分段形式) |
一句话总结
泰勒展开在不可导点直接崩溃。
数值差分能给你一个“伪斜率”,用它做的线性近似在不可导点附近可能有用,但如果函数在局部非线性很强(如∣x∣\sqrt{|x|}∣x∣),线性近似会迅速失效。
真正的解决办法是:避开坏点,或者用更复杂的非光滑优化方法(次梯度、近端算子等)。