双向导数
因此,如果您了解一些相关知识,则可以轻松推断出
其中g(θ)
指梯度。
现在,通过插入刚刚讨论的示例的值,来检查上面编写的方程式的正确性。所以,我会得到以下的东西。
现在让我们计算它的实际导数。据我所知,f(θ)=θ³,通过简单的导数g(θ)= 3⋅θ²,而我们得到g(θ)=3。我们做了一个很好的近似,近似误差仅为0.0001。现在让我们看看如果使用传统方法会得到什么。如果用单边来计算,最终将得到3.0301,其近似误差为0.0301。因此,我们在这里做了出色的工作,大大降低了误差!
您刚刚看到双面导数的性能要比传统方法好得多。这给了您更大的信心,θ的g可能是f(θ)的导数的正确实现。这听起来真是太好了!这种方法也有一个缺点。事实证明,这种方法的运行时间是使用单侧方法的两倍。但是我认为在实践中使用此方法是值得的,因为它更加准确。
再深入一点
让我们回顾一下导数的形式定义。
这里要注意的重要一点是ϵ。对于non的非零值,您可以证明近似值的误差约为ϵ²。ϵ是一个很小的数字,趋向于0。因此,总而言之
error = O(ϵ²)
在此,O是指的顺序。
您可以通过简单的数学证明,如果使用单向导数,则误差将为ϵ或
error = O(ϵ)
ϵ当然是少于1的极小数,所以ϵ >> ϵ²。因此,现在您可能已经了解了为什么应该使用双面导数而不是单面导数,并且我们将看到这如何帮助我们进行梯度检查。
梯度检查
梯度检查是一种非常有用的技术,已帮助我轻松地进行调试并发现神经网络中的错误。现在,我们将演示如何使用这种出色的技术来调试或验证您的网络实现以及反向传播是否正确。这并不是什么新鲜事物,但让我们将单个神经元作为演示。
请记住,[x₁, x₂ ... x_n]
是输入,对于每个参数,我们都参数(w¹, b¹) (w², b²) … (wⁿ, bⁿ)。因此,要实现梯度检查,您应该做的第一件事就是获取所有参数并将它们调整为巨大的矢量数据。因此,您要做的就是将所有这些w和b都进行调整,使其成为矢量。然后将所有这些向量连接成一个称为θ的巨型向量。所以现在我们可以像这样用θ来写成本函数J
因此,现在我们的J将只是θ的函数。
现在,用相同的方式对w和b进行排序,您还可以将dw¹
, db¹
… dwⁿ
, dbⁿ
连接起来,并将它们连接成一个大向量,我们将其称为与θ尺寸相同的dθ。我们将以类似的步骤进行操作,即将所有dw变为矢量,因为它们是矩阵,而b则已经是矢量,因此只需将它们串联即可。我觉得可能有帮助的一点是,w 1的尺寸与dw 1的尺寸相同,而b 1的尺寸与db 1的尺寸相同,依此类推。这也意味着您可以使用相同的大小和串联操作。因此,现在您可能会有一个问题,“dθ在这里是θ的斜率还是梯度?” 我们将在稍后讨论。