课程链接 https://www.coursera.org/learn/machine-learning
参考文章 https://www.cnblogs.com/maxiaodoubao/p/10222170.html
用来处理大数据的算法
大数据集的学习 Learning With Large Datasets
如果有一个低方差的模型, 通常通过增加数据集的规模,可以获得更好的结果
但是如果数据集特别大,则首先应该检查这么大规模是否真的必要,也许只用 1000个训练集也能获得较好的效果,可以绘制学习曲线来帮助判断。
如果必须使用一个大规模的训练集,则可以尝试使用随机梯度下降法(SGD)来代替批量梯度下降法。
随机梯度下降法 Stochastic Gradient Descent
1.将m个训练样本随机重新排列。(数据预处理)
2.对m个训练样本进行遍历,关于某个单一的训练样本(x(i),y(i))来对参数按公式进行更新
随机梯度下降的做法实际上就是扫描所有的训练样本,首先是第一组训练样本(x(1),y(1)) ,然后只对这第一个训练样本 对它的代价函数计算一小步的梯度下降。换句话说 我们要关注第一个样本,然后把参数θ稍微修改一点,使其对第一个训练样本的拟合变得好一点。完成这个内层循环以后,再转向第二个训练样本, 还是一样在参数空间中进步一小步 ,即稍微把参数修改一点,让它对第二个样本的拟合更好一点。做完第二个再转向第三个训练样本,同样还是修改参数 让它更好的拟合第三个训练样本 ,以此类推 直到完成所有的训练集。然后外部这个重复循环会多次遍历整个训练集。
从这个角度分析随机梯度下降算法我们能更好地理解为什么一开始要随机打乱数据,这保证了我们在扫描训练集时对训练集样本的访问是随机的顺序 。这一步能让你的随机梯度下降稍微快一些收敛。
跟批量梯度下降不同,随机梯度下降不需要等到对所有m个训练样本求和来得到梯度项,而是只需要对单个训练样本求出这个梯度项。我们已经在这个过程中开始优化参数了,就不用等到把所有那3亿的美国人口普查的数据拿来遍历一遍,不需要等到对所有这些数据进行扫描,然后才一点点地修改参数 直到达到全局最小值。对随机梯度下降来说 我们只需要一次关注一个训练样本。
小批量梯度下降 Mini-Batch Gradient Descent
在批量梯度下降中, 我们会在每一代中使用所有的 m 个数据。 而在随机梯度下降中, 我们会在每一代中使用一个单一的数据。 小批量梯度下降则是介于两者之间。 具体地说, 用这个算法我们将在每次迭代中使用 b 个数据, 其中 b 是一个称为 "迷你批次" 的参数。
小批量梯度下降的一个缺点是, 现在有了这个额外的参数 b, 可能需要调整小批量批次的大小,因此可能需要时间。 但如果你较好地进行矢量化, 这有时可以比随机梯度下降运行更快。
随机梯度下降的收敛性 Stochastic Gradient Descent Convergence
目的:确保调试过程已经完成 并且能正常收敛。同样重要的是 你怎样调整随机梯度下降中学习速率α的值。
对于批量梯度下降的算法 我们确定梯度下降已经收敛的一个标准方法是画出最优化的代价函数,要保证这个代价函数在每一次迭代中都是下降的。
对于随机梯度下降算法,为了检查算法是否收敛 ,我们沿用之前定义的cost函数 ,在随机梯度下降法学习时,在我们对某一个样本进行训练前,在随机梯度下降中,我们要关注样本(x(i),y(i)) ,然后关于这个样本更新一小步,再转向下一个样本(x(i+1),y(i+1))
换一种说法,当随机梯度下降法对训练集进行扫描时 在我们使用某个样本(x(i),y(i))来更新θ前 计算出这个假设对这个训练样本的表现。我要在更新θ前来完成这一步,原因是如果我们用这个样本更新θ以后再让它在这个训练样本上预测,其表现就比实际上要更好了。
最后,为了检查随机梯度下降的收敛性,每1000次迭代运算中,我们对最后1000个样本的cost值求平均然后画出来。通过观察这些画出来的图,我们就能检查出随机梯度下降是否在收敛。
图1:红色线的学习率比蓝色线要小,因此收敛的慢,最后收敛的更好一些。
图2:红线通过对5000次迭代求平均,而不是1000个,得到更加平滑的曲线。
图3:蓝线颠簸不平而且没有明显减少。可以增大α来使得函数更加平缓,也许能使其像红线一样下降;或者可能仍像粉线一样颠簸不平且不下降,说明模型本身可能存在一些错误。
图4:如果曲线正在上升,说明算法发散。应该把学习速率α的值减小。
如果曲线看起来噪声较大,或者老是上下振动 ,那就试试增大你要平均的样本数量,这样应该就能得到比较好的变化趋势。如果你发现代价值在上升,那么就换一个小一点的α值。
在线学习 Online Learning
针对数据流,而非针对离线静态数据集进行学习。
在线学习的算法与随机梯度下降算法类似,只对单一的实例进行学习,而非对一个提前定义的训练集进行循环。
一旦对一个数据的学习完成,便可以丢弃它,不需要再存储。这样的好处在于可以针对用户当前行为,不断更新模型以适应该用户。慢慢地调试学习到的假设,将其调节更新到最新的用户行为。
映射化简和数据并行 Map Reduce and Data Parallelism
只要你的机器学习算法可以表示为训练样本的一个求和,只要算法的主要计算部分可以表示为训练样本的求和,那么你可以考虑使用映射化简技术来将你的算法扩展到非常大规模的数据上。