大规模机器学习(Large Scale Machine Learning)

1.大型数据集的学习

处理大数据集的算法
近年来机器学习技术的发展归因于我们有极其庞大的数据用来训练我们的算法。
处理如此海量数据的算法?我们为什么要用大的训练集呢?

我们已经知道一种获取高性能的机器学习系统的途径是采用低偏差的学习算法,并用大数据进行训练。即决定效果好坏的往往不是算法的好坏,而是谁的训练数据多。如果你想使用大数据进行训练,至少要能获得大数据集。

大数据学习的问题:计算问题
如果有一亿条训练数据,可以和从这一亿条数据中随机抽取一千条数据训练的结果相同,为什么我们不用一千条进行训练呢?

增大训练数据是否能提升算法的好坏?

高效的计算方法用来处理大数据:
1.随机梯度下降
2.减少映射

2.随机梯度下降

对于很多机器学习算法,例如线性回归、逻辑回归和神经网络,我们推导算法的方法是提出一个代价函数,或提出一个优化目标,然后使用梯度下降的算法求代价函数的最小值。

当我们的训练集很大时,梯度下降算法的计算量会变得非常大。对普通梯度下降算法的改进:随机梯度下降法。

当训练数据非常大时,梯度下降变为批量梯度下降。批量这个词指的是我们每次都需要同时考虑所有的训练样本。你要不端的迭代,就需要不断地求和,三亿数量的求和,计算需要花费很长时间。

如果每次迭代时不用考虑全部的样本,仅仅只需要考虑一个训练样本。

1.随机打乱所有数据
2.代入随机打乱的的训练样本,对代价函数进行优化,直到全局收敛(不需要代入三亿数目就会使代价函数最小化)

换个写法:

迭代会更快,不需要对所有训练样本进行求和
每一次迭代只要保证能拟合某一训练样本就行了

两者相比,收敛方式是不同的,随机梯度下降法就是连续不断地在某个区域内朝着全局最小值徘徊,而不是直接达到全局最小值。但通常我们使用随机梯度下降就可以达到一个很好的全局最小值,这对于算法的实际效果就已经足够了。

最后,在随机梯度下降法中有一个外层循环,它决定了内层循环的执行次数,所以外层循环应该执行多少次呢?这取决于训练集的大小,通常一次就够了(1-10次)。

3.Mini-Batch梯度下降

比随机梯度下降还要快哦!

它的思想是既不使用全部的样本,也不一次只用一个样本,而是一次使用b个样本。

比方说b = 10时:

完整的算法:

为什么我们使用b个样本而不是像随机梯度下降那样每次只使用一个样本呢?
因为在向量化的过程中,Mini-Batch梯度下降法可能要比随机梯度下降法表现要好,仅当你有一个好的向量化方式。因为包含了b个样本更向量化的方式执行,将使你在10个样本内部分并行运算。换句话说,如何使用合适的向量化方式计算余下的样本,可以部分使用好的数值代数库然后对b个样本进行并行运算。

Mini-Batch梯度下降的缺点之一是:当有一个额外的参数b时,你需要确定Mini-Batch的大小,这可能需要费些时间,不过如果你有优秀的向量化方法,有时它将比随机梯度下降运行的更快。

4.随机梯度下降收敛

运行随机梯度下降法,你怎么保证调试过程已经完成,并且已经收敛到合适的位置了呢?你怎么调整随机下降梯度中学习速率α的值呢?

确保算法收敛
选择合适的学习速率α

回顾之前的批量梯度下降算法,确保梯度下降已经收敛的一个标准方法就是绘制优化代价函数,这是一个关于迭代次数的函数,要确保代价函数在每一次迭代中都是下降的。

比起之前需要是不是的计算Jtrain,那样就得遍历所有的训练样本,而随机梯度下降法的步骤只是在更新θ之前计算这些cost函数,并不需要太大的计算量。我们要做的就是在1000次迭代中,求出前1000个cost函数的平均值,然后把它画出来,通过观察所画的图我们就能检查出随机梯度下降是否在收敛。

画图实例:

如果使用一个更小的学习速率,震荡就会变小,最终结果也会变好一点(区别可以忽略)。
增大训练样本的数量,得到的曲线更平滑。但是速度会变慢。
样本太少,噪声明显。增大训练样本,曲线会变得优化,如果没有变好,说明你需要调整学习速率或调整特征或者算法的其他东西。
曲线上升,需要用更小的学习速率α。

在大多数随机梯度下降法的典型应用中,一般你最终得到的参数只是一个全局最小之的接近值,而不是真正的全局最小值。在大多数,随机梯度下降法的典型应用中,学习速率α一般是不变的,如果你想要最终的收敛结果达到局部最小值,你可以做的就是让学习速率α的值随着时间变化逐渐减小。

你的最终值会比较接近全局最小值(每一步都会越精确)。

