zoukankan      html  css  js  c++  java
  • 大型机器学习

    来自ng的ml-003 17_XVII._Large_Scale_Machine_Learning

    这里的大型机器学习是将算法应用到大数据集上,回顾前10年或者前5年,机器学习有了较好的发展是因为有了很多的数据集的出现。为了得到一个低bias算法

    一、引言


    在机器学习界 这是很广泛赞同的一句话,不是看谁有好的算法,而是看谁有足够多的数据。


    这里就如第二篇博文说的,左边因为增加数据 误差有所下降,说明是过拟合的现象,是低bias 高variance,而右边增加了样本他的误差都稳定了,这是高bias 低variance现象是欠拟合,说的是这个模型还不够复杂,不能表现数据的信息,可以通过增加特征或者改变更复杂的模型来解决。

    二、随机梯度下降法

    随机梯度下降算法可以应对更大的数据集,在之前的视频中提及的是梯度下降算法,然后在因一个样本更新一次速度太慢,所以就几个样本更新一次,那这时候的算法叫批量梯度下降算法,但是现在提到的随机梯度下降算法在每一次迭代中不需要去计算所有的样本。


    以前的叫梯度下降算法,然后如果一次先计算所有的样本叫做批量梯度下降算法,但是现在的DL中用的是minnibatch,就是小型批量梯度下降算法,这里主要介绍的是随机梯度下降算法,是基于单个样本的,只是这里在计算之前先将所有的样本进行洗牌,打乱之间的顺序,这样可以打破之前样本之间的联想,所以很不错


    原来的批量梯度下降算法是比较稳定的将cost或者目标函数进行一步一步的趋于最小值,对于随机梯度来说,是对于每个样本的,那难免会有不好的样本,那么有可能会上下跌荡,但是每次迭代的速度确实很快,因为是计算单个样本的,对于批量来说最后的收敛是较为稳定的,但是随机的会导致最后在一个靠近全局最小(这点不错啊 )的一个区域来回游荡,虽然不能稳定的收敛,但是因为最后是在全局部分游荡,所以还是很有优势的。上图中说了如果你的数据量很大,m=300百万,那么差不多epoch = 1就行了,但是一般epoch=1-10也还好,因为这个随机梯度下降算法本身就按照每个样本计算,所以还好。

    三、mini-batch 梯度下降算法


    mini-batch 梯度下降算法就是将两者的优势结合起来,(上图中mini批量梯度还没有说道预处理需要将样本随机打乱)


    上图中,因为相比较于批次梯度下降算法,他的优势在于能够在一次b个样本上进行计算,而批量是整个数据集迭代一次,对于随机梯度下降来说,他的优势在于b个样本可以构成一个矩阵,通过现有的高度优化的代码,可以使得他的速度比随机梯度下降算法还快,但是这个b的取值还是需要多次实验得到的。

    四、随机梯度下降法的收敛

    对于批量梯度下降法来说,当数据量很大的时候,得周期性的在完成一次迭代后在计算一次cost,很慢


    随机梯度下降法是先用theta参数在这个样本上计算cost,然后在用这个样本来更新theta。收敛的化可以通过比如每1000词迭代后输出cost函数,看是否与上次的输出差不多


    上图中第一个图是随机梯度下降法在不同的学习率下的图,红色是更小的学习率,相比之下更少的动荡和得到更好的结果,但是也相差无几,;第二幅图是选择每1000个显示一个点还是每5000个显示一个点,当选择1k个显示一个cost点,有可能会比较上下浮动,如果在更大的样本量下显示,会变得更加平滑,;左下 第三个图是当你显示的1k个点如图中蓝色的是更加动荡的,通过5k个样本的更加平滑的显示才发现有下降的趋势,因为蓝色几乎看不出有下降的趋势,肯定会认为哪里代码写错了什么的,但是如果更加平滑的操作后显示的还是平的,那么这个算法就是失败的,没啥用处;但是如果是第四个,那么说明这个梯度下降算法成了上升的了,那么肯定是学习率太大,导致在一个碗型的图中是朝着相反的方向走了


    对于学习率来说,在固定常量的情况下是将随机梯度下降法趋于全局最优但是又不等于全局最优,一般来说应该随着时间这个学习率该下降的,但是如果按照图中那种的化,会显得这个算法很娇气,就是差不多是专一,而不能通用了。所以很多人还是选择将学习率变成固定的常量。

    五、在线学习


    上图是个船票网站的例子,对于一些网站有着连续不断的数据,其中(x,y),x是从客户,从船,从网站上等等拿到的特征,y是这个船是否被使用,对于这样的网站来说,是来一个数据,就进行权值更新一次,然后这个数据就被丢弃了。但是如果是小网站,没有源源不断的数据的话,还是保存好数据,然后从这个数据包中在接着不断的学习。

    但是对于大网站来说,这个在线学习是一直在改变的权值的,那么如果在一个时期中有个主流是租用这条船,那么这种实时性的跟踪也是能够很好的体现的。


    上图中是另一个例子,在这个例子中考虑称类似淘宝中搜索的那种,这里面需要预测的是用户是否会点击这个连接 CTR,就是是否对这个感兴趣,然后在淘宝搜索的时候就可以将相关这个搜索词的排名前10 或者100 点击次数最多的链接排列出来。相比较而言,如果网站人数很多,那么用在线学习,不但能够跟踪实时的用户爱好,而且能够较为缓慢而且平滑的适应用户的喜好。

    六、映射约间和数据并行

    对于上述所有的算法来说,他们都是在一个机器上运行的,这在现在这种多机器,多核心 gpu或者集群啥的年代,能够如何扩展到那些领域 对机器学习来说,很是重要,这章应该值得看看(这里是浅显的,但是道理却很好)。

    map-reduced是由jeff dean 和sanjay gimawat发明的,相比较而言这是个很重要的方法,差不多应用范围比SGD还广


    上图中就是一个例子,假设有m=400个样本,而且有numMachine = 4,那么可以分成numMachine部分的样本,将每部分的样本输送到不同的机器上运行,得到最后的temp结果,然后将这个结果输送给master机器,即slave机器是负责计算一个计算公式中可以不交叉的部分。那么最后在master机器上进行相加,然后在master机器上进行


    如上图中就是之前的map-reduced方法。如果不考虑传输过程中网络的延时等,的确可以达到4x的速度。


    但是首先要考虑,你的学习算法是否能够被用来map-reduced,比如图中的算法,在后面是简单的相加的,那么这部分的确可以用来分给几个机器运行,但是如果都是单线的,那么就没法进行分配了


    但是我们不是数据中心,我们也没有天河,也没有计算机集群,那么如何进行map-reduced,但是我们的机器确实是多核心,那么我们可以如上图一样,将数据集合给分成几个核心的协同工作,这时候就无需考虑网络延时问题了,因为都在一台机器上。如果你的算法是使用线性代数包的,而且自己写的很好可以用矩阵等来表示,那其实代数包中很多底层的优化是会自动并行计算的。关键词:hadoop。








  • 相关阅读:
    delphi利用文件内存共享的简单小说阅读器
    Delphi中共享内存学习
    JavaWeb初学者配置数据库连接报错(此处是MSSQL)
    Delphi的Json学习之一
    Delphi记录类型指针的使用
    汇编——段寄存器
    SQL 标量函数-----日期函数 day() 、month()、year() 转载
    项目一总结 滚动监听
    一阶段项目总结 导航栏 滚动监听固定
    简单的 js手写轮播图
  • 原文地址:https://www.cnblogs.com/shouhuxianjian/p/4529211.html
Copyright © 2011-2022 走看看