机器学习 day17大规模机器学习

01 学习大数据集

大规模机器学习就是处理大数据集的算法


  • 一种获取高性能的机器学习系统的途径是采用低偏差的学习算法并用大数据进行训练。
  • 大数据集学习的特有问题是计算问题。
  • 在训练一亿个样本之前,我们可以随机选择一亿个样本中的一千个样本,然后用这一千个样本来训练我们的算法。如果用一千个样本训练效果也是一样的话,在训练大量的模型前预先检查往往也是一个明智的选择。如果效果相同的话,可以根据这一千个样本绘制学习曲线,如果画出左图高方差的曲线那么增加训练集还是有作用的,如果是右边高偏差的算法,样本也不会比训练1000个更好了,如果是右图那么自然而然地会添加额外地特征项或在神经网络中添加额外地隐藏单元,这样最终可能得到左边的图。

在这里插入图片描述

02 随机梯度下降

当我们训练集很大时,梯度下降算法的计算量会变得非常大,因此对普通的梯度下降法进行改良为随机梯度下降法,使得算法能够应用于大规模的数据训练。


  • 先来回顾下线性回归:第一个式子是假设函数,第二个式子是代价函数,第三个式子是不断地更新参数sita来使得代价函数趋于最小,右图是构建的三维函数可以看出是弓形。

在这里插入图片描述

  • 在参数初始值,运行梯度下降算法,将会不断迭代,最终得到参数的全局最小值。如果m的值非常的大,那么单单是计算微分项就需要很大的计算量,更何况还要一次次的迭代。这个梯度下降算法又叫批量梯度下降,其中批量是指每次都需要同时考虑全部的训练样本。

在这里插入图片描述

  • 随机梯度下降算法每次迭代不需要每次都同时考虑全部的训练样本,仅仅只考虑一个训练样本。为了更好的描述随机梯度下降算法,我们将代价函数定义为右侧的第一个式子,这个代价函数实际上是衡量我的假设函数在某个样本(x(i),y(i))上的表现。而左图第一个总体代价函数可以写成右图第二个式子(假设函数在m个训练样本中每一个样本(x(i),y(i))上的代价函数的平均值),随机梯度下降的步骤如下:
    1. 将所有的m个训练样本重新随机排列。(这保证了遍历时对训练集样本的访问是以随机顺序排列的,这一步能让随机梯度下降在收敛时能够更快一点)
    2. 对所有的训练样本进行遍历,然后做如下参数更新.(就是不断地对参数进行调整来依次适应第一个参数、第二个参数…)
  • 随机梯度下降和批量梯度下降相比不需要对全部的m个样本求和来得到梯度项,而只需要对单个样本就可求出梯度项(黄色框画出来的就是梯度项)。在随机梯度下降过程中我们已经开始一点点把参数向全局最小值的方向进行修改了。

在这里插入图片描述

  • 随机梯度下降每一次迭代都会更快,因此我们不需要对所有训练样本进行求和,每一次迭代只要保证能拟合某一个训练样本即可。虽然它的参数走的线不是一条曲线,但是它是随机而迂回的路径朝着全局最小值的方向移动的。随机梯度下降和批量梯度下降相比收敛形式是不同的,他就是连续不断的在某个区域中朝着全局最小值的方向徘徊,而不是直接打到全局最小值(在实际应用中,只要能接近全局最小值就能得到一个很好的效果)。
  • 在随机梯度下降法中其实还有一个外层循环(1到10次,通常一次就可,还是取决于数据集m的大小)来决定内层循环的次数

在这里插入图片描述

  • 总结下:批量梯度下降算法是一次就需要遍历全部的训练集,然后在进行迭代(迭代一次就相当于遍历两次全部训练集)才有可能得到全局最小值,而随机梯度下降算法有可能只需要遍历一次就可以的到全局最小值。所以说将随机梯度下降法的思想应用到学习算法中来适应更大的数据集从而提升算法的性能。

