美文网首页机器学习
如何理解梯度?

如何理解梯度?

作者: Paycation | 来源:发表于2019-02-16 19:51 被阅读7次

Warning: 本文的数学定义可能不太准确,其主要目的在于辅助理解这些概念,而非严格的数学。

偏导数 partial derivative

有函数f(x,y)=x^2y,当y不变而x发生极小的改变后,会使得函数值发生极小的变化。这个变化率被记为\dfrac{\partial{f}}{\partial{x}},称为对x的偏导数。因为整个过程中y不变,可以把y视为常数,然后求导即可,即\dfrac{\partial{f}}{\partial{x}}=2y。而对y的偏导数为\dfrac{\partial{f}}{\partial{y}}=x^2
偏导数的正式定义是:
\begin{aligned} \dfrac{\partial{f}}{\partial{x}}(a,b)&=\lim_{h\to0}\dfrac{f(a+h,b)-f(a,b)}{h}\\ \dfrac{\partial{f}}{\partial{y}}(a,b)&=\lim_{h\to0}\dfrac{f(a,b+h)-f(a,b)}{h} \end{aligned}
偏导的本质可以理解是在一个曲面(这里所有的描述都是基于3维,即二元函数)上一个点,分别向x轴,y轴移动微小的距离,产生的函数值的变化率。只能在x,y两个轴上移动,用向量表示移动的方向就是\begin{bmatrix}x\\0\end{bmatrix}\begin{bmatrix}0\\y\end{bmatrix},不够全面,因此引入方向导数。

方向导数 directional derivative

用向量作为变量来重写偏导数定义式:
\dfrac{\partial{f}}{\partial{x}}(\vec{a})=\lim_{h\to0}\dfrac{f(\vec{a}+h\vec{i})-f(\vec{a})}{h}
其中\vec{i}=\begin{bmatrix}1\\0\end{bmatrix},是单位向量。上式中的\vec{a}+h\vec{i}其实也就是:\begin{bmatrix}a\\b\end{bmatrix}+h\begin{bmatrix}1\\0\end{bmatrix}=\begin{bmatrix}a+h\\b\end{bmatrix},和偏导数定义式里面的参数一致。如果求y的偏导,那么令\vec{i}=\begin{bmatrix}0\\1\end{bmatrix}即可。

插入一个话题,如果这里的\vec{i}不是单位向量会怎么样?已知\dfrac{\partial{f}}{\partial{x}}=\lim_{h\to0}\dfrac{f(x+h,y)-f(x,y)}{h},那么\lim_{h\to0}\dfrac{f(x+2h,y)-f(x,y)}{h}=2\times\lim_{h\to0}\dfrac{f(x+2h,y)-f(x,y)}{2h}=2\cdot\dfrac{\partial{f}}{\partial{x}}。也就是说,你需要把移动的向量的长度标准化为1,否则求出的结果是方向导数的一个倍数,而不是其本身,就解释到这种程度吧。

但是我们这里不需要这么严格, 因为我们可以认为定义式中的h包含这个倍数,让你的向量变成模为1,并且继续乘以一个无穷小量。因此\vec{v}可以是任意向量,下面的定义式都成立:
\nabla_{\vec{v}}f(\vec{a})=\lim_{h\to0}\dfrac{f(\vec{a}+h\vec{v})-f(\vec{a})}{h}
这就是方向导数的定义式,它表示任意方向上的函数变化率。字母\nabla读作nabla。这里的\vec{a}虽是一个向量,但也表示起点的坐标。\vec{v}表示这个方向导数的方向,并不需要是单位向量。整个\nabla_{\vec{v}}f可以视为一个函数。

举个具体的例子来说明它的一个性质,比如移动\vec{v}=\begin{bmatrix}-1\\2\end{bmatrix},显然函数值变成f(x-1,y+2)。我们可以不要去想它是一次性移动过去的,可以先想象成:函数图像上某点,首先沿着x轴左移1个单位,然后再沿着y轴上移2个单位。现在我假设这个向量移动的距离非常小,但是方向不变,记为hv=\begin{bmatrix}-h\\2h\end{bmatrix},其中h\to 0。函数上某点先沿着x轴左移h个单位,其对于函数值z带来的变化记为\Delta z_x,仅沿x轴方向移动一个微小的距离,这正是偏导数的定义。

