在上一节中,我们需要找到使损失函数最小化的权重与偏置。高中数学告诉我们,求函数的极值可以通过令导数为零来实现。然而,在神经网络中,函数极其复杂,无法直接求得解析解,因此我们采用梯度下降法逐步逼近最优解。本教程将从导数基础讲起,层层深入,带你全面掌握梯度下降法的原理与实现方法。
1. 导数
导数是描述函数在某一点上瞬时变化率的概念,即某个瞬间的变化量。这个“瞬间”在数学上定义为时间趋近于0。

用代码实现一个简单的数值微分:
def numerical_diff(f,x):
h=10e-50
return(f(x+h)-f(x))/h
这里我们取一个极小的数 h 模拟趋近于0。但需要注意:如果 h 太小(如 10e-50),在计算机中可能产生舍入误差,因为浮点数精度有限,实际 h 可能被当作0。此外,上述公式计算的是 x 与 x+h 之间的差分,并非真正的切线斜率,存在一定误差。
为了减小误差,可以使用中心差分:计算 f(x+h) 与 f(x-h) 之间的差分,这样误差更小。

改进后的数值微分代码如下:
def numerical_diff(f,x):
h=1e-4
return (f(x+h)-f(x-h))/(2*h)
通常,我们使用数学公式直接求出的导数称为解析解,而上述数值微分得到的是近似值。由于误差非常小(当 h=1e-4 时),在工程中可以将两者视为等价。
