Warning: 本文的数学定义可能不太准确,其主要目的在于辅助理解这些概念,而非严格的数学。
偏导数 partial derivative
有函数,当不变而发生极小的改变后,会使得函数值发生极小的变化。这个变化率被记为,称为对的偏导数。因为整个过程中不变,可以把视为常数,然后求导即可,即。而对的偏导数为。
偏导数的正式定义是:
偏导的本质可以理解是在一个曲面(这里所有的描述都是基于3维,即二元函数)上一个点,分别向轴,轴移动微小的距离,产生的函数值的变化率。只能在两个轴上移动,用向量表示移动的方向就是和,不够全面,因此引入方向导数。
方向导数 directional derivative
用向量作为变量来重写偏导数定义式:
其中,是单位向量。上式中的其实也就是:,和偏导数定义式里面的参数一致。如果求的偏导,那么令即可。
插入一个话题,如果这里的不是单位向量会怎么样?已知,那么。也就是说,你需要把移动的向量的长度标准化为1,否则求出的结果是方向导数的一个倍数,而不是其本身,就解释到这种程度吧。
但是我们这里不需要这么严格, 因为我们可以认为定义式中的包含这个倍数,让你的向量变成模为1,并且继续乘以一个无穷小量。因此可以是任意向量,下面的定义式都成立:
这就是方向导数的定义式,它表示任意方向上的函数变化率。字母读作nabla。这里的虽是一个向量,但也表示起点的坐标。表示这个方向导数的方向,并不需要是单位向量。整个可以视为一个函数。
举个具体的例子来说明它的一个性质,比如移动,显然函数值变成。我们可以不要去想它是一次性移动过去的,可以先想象成:函数图像上某点,首先沿着轴左移1个单位,然后再沿着轴上移2个单位。现在我假设这个向量移动的距离非常小,但是方向不变,记为,其中。函数上某点先沿着轴左移个单位,其对于函数值带来的变化记为,仅沿轴方向移动一个微小的距离,这正是偏导数的定义。
之前我有提到,变成,导致结果(这里的含义是,这个表示方法不是很规范,主要是为了说明问题),不难想到:
变成,为任意常量,有:
因此,左移个单位的效果是:,而上移个单位是类似的:。
显然,两个变化值累加后就是最终的值变化量:(想象一个烤串上的肉,任凭如何变化,带来的效果不就是把轴这个烤串上的肉上下拨动吗?而两次拨动可以是正的,也可以是负,叠加后就是最终的)。因此整个函数的变化率可以写成:
一般地,对于任意的向量,其方向上对应的方向导数是。可以看到当或者时,方向导数分别变成偏导数和。对于更高维度的函数,方向导数等于向量和偏导的点积的这个算法也是成立的,就不深究了。
梯度 gradient
我们把向量叫做的梯度,记为(相比于方向导数需要一个向量来指明方向,梯度直接就有一个明确的方向),方向的方向导数可以记为梯度和该向量的点积:。
现在我们思考一个问题,在曲面上的一点,哪一个方向的向量能使得函数变化率最大?类比于爬山,哪一个前进方向的山坡最陡峭?为了排除“倍数”的影响,这里用单位向量来计算方向导数,这样才能保证不同方向上,我们前进的微小距离是一样的。
这个向量有无数个方向,可以选择,这些方向共同构成一个单位圆。我们假设目前所在的点叫,那么根据前面所说的计算方法,我们的方向导数是:
不难看出,当和梯度的方向一致时,方向导数最大。因此当我们在曲面上任意一点,需要向上(上山)时,我们顺着梯度指引的方向就是上升最快的方向。在机器学习中,我们一般是下山,这时候我们找跟梯度相反的方向就可以了,即。
网友评论