机器学习基础---大规模机器学习

一:学习大数据集

讲述可以处理海量数据的算法html

思考:为何要使用海量数据集呢?要知道获取高性能的机器学习系统途径是采用低误差的学习算法,并用大数据进行训练。算法

低误差:代表指望输出和真实标记之间偏差小,学习算法拟合能力更强 高误差:代表指望输出和真实标记之间偏差大,学习算法拟合能力较差 低方差:代表训练数据集的变化对目标函数的估计值形成较小的变更 高方差:代表训练数据集的变化对目标函数的估计值形成较大的变更

这里拿以前提到过的易混淆词来举例,For breakfast I ate __ eggs,这里填two,而非too或者to,从下面的图中能够明确,只要使用大数据对算法进行训练,它的效果彷佛会更好。服务器

从这样的结果能够得出,在机器学习中,“It’s not who has the best algorithm that wins. It’s who has the mostdata.”,意思是决定因素每每不是最好的算法而是谁的训练数据最多网络

因此若是你想进行大数据集的学习,至少咱们要可以得到大数据集。机器学习

可是大数据集有它本身的特殊的问题,即计算问题。假设有m等于一亿的训练样本,想要训练一个线性回归模型或一个逻辑回归模型,而后用梯度降低进行更新:函数

能够看到其中计算梯度的项,当m等于一亿时,计算的代价太大了。因此在使用一亿个样本训练模型以前,咱们应该先试试随机选取少许样本(1000个),而后仅用这1000个样原本训练咱们的算法。因此在正式使用一亿个样本进行开发前,预先检查每每是个明智的选择。(使用少许样本进行训练,结果每每是同样的,这也是绘制学习曲线的经常使用方法)性能

左图是高方差状况,增长训练集样本每每有效,右图是高误差状况,增长训练集样本没有太大效果。咱们能够适当增长特征,使得右图向左侧转变。学习

因此在大规模计算中,咱们每每但愿能找到替代这个算法的算法或寻找更有效的计算这项的方法,接下来,将介绍两个主要方法:随机梯度降低和减小映射,用来处理海量的数据集大数据

二: 随机梯度降低法

对不少机器学习算法,例如线性回归、逻辑回归和神经网络,推导算法的方法是提出一个代价函数或提出一个优化目标,而后使用梯度降低这样的算法求代价函数的最小值,可是当训练集很大时,使用梯度降低算法的计算量会变得很是大,接下来将讨论对梯度降低算法的改进:随机梯度降低法优化

(一)回顾以前的线性回归模型

假设函数与代价函数以下:

使用梯度降低的公式以下:

可是当m很大时,咱们计算求和项(不断迭代求和),将变得十分困难:

由于咱们每次都要同时考虑全部的训练样本,因此咱们称之为批量梯度降低法。

(二)随机梯度降低法(更快)

那么当训练集很大时,用这样的梯度降低的更新,将会很是慢,花费的代价太大,下面来看一下更高效的算法,能够更好地处理大型数据集。

用另外一种方式写出代价函数:

这个代价函数其实是衡量假设函数在某个样本上的表现,所用整体的代价函数为:

用这种方法应用到线性回归模型上,写出随机梯度降低的过程:

1.随机打乱全部的数据集(随机打乱:将全部m个训练样本从新随机排列)(标准预处理过程);

2.对全部的训练样本进行遍历,进行更新:,这一项实际上是

因此随机梯度降低其实是遍历全部的训练样本。

首先是第一组训练样本,此时只对第一个训练样本的代价函数进行梯度降低操做,而后把参数稍微修改一下,使其拟合的更好。

而后以一样的方式继续操做后面的训练样本,直到完成整个训练集。

以前梯度降低法是遍历有所样本梯度降低一次,这里随机梯度降低法是每输入一个样本梯度降低一次

随机梯度降低不同的地方在于不须要对所有m个样本求和来获得梯度项,只须要对单个训练样本求出这个梯度项,来看一下随机梯度降低过程的迭代过程:

总的来看,参数是朝着全局最小化的方向移动的,整个过程仍是以随机迂回的路径朝着全局最小值前进,相比于普通梯度降低(红色的曲线),随机梯度降低的收敛形式是不一样的,它所作的是接二连三在某个区域中朝着全局最小值方向徘徊。

三:Mini-Batch梯度降低

