机器学习笔记040 | 大量数据的处理

机器学习笔记040 | 大量数据的处理_第1张图片

有句话是这么说的:

It's not who has the best algorithm that wins.
It's who has the most data.

数据对于机器学习来说,其重要性毋容置疑。

随着数据量的增加,算法预测的精准度也会有所增加:

机器学习笔记040 | 大量数据的处理_第2张图片

不过大量的数据,会带来一个直接的问题,那就是与之相匹配的运算量。

当我们的训练集非常大时,之前介绍的梯度下降算法,就因为巨大的运算量而显得不太好用。

怎么办呢?下面来说说几种解决的方式。

1 随机梯度下降(Stochastic Gradient Descent)

首先我们回顾一下梯度下降算法。

预测函数:

代价函数:

梯度下降算法需要同步执行的步骤:

随机梯度下降和这不一样的地方在于,梯度计算时不需要对所有的 m 个训练样本求和,每次只处理一个样本。

这样就不会因为训练样本数过大,而运行缓慢。

其代价函数为:

需要同步执行的步骤为:

因为每次只处理一个样本,为了避免样本顺序的影响,在计算之前先随机打乱样本顺序。

计算完一个样本然后在计算下一个,如此反复,直到所有样本都计算完毕。

如果说梯度下降算法的收敛是这样一条相对平滑的弧线:

机器学习笔记040 | 大量数据的处理_第3张图片

那么随机梯度下降算法的收敛过程就显得非常曲折:

机器学习笔记040 | 大量数据的处理_第4张图片

并且曲线最终没有收敛到一个点,而是一个区域。

如果每 1000 次迭代,绘画最近 1000 个样本的代价函数平均值,就是下面几个图中的蓝线。

情况一:趋势向下

机器学习笔记040 | 大量数据的处理_第5张图片

其中红线的学习速率 α 比蓝线的更小,我们可以看到其收敛的速度更慢。

虽然两者最终的结果有所差异,不过差异非常小。

如果将迭代次数从1000 变成 5000,得到的曲线会比原来更加平滑:

机器学习笔记040 | 大量数据的处理_第6张图片

不过缺点就是每 5000 个样本才得到一个数据点,因此这个曲线给出的反馈是相对延迟的。

情况二:上下波动

机器学习笔记040 | 大量数据的处理_第7张图片

如果出现上面这样的情况,我们将迭代的次数增加到 5000 次,可能会得到两种不同的曲线。

如果得到的是红线,说明算法其实有在收敛,只是速度比较慢。

如果是得到上图中的粉线,说明算法其实没有起到什么作用。

这时候我们应该尝试一些改变,例如调整学习速率,改变特征变量等等。

情况三:趋势向上

机器学习笔记040 | 大量数据的处理_第8张图片

这说明算法产生了背离, α 过大了,此时应该缩小 α 。

其实对于学习速率 α 的选择,也可以动态的进行:

通过这样的方式,随着迭代次数的增加, α 会越来越小,最终会收敛到较小的范围:

机器学习笔记040 | 大量数据的处理_第9张图片

不过这样也产生了一个新的麻烦,那就是多了一个参数 C 需要调试。

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

小批量梯度下降算法,是介于批量梯度下降算法和随机梯度下降算法之间的。

如果说批量梯度下降算法每次迭代使用的是全样本 m ,随机梯度下降算法每次迭代使用的是 1 个样本,那么小批量梯度下降算法每次迭代使用的 b 个样本,其中 1 < b < m 。

其梯度计算的公式是:

b 一般设置在 2 到 100 之间。

假如 m = 1000,设置 b = 10 ,也就是:

其中 i = 1, 11, 21, 31, … , 991 。

和随机梯度下降相比,每次处理 b 个样本的优势在于向量化处理。

当你有较好的向量化实现时,小批量梯度下降能够并行计算,使用更短的时间得到结果。

当然小批量梯度下降也有一个缺点,那就是多了一个额外的参数 b 需要调试。

3 在线学习(Online Learning)

在线学习算法的机制,和随机梯度下降算法差异不大,唯一的区别就是放弃了一个固定的数据集,通过不断获取新样本来训练学习。

训练完成之后,这个样本就被丢弃,之后也再也不会用到了。

我们举一个例子,假设在一个大型网站中,用户不断搜索手机信息,并点击浏览。

网站会不断收集用户搜索的关键字和点击的结果。如果用户点击了,就标记为 1 ,否则就标记为 0 。

那么用户每一次的搜索和点击,都会构成一个训练样本。

从本质上来说,这样的数据是无限,所以没有必要重复处理同一个样本。

当然,如果只有少量的用户,在数据非常少的时候,将数据保存在一个固定的数据集中才有意义。

通过在线学习的方式,每一个新的数据,都会给算法的学习结果带来调整。

对于用户偏好的变化,可以很好的适应。

4 映射约减(Map Reduce)

映射约减 (map reduce) 大规模机器学习常用到的一种方法。

其主要的过程是将训练集拆分成多个部分,然后分别交给不同的计算机进行计算,最终汇总结果:

机器学习笔记040 | 大量数据的处理_第10张图片

假如训练集数量 m = 400 ,把训练集拆分成 4 份:

机器学习笔记040 | 大量数据的处理_第11张图片

然后传到不同的计算机分别计算:

机器学习笔记040 | 大量数据的处理_第12张图片

最终进行汇总:

其结果和直接计算是一样的:

通过这样的方式,可以将计算变成并行,大大提高计算速度,降低运算时间。

理论上我们可以得到 4 倍的加速时间,不过考虑网络延时,以及数据汇总的额外消耗,得到的加速时间总是小于 4 倍的。

还有一种方式就多核处理。

现在很多计算机都是多核的,例如我们有一台 4 核计算机,就可以将训练样本分成 4 份,让每一个核处理其中一份:

机器学习笔记040 | 大量数据的处理_第13张图片

这样,相比使用多台计算机并行计算,就不用担心网络延时的影响。

5 注意

有时候并不是数据越多越好。

如果是高偏差的问题,使用大量的数据,算法效果也不会得到改善:

机器学习笔记040 | 大量数据的处理_第14张图片

所以在上大数据之前,应该先使用其中的一部分数据对算法进行验证。

文章转载自公众号:止一之路

机器学习笔记040 | 大量数据的处理_第15张图片

你可能感兴趣的:(机器学习笔记040 | 大量数据的处理)