03 Mini-Batch 梯度下降

Mini-Batch 梯度下降有时甚至比随机梯度下降还要快一些。


  • 总结下我们迄今为止学的梯度下降算法:
    1. 批量梯度下降算法每次迭代都要用到所有的m个样本
    2. 随机梯度下降算法每次迭代只需要使用一个样本
    3. 而Mini-Batch 梯度下降算法每次迭代会使用b个样本(b是一个称为Mini-Batch大小的参数,通常选择b=10,b的范围是2~100),它是介于批量梯度下降算法和随机梯度下降算法之间的算法。

在这里插入图片描述

  • Mini-Batch 梯度下降完整算法如下:以步长为10增长为例,仅用前十个样本就能运行算法来更新参数,这也是为什么Mini-Batch 梯度下降比批量梯度下降算法要快的原因。为什么Mini-Batch 梯度下降不像随机梯度下降算法一样每次只使用一个样本呢?–>因为在向量化过程中Mini-Batch 梯度下降比随机梯度下降更快(仅当有好的向量化方法)。
  • Mini-Batch 梯度下降算法的缺点之一是当有一个额外的参数b时,你需要确定Mini-Batch大小,这需要额外的时间,当然如果有好的向量化算法Mini-Batch 梯度下降比随机梯度下降更快。

在这里插入图片描述

  • 如果有一个合适的向量化的方法,蓝框的求和公式将在10个样本中实现部分并行计算,换句话来说通过合适的向量化方法计算余下的样本,可以部分使用好的数值代数库,然后对b个样本并行进行梯度计算,随机梯度下降算法每次只针对一个样本肯定没有太多的并行计算。

04 随机梯度下降收敛

当你运行随机梯度下降算法时如何确保调试过程已经完成,并且已收敛到合适的位置呢?怎样调整随机梯度下降算法中的学习速率a的值呢?


  • 批量梯度下降算法确保梯度下降已经收敛的一个标准方法就是绘制优化代价函数(关于迭代次数的函数),我们要确保代价函数J每一次迭代都是下降的。当m教小时使用这个还算可以,但是当训练集m特别大时,你肯定不希望得定期的暂停这个算法来计算蓝色框中的式子,因为每次计算都会遍历整个数据集。
  • 对于随机梯度下降算法为了检查算法是否收敛可以进行下面的工作:当随机梯度下降法对训练集进行扫描时,在我们使用某个样本(x(i),y(i))来更新参数sita之前,让我们来计算出这个训练样本假设的表现有多好即cost()函数。最后为了检查是否收敛,每1000次迭代就画出前一步骤所计算出来的cost()函数前一千个样本的的平均值,这样通过观察图就可以看是否下降收敛,可以看出算法在你前一千个样本中表现得有多好。

在这里插入图片描述

  • 下面第一个图中红色线代表更小的学习速率a,可以看出更加得平缓但是能得到更好的效果。(因为随机梯度下降不是直接达到全局最小值,而是在这个区域不断震荡,学习速率越小震荡幅度也就越小。)第二个图中得红色线代表样本从一千增加到五千,可以看出得到的曲线比较平滑,但是得到的关于算法表现有多好的反馈就有一点延迟,因为图中每一个数据点是从五千个样本中得到,而不是从之前的1000个样本得到。第三个图由于样本太少所以表现得好像没有下降收敛一样,红线代表样本增加到5000,可以看出比最开始显得下降了。而粉色线也代表样本增加到了五千但是没有啥变化,这就说明算法基本就没有学习,这时需要调整学习速率或者特征或者其他东西。第四个图是上升的趋势,这时算法发散了,这时就需要更小的学习速率。