将会介绍Mini-Batch梯度降低,它有时比随机梯度降低法还要更快一些

(一)三种降低法对比

(1)普通梯度降低:每次迭代都要用到全部的m个样本;

(2)随机梯度降低:每次迭代只需用到一个样本;

(3)Mini-Batch梯度降低:它是介于上述二者之间,每次迭代会使用b个样本(b是称为Mini-Batch大小的参数,一般b的范围2-100)。

例如:假设b=10,获得10个样本为:,而后进行梯度更新:,接着再从i+10开始进行更新,一直进行下去,写下完整算法以下:

Mini-Batch梯度降低算法的缺点之一是要计算参数b的大小时,可能须要花费些时间,不过若是有优秀的向量化方法(使得b个样本能够并行计算),有时它将比随机梯度降低运行的更快。

四:随机梯度降低收敛

将介绍确保算法的正确收敛以及调整随机梯度降低中的学习速率α的值

(一)正确收敛

回顾以前的普通梯度降低法,确保梯度降低已经收敛的一个标准方法就是绘制代价函数;

而对于随机梯度降低,为了检查算法是否已经收敛,能够进行如下的工做:

1.沿用以前定义的代价函数:

2.当随机梯度降低法进行学习时,在使用某个样本更新参数以前,能够计算出这个训练样本对应的假设表现有多好(即计算出代价函数);

3.为了检查随机梯度降低是否收敛,要作的是每1000次迭代,就画出前一步中所计算出的代价函数,把这前1000个样本的代价函数的平均值画出来,经过观察所画的图,就能检查出随机梯度降低法是否在收敛。

相比较以前的代价函数,每次都须要遍历全部的训练样本,而随机梯度降低法,只须要子啊更新θ以前计算这些cost函数。

下面是画出图的例子

若是获得的上述这样的图,能够看出代价函数的值在降低,可以判断学习算法已经收敛了;(红线是表示咱们选择了一个很小的学习速率,效果更好)

若是出现上述这样的状况,咱们对1000组样本(红线--若是提升样本数,曲线会更加平滑)取cost函数平均值,看起来代价函数收敛得很好。

若是出现上述这样的状况,看起来代价函数彻底没有在减少,彷佛算法没有在进行学习。可是若是给出更多的训练样本求平均值,出现的曲线结果多是如上图中红色的曲线所示,这样其实能看出代价函数是在减少的,只是求均值的样本太少的状况下,致使可能看不出其实是趋向于减小的;

若是获得上图粉色线所表示得图形,不管咱们增大样本数量,曲线依旧没有降低,说明了,出于一些缘由,咱们得算法并无进行学习。咱们能够调节学习速率或者特征

若是获得上图中这样的曲线,它看起来是在上升的,这样的状况就是算法发散的信号,这时要作的是用一个更小的学习速率α。

因此,经过上述所画的这些图,能够知道可能出现的各类状况,也可以应对不一样的状况采起不一样的措施。

(二)学习速率α

最后,讨论说一下关于学习速率α的状况:

在大多数随机梯度降低法的典型应用中,学习速率α通常是一个不变的常数,所以最终获得的结果会在全局最小值附近徘徊,获得的是一个很是接近全局最小值的值。若是想让随机梯度降低更好地收敛到全局最小值,可让学习速率α的值随时间变化逐渐减少。

一种典型的方法就是设置的值,让等于某个常数1除以迭代次数加上某个常数,它的缺点是要肯定两个常数的值须要花一些时间,可是若是可以找到这两个常数,得出的效果是很好的。

五:在线学习 

将讨论一种新的大规模的机器学习机制:在线学习机制。这个在线学习机制,让咱们能够模型化一些问题,就是咱们有连续一波数据或者连续得数据流,想要从中学习得这类问题。

若是你有一个由连续的用户流引起的连续的数据流,进入你的网站,你能作的是使用一个在线学习机制,从数据流中学习用户的偏好,而后使用这些信息来优化一些关于网站的决策。

(一)在线学习的案例

假设你提供运输服务,用户们向你询问把包裹从A地运到B地的服务,同时假定你有一个网站,用户们登陆网站告诉你他们想从哪里寄出包裹以及寄到哪里去,而后你的网站开出运输包裹的服务价格,根据你给用户的这个价格,用户有时会接受这个运输服务(y=1),有时候并不会接受(y=0),这里想要用一个学习算法帮助优化咱们给用户开出的价格。

