Andrew NG 机器学习 笔记-week10-大规模机器学习(Large Scale Machine Learning)

来源:互联网 发布:c语言那本书比较好 编辑:程序博客网 时间:2024/05/17 23:50

一、Gradient Descent with Large Datasets

1、大型数据集的学习(Learning with Large Datasets)

得到一个高效的机器学习系统的最好方式之一是,用一个低偏差的学习算法,然后用大量的数据训练它。

如 补全句子单词的例子。有大量的数据,很多算法都能够取得不错的效果。

有种说法:通常不是最好的算法取胜,而是谁有最多的数据。

但大数据集训练也有它自身的问题,如计算量问题。

比如:在使用梯度下降法时
数据量 m=100000000;
这里写图片描述

计算了1亿次求和,仅仅计算一步的梯度下降

在进行大规模计算前,应先随机选出几千条数据,看算法效果。

通过画学习曲线,左侧的高方差,增加数据集有用,右侧的高偏差,增加数据集没用:

这里写图片描述

2、随机梯度下降法(Stochastic Gradient Descent)

这里写图片描述

如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法来代替批量梯度下降法。

在随机梯度下降法中,我们定义代价函数为一个单一训练实例的代价:
这里写图片描述

随机梯度下降算法为:首先对训练集随机“洗牌”,然后:
这里写图片描述

随机梯度下降算法在每一次计算之后便更新参数 θ,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。

这里写图片描述

3、小批量梯度下降(Mini-Batch Gradient Descent )

小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数 b 次训练实例,便更新一次参数 θ。

这里写图片描述

通常我们会令 b 在 2-100 之间。这样做的好处在于,我们可以用向量化的方式来循环 b 个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现可能比随机梯度更快。

4、随机梯度下降收敛(Stochastic Gradient Descent Convergence)

现在我们介绍随机梯度下降算法的调试,以及学习率 α 的选取。

在批量梯度下降中,我们可以令代价函数 J 为迭代次数的函数,绘制图表,根据图表来判断梯度下降是否收敛。但是,在大规模的训练集的情况下,这是不现实的,因为计算代价太大了。

在随机梯度下降中,我们在每一次更新 θ 之前都计算一次代价,然后每 X 次迭代后,求出这 X 次对训练实例计算代价的平均值,然后绘制这些平均值与 X 次迭代的次数之间的函数图表。

这里写图片描述

左上角,减小 学习率 α ,可能收敛速度变慢,但最后收敛到更接近最小值点。
右上角,增加每次计算平均代价的数量,可以使曲线更平滑。
当我们绘制这样的图表时,可能会得到一个颠簸不平但是不会明显减少的函数图像(如上面左下图中蓝线所示)。我们可以增加 X 来使得函数更加平缓,也许便能看出下降的趋势了(如上面左下图中红线所示);或者可能函数图表仍然是颠簸不平且不下降的(如洋红色线所示),那么我们的模型本身可能存在一些错误。
如果我们得到的曲线如上面右下方所示,不断地上升,那么我们可能会需要选择一个较小的学习率 α。

我们也可以令学习率随着迭代次数的增加而减小,例如令:
这里写图片描述

随着我们不断地靠近全局最小值,通过减小学习率,我们迫使算法收敛而非在最小值附近徘徊。 但是通常我们不需要这样做便能有非常好的效果了,对 α 进行调整所耗费的计算通常不值得。

这里写图片描述

总结下,这段中,我们介绍了一种方法,近似地监测出随机梯度下降算法在最优化代价函数中的表现,这种方法不需要定时地扫描整个训练集,来算出整个样本集的代价函数,而是只需要每次对最后 1000 个,或者多少个样本,求一下平均值。应用这种方法,你既可以保证随机梯度下降法正在正常运转和收敛,也可以用它来调整学习速率α的大小。

二、Advanced Topics

1、在线学习(Online Learning)

一种新的大规模的机器学习机制。
在线学习机制让我们可以模块化问题。

今天,许多大型网站或者许多大型网络公司,使用不同版本的在线学习机制算法,从大批的涌入又离开网站的用户身上进行学习。特别要提及的是,如果你有一个由连续的用户流引发的连续的数据流,进入你的网站,你能做的是使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些关于网站的决策。

假定你有一个提供运输服务的公司,用户们来向你询问把包裹从 A 地运到 B 地的服务,同时假定你有一个网站,让用户们可多次登陆,然后他们告诉你,他们想从哪里寄出包裹,以及包裹要寄到哪里去,也就是出发地与目的地,然后你的网站开出运输包裹的的服务价格。比如,我会收取5020元等,然后根据你开给用户的这个价格,用户有时会接受这个运输服务,那么这就是个正样本,有时他们会走掉,然后他们拒绝购买你的运输服务,所以,我们想要一个学习算法来帮助我们,优化我们给用户开出的价格。

在线学习指的是对数据流而非离线的静态数据集的学习。许多在线网站都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利的进行学习。

假使我们正在经营一家物流公司,每当一个用户询问从地点 A 至地点 B 的快递费用时,我们给用户一个报价,该用户可能选择接受(y=1)或不接受(y=0)。
现在,我们希望构建一个模型,来预测用户接受报价使用我们的物流服务的可能性。因此报价 是我们的一个特征,其他特征为距离,起始地点,目标地点以及特定的用户数据。模型的输出是 p(y=1)。

在线学习的算法与随机梯度下降算法有些类似,我们对单一的实例进行学习,而非对一个提前定义的训练集进行循环。

这里写图片描述

一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。

每次交互事件并不只产生一个数据集,例如,我们一次给用户提供 3 个物流选项,用户选择 2 项,我们实际上可以获得 3 个新的训练实例,因而我们的算法可以一次从 3 个实例中学习并更新模型。

你会看到大公司会获取如此多的数据,真的没有必要来保存一个固定的数据集,取而代之的是你可以使用一个在线学习算法来连续的学习,从这些用户不断产生的数据中来学习。

我们所使用的这个算法与随机梯度下降算法非常类似,唯一的区别是,我们不会使用一个固定的数据集,我们会做的是获取一个用户样本,从那个样本中学习,然后丢弃那个样本并继续下去,而且如果你对某一种应用有一个连续的数据流,这样的算法可能会非常值得考虑。当然,在线学习的一个优点就是,如果你有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为。

2、MapReduce和数据并行(MapReduce and Data Parallelism)

MapReduce和数据并行对于大规模机器学习问题而言是非常重要的概念。之前提到,如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个数据集进行循环,计算量非常大。我们可以将数据集分配给多台计算机,让每台计算机处理数据集的一个子集,然后将计算结果汇总求和。这种方法就叫作MapReduce。

如果任何学习算法能够表达为,对训练集的函数求和,我们便可以将这个任务分配给多台计算机(或者同一台计算机的不同CPU核心),以达到加速处理的目的。

例如,我们有 400 个训练实例,我们可以将批量梯度下降的求和任务分配给4台计算机进行处理:
这里写图片描述

很多高级的线性代数函数库已经能够利用多核CPU的多个核心来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘由。

阅读全文
0 0
原创粉丝点击