谈谈你对大规模机器学习这个领域的理解和认识? 举报 理由 举报 取消 海量数据场景下,通过大规模机器学习方法来充分挖掘数据集中的价值已经在很多公司里都有着非常多的应用了,相关的资料也已经很多,但是在我看来却还谈不上非常的系统,所以期望通过这个问题来一起把这个方向的知识体系梳理得更为清晰系统化,为有需要的同学提供一些导引性的帮助。 2018年2月16日 7 条回复 1613 次浏览 学习,数据挖掘,机器
回复 ( 7 )
抛砖引玉。
感谢 @白刚 同学的回答,我的追加评论有些长,只能放在这里了:
————————————————————————————————————–
谢谢白刚同学的回答。
回答质量很高,留给我评论补充的余地已经很少了:)。
我稍微再补充一点点自己的认识。
1. 大规模机器学习的知识构成。
本质上大规模机器学习可以说由三个Domain的知识构成
机器学习系统
并行计算
分布式系统
其中机器学习系统的由来已久,从单机版的liblinear/libsvm到MaxEnt以及MSRA开源出来的OWLQN实现,交大的SVDFeature到现在的Caffe以及TensorFlow(抱歉,目前的TensorFlow还是单机版的,所以虽然知道G家有将TensorFlow的分布式版发布出来的计划,现在还是被我罗列在单机版的范畴了)。变化的是具体的算法内核,线性模型/非线性模型,有监督学习/无监督学习,shallow model/deep model,不变的正如白刚同学所说的,是迭代求优的过程,PLSA和K-Means求解所使用的EM、LR模型求解所使用的LBFGS/OWLQN、Online Learning所使用的FTRL、Deep Learning惯用的SGD本质上都是迭代求优过程的不同演绎。
并行计算则由来更久,从7、8十年代就已经源起,彼时主要应用的领域还是偏窄一些,高能物理模拟计算/军工/科学计算等等。
分布式系统相对来说要年轻一些,但也有十年左右的历史。例子在这里我想就不需要一一枚举了。
不同的Domain对于大规模机器学习的贡献是不一样的。
在我看来,机器学习系统是大规模机器学习的内核,单机版的机器学习系统在很多场景下已经足以满足业务需求,而并行计算在大规模机器学习的早、中期扮演了重要的角色(典型代表是MPI/Hadoop/Spark),随着某些应用场景下数据量越来越大,分布式系统的技术知识也变得重要起来(典型代表是Petuum/Peacock)。
2. 大规模机器学习的核心本质论
说一门技术的”核心本质论“有些大言不惭的感觉,但是对”核心本质论“探讨梳理的过程往往有助于我们更深入地理解掌握一门技术的核心精要,所以在这里我只是share一下自己的理解认识,抛砖引玉。
在我个人看来,大规模机器学习的技术核心包括两个层面的内容:
基础技术
业务技术
其中基础技术就是并行计算、分布式系统这样的技术知识,而业务技术则是机器学习系统的知识。
所以,大规模机器学习也是一门业务,只不过这个业务更为基础一些。
跟其他的业务领域一样,整体意义上来说,业务技术的知识其实会要胜过基础技术,但是这种对比关系又不绝对,很多时候基础技术的知识又会对业务技术的演化带来制约和决定性因素。我来试着举几个例子:
从我个人了解到的情况来看,已经有不少工业界的公司,当他们的大规模机器学习集群在使用Batch Learning算法训练LR耗时过长时,会使用FTRL来进行离线训练,效果均跟Batch Learning算法持平。这个业务场景其实对于基础技术的选择是有着蛮重要的影响的。不考虑FTRL,只是基于”embarassingly parallel”的暴力并行来进行batch learning算法的性能加速,单位机器所带来的模型收益是不会提升的。
另一个例子,就是LDA主题模型的分布式训练了,从最传统的Gibbs Sampling到Sparse Sampling再到去年MSRA和CMU合作发表的LightLDA,本质上还是在业务层面作了大量的优化,从而起到花费更少规模的机器,获取评估数据集上相同甚至更高指标的效果。
而基础技术的发展对业务技术的演化带来促进的例子G家就是挺好的Case,只是做出一个分布式的机器学习系统和做出一个真正易用的机器学习系统,还是有着巨大的差异的,中间的差异主要还是由基础技术与业务技术的紧密衔接带来的。
但是我个人还是会认为,对于大规模机器学习领域来说,业务技术的重要性胜过了基础技术。业务技术领域的创新和技术进展,在很大程度上可以简化基础技术的投入和难度。只有在限定业务技术问题场景的情况下,基础技术的重要性会突显出来。有过一定业务系统经验的同学,对这一点的认识应该会有一些认识。
3. 大规模机器学习的业务技术剖析
白刚同学的答案里总结得很精炼。
机器学习应用的问题,本质上包括两个:
建模(representation)
求解(optimization)
大规模机器学习大抵上解决得还是求解这个维度问题的分布式实施。当然随着数据量的增加,模型尺寸的变化,对于建模会提出新的要求,也许在建模环节有些许变化可以更有利于大规模分布式求解这又是另外一个story了(这里我暂时没想出好的例子,欢迎大家补充,也许word2vec的输出层对softmax作的hierarchy优化算是一个蹩脚的例子?但是这个例子跟分布式求解似乎又不那么强相关)
所以我会认为关于求解过程的技术知识对于大规模机器学习会更重要一些。
比如Find Local Minima的方法细分来说会有Trust Region和Line Search两种。
前者是liblinear的主力求解算法,后者在LBFGS或OWLQN求解算法里会用到。
Line Search又细分为 Exact Step Size和Inexact Step Size两类。
前者的代表是共轭梯度法,优化过程更为精确,但计算成本过高,通常不会被直接使用。后者的代表则是Backtracking Line Search。
不同的求解算法,对应的并行化细节会有一定差异,虽然这种差异大抵上不是计算框架层面的差异,但只有精确地理解了这些差异以后才有可能在分布式实现中做到准确。
再比如EM算法在PLSA求解算法里的应用,对于E步和M步里要计算的那几个条件
概率的求解过程的精确理解,可以让我们 花费更少的计算代价完成统计计算,因为这些条件分布的具体数值是存在可以共用的部分的。
而建模对于大规模机器学习的重要性,固然对于深入理解分布式的实现细节有着重要的帮助,因为知识总归是有联系的,建立起知识之间的联接关系对于牢固把握肯定是有帮助,但更深层面的思考我目前还没有得出,也欢迎大家补充。
4. 大规模机器学习的适用场景
总体来说,我的答案会比较中庸”it depends on”。是否应用大规模机器学习,使用什么程度的大规模机器学习技术,跟具体的业务特点,数据规模是强相关的。
Deep Learning算是大规模机器学习的重度用户,但是使用Deep Learning进行Query Understanding又未必一定需要大规模机器学习,单机多卡在很多场景下就足以满足这样以及类似的业务需要了。
搜索排序/推荐系统,我觉得就更是如此了,对业务问题的理解,对数据规律的认识,我个人认为重要性一定是优先于大规模机器学习系统本身的。当业务优化目标确定之后,数据量达到一定规模,这个时候就是大规模机器学习发挥空间的场景了。而到了这个阶段,实际上也有不同的选择,几百GiB的数据,MiB级的模型?Spark/MPI是不错的选择。TiB级的数据,GiB级的模型?也许可以考虑一下PS这样的架构。但是会不会数据可以通过Sampling达到相近的效果,模型可以通过精简变得更为小巧?这些都是有大规模机器学习经验的同学在应用之前值得ask自己的问题。手里拿个锤子,看啥都是钉子的事情还是要尽量减少。
当然,以上所说的场景还是偏主流业务导向的,对于push 技术边界的场景,是不适合的。对于push技术边界的场景,打造尽可能锋利的技术尖刀,才更有助于探索技术边界。
总的来说,大规模机器学习是一柄利器,但是这柄利器并不是万能钥匙,最本质的还是对我们要solve的那个问题的准确理解和定义。套用一句忘了哪个老哥说过的话:
搞清楚你真正的loss function是什么才是最重要的事情。
—————————————————————————————————————
自己最近也在整理关于大规模机器学习这个领域的一些经验和思考,抛出来供大家一起讨论,期望最终能够作成一个open-source性质的系列文章。
Large Scale Machine Learning–An Engineering Perspective–目录
Large Scale Machine Learning–An Engineering Perspective–0. 引言
Large Scale Machine Learning–An Engineering Perspective–1. 大规模机器学习平台的构成
机器学习研究的是从数据中自动的归纳逻辑或规则,并根据这个归纳的结果与新数据来进行预测的算法。这个方向是与数据相关的,而从前数据的收集过程效率往往很低成本很高,很少有大规模的问题需要解决。直到互联网发展起来,web服务器可以记录和收集大量的用户访问、交互信息,这类数据数据的收集成本非常低,并且有一定的价值。由此开始,“大规模机器学习”变得可行,并且越来越重要。
机器学习的应用上,我们接触到的各种问题、算法、技术看似复杂,但主要可以看成两个方面:
“大规模机器学习”所涉及的就是从模型的representation和optimization这两个方面去解决应用大规模的数据时的理论和工程上的问题。
那么我们先讨论一下为什么“大规模”是有益的,比“小规模”优势在哪里。
模型训练的目标是使得模型应用到新数据上时效果最好,也就是使得generalization error最小。而这个generalization error,对于supervised learning,理论上有两个来源:bias和variance。High bias可以看做模型的建模能力不足,在训练集上的错误较大–并且在新数据上往往会更差,也就是under-fitting;high variance则可以看做模型过于拟合训练集,而对新数据会效果很差,也就是over-fitting。
所以对于模型效果上,除了特征工程这类trick之外,“调得一手好参”–解决好bias和variance的tradeoff,也是部分算法工程师的核心竞争力。但“大规模机器学习”可以一定程度上同时解决这两个问题:
所以当老板/技术委员会/隔壁团队的挑刺小能手/无知的围观群众提出几十上百计算节点/几TB数据吞吐不够绿色环保不要老想着搞个大新闻时,要以深邃的理论基础兼可观的业务收益说服众人:经世致用,而不是追求fancy。
—————-
从模型的representation和optimization这两个方面,更形式化的定义机器学习的求解问题,learning的过程大概可以这么描述:
,
其中就是representation,或者说模型参数;是数据;和分别是loss/risk/objective 和 prior/regularization/structural knowledge。
的过程即前面说的optimization,往往是迭代优化的过程。有些可以转化为最优化问题,通过数值优化的方法,比如batch的LBFGS,或者online的SGD/FTRL等等来进行参数估计;有些是无法构造成可解的最优化问题时,转化为概率分布的估计问题,通过probabilistic inference来解决–比如用Gibbs sampling来训练latent Dirichlet allocation模型。
无论是数值优化,还是sampling,都是不断迭代优化的过程:
. . .
. . .
. . . . . .
. . . . . .
每一步迭代做两件事。第一个是当前的模型在数据集上的evaluation,得到一个“与好的模型相比可能存在的偏差”这个量;第二个是根据这个偏差量,去修正模型的过程。
大规模机器学习就是解决和的规模非常大的时候所引入的理论上和工程上的问题。“知识体系”可以两个方面来整理,一方面是宏观上的架构,另一方面是无数微观上的trick。迭代中的那两个步骤决定了宏观上的架构应该是什么样子。两个步骤内的计算和之间的数据交互引入了解决多个特定问题的技术和trick。
首先,和需要分布在多个计算节点上。
假设数据分布在n个data node节点上;模型分布在m个model node节点上。数据/样本集只与第一步有关,这部分计算应该在数据所在的节点上进行;第二部是对模型的更新,这一步应该在模型所在的结点上进行。也就是说,这个架构中有两个角色,每个都有自己的计算逻辑。并且在分布式的系统中,需要有一套replica的机制来容错。
几乎所有的大规模机器学习的平台、系统都可以看做这由这两个角色构成。在Spark MLLib里边,driver program是model node,executor所在的worker node是data node;在Vowpal Wabbit里边,mapper id为0的节点扮演了model node的角色,所有的mapper扮演了data node的角色;在Parameter Server(Petuum,model node需要得到更新量。
MLLib通过RDD的treeAggregate接口,VW通过allReduce,这两者其实是相同的方式。结点被分配在一个树状的结构中,每个节点在计算好自己的这部分更新量 后,汇总它的子节点的结果,传递给它的父节点。最终根节点(model node)获取到总的更新量。DMLC中的Rabit对这类aggregation数据传输提供了更简洁的接口和更鲁棒的实现。我们应用Rabit实现了一套multi-task learning去训练不同广告位上的广告点击率模型的方案。
而PS则是通过worker(data node)去pull其需要的那部分,计算更新量并把自己的那部分去push给server(model node),server去做对应的模型的更新。这个似乎比前边的aggregation要简单,但当每个data node进度差别太大时,又引入了新的问题。
所以第三点问题涉及到并行和一致性。分布式的系统中每个节点的状态都不相同,计算的进度也会不一样。当某个data node计算的更新量对应的是若干轮迭代之前的时,它对优化不一定有贡献,甚至可能影响到收敛。
VW和MLLib上的迭代计算,可以看做是同步的。所有的model node获取了所有的data node的汇总起来,再更新,并广播给所有的data node。每次迭代model node获取的是完整的更新量,data node拿到的是一致的模型。所以这里相当于设置了barrier,等大家都到达这一轮的终点时,再放大家开启下一轮。
这里的tradeoff是:完全不设置barrier,也就是纯asynchronous processing,会让系统尽快的推进下去,但节点间进展程度差异太大会造成优化求解的收敛性不稳定;每一轮迭代都设置barrier,也就是bulk synchronous processing,会保证数据的一致,但是会在每一轮都等待慢的节点,造成效率不足的问题。
所以一个折衷的方案就是设置barrier,当不是每一轮都设置,而是限定一个时间窗口长度。计算的最快的节点也要等到所有的都被应用到的更新之后再开始下一轮pull&compute&push。这种机制又叫bounded delay asynchronous或者stale synchronous processing。
总的来说,解决好以上的几个问题,构建一套大规模的机器学习系统并不是太空科技。但这些需要严谨的工程能力和大量的巧妙的trick。这些都来自于对问题的深入理解和探索,以及充分的实践。前者帮助更合理的抽象结构、定义接口,后者则帮助解决实现中的障碍,得到更高效和稳定的系统。
我曾经尝试在Apache Spark上去实现一些大规模的机器学习算法(
这个问题问地太大了,我结合自己几年工作中的体会,谈一下理解。
分布式机器学习涉及cs两个领域的结合:分布式系统和人工智能。机器学习是解决人工智能的手段,而分布式系统主要研究计算、存储及其他应用层面上的分布式技术。根据CAP理论,加上不同应用侧重不同,我们常需在设计分布式系统时限制使用场景,并做trade-off。
展开之前,先补充谈一下hpc和并行计算。它们都属系统方向,具体和分布式计算的差异不那么明显。分布式计算更注重在商用计算机上可扩展性带来的质变。这在互联网公司很流行:以前不能跑那么大规模现在可以了,这是重点。企业有时并不那么在意一个训练任务是跑11个小时还是10个小时,因为优化这1小时时间需要投入大量人力和时间成本。一个可扩展的算法,靠更多的核便能达到更快或可接受的时间。而hpc则更关注因计算时间带来的质变,比如之前我们要跑好几年的任务现在一个月就能跑完。hpc更流行于专用的大型计算场景(如气候预测、燃烧模拟),这些应用往往是用特定数值方法求解偏微分方程模型。和机器学习不同的是,这些应用的大计算量不是由数据规模导致而是由算法本身的复杂性决定(你很少见到sgd这样方法会用在这些优化问题中)。因此,相应的hpc应用通常要跑在定制的高性能计算机上。要指出的是,hpc研究者有时会过于在乎加速比而忽略可扩展性。我们都知道中国能造出世界最快的超级计算机,却没有好的应用能跑上那么多资源。
分布式机器学习中的分布式不仅包含计算,还涉及存储。首先,计算的分布式就是要把问题切开,分布地去解决。对于机器学习的问题,切问题包括对训练数据和训练模型的切分。切分数据意味着减少计算量,而切分模型的方式决定了计算和通信的拓扑。理想情况下,机器学习问题的模型可以不做切分,但这并不满足分布式计算可扩展的要求。一方面随着数据量的增大,模型规模可能增大到超出单机内存,另一方面模型本身也变地越加复杂。那么如何对数据和模型进行合理的剖分呢?一个原则是尽量同时,即在切分数据的同时尽量保证切开的模型大小均衡以及通信较优。一种情况,对于与数据相关的这类模型(如矩阵分解,pagerank,svd等,换句话说就是model是key-value的样子,key对应一个物体或人),我们可以通过对数据的切分来控制切分模型的方式。我之前写过的一个分布式计算框架Paracel里提供了丰富的数据切分方式,帮助用户灵活地解决这类机器学习问题。另一些情况是模型不直接和数据相关(如LR、神经网络等),这时只要分别对数据和模型做各自的切分即可。除了分布式计算,分布式存储也在分布式机器学习系统里发挥着作用。如参数服务器的模型通信方式本质上是key-value的分布式内存。另外,早在mapreduce系统中,g就开始依赖分布式文件系统来完成容错。
分布式机器学习算法的可扩展性决定了它能解决问题的规模。一方面,可扩展性要求在时间上随着资源的增加而减少。这里所说的时间分为计算时间和通信时间,对应前段提到的数据切分和模型切分。事实上,我们常遇到的情况是切地越细通信越大。虽然因问题而异地优化对模型的剖分可以巧妙减少一些通信量,但总是有下限,因此”时间-核“曲线往往下降到一个临界值后上升,这个转折点就是该算法的极限。例如对神经网络模型的切分粒度将在通信时间和计算时间相当时最优,此后,加入更多的资源,性能反而下降。另一方面,可扩展性体现在随着问题规模越大,算法能通过加入相应量的资源达到相同性能。这个目标的瓶颈往往在内存,因此分布式机器学习中对模型的切分也很重要。当然,应在尽量合理的范围内剖分模型,比如在实际问题中,ALS模型的一个维度通常足够放入单机内存,这时就不应过早地将问题复杂化,而只需要切分另外一个大的维度。
机器学习算法往往是迭代地解优化问题,由于last reducer问题的存在,BSP的计算方式会浪费太多时间在等待上。Mapreduce解决的方式是设置时间,一旦超时即认为worker死掉重新分配一个worker。事实上,而作为BSP的推广,SSP是更好的方式(上面的回答里也提到了)。还有一种方式是多切几份数据,让算地快的节点多算这些预留数据。简单来说就是做“负载不均衡”:让算地快的节点多算,算地慢的节点少算。
对于用户,每一种成熟的算法都值得拥有一个专用系统是成立的。但同时我们不应忽视机器学习算法间的共性,这些特点帮助我们进行更好的抽象和优化。目前阶段分布式机器学习在工业界现状是,做算法的和做系统的还相对脱节。原因可能是同时了解这两个领域的人较少,因此公司将部门和目标独立分开来。但设想如果一个工程师不懂图算法,那他如何能写出高效的图计算框架呢?对于机器学习系统也是一样道理。展望分布式机器学习,随着deep learning的流行,人们对计算性能要求变地更为苛刻,传统HPC和优化人员将会更多地进入机器学习领域,这也将促进系统和算法的同学进行更深入合作。
希望对大家有帮助。
看大家答的都很具象了,我来补充点大面上的事情。
一、前言
CS是围绕计算开展的科学。而计算有三大要素:
无论在哪个时代,我们都在围绕着这三个事情开展对计算科学的研究。这三个要素构成了一个经典的木桶效应的场景。也就是说,三件事之间最弱的一环总会变成制约计算机科学发展的一个主要因素。因此,计算机科学总是在围绕他们开展一个知二求三的过程。
二、大规模机器学习的诞生
1 简单回顾一下历史:
比如我们有密码、有解密方法,但是总是筹不到足够的人力来进行解密计算。
于是我们就有了电子计算机。
依托摩尔定律,在计算力问题基本解决了之后。数据的缺乏就变成了限制计算机科学开展研究的主要问题。
随之而来的就是信息时代。
依托互联网的告诉发展,在数据量问题基本解决了之后。逻辑方法的缺乏就变成了限制计算机科学开展研究的主要问题。
究其根本,是因为我们把计算科学应用到了超乎想象的领域中去。我们为其他学科带来了研究的新思路。同时其他学科面临的缺乏方法论的问题也会随之引入到计算机科学中。
2 机器学习的处境
在不远的一段时间之前,我们还在研究这个问题的浪前。我们并没有什么特别糙猛快的方法去解决逻辑思路的缺乏问题。
相比而言:
我们只要不停的提高晶体管的密度,增加主频,或者采用分布式或者集群的方法,总是能够获得期望的计算能力的;
如今,互联网为我们提供了前所未有的方法,去研究一些以前我们可望不可及的社会学问题。甚至是对他们进行定量的研究。当大家尝到了甜头之后,数理方法被广泛地应用在了各行各业中去。面对如此广泛地应用,我们暂时还遇不到缺乏数据的问题。他们就在我们的面前,直接用就可以了。
随着应用场景愈发的深入,我们开始研究一些先前不可解觉得问题。比如N-S方程、非数论方法的密码学特别地脑科学和认知科学。
我们很快就发现了一个严重的问题——传统的数理方法和冯诺依曼面条机体系并不能很好的应用在这些领域上。前两者的问题还显得并不是那么的明显,毕竟限制条件并不仅仅局限于方法论的缺失,还可以通过提高计算能力来解决。当我们有糙猛快的解决方案的时候,科技的进步总是会随着人类的懒惰而放慢。
但是面对脑科学和认知科学。途有计算能力就捉襟见肘了。
我们很长的一段时间内,都没有在数理方法上取得一个很好的进展来解决这两个学科里面的经典问题——大脑是怎么工作的。我们甚至连其中的一点点小的功能都很难去复现出来。更不用说,获得一个方法论来解释这一整套问题。
究其原因,是因为我们的数理方法里面,没有一个像傅立叶变换或这样合适的论域转换方法,把语音识别、人脸识别、图像识别等等问题很好的解决掉。尽管我们知道一旦有了数理方法之后整个问题的研究都会变得非常地机械、简单、自然而且顺手。
机器学习,就是在这样的一个背景下应运而生的。
3机器学习里一些典型的坑
首先,机器学习需要做的事情一定要明确。因为我们的目标是去寻找一个有效的解决问题的途径。
因此,机器学习这门学科开展的时候总是会围绕着这样的一些问题来开展:
目前来看,由于我们对量子计算这些个玄学问题还没有很统一的理论。所以一切可以使用的计算方法都是基于冯诺依曼机的,而它的实现又是基于逻辑门的。逻辑门本质上是非线性过程,用处是分类。所以就算是出现的方法再千奇百怪,我们最后还是会受到逻辑门自身的影响。换句话说,所有的现存的学习方法及其实现,本质上都是分类器。我们需要做的是设计出不同的、可收敛的非线性分类方法以适应不同的学习场合。包括算法本身的复杂度问题。
前面提到的不同的学习场合,就是现在机器学习领域里面还没有很清晰结论的领域。换人话说就是,我们目前有很多的机器学习方法,但是用哪种方法最有效。我们只能试一试。因此如何界定一个问题的复杂度及其适用的算法还是一个迫切需要解决的问题。
这个有点像是传统计算机领域的测试工程师的任务。也就是说,我们怎么才能保证学习方法是尽可能的有效的。毕竟,机器学习方法并不能保证它所输出的结论每次都是正确的。从蒙特卡落的角度来讲,我们也需要尽可能的提高学习结果的准确性。
目前来看,我们的确缺乏一些比较高级的数理方法来解决这个问题,从而机器学习的效果到底好与坏变成了一个NP-hard问题。这极大的制约了机器学习的方法。
4一些浅见
前面说道,机器学习本质上是一种分类方法。更进一步的定义的话,机器学习是基于数据点对论域内进行有效分类的搜索算法。
而搜索算法可以朴素的分为深度优先和广度优先。放到机器学习里面来说就是DL和SVM这两个经典算法之间的差异。
这个也是一个可以挖掘的深坑。我们可以参考搜索算法的一些走过的路应用的ML里面来。主要来说,还是工作量的问题。
以上
30年前理论上的东西,运算能力终于跟上了。
没觉得有什么纯原创的新鲜玩意。连分布式的根基mapreduce都是从functional programming里面来的。
深度学习更不用说了,你告诉我它和神经网络有什么区别…
现在好的研究所都是六分研究人员,四分工程人员,主要还是平台的搭建。
//——
补充一下,我可能语气是不太好,道歉,今人的研究必然有价值,也必然相对古人有进步。但依然,创新性不大这点还是没变。
事实上现在做研究主要是玩domain knowledge,真到算法层面来回来去就那点玩意。
这个时代本来就是搭建平台的时代。新工具,把以前想干不能干的事干了。
能对工业界造成震动的技术,在学术界绝对都不是新东西。与其说是大数据的时代,不如说是分布式系统的时代。
//——-
我的第一篇paper就是纯算法上,不sample,把数据切成数据流来解决原算法无法在大数据上跑的问题,因为内存一口气装不下。(当时没听过graphLab这种直接用硬盘的Bug工具,不然也不会搞这个了)
我老师明确跟我说,这东西你去工业界没人屌你的,都是直接分布式硬来,完全用人(机器)多力量大来硬解。我老师一个工业界的朋友有一次一起吃饭,聊起那片文章时跟我说,这篇文章找工作时千万别和人家说具体是什么,就说大数据就行了。
现在研究的方向真涉及大数据的都是怎么更好更高效的用更大的cluster。算法上scalability已经很不热了。
//—-
太多人把没有原创性和没有价值认为是一个意思了… 您要是这么觉得就没有讨论的必要了。
别说什么今人古人了。任何一篇paper,都有它自己与之前不同的东西,也有他自己独特的考量。拿这个说有什么意义呢?
现在好多组所做的事都是,看看还有哪个领域deep learning没被人用过,赶紧上。完全是应用层面的东西了。
我只想说feature提不好的情况下。。。啥算法都白瞎。。。
我是来搞笑的。
几个回答很好啊。总结下:
1杀鸡不要用牛刀
2杀鸡用牛刀鸡也不会更好吃
3杀鸡不要用牛刀,多几个人用多把鸡刀更快。
4人多杀鸡,鸡刀都不用磨。