这里要设计分布式的策略,怎么做分布。当你有一只一台机器的时候,显然把任务分布到每个机器上去,每个机器往前走,把中间结果存在局部的存储空间,他们完成的时间并不是一样,保证程序正确性你需要设置,每一台叫做服务器可以接着往下走。机器学习算法有这么一个特点,不是一次性,需要反复进行迭代,这样就造成困难,在你选择对于系统的行为采取不同的措施的时候,它会产生不同的结果,有些结果就是像这样,很多时间浪费在通讯上面,能保证你的结果很对,它是慢但是对。另一种方法我把通讯协议可以简单化,让它不必等待彼此,有时候会得到一个很快的结果,但这种结果经常是一个发散的不正确的一个结果。
Hadoop,在过去被大家认为是一个适合写并行程序的平台,但是Hadoop对机器学习的算法是不是真正适合呢?我不知道各位在自己开发过程中有这样的经历,我自己在学校里面或者Facebook做访问学者的经历是相当悲惨的经历,你在Hadoop掌握了一千台机器你来写一个Hadoop的项目,中间硬盘读取的瓶颈会极大程度限制了程序有效性,当你有很多机器的时候,彼此之间很难同步,大部分时间发生在等待里面。硬盘读取是相当昂贵的操作所以会耗费大量时间,经常造成程序相当难往前推进。
这块,我们从这个地方出发,怎么来解决这个问题,是相当有意思的一个问题。这块为了表达我们的思路,有必要稍微展示一下到底机器学习的神秘性或者它的特点在哪儿?跟普通的程序有什么区别?我尝试了一下做了比较。通常写计算机程序希望是一个精密的执行,就像我搭一个楼,把一个蓝图精密到按步骤进行实现,这样保证这个楼能搭起来。机器学习不是精密实现以前设定好的计划,通常实现优化问题,就像在体操里面有一个规定动作一个自选动作,爬这个山顶你可以从这条路爬,也可以从那条路爬,所以有一种容错性,有容错性就给了新的机会。这块我想说机器学习可以写出这么数学公式,达到最高点你可以用数学公式进行评估,解决途径执行迭代程序,迭代程序本身有自动收敛性的特点。
当你在一定情况下进行迭代,不管你迭代精度是特别高还是比较高,它都有可能收敛,这就造成了机器学习算法既难又简单,关键看你从哪个角度解决。比如说他提供的特点就是容错性,容错性什么意思?比如说你在做一个sorting,我们知道这个东西是不能容错的,这块如果错了以后不改,最后结果是错的。这是传统计算机的普遍特点,一旦在某个结骨眼出了错,你必须改。在机器学习,就像有点喝醉的家伙在爬山,虽然醉了,但知道山顶在哪儿,他看得见,脚还能,多多少少还是能爬上去,不见得爬得那么快,走错了以后还要走回去,还要重走,这个地方是不一样的。
还有数据和模型的两向性,对于系统工程师,数据和模型并没有什么区别,它都是在内存里边的一些数字而已,你把它分割是没有问题,比如我有数据分在某一个机器上,我这儿有模型,模型指里面参数,比如神经网络参数可以把它分割,大了以后我们可以做所谓的数据和模型并行。
在通常经典的系统设计里面,这两种并行没有区别,有时候你会看到Hadoop和Spark不相区分的并行处理。但是如果你仔细观察机器学习程序特点,你发现这两种并行的结果很不一样,当数据被并行的时候,他们之间是不相关的,所以你不需要对他们之间进行协调,需要对算出结果进行一定的协调,当然在他们算的过程中你不需要进行协调。