本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍批量梯度下降法的弊端进而引出随机梯度下降法,并通过代码构建随机梯度下降法。
一
批量梯度下降法的弊端
前几个小节介绍的梯度下降法,一直是将想要最优化的损失函数相应在某一点θ的梯度值准确的求出来。
通过上面的公式也可以看出,要想求出准确的梯度,梯度向量中的每一项都需要对所有样本进行计算,这样的梯度下降法称之为批量梯度下降法(Batch Gradient Descent)。也就是说,每一次计算过程都是将样本中所有的信息批量的进行计算,很显然这样会带来了一个问题,如果样本量m非常大,计算梯度本身也是非常耗时的。
二
随机梯度下降法
在批量梯度下降法中,由于每一项都对m个样本进行计算,然后为了取平均在前面除以了m。所以一个很自然的想法就是每一次只对其中的一个样本进行计算,如下图的右部分所示:
每一次计算梯度只取其中的一个样本,相应的对于添加一列1的样本矩阵Xb而言,每次计算只取其中的一行,同时也不用再在前面除上样本数m了。使用右边的式子来当做搜索的方向,此时说的是搜索的方向而不是梯度的方向,因为右边式子本身已经不是损失函数梯度了。只不过我们观察梯度式子,每一次都随机取出一个样本i,对应右边的式子也是一个向量,也可以表达一个方向,我们向这个方向进行搜索不停的迭代,直至达到损失函数最小值。这种梯度下降法被称为随机梯度下降法(Stochastic Gradient Descent)
如果是批量梯度下降法,参数的行进轨迹会是一个波动很小并且一直朝着损失函数值最小的方向。但是随机梯度下降法,不能保证每次计算得到的方向都是损失函数减小的方向,更不能保证是减小速度最快的方向,所以参数的搜索路径会呈现上图的样子,可能在某一时刻向着梯度增大的方向前进,也可能向着梯度减小的方向前进,这就是随机的特点,具有一定的不可预知性。
不过通过实验发现,通过随机梯度下降法通常情况下依然能够差不多的来到损失函数相应最小值的附近,虽然他可能不会像批量梯度下降法那样一定来到最小值这个固定的位置,但是当我们的m非常大的话,可能我们愿意用一定的精度来换取一定的时间,这样随机梯度下降法就有意义了。
在具体实现的时候,有一个非常重要的技巧,就是在随机梯度下降法过程中,学习率的取值变的很重要,这是因为在随机梯度下降法的过程,如果学习率一直取一个固定值的话,很有可能在一定程度上,随机梯度下降法已经来到最小值中心左右的位置,但是由于随机的过程不够好,学习率η又是一个固定值,慢慢的可能就会跳出最小值所在的位置,所以在实际中,我们希望在随机梯度下降法中,学习率是逐渐递减的。我们可以设计一个函数来让学习率η值随着随机梯度下降法循环次数的增加相应的学习率η值越来越小,具体的函数如下图右部分所示,对三种学习率递减函数进行标号:
- 式子1。当循环次数为1的时候η值为1,当循环次数为2的时候学习率η值为0.5...依次类推。随着循环次数的逐渐增加,学习率η将会逐渐的减小,不过这样的实现有的时候会有一些问题,当我们的循环次数比较少的时候,η值下降的太快的,循环迭代次数从1变到2,η值直接从1下降到0.5,但是如果循环次数从10000增长到10001的话,此时的η值才下降了万分之一,前后η值下降速度比例差别太大了;
- 式子2。由于式子1的η值下降速度的比例差别太大,通常在具体实现的时候,在分母上加上一个常数b,来缓解这种情况,在本课程中b通常取值为50,也就是说当循环次数从0上升到1的时候,η只会下降2%左右,这样一来缓解在初始的情况下,η值变化太大,另外在分子部分固定取1的话,在有些时候可能也达不到理想的效果;
- 式子3。所以在式子2的基础上让分子也取一个常数a,比分子固定为1要灵活一些。
其中的a,b就是随机梯度下降法对应的两个超参数,不过在本课程中不对两个超参数进行调整,此时选择经验上比较好的值:
- a的取值为5;
- b的取值为50。
但是不管怎么样,在随机梯度下降法中为了得到比较好的收敛结果,学习率应该随着循环次数的增加逐渐递减的。
实际上这种逐渐递减的思想是模拟搜索领域非常重要的思想~模拟退火的思想。所谓模拟退火的思想就是模拟在自然界的情况下,比如说打造钢铁使用火炼,在这个过程中,火炼的温度是从高逐渐到低冷却,也就是所谓的退火的过程,此时冷却的函数是和时间t是相关的。所以有的时候将η中的a,b两个参数用t0和t1来表示,相应的就是模拟退火中的时间。
三
实现随机梯度下降法
批量梯度下降法:
接下来就是随机梯度下降法最关键的步骤。不需要传入学习率η,此时学习率η值是由前面介绍学习率衰减函数计算得到的。对于批量梯度下降法来说,循环终止的条件有两个:
- 循环次数达到了预设最大的循环次数;
- 两次迭代损失函数的减小值不能够达到预设精度那么多。
不过在随机梯度下降法中,由于梯度改变方向是随机的,所以此时的损失函数不能保证是一直减小。因此很有可能损失函数的值是跳跃的,正因为如此,使用批量梯度下降法中第二个条件终止循环并不好,也就是这一次搜索比上一次搜索他们的差距特别的小,并不代表离损失函数的中心更近,很有可能和这一次随机的样本得到的梯度有关,所以在随机梯度下降法中就不需要第二个循环终止条件了,相应的只判断当前的循环次数有没有达到预设的循环次数即可,此时可以直接写一个for循环。
将循环次数设置为样本总数除上3,这相当于随机梯度下降法这个循环只需要循环三分之一样本个数就好了。换句话说,我们只是随机的检查了三分之一样本总量那么多的样本。此时检查的样本量比在批量梯度下降法一次循环检查的样本量都要少。在批量梯度下降法的时候每次循环都要对所有的样本进行计算来算出真正的梯度。
时间比批量梯度下降法要快的多,而且两种梯度下降法得到的结果非常接近。随机梯度下降法只检测了三分之一样本就得到相对精度比较高结果。
在应用随机梯度下降法处理高维样本的时候,不能这样直接的随机使用三分之一样本,这里将迭代次数设置为三分之一仅仅为了展示随机梯度下降法策略的强大之处。