4.4 理解梯度下降
首先我们要理解什么叫梯度。梯度实际上就是我们上一小节中和学习速率相乘的因子。它标记为:
其中那个倒三角符号读作“纳布拉(nabla)”,中文翻译一般就叫做梯度。梯度实际上是一个向量,在当前的一维情形下,在不考虑符号的情形下,向量和标量并没有区别。以后我们会碰到是一个向量的情形,此时就需要考虑每个方向上的梯度。它一般也叫做方向导数。
没有学过微积分的同学,会对梯度或者导数的概念异常陌生。我们暂且不要管梯度或者导数的概念,先来考虑光滑斜面上下滑的滑块的运动问题。
假如有一个滑块放在光滑的斜面上,那么滑块会如何运动?
很简单是吗?它一定会向下沿着斜面下滑,下滑的速度可以用受力分析和牛顿第二定律来计算。假设斜面的倾角为,如下图所示:
假设初始时,滑块处于高度, 方向的位置为, 很显然,。在滑块沿着斜面下滑时,任何时刻都存在这个简单的关系,即 。 这说明沿着斜面下滑时,每下滑一个高度 , 必然缩小一个,它们的比值是
当我们将 都取得非常非常小时,这个比值仍然保持不变。我们标记这种非常非常小的变化为:
它就标记了这个斜面的斜率。实际上,沿着任何光滑曲线的下降,都是这个直斜面的简单推广,因为任何光滑曲线在非常小的邻域内都可以等价于一个直的斜线。所以在任何光滑曲线上,都可以计算某一点附近的斜率。以此斜率来指导放在这条曲线上的滑块的运动,这也就是为什么斜率又被称作是导数的原因。“导数”的字面意思就是导引的数值。
从上面的讨论可以知道,要使得这种沿着导数方向下落的算法成立,必须包含两个重要假设。
- 每一步在x方向上的移动都必须要足够的小但不能为零,以使得这种微分邻域的假设成立。
- 梯度依赖于我们的预测函数,而预测函数本身是权重和特征值x的函数,如果预测函数恰好在某个取值对下为零,就会导致梯度下降停止,一般称为梯度消失,但这时的误差实际上依然可能比较大。所以最好使用某些特殊的预测函数,这些函数不存在零点。反之,如果预测函数在某个取值对下趋于无穷大,即函数在有限定义域范围内有极点,此时梯度趋于无穷大,误差也趋于无穷大,这种叫做梯度发散或者梯度爆炸行为。所以预测函数也不能在有限区域内有极值点。
综上可知,预测函数的形式实际上非常有限,最好的预测函数是概率分布函数,因为概率分布函数都是有界光滑的函数。我们通常所用的sigmoid函数,实际上是物理上常用的Fermi-Dirac统计的粒子分布函数。在识别类的人工智能任务中,我们往往是对特征建模来进行计算。此时一般使用类似sigmoid的函数就可以了。但是在决策类的人工智能任务中,我们往往对事件建模,此时需要使用其它的预测函数(或者按照官方的称呼,叫激活函数),比如泊松分布或者几何分布,对不同的事件,应使用不同的预测函数。
最后来说一下学习速率的问题,一般的教科书对此数值的处理方法是试探这五组值,并称为调参的艺术。实际上这是完全不懂人工智能背后的数学,导致人工智能在这些人眼里看起来像玄学。真正好的算法只需要用0.1这一个学习速率参数就足够了。我们永远需要记住,我们处理的问题是一个微扰问题,如果问题是非微扰的,目前的人工智能将无能为力,甚至目前的数学对非微扰问题都没有太多好办法。对偶性是目前唯一比较靠谱的非微扰方法,但这超出了我们讨论的范围,甚至是当前纯粹数学的最前沿问题。既然是在做微扰论,那么只要保证微扰展开成立就可以了,这种约束我们在上面的预测函数中已经讨论清楚了。如果你发现你的模型收敛的异常慢或者出现了梯度爆炸的情形,你首先应该考虑的是对模型中的特征做正规化处理,也即上一节我们谈到的无量纲化,而不是去调整学习速率。
网友评论