看了论文《TencentBoost: A Gradient Boosting Tree System with Parameter Server》,主要从以下三个方面阐述论文思想:
一 ,woker端的工作(其中有一个节点是leader worker主要负责sample features,合并梯度图):
1.每个worker根据分配到的数据,统计部分特征的分位图,然后把统计的分位图Push到server上。
2. 从server上Pull下全部特征的分位图,根据分位图确定候选特征值。
3. 每个worker初始化树结构,并选定一个根节点为active。leader worker选取一些特征push到server上。
4. worker从server上Pull下来选取的特征,为active node计算梯度图。把计算好的梯度直方图push给server。
5. leader worker从server端pull下所有的梯度图,计算最佳切分点,并push给server。
6. worker从server上pull下最佳切分点,根据最佳切分点,划分子树,并置已选节点为unactive。然后开始下一轮的计算梯度图,直至已满足树的深度。
二,server端工作:
1.存储方式:用vector存储,对于稀疏数据则之间存储非零值的索引。
2.参数空间的划分:range-hash混合存储。先根据索引划分几个范围,每个范围内通过哈希映射确定每个服务器负责的参数范围。
三,网络结构优化
1为计算最佳切分点是高维操作,仅仅由leader worker一个节点计算效率太低,为了加快获得最佳切分点的速度,有两个地方可以优化。
(1)针对worker端 Round-robin work partition。采用轮询策略,确定每个worker所负责的候选特征值。每个woker在自己所负责的特征值内,寻找最佳特征切分值。
(2) 针对server端 Sparse pull。假设有P个分区,每个分区中含有K个特征,通过pull操作循环依次获取每个特征的梯度图,以确定这K个特征的最佳切分点。将结果以split feature/split value/gain的向量形式传递给worker。worker获得P个最佳值后,再从这P个特征值中选择一个最佳切分点最为最终的结果。(本质上是分而治之的思想)从而节约了数据存储以及数据传输。
针对论文里面的实验结果,很多人有争议,可以查看这里https://github.com/Tencent/angel/issues/7