最近发现一个有意思的现象,现在搞学术的不来点机器学习,基本都会认为不跟随潮流,为了跟上时代我们也来介绍一期有关机器学习的内容,随机梯度下降,我可以向大家保证,不要这个主题的任何背景知识,希望我能做到这一点,好了让我们开始今天的旅程。
介绍
从我们数学角度来看,神经网络只是一个参数化的函数。训练神经网络就是要最小化一个函数,本质上是一个优化问题:
最常见的一种我们会使用函数f来表述损失函数,并且能希望使用输入输出对 (x,y) 最小化权重由 w 表示的全连接神经网络的均方误差:
上面那段话我们只是举一个常见的例子,不懂也没有关系,总之训练神经网络,只是在做一个优化问题而已。
随机梯度下降的起源
随机梯度下降,英文名:
我们通常用SGD来简称,但与传统的梯度下降步骤相比,它具有随机梯度。在我们解释这个想法之前,最好把每一部分的含义解释清楚。
梯度下降
直观上,我们在做梯度下降(GD)的时候,就像沿着向下的方向走下山一样。然而,“向下”的方向并不会直接指向最小值。相反,“向下”方向保证我们只会在一小步之后下降,而不是立刻到达山脚。所以我们需要不断迭代算法,但是我们的步子不能迈的太大,因为如果我们迈出太大的一步,我们最终可能会上升,从而错过最小值。
另外一件值得注意的事是梯度下降算法往往只能找到局部最小值,常见的梯度下降更新公式为:
很显然更新公式要求我们必须选择一个初始值 w₀。不难预期这个初始值的选择将会影响我们找到最小值,另一件要做的事是要告诉人家你的算法何时停止,毕竟你永远都在运行算法,计算机的内存就会溢出。作为停止标准。常见的做法是对∇f(wᵢ)的值设置一个阈值,即当∇f(wᵢ)非常小时并且w的值变化很小时,我们的算法就会停止。
智力hᵢ的值称为被时间步长,有些做深度学习的也喜欢把它叫做学习率,通常我们需要对这个值不断的调试,直到找到合适的,如果学习率太大,我们可能永远不会收敛到我们想要的最小值如果学习率太小,则可能收敛得太慢甚至不会收敛到你想要。我们接下来的内容讨论我们如何选择学习率。
随机梯度
随机梯度是一个不精确的梯度,它真实梯度∇ f有些微的不同,但大概样子上还是差不多的,尽管随机梯度从原理上来讲可以是任何梯度,但在训练神经网络时,我们通常偏好小批量梯度。小批量梯度是在某些训练示例上计算的梯度,而不是使用所有训练数据集。原因也是显而易见的,毕竟我们只有有限的计算和内存,而数据集对我们来说通常是太大了。
随机梯度下降
现在,我们采用梯度下降步骤中的公式并引入小批量梯度,以获得非常相似的表达式:
收敛的数学概念
自然而然地,我们必须为提出的算法提供一种收敛证明,否则这种迭代算法毫无用处,我们假设我们能够找到最小化的参数,并且迭代次数足够多时,迭代的值接近最小化的参数,即
但在实践过程中,我们发现给定一个算法随机梯度下降算法,通常更容易提供||wᵢ — w*||的上界。例如:
当 i→∞ 时,由于 1i→0,我们有 wᵢ →w* ,这种情况同样能够证明收敛性,我们就说上面的例子收敛的速度O(1/i)。接下来是最妙的地方,我们将优化问题和常微分方程中的 函数联系在一起。
最优化和常微分方程
李亚普诺夫函数的概念来自俄罗斯数学家亚历山大·李雅普诺夫(Александр Михайлович Ляпунов),这个概念在动力系统的稳定性和控制理论中十分重要,它与梯度下降等算法之间存在很强的联系,但到目前为止我们看的还不是很明显。首先,重新整理梯度下降公式,得到:
左边的项是连续函数有限差分,上面的表达式是有关w(t)的ODE的离散近似化:
在这个框架中,我们将w视为一个连续函数,它在时间tᵢ时的取值产生了梯度下降的迭代值wᵢ。我们不知道每个tᵢ的确切值,但我们知道根据它的离散近似化,它们是以hᵢ间隔排列的。尽管不完美,但现在可以将优化中的数学概念转化为ODEs,反之亦然。
这里我们还要提一下函数的最小值我们提到损失函数f的最小化参数为w*。由于w*是f的一个局部最小值,所以它的梯度为零,即∇f(w*) = 0。而常微分方程有关平衡点的概念告诉我们,对于给定的上面给定ODE,∇f(w*) = 0。因此,w*是一个平衡点。
然而,作为ODE的平衡点并不意味着是f的最小化参数,因为如果我们考虑f的最大化参数也有∇f(w*) = 0。回忆一下梯度下降算法,由于我们是朝“下降”方向迈步,无论我们开始多接近最大值,我们都将从它那里远离。还有一些梯度为零的点,既不是最大值点也不是最小值点,被称为鞍点。
在上面我们给出的示意图中我们看到两种可能的情况,虽然这两者都是ODE的平衡点,但如果从足够接近w*的地方开始,随着时间推移差异|w(t) -w*|会减少,那么我们称平衡点是稳定的。在上图中,我们可以看到这对于最小值是成立的,但对于最大值则不然。这意味着我们可以将最小值w*视为ODE的一个稳定平衡点。如果我们能够利用ODE的知识找到了一个稳定的平衡点,那么我们就找到了f的一个最小值点。这时李亚普诺夫函数就派上用场了。
李亚普诺夫函数
我们从一个例子开始,在这个例子中我们将李亚普诺夫函数视为代表物理系统的能量:
球在某一位置的能量是势能(高度越高,势能越大)和动能(随着速度增加)之和。在现实世界中由于存在摩擦,如果球在山顶释放,它最终会停在底部,即使它会振荡一段时间。
在这种情况下山谷底部是某个从运动定律推导出来的ODE的稳定平衡点。并且是一个无能量的点。此外,球只会停在山谷底部,而不会停在其他地方。由于摩擦力作用于球使其失去能量,并且没有其他力作用于系统,我们也可以说系统的能量不会增加。事实上这些性质最终被我们抽象成李亚普诺夫函数的定义:
这里如果你查阅资料会发现标准的定义中通常会假设平衡点w*=0 ,为了清晰起见我们放弃了这个假设,但我们的定义仍然有效,重要的是这里的wᵢ可以是任何序列,但我们将其视为梯度下降序列。
现在我们了解了李亚普诺夫函数的直觉和定义,那么我们如何在给定的问题背景下找到一个函数呢?嗯,李亚普诺夫函数最好的部分是,它不一定需要代表能量,如果我们找到一个满足属性 1-4 的函数,即使它没有可以转化为现实世界的解释也没关系。这是因为在数学中,李亚普诺夫函数不必从物理定律导出。
不幸的是,我们通常没有一般的方法来构造李雅普诺夫函数,为了找到雅普诺夫函数,我们需要直接和经验,通常人们我们定义几个候选者,然后检查上述性质是否成立。性质1-3的验证通常非常简单,大部分证明时间都花在验证性质4上,稍后我们会看到这一点随机梯度下降算法,这是从这个性质出发,我们将推导出算法收敛
假设我们找到了一个李亚普诺夫函数来解决我们手头的问题。我们可能知道也存在一个平衡点——否则,问题没有明确定义,我们就不应该使用梯度下降。另外,f应该是一个有一些假设的函数——如果不是,从数学上讲,我们真的不能保证太多。
好了,接下来的算法收敛性证明也是最精彩的部分,但考虑到现在的时间和篇幅,我们写到这里的时候已经快12点,如果大家感兴趣,我们会继续往下写的,今天就在这里结束吧。我们下期见!