函数的最小值点,特别是机器学习中的成本函数,代表着误差最低点。导数 $f'(x)$ 描述函数 $f(x)$ 在任意给定点 $x$ 处的斜率或瞬时变化率。理解导数如何作为梯度下降算法的指导,需要将这些概念联系起来。想象你正站在由成本函数图表示的山坡上,你想走到谷底(最小值)。雾很大,你只能感觉到你脚下的地面。你如何决定往哪个方向迈步?导数提供了你所需的确切信息。如果你当前位置 $x$ 处的导数 $f'(x)$ 为正,这意味着斜率为正。函数在此点正在增加。要朝最小值下山,你需要向着 $x$ 更小的方向移动,也就是说你需要向左移动(减小 $x$)。如果你当前位置 $x$ 处的导数 $f'(x)$ 为负,这意味着斜率为负。函数在此点正在减小。要继续朝最小值下山,你需要向着 $x$ 更大的方向移动,也就是说你需要向右移动(增大 $x$)。如果导数 $f'(x)$ 为零,斜率是平坦的。这表明你可能处于底部(一个最小值),或可能处于一个峰值或一个平坦高原。梯度下降通常会在这里停止。注意这个规律:如果导数为正,我们减小 $x$;如果导数为负,我们增大 $x$。在这两种情况下,我们本质上都是朝着导数符号相反的方向移动。这是梯度下降算法如何使用导数的核心思想。它计算当前点的导数,并朝着相反的方向迈出小步。步长的大小通常也与导数的大小成比例(坡度越陡意味着步长越大,坡度越缓意味着步长越小),并由一个称为学习率的因子进行调整(我们很快会讨论它)。从数学角度看,梯度下降的一次步进可以这样表示:$$ x_{\text{new}} = x_{\text{current}} - \alpha \cdot f'(x_{\text{current}}) $$这里:$x_{\text{current}}$ 是你的当前位置。$f'(x_{\text{current}})$ 是你当前位置的导数(斜率)。$\alpha$ (alpha) 是学习率,一个小的正数,控制你迈步的大小。我们将在“学习率参数”部分更详细地讨论这个参数。$x_{\text{new}}$ 是迈步后的更新位置。主要部分是负号。它确保你逆着梯度移动:如果 $f'(x_{\text{current}})$ 为正(斜率指向右上坡),减去 $\alpha \cdot f'(x_{\text{current}})$ 会使 $x$ 向左移动(减小 $x$)。如果 $f'(x_{\text{current}})$ 为负(斜率指向右下坡),减去 $\alpha \cdot f'(x_{\text{current}})$ 实际上增加了一个小值(因为减去一个负数就是加上一个正数),使 $x$ 向右移动(增大 $x$)。本质上,导数就像一个指向山坡上方(最陡峭增加方向)的指南针,梯度下降算法只是朝着相反的方向迈步,以走向下坡。通过迭代重复这个过程,计算导数,并朝着相反的方向迈出小步,梯度下降逐渐沿着成本函数的斜坡下降,走向一个最小值。我们来形象化这一点。考虑简单的函数 $f(x) = x^2$。它的最小值显然在 $x=0$。导数是 $f'(x) = 2x$。{"layout": {"title": "导数指导梯度下降步长", "xaxis": {"title": "x", "range": [-3.5, 3.5]}, "yaxis": {"title": "f(x) = x^2", "range": [-1, 10]}, "showlegend": false, "shapes": [{"type": "line", "x0": 2, "y0": 4, "x1": 3, "y1": 8, "line": {"color": "#f03e3e", "width": 2, "dash": "dot"}, "name": "切线斜率"}, {"type": "line", "x0": 2, "y0": 4, "x1": 1.8, "y1": 4, "line": {"color": "#1c7ed6", "width": 4}, "name": "梯度下降步长方向"}], "annotations": [{"x": 2, "y": 4, "text": "当前点 (x=2)", "showarrow": true, "arrowhead": 2, "ax": -40, "ay": -40}, {"x": 2.5, "y": 6, "text": "斜率 f'(2) = 4 (正)", "font": {"color": "#f03e3e"}, "showarrow": false}, {"x": 1.9, "y": 4.5, "text": "向左移动 (减小 x)", "font": {"color": "#1c7ed6"}, "showarrow": true, "arrowhead": 6, "ax": 50, "ay": 30}]}, "data": [{"x": [-3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5], "y": [12.25, 9, 6.25, 4, 2.25, 1, 0.25, 0, 0.25, 1, 2.25, 4, 6.25, 9, 12.25], "mode": "lines", "line": {"color": "#495057"}, "name": "f(x)=x^2"}, {"x": [2], "y": [4], "mode": "markers", "marker": {"color": "#e64980", "size": 10}, "name": "当前位置"}]}如果我们在 $x=2$,函数值为 $f(2) = 2^2 = 4$。导数是 $f'(2) = 2 \times 2 = 4$。由于导数为正,这告诉我们函数在此处正在增加(红色虚线显示正切线斜率)。梯度下降算法利用这个正导数来决定将 $x$ 向左移动(减小 $x$),如蓝色箭头所示,向着 $x=0$ 处的最小值迈步。如果我们改在 $x = -1.5$,导数将是 $f'(-1.5) = 2 \times (-1.5) = -3$。负导数告诉梯度下降算法增加 $x$(向右移动),再次向最小值迈步。这个过程重复进行,每个新点的导数指导下一步,直到我们理想地到达一个导数非常接近零的点,这表示我们找到了一个最小值。