5.在线学习

在线学习机制让我们可以模型化一些问题,就是我们有连续一波数据或者连续的数据流,先要用算法从中学习的这类问题。

网站用户数据流,就可以用在线学习机制从数据流中学习用户的偏好,然后用这些信息优化关于网站的决策。

在在线学习机制中,我们实际上丢弃了固定的数据集这一概念,取而代之是一个算法,现在我们获取一个样本,然后利用那个样本以这种方式学习。然后我们丢弃这个样本。因为你有强大的数据流,没必要反复使用样本。

连续的数据流是关键。

这种在线学习机制可以适应变化的用户偏好。

卖手机的选项供用户选择;
CTR:点击率
产品搜索问题,使用在线学习机制在线学习用户点击情况
网站展示特别优惠;
新闻网站推荐;
商品推荐;
...

这些问题中的任何一个都可以被转变为标准的,拥有一个固定的样本集的机器学习问题。或许你可以让网站运行几天,然后保存一个固定的数据集,然后转变为一个拥有固定数据集的机器学习问题。但是在实际中,大公司的大网站有如此多的数据,所以真的没必要保存一个固定的数据集。可以使用在线学习算法,来连续的学习,从这些用户不断产生的数据中来学习。

优点:如果你有一个变化的用户群,又或者你在尝试预测的事情在缓慢变化(用户品味),在线学习算法可以慢慢地调试你所学习到的假设,将其调整更新为最新的用户行为。

6.减少映射与数据并行

应用在大规模机器学习上,MapReduce

你可以将学习算法应用到随机梯度下降不能解决的规模更大的问题。

把训练集分成10份或者100份...计算完成后再返回到一个服务器上。
这个公式完全等同于批量梯度下降算法,只是不需要在一台机器上计算。

示意图:

只要学习算法可以表示成一系列的求和形式,或者表示成在训练集上对函数的求和形式,你就可以使用MapReduce技巧来并行化学习算法,使得其可以应用于非常大的数据集。

计算机可以有多个CPU,CPU又有多个核心,如果你有很大的数据集,且你有一个四核电脑,可以用MapReduce分共工作,然后每个核心计算四分之一训练样本的总和。还不用担心数据传输和网络延迟。有些线性代数库可以自动在一台机器上不同核心上进行并行代数运算。而且如果你的学习算法有非常好的向量化表示,你就可以直接以向量化的形式应用标准学习算法,不用担心并行。你的线性代数库会帮你处理的很好,所以你可以不应用MapReduce。

应用举例:照片OCR

第一百四十七课:问题描述与OCR pipeline

照片OCR技术:
1.复杂。一个复杂的机器学习系统是如何被组装起来的。
2.机器学习流水线。如何分配资源来对下一步计划做出决定

自己开发/团队开发

3.机器学习中很多有用的想法和概念 。

如何将机器学习应用到计算机视觉问题中!!!
人工数据合成

照片OCR技术:照片光学字符识别(读取图片中的文字信息)

步骤:
1.扫描图片,找处照片中的文字信息
2.重点关注文字区域,并对区域中的文字进行识别
3.显示和记录文字

文字检测
字符分割
文字分类

像这样一个系统,我们称之为机器学习流水线:

如果你要设计一个机器学习系统,你要作出的最重要的决定之一就是你要怎么设计这个流水线的各个模块。(如何将这个问题分成一系列不同的模块,这会影响到你算法的最终表现)

第一百四十八课:滑动窗口

流水线中每个独立组件的工作原理?
文字识别是长宽不同的矩形,所以先看个行人检测的例子。

为了建立一个新人检测系统,我们要做的是从数据集中收集一些正样本和负样本(包含行人和不包含行人)。然后你可以在你的网络中训练,或者使用其他学习算法,来对y进行分类,来划分每个图块是否包含一个行人。

监督学习

移动绿色滑块(一定步长移动),每次移动都是用分类器进行分类,遍历图片中的不同位置,并且通过分类器进行分类,判断图片中是否有行人。

这就是你如何训练一个监督学习分类器,然后使用一个滑动窗口分类器或者说滑动窗口检测器找出图中所有的行人。

回到文字检测:

正负样本训练
滑动窗口检测
绘制矩形
扩大白色区域
丢弃不适用长宽比

现在获得了文字区域,转到流水线下一步:
识别文本

再次使用监督学习算法
寻找字符分割,训练分类器,再次使用滑动窗口

训练26个字母,识别出字母。

第一百四十九课:获取大量数据和人工数据?

从哪获取这么多训练数据呢?
人工数据合成

假如这个想法适用于你的机器学习模型,有时它能为你的学习算法轻松得到大规模的训练集。

人工数据合成主要包括两种形式:
第一种:自己创造数据
第二种:我们已经有小的标签训练集,然后以某种方式扩充训练集(较小的训练集转换成一个较大的训练集)