之前我有提到,h变成2h,导致结果\lim_{h\to 0}\dfrac{\Delta z_x|_{2h}}{h}=2\cdot\dfrac{\partial{f}}{\partial{x}}(这里的含义是\Delta{z_x|_{2h}}=\lim_{h\to 0}\dfrac{f(x+2h, y)-f(x,y)}{h},这个表示方法不是很规范,主要是为了说明问题),不难想到:
h变成khk为任意常量,有:
\lim_{h\to 0}\dfrac{\Delta z_x|_{kh}}{h}=k\cdot\dfrac{\partial{f}}{\partial{x}}

因此,左移h个单位的效果是:\lim_{h\to 0}\dfrac{\Delta z_x|_{-h}}{h}=-\dfrac{\partial{f}}{\partial{x}},而上移2h个单位是类似的:\lim_{h\to 0}\dfrac{\Delta z_y|_{2h}}{h}=2\cdot\dfrac{\partial{f}}{\partial{y}}

显然,两个变化值累加后就是最终的z值变化量:\Delta z=\Delta z_x+\Delta z_y(想象一个烤串上的肉,任凭x,y如何变化,带来的效果不就是把z轴这个烤串上的肉上下拨动吗?而两次拨动可以是正的,也可以是负,叠加后就是最终的)。因此整个函数的变化率可以写成:
\lim_{h\to0}{\dfrac{\Delta z}{h}}=\lim_{h\to0}{\dfrac{\Delta z_x+\Delta z_y}{h}}=-\dfrac{\partial{f}}{\partial{x}}+2\cdot\dfrac{\partial{f}}{\partial{y}}
一般地,对于任意的向量\vec{v}=\begin{bmatrix}a\\b\end{bmatrix},其方向上对应的方向导数是a\cdot\dfrac{\partial{f}}{\partial{x}}+b\cdot\dfrac{\partial{f}}{\partial{y}}。可以看到当\vec{v}=\begin{bmatrix}1\\0\end{bmatrix}或者\begin{bmatrix}0\\1\end{bmatrix}时,方向导数分别变成偏导数\dfrac{\partial{f}}{\partial{x}}\dfrac{\partial{f}}{\partial{y}}。对于更高维度的函数,方向导数等于向量和偏导的点积的这个算法也是成立的,就不深究了。

梯度 gradient

我们把向量\begin{bmatrix}\dfrac{\partial{f}}{\partial{x}}\\\dfrac{\partial{f}}{\partial{y}}\end{bmatrix}叫做f(x,y)的梯度,记为\nabla{f}(相比于方向导数需要一个向量来指明方向,梯度直接就有一个明确的方向),\vec{v}方向的方向导数可以记为梯度和该向量的点积:\nabla_{\vec{v}}f=\vec{v}\cdot\nabla{f}
现在我们思考一个问题,在曲面上的一点,哪一个方向的向量能使得函数变化率最大?类比于爬山,哪一个前进方向的山坡最陡峭?为了排除“倍数”的影响,这里用单位向量\vec{v}来计算方向导数,这样才能保证不同方向上,我们前进的微小距离h是一样的。
这个向量有无数个方向,可以选择,这些方向共同构成一个单位圆。我们假设目前所在的点叫(a,b),那么根据前面所说的计算方法,我们的方向导数是:
\nabla_{\vec{v}}f(a,b)=\vec{v}\cdot\nabla{f}(a,b)=||\vec{v}||\cdot||\nabla{f}(a,b)||\cdot\cos{\theta}

单位圆

不难看出,当\vec{v}和梯度的方向一致时,方向导数最大。因此当我们在曲面上任意一点,需要向上(上山)时,我们顺着梯度指引的方向就是上升最快的方向。在机器学习中,我们一般是下山,这时候我们找跟梯度相反的方向就可以了,即-\nabla f

相关文章

网友评论

    本文标题:如何理解梯度?

    本文链接:https://www.haomeiwen.com/subject/svvwjqtx.html