对于梯度下降法的理解
把自己看过的东西复述一遍能有个更好的理解,本着这个原则决定写一写博客。
梯度下降法也称Gradient Descent。部分专业名词我会直接用英语表述,因为更容易理解。我看到的资料都是从直观和推导两个方向进行的。我也从这两个方面来写自己的理解。
1.直观理解
先不管梯度下降是什么。我们来考虑一个曲面。如下图所示,假设我们的目标是要寻找这个曲面的最低点,对于我们人类来说这个轻而一举,瞄一眼就可以明白哪里是最低点。其次拿一个球放到这个曲面的某一个点上,也是会朝着最低的方向滚落。从数学的角度来看,一个三维空间的曲面可以用ƒ(x, y)这样一个函数来表示。那么如何从数学的角度来找到这个最低点呢,先假设这个球在点A($x_{0}$, $y_{0}$, $f(x_{0}, y_{0})$)。我们考虑很小的一个变化,$x_{0}$变化 $Δx$, $y_{0}$变化$Δy$,对应的 $f(x_{0}, y_{0})$就变化 $Δf(x, y)$。数学上可以证明 $Δf(x, y)$ ≈ $Δx\frac{\partial f(x_{0}, y_{0})}{\partial x}$ + $Δy\frac{\partial f(x_{0}, y_{0})}{\partial y}$。当这个变化特别小的时候可以看做相等了。引入两个向量$ΔV$ = ($Δx$, $Δy$), $\nabla f$ = ($\frac{\partial f(x_{0}, y_{0})}{\partial x}$, $\frac{\partial f(x_{0}, y_{0})}{\partial y}$). $\nabla f$这个就叫做梯度,直观理解的部分里面简单的理解成向量就行,先不要去考虑它的物理意义。为了找到最低点,我们就要使$Δf(x, y)$一直为负,而$Δf(x, y)$ = $ΔV\nabla f$。 如果我们让$ΔV$ = -η$\nabla f$,那么$Δf(x, y)$ = -η$\nabla f\nabla f$。因为点乘$\nabla f\nabla f$ ≥ 0。
更新后的点B就为
$x = x_{0} - η\frac{\partial f(x_{0}, y_{0})}{\partial x}$
$y = y_{0} - η\frac{\partial f(x_{0}, y_{0})}{\partial y}$
$f(x, y) = f(x_{0}, y_{0}) - η\nabla f\nabla f$
把$x$换成$w$权重(weight), 把$y$换成$b$偏移量(bias)。就是我们常见的利用Gradient Descent更新参数的公式了。
2.数学理解
在直观理解的部分,简单说明了为什么梯度下降法能够work,但没有解释为什么我们会选择梯度下降法。没有其他方法了吗?
数学警告!!!
相信看到这里的人都知道有个人叫泰勒,而他发现了一个叫泰勒展开式的公式。简单的说就是任意一个函数都可以由一个多项式函数来表示(我自己的理解)。泰勒展开式成立的条件是$x$与$x_{0}$非常接近
首先一元的泰勒展开式 $f(x) = f(x_{0}) + \frac{{f}'(x_{0})}{1!}(x - x_{0}) + \frac{{f}''(x_{0})}{2!}(x - x_{0})^{2} + ... + \frac{f^{n}}{n!}(x - x_{0})^{n} + O(x^{n})$;
还有二元的泰勒展开式 这里我就不写整个展开式了,只写他的一阶展开式$f(x, y) = f(x_{0}, y_{0}) + (x - x_{0})\frac{\partial f(x_{0}, y_{0})}{\partial x} + (y - y_{0})\frac{\partial f(x_{0}, y_{0})}{\partial y}$;
如果我们让 $Δx = x - x_{0}$, $Δy = y - y_{0}$, $Δf(x, y) = f(x, y) - f(x_{0}, y_{0})$。 上面的式子就会变成 $Δf(x, y) = Δx\frac{\partial f(x_{0}, y_{0})}{\partial x} + Δy\frac{\partial f(x_{0}, y_{0})}{\partial y}$;
是不是感觉这公式很熟悉,没错这就是我们前面所提到的数学上可以证明的那个公式。这个也叫全微分公式。
全微分成立的条件也就是前面泰勒展开式成立的条件,也就是变量的变化非常小的时候成立,回到前直观理解部分我们设置了$ΔV$ = -η$\nabla f$。这个$η$我一直没解释,其实他就是学习率(learning rate)。Learning rate的值我们知道一般都设置得很小,一般都是0.001以下了,这是为了使$ΔV$比较小,也就是$Δx,Δy$比较小,因为只有$Δx,Δy$比较小的时候我们的泰勒展开式才能成立,才能够利用微分公式。
回到开头提出的问题,为什么梯度下降法?其实我们可以看到泰勒公式还有2阶,3阶等等。用来进行估计会更准。但是因为计算高阶微分比较麻烦,所以一般就用一阶也即是Gradient Descent。 另外因为泰勒展开式对任意函数都成立,这其中当然包括我们任意的损失函数(Loss Function)。这就是我们为什么要选择Gradient Descent的原因(可能还有其他原因,但我不太清楚了。手动狗头)。
参考资料:
1. Michael Nielsen《Neural Networks and Deep Learning》
2. 3Blue1Brown 《Neural Networks》
3. 李宏毅 《Mathine Learning》