假设已经获取了描述用户特色的特征,好比用户的人口统计数据、用户邮寄包裹的起始地以及目的地,咱们要作的是用这些特征学习用户将会用咱们的运输服务来运输包裹的几率,因此利用这些几率,就能够在新用户来的时候提供合适的价格。

考虑逻辑回归算法:假定有一个连续运行的网站,如下就是在线学习算法所作的:

报价是咱们的一个特征,其余特征为距离,起始地点,目标地点以及特定的用户数据----是特征X。 用户接受报价使用咱们的物流服务的可能性y 每次循环,咱们都会利用刚获得得(x,y)数据对来更新θ

若是真的运行一个大型网站,网站有连续的用户流,那么这种在线学习算法就很是适用。(能够适应变化得用户偏好)

(二)在线学习的案例二

这是一个产品搜索的应用,咱们想要用一种学习算法来学习,如何反馈给用户好的搜索列表。假设有一个卖手机的店铺,有一个用户界面可让用户登陆你的网站并键入一个搜索条目,例如“安卓手机、1080p摄像头”,假定店铺中有100种手机,因为网站设计,当用户键入一个搜索命令,会找出10部合适的手机供用户选择。这里想要用一个学习算法帮助咱们找到在这100部手机中哪10部手机是应该反馈给用户的。

接下来是解决问题的思路:

1.对于每一个手机以及给定的用户搜索命令,能够构建特征向量x,这个特征向量可能会表示手机的各类特征,多是:用户的搜索与这部电话的相似程度有多高、用户搜索命令中有多少词能够与这部手机的名字相配等等。

2.咱们须要作的是估计用户点击某一手机连接的几率,因此将y=1定义为用户点击了手机的连接,而y=0是指用户没有点击连接,而后根据特征x来预测用户点击特定连接的几率。、

3.若是可以估计任意一个手机的点击率,能够利用这个来给用户展现10个他们最有可能点击的手机。

这就是在线学习机制,咱们所使用的这个算法与随机梯度降低算法很是相似,惟一的区别就是不会使用一个固定的数据集,而是获取一个用户样本,从这个样本中学习,而后接着处理下一个,并且若是你的某个应用具备连续的数据流,在线学习机制很是值得考虑。

六:减小映射与数据并行

将讨论另外一种能够应用在大规模机器学习上的思想:叫作MapReduce

MapReduce的思想:

对于普通梯度降低法来讲:

假定有训练集以下:

根据MapReduce的思想,把训练集分割成不一样的子集,假设m=400(这里为了方便介绍,实际处理大规模数据m应该是4亿的数量集),有4台机器能够处理数据,

第一台机器用前四分之一的训练集:

计算求和:

而后接着以此类推处理后面的训练集:

如今每一个机器作的是四分之一的工做,使得它们能将原来的运行速度提升四倍,它们完成各自的temp计算后,而后把temp发给一个中心服务器去整合结果,最后更新参数:

下面是MapReduce的示意图:

若是想把MapReduce的思想应用在某种学习算法上,经过多台电脑并行计算来实现加速,思考:学习算法是否能表示成对训练集的一种求和?

实际上不少学习算法均可以表示成对训练集函数求和,而在大数据集上运行,所消耗的计算量就在于须要对很是大的训练集进行求和,因此只要学习算法能够表示为对训练集的求和,那么就能够用MapReduce将学习算法的使用范围扩展到很是大的数据集

看下面的例子:

假设想要用一个高级的优化算法,好比L-BFGS、共轭梯度算法等等,假定要训练一个逻辑回归学习算法,须要去计算两个重要的量:

(1)计算优化目标的代价函数:

(2)高级优化算法须要偏导项的计算过程:

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

具体而言,若是任何学习算法可以表达为,对训练集的函数的求和,那么便能将这个任务分配给多台计算机(或者同一台计算机的不一样CPU 核心),以达到加速处理的目的。

不少高级的线性代数函数库已经可以利用多核CPU的多个核心来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故(比调用循环快)。

这就是利用MapReduce来实现数据的并行操做,能有效的提升运行效率,因此经过本章的学习,但愿可以对大规模机器学习的方法有所了解和掌握。

相关文章
相关标签/搜索