大型数据集的学习(Learning With Large Datasets)
如果我们有一个低方差的模型, 增加数据集的规模可以帮助你获得更好的结果。
我们应该怎样应对一个有 100 万条记录的训练集?
以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,如果我们的学习算法需要有 20 次迭代,这便已经是非常大的计算代价。
首先应该做的事是去检查一个这么大规模的训练集是否真的必要,也许我们只用 1000 个训练集也能获得较好的效果,我们可以绘制学习曲线来帮助判断。
—————————————————————————————————————————————————————————
随机梯度下降法(Stochastic Gradient Descent)
如果我们一定需要一个大规模的训练集, 我们可以尝试使用随机梯度下降法来代替批量梯度下降法。
在随机梯度下降法中,我们定义代价函数为一个单一训练实例的代价:
随机梯度下降算法为:
首先:对训练集随机“洗牌”;
然后:
随机梯度下降算法在每一次计算之后便更新参数 θ, 而不需要首先将所有的训练集求和。
在梯度下降算法还没有完成一次迭代时, 随机梯度下降算法便已经走出了很远。
但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。
因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。
—————————————————————————————————————————————————————————
小批量梯度下降(Mini-Batch Gradient Descent)
小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法, 每计算常数 b 次训练实例,便更新一次参数 θ。
通常我们会令 b 在 2-100 之间。这样做的好处在于,我们可以用向量化的方式来循环 b 个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)。
—————————————————————————————————————————————————————————
在线学习(Online Learning)
一种新的大规模的机器学习机制,叫做在线学习机制。
今天,许多大型网站使用不同版本的在线学习机制算法,从大批的涌入又离开网站的用户身上进行学习。
特别要提及的是, 如果你有一个由连续的用户流引发的连续的数据流,进入你的网站,你能做的是使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些关于网站的决策。
在线学习算法指的是对数据流而非离线的静态数据集的学习。
许多在线网站都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利地进行算法学习。
在线学习的算法与随机梯度下降算法有些类似, 我们对单一的实例进行学习, 而非对一个提前定义的训练集进行循环。
一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。
这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
这些问题中的任何一个都可以被归类到标准的,拥有一个固定的样本集的机器学习问题中。
或许,你可以运行一个你自己的网站,尝试运行几天,然后保存一个数据集,一个固定的数据集,然后对其运行一个学习算法。
但是这些是实际的问题,即大公司会获取如此多的数据,真的没有必要来保存一个固定的数据集, 取而代之的是你可以使用一个在线学习算法来连续的学习,从这些用户不断产生的数据中来学习。 这就是在线学习机制。
然后就像我们所看到的,我们所使用的这个算法与随机梯度下降算法非常类似,唯一的区别的是,我们不会使用一个固定的数据集,我们会做的是获取一个用户样本,从那个样本中学习, 然后丢弃那个样本并继续下去, 而且如果你对某一种应用有一个连续的数据流,这样的算法可能会非常值得考虑。
当然,在线学习的一个优点就是,如果你有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为。
————————————————————————————————————————————————————————
Map Reduce and Data Parallelism
Map Reduce and Data Parallelism对于大规模机器学习问题而言是非常重要的概念。
之前提到, 如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个训练集进行循环,计算偏导数和代价,再求和,计算代价非常大。如果我们能够将我们的数据集分配给不多台计算机,让每一台计算机处理数据集的一个子集,然后我们将计所的结果汇总在求和。这样的方法叫做MapReduce。
具体而言,如果任何学习算法能够表达为,对训练集的函数的求和,那么便能将这个任务分配给多台计算机(或者同一台计算机的不同 CPU 核心),以达到加速处理的目的。
例如, 我们有 400 个训练实例, 我们可以将批量梯度下降的求和任务分配给 4 台计算机进行处理:
很多高级的线性代数函数库已经能够利用多核 CPU 的多个核心来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故(比调用循环快)。