1. 大规模机器学习
1.1 大型数据集
现实世界中,往往数据集的规模很大,譬如人口普查数据、谷歌、阿里、亚马逊,....等这些互联网公司产生的海量数量。不论采用怎样的算法或优化,可能最后决定模型准确度的主要因素就是数据集的规模,于是,研究和优化大规模数据集的训练变成了很重要的内容。针对大数据集,如果我们一上来就用传统的梯度下降算法,可能往往会训练很慢很慢,达不到预期要求。那么我们该投入多少数据量来训练模型?便成了一个很实际的问题。譬如,数据总量有1亿条,那么我是不是将数据集的尺寸设为m = 100000000,来投入模型训练 ?
这时,行之有效的方法是投入一个较小数量的样本经行检查式的预训练,并观察训练损失、验证损失和数据集数量m的关系曲线:
假设我们预训练数据集尺寸m = 1000, 训练和交叉验证数据集的损失和m的关系如上右图,则表示,即使我们增大数据集的尺寸m也不会对模型的训练产生好处,模型的损失不再会下降很多(即模型精度不会提高很多);
假设关系图如上左,则表示我们还应该继续加大训练集的数量m。
1.2 随机梯度下降
假设训练集有3亿数据,那么如果我们用传统的批量梯度下降算法,没迭代一个参数θ,我们就需要遍历这3亿条数据,这还没考虑计算机内存能否装下这些数据,然而这才仅仅是n个参数中的1个θ的迭代。
具体如下图:
SGD公式表示:
利弊分析:
随机梯度下降算法在每一次计算之后便更新参数θ,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。
但是这样的算法存在的问题是, 不是每一步都是朝着”正确”的方向迈出的。 因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊
1.3 小批量梯度下降
小批量梯度下降Mini-Batch Gradient Descent算法是介于传统梯度下降算法(批量梯度下降)和随机梯度下降算法之间的算法,每计算常数b次训练实例,便更新一次参数θ。
传统梯度下降算法,每更新一次θ遍历整个数据集m个样本,SGD则遍历1个,小批量梯度下降遍历b个数据样本,b取值范围通常介于2~100之间。
举个例子,数据集有数据1000个,我们可以采取每批10个数据进行梯度下降:
这样做的好处在于,我们可以用向量化的方式来循环b个训练实例。如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)。
1.4 随机梯度下降收敛
本小节主要介绍在随机梯度下降模型运行过程中的图像和学习率α的选取
1.4.1平均损失-迭代次数
在随机梯度下降中,我们在每一次更新θ前都先计算一下损失函数cost(),并绘制平均损失和迭代次数的图表,用图表我们可以评估模型学习情况,损失下降情况。
譬如我们可以采用这种方式,每经过1000个数据样本,算一次平均损失(Σcost()/1000),将平均损失和当前迭代的轮数作为坐标绘图,我们绘制的图表可能如下图所示:从左至右分别命名为图1、图2、图3和图4
图一:
假设我们的数据集大小为1000,蓝色图像为SGD的损失曲线,可以看出学习效果不错,模型最终趋于收敛(即损失不再降低),那此时如果我们改用更小的学习率α来训练模型,得出的可能是红色曲线,我们发现,红色曲线下降到了更低的损失点,表面模型更优(同时也表明,蓝色曲线只是收敛到了局部最优解而不是全局最优解)
图二:
蓝色的曲线是正常SGD的损失曲线,此时我们不改变学习率,只是简单地将绘图间隔改为每5000个数据点一次,则我们可能会发现,绘制出的图(红色曲线)更为平滑。(因为拓宽了间隔,会导致cost变化幅度更服从整体,即趋于平滑)
图三:
蓝色曲线是SGD曲线,不过从曲线来看,模型并没有收敛,此时我们可以同样增加间隔至5000,此时绘制出的曲线如红色,可以看出,虽然损失下降的比较慢,不过还是正常下降的,即模型是正常学习的。如果画出的曲线如粉色线,那么则表明模型训练出了问题。可能是数据集、学习率、特征等情况需要调整。
图四:
蓝色曲线是SGD曲线,很明显是异常的,损失不降反升,我们可以尝试减小学习率α
1.4.2 学习率α选择
我们也可以令学习率随着迭代次数的增加而减小,例如令:
我们可以用两个常量+迭代次数来构造学习率α的公式,使得随着迭代次数的增加,公式分母增加,学习率α逐渐减小。
为什么采用变化的学习率?且越来越低?
理论上来说,学习率越小越好,学习率越小,则意味着每次迭代过程损失降低的较小,即向全局最优点前进的步伐越小,从而不容易导致陷入“局部最优解”的情况。但是不可能一开始就将α设置的很小,不然模型训练时间将大大增加,而且通常在模型训练的前期,损失降低的越快,此时利用较大的α可以迅速降低loss,加快训练速度。
于是乎我们便可以采用式子中的方式,逐渐降低α的方式来训练。
1.5 在线学习
今天,许多大型网站或者许多大型网络公司,使用不同版本的在线学习机制算法,从大批的涌入又离开网站的用户身上进行学习。特别要提及的是,如果你有一个由连续的用户流引发的连续的数据流,进入你的网站,你能做的是使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些关于网站的决策。
假定你有一个提供运输服务的公司,用户们来向你询问把包裹从 A 地运到 B 地的服务,同时假定你有一个网站,让用户们可多次登陆,然后他们告诉你,他们想从哪里寄出包裹,以及包裹要寄到哪里去,也就是出发地与目的地,然后你的网站开出运输包裹的的服务价格。比如,我会收取¥50 来运输你的包裹,我会收取 $20 之类的,然后根据你开给用户的这个价格,用户有时会接受这个运输服务,那么这就是个正样本,有时他们会走掉,然后他们拒绝购买你的运输服务,所以,让我们假定我们想要一个学习算法来帮助我们,优化我们想给用户开出的价格。
一个算法来从中学习的时候来模型化问题在线学习算法指的是对数据流而非离线的静态数据集的学习。许多在线网站都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利地进行算法学习。
假使我们正在经营一家物流公司,每当一个用户询问从地点 A 至地点 B 的快递费用时,我们给用户一个报价,该用户可能选择接受(y=1)或不接受(y=0)
现在,我们希望构建一个模型,来预测用户接受报价使用我们的物流服务的可能性。因此报价 是我们的一个特征,其他特征为距离,起始地点,目标地点以及特定的用户数据。模型的输出是p(y=1)。
在线学习的算法与随机梯度下降算法有些类似,我们对单一的实例进行学习,而非对一个提前定义的训练集进行循环
一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
每次交互事件并不只产生一个数据集,例如,我们一次给用户提供 3 个物流选项,用户选择 2 项,我们实际上可以获得 3 个新的训练实例,因而我们的算法可以一次从 3 个实例中学习并更新模型。
这些问题中的任何一个都可以被归类到标准的,拥有一个固定的样本集的机器学习问题中。或许,你可以运行一个你自己的网站,尝试运行几天,然后保存一个数据集,一个固定的数据集,然后对其运行一个学习算法。但是这些是实际的问题,在这些问题里,你会看到大公司会获取如此多的数据,真的没有必要来保存一个固定的数据集,取而代之的是你可以使用一个在线学习算法来连续的学习,从这些用户不断产生的数据中来学习。这就是在线学习机制,然后就像我们所看到的,我们所使用的这个算法与随机梯度下降算法非常类似,唯一的区别的是,我们不会使用一个固定的数据集,我们会做的是获取一个用户样本,从那个样本中学习,然后丢弃那个样本并继续下去,而且如果你对某一种应用有一个连续的数据流,这样的算法可能会非常值得考虑。当然,在线学习的一个优点就是,如果你有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为。
1.6 Map reduce和数据并行
Map reduce和数据并行(Data Parallelism)是对于大规模机器学习问题而言是非常重要的概念。之前提到,如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个训练集进行循环,计算偏导数和代价,再求和,计算代价非常大。如果我们能够将我们的数据集分配给不多台计算机,让每一台计算机处理数据集的一个子集,然后我们将计所的结果汇总在求和。这样的方法叫做映射简化。
MapReduce最早是由Google公司研究提出的一种面向大规模数据处理的并行计算模型和方法,搞大数据的同学一定很熟悉这个概念。MapReduce的推出给大数据并行处理带来了巨大的革命性影响,使其已经成为事实上的大数据处理的工业标准。
具体而言,如果任何学习算法能够表达为,对训练集的函数的求和,那么便能将这个任务分配给多台计算机(或者同一台计算机的不同 CPU 核心),以达到加速处理的目的。
例如,我们有 400 个训练实例,我们可以将批量梯度下降的求和任务分配给 4 台计算机进行处理:
将这四台机器运算的结果发送至另一台中心服务器,我们便可利用temp汇总得到梯度下降θ更新的表达式:
2. 应用实例
略
3. 总结
当然,有时带标签的数据,也可以用于异常检测算法的评估。此外,我们也花时间讨论了一些特别的应用或者特别的话题,比如说推荐系统。以及大规模机器学习系统,包括并行系统和映射化简方法,还有其他一些特别的应用。比如,用于计算机视觉技术的滑动窗口分类算法。
最后,我们还提到了很多关于构建机器学习系统的实用建议。这包括了怎样理解某个机器学习算法是否正常工作的原因,所以我们谈到了偏差和方差的问题,也谈到了解决方差问题的正则化,同时我们也讨论了怎样决定接下来怎么做的问题,也就是说当你在开发一个机器学习系统时,什么工作才是接下来应该优先考虑的问题。因此我们讨论了学习算法的评价法。介绍了评价矩阵,比如:查准率、召回率以及 F1 分数,还有评价学习算法比较实用的训练集、交叉验证集和测试集。我们也介绍了学习算法的调试,以及如何确保学习算法的正常运行,于是我们介绍了一些诊断法,比如学习曲线,同时也讨论了误差分析、上限分析等等内容。
所有这些工具都能有效地指引你决定接下来应该怎样做,让你把宝贵的时间用在刀刃上。现在你已经掌握了很多机器学习的工具,包括监督学习算法和无监督学习算法等等。