机器学习编程:从编码到深度学习
上QQ阅读APP看书,第一时间看更新

3.2.4 偏导数

让我们来看看什么是偏导数,以及它们是如何派上用场的。我们可以将求偏导数看成使用武士刀对多变量函数进行切片,然后计算每个切片的梯度(不一定非得使用武士刀,但武士刀会让整个过程看起来更酷)。例如,当我们将b固定在0时,就相当于将损失函数切成下面的样子:

上图显示的切片与我们在3.2节中绘制的损失曲线相同。由于我们在这里使用了不同的范围和尺度来表示坐标轴,所以它看起来有点像被压扁了,但它是和之前完全相同的函数。对于每个b的取值都有一条这样的曲线,该曲线具有唯一的变量w。同样,对于w的每个值都有一个以b为变量的曲线,w=0时的曲线如下图所示:

一旦我们有了这些一维切片,就可以计算它们的梯度,就像我们计算前述初始曲线一样。有一个好消息,我们可以通过结合切片的梯度得到曲面的梯度。这个概念的可视化表达如下图所示:

多亏有了偏导数,我们可以把一个二元问题分解成两个一元问题。这就意味着我们不需要使用新的算法来做曲面上的梯度下降计算。取而代之的是,我们只需要使用偏导数对曲面进行切片,然后在每一个切片上做梯度下降计算即可。

数学探究:偏导数与微积分

处理梯度、导数和偏导数的数学分支称为微积分。如果你想深入研究微积分,就请登录可汗学院网站[1]。同样,该网站上有比你学习本书所需多得多的知识。

具体地说,你可以通过选取每个变量(这里的例子是w和b)并假设它是函数中唯一的变量来计算相应的偏导数。假设其他量都是常数,然后计算对唯一变量的导数。当我们将b固定为0并计算L对w的导数时,就已经做了一半的工作,如下式所示:

现在我们需要做同样的事情,只是使用另一种方式而已:假设w是常数,求L对b的导数。如果你学过微积分,那么就可以自己计算偏导数。答案如下:

现在我们总结一下梯度下降法在二维损失曲面上的工作原理。我们的徒步旅行者站在某个特定的地方,也就是取某个特定的数值(w和b)。她使用偏导数计算公式分别计算L关于参数w和b的偏导数。她将w和b的当前值代入相应的偏导数计算公式,得到了关于每个变量的梯度,然后分别将梯度下降法应用于这两个梯度,这样就得到了答案!她沿着曲面的梯度进行下降。

这一章的数学计算内容已经足够多了。让我们使用代码来表示这个算法吧。

[1] www.khanacademy.org/math/differential-calculus。