在这里插入图片描述

  • 总结:如果出现噪声太大或者图像老是上下振动,就可以试着增加求均值的样本的数量,如果图像上升那么就用一个更小的学习速率。
  • 如果你想要将随机梯度下降到更好的收敛到全局最小值(也是接近哈),那么就需要让学习速率的值随时间变化而逐渐减小。经典的做法就是让a=某个常数1/(迭代次数+某个常数2),但是很少用,原因有二:一是收敛得到的值已经很满意了,二是还需要确定两个常数,无形中又增加了算法的复杂性还有计算量。

在这里插入图片描述

05 在线学习

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


  • 以提供运输服务为例,y=1是购买运输服务,y=0是不购买,我们想要用(出发地、目的地、我们提供的价格等)特征来学习他们选择我们来运输包裹的概率。如果我们可以估计出每种价格下用户选择使用服务的概率,我们就可以选择一个价格即可能使用户选择我们,我们还会有回报。算法如下:当用户访问我们时,我们会得到与其对应的(x,y)对,在线学习算法就会利用刚得到的(x,y)(因为我们不使用固定的训练集,所以这里不是(x(i),y(i)))来更新参数theta。我们使用完这个样本就会将其丢弃不在使用,这也就是为什么一次只处理一个样本。

在这里插入图片描述

  • 在比如说搜索的例子(又叫点击率预测学习问题 -CTR),当你搜索手机时,他会从100个手机里给你推送10个,提供了特征x(与你搜索的手机关联度),y=1是点击进入。运行此类网站的一个方法就是不停的给用户展示你对他们可能会喜欢的十个手机的预测,每一次用户访问你将会得到十个样本即十个对应的(x,y)对,然后运行在线学习算法来更新参数,对这十个样本利用10步梯度下降法来更新参数。

在这里插入图片描述

  • 在线学习的一个优点就是如果有一个变化的用户群又或者是你在预测的事情在缓慢的变化,在线学习算法可以慢慢地调试你所学习到的假设,将其调节到最新的用户行为。
  • 总结:在线学习算法与随机梯度下降算法的唯一的区别就是我们不会使用一个固定的数据集,而是获取一个用户样本从那个样本中学习,然后丢弃那个样本继续处理下一个。如果某一个应用有一个连续的数据流,这样的算法是非常值得考虑的。

06 减少映射与数据并行

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


  • 根据MapReduce思想我们把训练集分为不同的子集,有几台电脑或者机器并行处理训练集数据就分为几个子集。每台机器使用相对应的子集来处理梯度下降算法中的求和部分,这样每个机器都进行工作,效率就提高了好几倍。最后我们将这些temp变量发送给一个中心服务器,中心服务器会整合这些结果,尤其是将更新我的参数theta。可以说这个公式完全等同于批量梯度下降法,只是不需要在一台机器上处理这400个数据。

在这里插入图片描述

  • 就例子而言,四台电脑各自承担四分之一的计算量,你可以加速到四倍速,如果没有网络延迟和忽略传输数据所有时间,那么就是四倍的速度,当然现实中的网络延迟及汇总所需要额外的时间,实际速度比四倍小。

在这里插入图片描述

  • 使用MapReduce思想还需要考虑学习算法是否可以表示成对训练集的一种求和。如果可以就能将学习算法的适用范围扩充到非常非常大的数据集。下面一个例子:高级优化算法需要计算优化目标的代价函数的计算过程和这些偏导项的计算过程,电脑把他们发送给中心服务器,然后将各部分和(temp^(i)_j)加起来,获得总的代价函数获得总的偏导项,接着将这两个值发送给高级优化算法。

在这里插入图片描述

  • 现在也可以在单机上使用MapReduce,因为电脑有多个处理核心CPU,CPU又有多个核心。这样的好处是可以不用担心网络延迟问题。如果你有一个多核机器,同时你有某些线性代数库(可以自动在一台电脑不同核心上进行并行代数运算),并且你的学习算法有非常好的向量化表示,你就可以直接以向量化的形式应用标准学习算法,不用担心并行(线性代数库就可以处理好)。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值