您好,登录后才能下订单哦!
今天就跟大家聊聊有关如何解析spark MLlib训练原理和使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
说明
spark MLlib是Spark提供的可扩展的机器学习库。MLlib中已经包含了一些通用的学习算法和工具,如:分类、回归、聚类、协同过滤、降维以及底层的优化原语等算法和工具,MLlib提供的API主要分为以下两类。
spark.mllib包中提供的主要API,操作RDD,后续可能废弃。
spark.ml包中提供的构建机器学习工作流的高层次的API,主要操作DataFrame,可使用pipeline把很多操作(算法/特征提取/特征转换)以管道的形式串起来,让数据在这个管道中流动。ml所有模型提供统一的算法操作接口,比如模型训练都是fit。mllib中不同模型会有各种各样的trainXXX。
训练原理
随机森林训练原理:
优化:
逐层训练:因为数据存放在不同的机器上,频繁的访问数据效率非常低,因此采用广度遍历的方法,每次构造所有树的一层,例如如果要训练10棵树,第一次构造所有树的第一层根节点,第二次构造所有深度为2的节点,以此类推,这样访问数据的次数降为树的最大深度,大大减少了机器之间的通信,提高训练效率。
样本抽样:当样本存在连续特征时,其可能的取值可能是无限的,存储其可能出现的值占用较大空间,因此spark对样本进行了抽样,抽样数量,最少抽样1万条
特征装箱:每个离散特征值(对于连续特征,先离散化)称为一个Split,上下限[lowSplit, highSplit]组成一个bin,也就是特征装箱,默认的maxBins是32。对于连续特征,离散化时的bin的个数就是maxBins,采用等频离散化;对于有序的离散特征,bin的个数是特征值个数+1;对于无序离散特征,bin的个数是2^(M-1)-1,M是特征值个数
过程:
1、初始化模型:构建numTrees个Node,赋默认值emptyNode,这些node将作为每棵树的root node,参与后面的训练。将这些node与treeIndex封装加入到队列nodeQueue中,后面会将所有待split的node都加入到这个队列中,依次split,直到所有node触发截止条件,也就是后面的while循环中队列为空了。
2、选择待分裂Node:循环从nodeQueue取出待处理node放入nodesForGroup和treeToNodeToIndexInfo中nodesForGroup是Map[Int, Array[Node]],其key是treeIndex,value是Node数组,其中放着该tree本次要分裂的node
treeToNodeToIndexInfo的类型是Map[Int, Map[Int, NodeIndexInfo]],key为treeIndex,value中Map的key是node.id,这个id来自Node初始化时的第一个参数,第一轮时node的id都是1。其value为NodeIndexInfo结构,
计算最佳node分裂:先在个partition上分别统计,再累积各partition成全局统计,针对每个node遍历所有特征,计算获得最佳分裂。
3、分裂node:根据最佳split进行node的分裂,包括当前节点的一些属性完善,左右孩子节点的构造等,将当前节点的左右孩子节点继续加入nodeQueue中,这里面放的是需要继续分裂的节点,至此当前层分裂完成。
4、循环训练循环执行取出node、分裂node步骤, 直到的所有节点触发结束为止。
5、随机森林继承自树模型集合模型,最终结果,分类投票,回归平均。
梯度下降步骤:
1、把当前的模型参数广播到各个数据partition(可当作虚拟的计算节点)
2、各计算节点进行数据抽样得到mini batch的数据,分别计算梯度,再通过treeAggregate操作汇总梯度,得到最终梯度gradientSum
3、利用gradientSum更新模型权重
缺点:
1、采用全局广播的方式,在每轮迭代前广播全部模型参数。众所周知Spark的广播过程非常消耗带宽资源,特别是当模型的参数规模过大时,广播过程和在每个节点都维护一个权重参数副本的过程都是极消耗资源的过程,这导致了Spark在面对复杂模型时的表现不佳;
2、采用阻断式的梯度下降方式,每轮梯度下降由最慢的节点决定。从上面的分析可知,Spark MLlib的mini batch的过程是在所有节点计算完各自的梯度之后,逐层Aggregate最终汇总生成全局的梯度。也就是说,如果由于数据倾斜等问题导致某个节点计算梯度的时间过长,那么这一过程将block其他所有节点无法执行新的任务。这种同步阻断的分布式梯度计算方式,是Spark MLlib并行训练效率较低的主要原因;
3、Spark MLlib并不支持复杂网络结构和大量可调超参。事实上,Spark MLlib在其标准库里只支持标准的多层感知机神经网络的训练,并不支持RNN,LSTM等复杂网络结构,而且也无法选择不同的activation function等大量超参。这就导致Spark MLlib在支持深度学习方面的能力欠佳
看完上述内容,你们对如何解析spark MLlib训练原理和使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。