假如我们收集到了一个大的标签数据集,我选用了一个正方形的长宽比,目标是输入一个图像块然后识别出图像块中央的字符。

现代计算机有一个庞大的字体库,任意字体粘贴到一个任意的背景中,应用一点模糊算子或者仿射变换,缩放和旋转操作就生成了一个人工数据集。

使用合成的数据,你实际上能为你的人工训练合成提供无限的训练数据样本。

使用现有的样本生成数据:
实际图片:人工扭曲

语音识别:
人工添加失真,引入不同的背景声音,就可以扩充样本数。

人工合成要合理。
当你在决定该添加那种失真时,认真考虑一下,添加什么样的失真才是有意义的?怎么样才能使你生成的样本至少有一定的代表性?

1.在合成大量的人工样本之前,要确保你的分类器偏差较低,这样的话更多的训练数据才有意义,标准的做法是绘制一个学习曲线来确保你有一个低偏差、高方差的分类器。如果你的分类器偏差太高,那么你可以尝试持续增加分类器的特征数量或者增加神经网络隐藏单元的数量直到偏差值降低。
2.获得比我目前的数据量多10倍的数据量,需要花费多少努力?

此外,
自己增加数据/添加标签
众包

第一百五十课:天花板分析(下一步工作的pipeline)

上限分析,它通常能够提供一个很有价值的信号,很好的指导你,你的工作流中的哪一部分最值得你花时间去研究?

一个有效的方法是对学习系统使用一个数值评估度量(文本识别正确的比例)。

上限分析的主要度量:
首先我们关注这个机器学习工作流中的第一个模块,对于每一个测试样本,都给它提供一个正确的文本检测结果(直接给出正确答案)。继续运行,使用跟之前一样的评价度量指标,来测量系统的准确率。如果用这个完美的文本检测系统,准确率提升了。

接着人工输入其他模块正确标签。
就能得到它们各自的上升空间是多大。

通过这种分析,你可以知道提升每个模块的潜在效果如何?或者说一个模块近乎完美时,系统性能增益多少?这就像给系统表现加上了一个提升的上限值。

工作流非常常用,却又很复杂的机器学习应用。上限分析可以用来衡量模块的表现,找到能提升算法性能的关键问题。

第一百五十一课:总结和感谢

我们学了什么?
监督学习算法
线性回归、逻辑回归、神经网路和支持向量机(SVM)
在这些例子中,你会有带标签的数据和样本

无监督学习算法
K均值算法、主成分分析法用来降维、异常检测算法
在这些算法中,你只有无标签的数据和样本
此外,异常检测算法也可以在有标签的样本中对算法进行评估

特定的应用和话题
推荐系统、大规模机器学习系统、并行和映射-化简算法
滑动窗口分类器(计算机视觉)

如何构建机器学习系统的建议
什么东西使得机器学习算法工作或是不工作?
谈论了方差和偏差、如何使用正则化来解决方差问题

如何决定下一步要做什么?
当你开发一个机器学习系统时应该如何合理分配你的时间?
学习算法的评估方法?
召回率和F1分数这样的评价指标
实践方面的评测方法(训练集、交叉验证集和测试集)

如何调试算法?
确保算法能够正常工作
诊断算法?
学习曲线、误差分析、上限分析等

我希望不仅仅认识了这些工具,更重要的是怎么有效的使用它们来构建强大的机器学习系统。

如果你跟着这么课学到现在,那么你可以自信地认为你已经成了机器学习方面的专家。如你所知,机器学习是一门在科学、技术和产业方面都有着深远影响的学科,现在你已经具备了使用这些机器学习的工具来发挥巨大作用的能力。

希望你们中能有很多人能够利用这些机器学习工具来构建出色的系统和应用以及出色的产品,并且希望你们能够利用机器学习,不仅仅是为了自己,更是为了有朝一日能够造福其他人的生活。

我还想告诉大家,给大家教这门课真的很有趣,所以谢谢你们。最后,在结束之前,我还想多说几句,在不久之前,我也是一个学生,甚至到了现在,我也尽可能挤出一些时间去上一些课,学一些新的东西,所以我很能体会你们学这门课的辛苦,因为你们可能也是很忙的人,生活中有很多很多事情要处理,即便如此你也还是挤出时间来观看这些课程视频。我知道这些视频长达数个小时,但你还是能够拿出时间来做这些复习题,并且很多人还愿意花时间去做那些编程练习题,那些题目都很长而且很难。所以我要对大家说一声谢谢。我知道,很多人学这门课都非常努力,很多人都在这门课上花了大量时间,很多人把自己整个人都扎进了课程,我希望你们能从中收货很多知识。在这最后,我要说:感谢你们能来当我的学生。

你可能感兴趣的:(大规模机器学习(Large Scale Machine Learning))