随机梯度下降法

1. 概念

随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降 那个梯度值准确的求出来。

随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_02


  那么通过推导的这个公式可以看出来,要想求出这个准确的梯度来,在这个式子中每一项都要对所有的样本(随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03 个)进行一下计算,前面是有一个求和计算的,那么这样的一个下降法通常又叫做批量梯度下降法(Batch Gradient Descent)。也就是说,每一次计算的过程都要将样本中所有的信息批量的进行计算,但是这显然就带来了一个问题,如果我们的 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03 个样本进行了计算,我们为了取平均,还除了一个 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03 ,所以一个自然衍生的想法就是我们可不可以每一次只对其中一个样本进行计算呢?基于这样的想法,我们就可以将上述式子变成:

随机梯度下降和标准梯度下降 随机梯度下降法_最小值_07


  在这里,我们把求和符号去掉,同时对于这个 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_08 来说,我们每次都取固定的一个 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_08,相应的,我们在括号外就不需要再除以 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03 了,直接乘以 2 就好了。当然了,我们也可以将上面的式子进行向量化:

随机梯度下降和标准梯度下降 随机梯度下降法_搜索_11


  这个向量化的方式和之前是一样的,只不过此时对于我们的 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_12 来说,我们每次只取 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_12 的一行进行计算就好了,我们使用这样一个式子来当作我们搜索的方向,是不是可以呢?这里需要特别注意一点,这里说的是搜索的方向,而不是梯度的方向,因为这个式子已经不是损失函数的梯度了,只不过我们观察梯度这个式子设想一下,每一次我们都随机取出一个 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_08,对于随机取的这个 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_08,然后用下列式子进行计算:

随机梯度下降和标准梯度下降 随机梯度下降法_最小值_16


  通过这个式子计算得到的也是一个向量,也可以表达一个方向,我们向这个方向进行搜索,不停的迭代,能不能得到我们损失函数的最小值呢?那么这样的一个思想它的实现思路叫做随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_17


  随机梯度下降法的搜索过程如上图所示。可以回忆一下,如果是使用梯度下降法,我们从外面的一点开始搜索,将会坚定不移的朝着一个固定的方向,也就是我们整个损失函数的最小值的那个方向向前移动。但是随机下降梯度法由于不能保证我们每次得到的方向一定是我们损失函数减小的方向,更不能保证一定就是减小速度最快的那个方向,所以我们的搜索路径就会形成这样的一种路径,这就是随机的特点,它具有不可预知性。不过实验结论告诉我们,即使如此,我们通过随机梯度下降法通常依然能够差不多的来到我们整个损失函数的最小值点附近,虽然它可能不会像梯度下降法那样一定来到最小值点。但是当我们的 随机梯度下降和标准梯度下降 随机梯度下降法_搜索_03 非常大的话,很多时候我们可能更愿意使用随机梯度下降法,用一定的精度换取一定的时间随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19)的取值变得很重要,这是因为在我们随机梯度下降法的过程中如果我们的学习率一直取一个固定值的话,很有可能在一定程度上我们随机梯度下降法已经来到这个最小值中心左右的位置了,但是由于这个随机的过程不够好,我们的 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 又是一个固定值,慢慢的又跳出了这个最小值所在的位置,所以在实际中我们希望在随机梯度下降法中我们的学习率是逐渐递减的,那么我们就可以设计一个函数来让我们的学习率(随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 )随着梯度下降法循环次数的增加,相应的 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 值越来越小,你可能已经想到了,最简单的方法就是使用倒数的形式(i_iters 表示循环次数):

随机梯度下降和标准梯度下降 随机梯度下降法_最小值_23


  不过,这样的一个实现有的时候会有一些问题,当我们的循环次数比较少的时候,我们的 η 下降得太快了。比如说,i_iters 从 1 变到 2,我们的 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 一下就下降了 50%,如果 i_iters 从 10000 增长到 10001 的话,我们的 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 才下降了万分之一,那么前后 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 值下降的比率相差太大了,所以通常在具体实现的时候,我们在分母上添加一个常数 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_27,后面我通常给 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_27 的取值为 50:

随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_29


  在分子的位置,如果我们固定取 1 的话,有时候可能也达不到我们想要的效果,所以我们让我们的分子也取一个常数 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_30

随机梯度下降和标准梯度下降 随机梯度下降法_最小值_31


  所以,我们可以将 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_30随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_27 看成随机梯度下降法对应的两个超参数,不过在之后的学习中,不对这两个超参数做调整,我们选用一个经验上比较好的值,随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_30 = 5, 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_27  事实上,这种逐渐递减的思想是模拟退火的思想。所谓的模拟退火的思想,其实就是模拟我们在自然界的情况下,比如说,打造钢铁需要用火炼,在这个过程中,火炼的温度是从高逐渐到低冷却的,也就是所谓的退火的过程,那么这个冷却的函数是和时间 随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_36 相关的。所以,有的时候,我们也将 随机梯度下降和标准梯度下降 随机梯度下降法_最小值_19 的值写做:

随机梯度下降和标准梯度下降 随机梯度下降法_搜索_38


2. 实现

  我相信我已经将随机梯度下降的原理介绍清楚了,下面我们就来具体代码实现一下。

随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降_39


随机梯度下降和标准梯度下降 随机梯度下降法_搜索_40


随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_41


随机梯度下降和标准梯度下降 随机梯度下降法_最小值_42


随机梯度下降和标准梯度下降 随机梯度下降法_随机梯度下降和标准梯度下降_43

  具体代码见 25 随机梯度下降法.ipynb