导数 $f'(x)$ 告知我们函数 $f(x)$ 在任意给定点 $x$ 处的斜率。思考一下如果斜率为零意味着什么。从图上看,零斜率对应一条水平切线。这些通常出现在哪里?它们常出现在函数图像的谷底(最小值)或山顶(最大值)。这一认识是优化的基础。临界点:变化发生之处导数 $f'(x)$ 等于零或未定义处,称为临界点。这些点是局部极小值和局部极大值的首要候选点。局部极小值是指比其所有紧邻点都低的点,而局部极大值是指比其紧邻点都高的点。为何把注意力放在 $f'(x) = 0$ 上?因为如果一个函数是平滑且可导的,它从递增(正斜率)变为递减(负斜率)形成一个峰值,或从递减变为递增形成一个谷值,唯有通过一个斜率暂时为零的点。以函数 $f(x) = x^2$ 为例。它的导数是 $f'(x) = 2x$。令 $f'(x) = 0$ 得到 $2x = 0$,所以 $x = 0$ 是唯一的临界点。我们直观地知道 $x=0$ 是抛物线 $y=x^2$ 的最小值。{ "layout": { "xaxis": { "title": "x", "range": [-3, 3] }, "yaxis": { "title": "f(x) = x^2", "range": [-1, 9] }, "title": "函数 f(x) = x^2 及其导数", "showlegend": true, "template": "plotly_white" }, "data": [ { "x": [-3, -2, -1, 0, 1, 2, 3], "y": [9, 4, 1, 0, 1, 4, 9], "mode": "lines", "name": "f(x) = x^2", "line": { "color": "#4263eb", "width": 2 } }, { "x": [-1.5, 1.5], "y": [0, 0], "mode": "lines", "name": "x=0 处的切线 (斜率为0)", "line": { "color": "#f03e3e", "dash": "dash", "width": 2 } }, { "x": [0], "y": [0], "mode": "markers", "name": "临界点 (x=0)", "marker": { "color": "#f03e3e", "size": 10 } } ] }函数 $f(x) = x^2$ 在 $x=0$ 处有最小值。在该点,切线是水平的,表明其斜率 $f'(0)$ 为 0。通过一阶导数对临界点进行分类知道一个点是临界点还不够。它是最小值、最大值,还是别的情况(比如在其他地方递增的函数中的一个平坦点,例如 $f(x)=x^3$ 在 $x=0$ 处)?一阶导数判别法通过考察临界点周围斜率的变化来对这些点归类。道理很简单:通过求解 $f'(x) = 0$ 来找出临界点(并注意 $f'(x)$ 未定义之处,尽管这在典型的机器学习成本函数中不常见)。在每个临界点 $c$ 的左右两侧选取略微靠近的测试值。在这些测试点评估导数 $f'(x)$ 的符号:如果 $f'(x)$ 在经过 $c$ 时从负值(函数递减)变为正值(函数递增),那么 $f$ 在 $c$ 处有局部极小值。可以想象滑雪下坡进入山谷 ($f'<0$),然后从另一边上坡 ($f'>0$)如果 $f'(x)$ 在 $c$ 处从正值(函数递增)变为负值(函数递减),那么 $f$ 在 $c$ 处有局部极大值。可以想象爬上山顶 ($f'>0$),然后从另一边下坡 ($f'<0$)如果 $f'(x)$ 在 $c$ 处没有改变符号(例如,两侧都是正值,或两侧都是负值),那么 $c$ 既不是局部极小值也不是局部极大值。它可能是一个有水平切线的拐点。例子: 我们来分析 $f(x) = x^3 - 3x$。 导数是 $f'(x) = 3x^2 - 3$。 令 $f'(x) = 0$: $$3x^2 - 3 = 0$$ $$3(x^2 - 1) = 0$$ $$3(x - 1)(x + 1) = 0$$ 临界点是 $x = 1$ 和 $x = -1$。现在,我们在由这些点定义的区间 $(-\infty, -1)$、 $(-1, 1)$ 和 $(1, \infty)$ 中查验 $f'(x) = 3(x-1)(x+1)$ 的符号。选取 $x = -2$(在 $(-\infty, -1)$ 中):$f'(-2) = 3(-2-1)(-2+1) = 3(-3)(-1) = 9$。因为 $f'(-2) > 0$,函数在 $(-\infty, -1)$ 上递增。选取 $x = 0$(在 $(-1, 1)$ 中):$f'(0) = 3(0-1)(0+1) = 3(-1)(1) = -3$。因为 $f'(0) < 0$,函数在 $(-1, 1)$ 上递减。选取 $x = 2$(在 $(1, \infty)$ 中):$f'(2) = 3(2-1)(2+1) = 3(1)(3) = 9$。因为 $f'(2) > 0$,函数在 $(1, \infty)$ 上递增。基于临界点处符号变化进行分析:在 $x = -1$ 处,导数从正值变为负值($+ \rightarrow -$)。这表示一个局部极大值。函数值为 $f(-1) = (-1)^3 - 3(-1) = -1 + 3 = 2$。在 $x = 1$ 处,导数从负值变为正值($- \rightarrow +$)。这表示一个局部极小值。函数值为 $f(1) = (1)^3 - 3(1) = 1 - 3 = -2$。{ "layout": { "xaxis": { "title": "x", "range": [-2.5, 2.5] }, "yaxis": { "title": "f(x) = x^3 - 3x", "range": [-4, 4] }, "title": "函数 f(x) = x^3 - 3x 的一阶导数检验", "showlegend": true, "template": "plotly_white", "annotations": [ { "x": -1.7, "y": 3.5, "text": "f'(x) > 0 (递增)", "showarrow": false, "font": { "color": "#37b24d" } }, { "x": 0, "y": -3.5, "text": "f'(x) < 0 (递减)", "showarrow": false, "font": { "color": "#f03e3e" } }, { "x": 1.7, "y": 3.5, "text": "f'(x) > 0 (递增)", "showarrow": false, "font": { "color": "#37b24d" } } ] }, "data": [ { "x": [-2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5], "y": [-8.125, -2, 1.125, 2, 1.375, 0, -1.375, -2, -1.125, 2, 8.125], "mode": "lines", "name": "f(x)", "line": { "color": "#4263eb", "width": 2 } }, { "x": [-1], "y": [2], "mode": "markers", "name": "x=-1 处的局部极大值", "marker": { "color": "#f03e3e", "size": 10 } }, { "x": [1], "y": [-2], "mode": "markers", "name": "x=1 处的局部极小值", "marker": { "color": "#12b886", "size": 10 } } ] }一阶导数 $f'(x)$ 的符号告知我们函数是递增还是递减。临界点 ($x=-1, x=1$) 处的符号变化显示出局部极大值和极小值。一个更直接的方法:二阶导数检验法计算导数有时比检验临界点周围的区间要简单。二阶导数判别法给出一种对临界点进行分类的备选方法,它运用了函数在这些点处的凹凸性。回想一下,二阶导数 $f''(x)$ 是一阶导数 $f'(x)$ 的导数。它告知我们斜率的变化率。如果某点处 $f''(x) > 0$,则斜率 $f'(x)$ 递增。这意味着函数图像向上弯曲,就像一个盛水的碗。我们称函数在该点向上凹。如果某点处 $f''(x) < 0$,则斜率 $f'(x)$ 递减。图像向下弯曲,就像一个倒置的碗。我们称函数在该点向下凹。这与极小值和极大值有何关联?思考一个临界点 $c$,其中切线是水平的,即 $f'(c) = 0$。计算二阶导数 $f''(x)$。评估 $f''(c)$,即在临界点 $c$ 处的凹凸性。如果 $f''(c) > 0$:函数有水平切线且向上凹。这种几何形态符合局部极小值。如果 $f''(c) < 0$:函数有水平切线且向下凹。这种几何形态符合局部极大值。如果 $f''(c) = 0$:检验法不给出信息。该点可能是局部极小值、局部极大值或拐点(凹凸性改变的点)。在这种情况下,你需要使用一阶导数检验法。例子: 我们再次分析 $f(x) = x^3 - 3x$。 我们之前找出 $f'(x) = 3x^2 - 3$ 且临界点为 $x = 1, x = -1$。 现在,通过对 $f'(x)$ 求导来找出二阶导数: $$f''(x) = \frac{d}{dx}(3x^2 - 3) = 6x$$我们来评估临界点处的 $f''(x)$:在 $x = -1$ 处:$f''(-1) = 6(-1) = -6$。因为 $f''(-1)$ 是负值,函数在 $x=-1$ 处向下凹。因此,$x = -1$ 对应一个局部极大值。在 $x = 1$ 处:$f''(1) = 6(1) = 6$。因为 $f''(1)$ 是正值,函数在 $x=1$ 处向上凹。因此,$x = 1$ 对应一个局部极小值。这些结论与一阶导数检验法的结果相符,并且在此例中,二阶导数计算和评估都非常简单。{ "layout": { "xaxis": { "title": "x", "range": [-2.5, 2.5] }, "yaxis": { "title": "f(x), f''(x)", "range": [-15, 15] }, "title": "函数 f(x) = x^3 - 3x 的二阶导数检验和凹凸性", "showlegend": true, "template": "plotly_white" }, "data": [ { "x": [-2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5], "y": [-8.125, -2, 1.125, 2, 1.375, 0, -1.375, -2, -1.125, 2, 8.125], "mode": "lines", "name": "f(x) = x^3 - 3x", "line": { "color": "#4263eb", "width": 2 } }, { "x": [-2.5, 2.5], "y": [-15, 15], "mode": "lines", "name": "f''(x) = 6x", "line": { "color": "#ae3ec9", "dash": "dash" } }, { "x": [-1], "y": [2], "mode": "markers", "name": "局部极大值 (f''(-1) < 0, 向下凹)", "marker": { "color": "#f03e3e", "size": 10 } }, { "x": [1], "y": [-2], "mode": "markers", "name": "局部极小值 (f''(1) > 0, 向上凹)", "marker": { "color": "#12b886", "size": 10 } }, { "x": [0], "y": [0], "mode": "markers", "name": "拐点 (f''(0)=0)", "marker": { "color": "#868e96", "size": 8, "symbol": "x" } } ] }二阶导数 $f''(x)$ 的符号表示凹凸性。在 $f'(x)=0$ 的临界点处,正凹凸性 ($f''>0$) 意味着局部极小值,而负凹凸性 ($f''<0$) 意味着局部极大值。在 $f''(x)=0$ 处(此处 $x=0$),凹凸性改变,确定了一个拐点。优化关联我们为何花费这些时间找出极小值和极大值?因为这是训练许多机器学习模型背后的基本数学理念。模型通过尝试最小化成本函数(也称损失函数或目标函数)进行学习。此函数量化了模型预测与训练数据中实际目标值的匹配程度。高成本表示性能不佳。低成本表示模型表现良好。训练过程包含调整模型的内部参数(例如线性回归中的斜率和截距,或神经网络中的权重和偏差),以找出能够使成本函数达到尽可能最小值的参数集合。在简单情况下,如某些形式的线性回归,我们可能能够用分析法通过将成本函数(或在高维度中的梯度)的导数设为零并求解来找出这个最小值,就像我们在此处找出临界点一样。然而,对于大多数复杂模型,特别是在深度学习中,成本函数异常复杂。我们不能简单地求解 $f'(x)=0$。相反,我们采用迭代算法,例如梯度下降(我们将在第4章具体介绍)。这些算法运用当前位置的导数(梯度)来确定哪个方向是“下坡”朝向最小值,并向那个方向迈一小步,多次重复这个过程。弄明白一阶和二阶导数如何识别单变量函数的极小值和极大值,是掌握机器学习中各类优化方法的重要组成部分。你现在拥有微积分工具来分析简单函数的形状并明确找到它们的低点,这直接对应于最小化成本函数的目的。接下来,我们将通过优化一个基本成本函数并使用 Python 工具协助计算,把这些付诸实践。