Gradient Descent补充

Gradient Descent是机器学习中非常通用的参数优化方法,也有很多的变种。之前在这里也记录过一些。此次听李宏毅老师的课程又有新收获。

1、AdaGrad

在梯度下降法中,学习率的选择和调整是非常重要的,有时直接决定了训练的质量和收敛的速度。上图展示了学习率过大或过小会产生的问题。

一种自然的思路是,初始时候我们的参数值位于离极小值点较远的地方,因此学习率可以大一些,随着训练进行参数渐渐靠近极小值点,此时学习率应该小一些以免错过极小值点。因此我们可以直接采用上图中的Vanilla Gradient Descent方法。

但是仅仅这样是不够的,有一个亟待解决的问题是各个参数的陡峭程度不同,有些梯度很大,有些相对平缓,如果采用统一的学习率必然会产生一方迁就另一方造成的低效。因此我们要对不同参数设定不同的学习率,一种方法就是AdaGrad。

AdaGrad就是在Vanilla的基础上加入了一个分母,这个分母是目前为止所有轮次此参数对应的梯度的平方和的平均值再开方。也就是说如果之前的轮次这个参数对应的梯度都比较大,当前轮次学习率就倾向于更小,看上去好像蛮合理的。但是这里有个问题,当前轮次梯度越大,这个分母也越大(因为分母的计算包含当前梯度),这样下来参数更新的步长到底是如何变化呢?这个步长到底好不好呢?

这里李宏毅老师给了一种有趣的解释:这个分母项实际上是对二阶导的一种近似

具体来说,我们先看下面的简单示例:

若我们定义一步到位的步长为最佳步长,这个例子中的最佳步长就是。

实际上这个步长可以写成用一阶导和二阶导表示的形式:

回到我们的问题上来,AdaGrad的分母项其实就可以看作是二阶导的一个近似表示(毕竟直接求二阶导的计算量较大,而用一阶导近似并没有增加太多计算代价,因为一阶导已经计算好了)。

以上就是李宏毅老师对AdaGrad的讲解,这个有趣的角度是我之前没有了解过的,在此补充一下。

2、Feature Scaling

Feature Scaling即特征归一化,这个问题其实我在葫芦书笔记里已经记录过了,这里只是补充一个点。

梯度方向对应Loss Function的等高线的法线方向

梯度方向对应Loss Function的等高线的法线方向

梯度方向对应Loss Function的等高线的法线方向

重要的话说三遍。

其实这个知识点我之前也是了解的,但并未从这个角度理解过特征归一化带来的好处。

举例来说,上图中的取值比较小(1,2……),的取值比较大(100,200……),于是的变化导致的loss function的变化不会很大,因此的相对平缓,的变化则相对陡峭,表现在等高线图中就是一个椭圆形。

而我们进行梯度下降的时候实际上就是随机性选择一个出发点,然后沿等高线的法线方向不断前进,直到达到局部最优点。这时椭圆的劣势就很明显了,因为各等高线的法线方向并不一致,所以我们在收敛过程中会走弯路。近似圆形则好很多,我们可以少走弯路,收敛速度很快。

3、Gradient Descent Theory

这部分展示了为什么梯度下降法是可行的,是一个非常根本性的问题。有人会觉得这是很简单的问题,画个图就能解释,但是图示只能提供直觉性的理解,无法提供令人信服的理论解释。

首先考虑一个问题,给定一个点,你能在这个点的一个半径很小的邻域内找到最小值点吗?一听到邻域,我们就很自然地想到用微积分里的泰勒展开来近似函数。使用泰勒展开的优点在于我们可以根据需要对高次项进行高阶忽略

上面是一个二元泰勒展开,这里只保留了一次项,二次项及更高次数项都被高阶忽略了(这一点建立在邻域半径足够小的基础上)。

假设我们给定点,则其足够小邻域内,函数可以近似表示成如下形式:

可以看到,此时函数值中和参数值有关的部分可以表示为和偏导数向量的内积。要想得到最小值,很显然应该使得这两个向量方向相反,于是参数的变化方向就是负梯度方向。

需要注意的是,这里假定邻域半径很小,若邻域很大,则近似效果很差,可能需要考虑二次项及更高次项。然而考虑高次项又会使得计算代价太大,因此我们常用的方法依然是梯度下降法和较小的学习率相结合(学习率某种程度上可以看作衡量邻域大小的一个指标)。

你可能感兴趣的:(Gradient Descent补充)