Andrew Ng 机器学习笔记 15 :大数据集梯度下降

随机梯度下降

对于线性回归、逻辑回归、神经网络等等很多机器学习算法,其实现都是通过得出某个代价函数或者某个最优化的目标来实现的,然后使用梯度下降这样的方法来求得代价函数的最小值。

而梯度下降在大量数据的情况下,每一次的梯度下降的计算量就变得非常大,因为需要对所有的训练样本求和。因此,这种在每次迭代中对所有数据都进行计算的梯度下降算法也被称为批量梯度下降(batch gradient descent)

随机梯度下降原理

随机梯度下降的代价函数如下:

c o s t ( θ , ( x ( i ) , y ( i ) ) ) = 1 2 ( h θ ( x ( i ) ) y ( i ) ) 2 J t r a i n ( θ ) = 1 m i = 1 m c o s t ( θ , ( x ( i ) , y ( i ) ) )

随机梯度下降算法中,我们的步骤如下:

  1. 将所有数据打乱。
  2. 重复执行梯度下降计算,注意,这里每一次计算 θ j 不是遍历全部的训练集m,而是从m个训练集里取出1个样本来计算。所以每次梯度下降的计算只需要一个样本代入计算。这一点是和批量梯度下降最大的不同。

随机梯度下降过程中,相比于批量梯度下降,会更曲折一些,但每一次的迭代都会更快,因为我们不需要对所有样本求和,每一次只需要保证拟合一个样本即可。

实际上,运行随机梯度下降和批量梯度下降这两种算法的收敛形式是不同的,你会发现随机梯度下降最终会在靠近全局最小值的区域内徘徊,而不是直接逼近全局最小值并停留在那里。但实际上这并没有太大问题,只要参数最终移动到某个非常靠近全局最小值的区域内,这也会得到一个较为不错的假设。

由于随机梯度下降每一次的梯度下降计算只需要计算单个样本,而不是像批量梯度下降那样每次计算全部样本,所以随机梯度下降的下降过程会很快。

最后还有一个细节点,在随机梯度下降的过程中,我们定义了一个外层循环,那么这个外层循环应该定义为多少次呢?这取决于你样本的数量。一般情况下一次就够了,最多10次是比较典型的。所以我们通常循环执行1到10次。

小批量梯度下降

在批量梯度下降中每次迭代我们都要用所有的m个样本;然而在随机梯度下降中每次迭代我们只用一个样本;小批量梯度下降的做法介于它们之间。准确地说在这种方法中我们每次迭代使用b个样本,b是一个叫做“小批量规模”的参数。

小批量梯度下降vs随机梯度下降

那么小批量梯度下降算法和随机梯度下降算法相比,有什么优势呢?

答案是向量化。具体来说,小批量梯度下降算法比随机梯度下降算法更好的原因在于前者每次梯度下降过程中,批量处理的数据可以用一种更向量化的方法来实现,允许你部分并行计算10个样本的和,而随机梯度下降算法每次只去计算一个样本,没有太多的并行计算。

小批量梯度下降算法相比随机梯度下降算法的一个缺点,是有额外的参数b。因此你需要一些时间来调试小批量b的大小。但是如果你有一个好的向量化实现,这种方式会比随机梯度下降更快一些。

随机梯度下降的收敛

随机梯度下降过程中,在每一次梯度下降的迭代执行前,我们都去用当前的随机样本 ( x ( i ) , y ( i ) ) 来计算当前的关于θ的cost函数:

c o s t ( θ , ( x ( i ) , y ( i ) ) ) = 1 2 ( h θ ( x ( i ) ) y ( i ) ) 2

在每次迭代之后都去更新θ,每个样本迭代一次。

最后为了检查随机梯度下降的收敛性,我们要做的是每1000次迭代,我们可以画出前一步中计算出的cost函数。

我们把这些cost函数画出来,并对算法处理的最后1000个样本的cost值求平均值。如果你这样做的话它会很有效地帮你估计出你的算法在最后1000个样本上的表现。所以,我们不需要时不时地计算 J t r a i n ,那样的话需要所有的训练样本。

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/79953863