导语: GBDT(或XGBoost)算法是一种十分流行的树集成学习算法,不但是数据科学竞赛的常胜工具,在工业界的具体业务场景也有广泛的落地场景。然而,近年来用户隐私数据保护条例逐渐完善,“数据孤岛”逐渐形成,不但数据难以收集,不同公司或团队之间的数据也难以共享,这直接影响着机器学习模型的效果。为了应对这个问题,联邦学习技术逐渐进入人们的视线。本文聚焦腾讯自研的联邦学习平台Angel PowerFL中纵向联邦GBDT算法实现,介绍纵向联邦GBDT算法的原理和流程,并讲解相关的优化技术。
梯度提升决策树算法(Gradient Boosting Decision Tree, GBDT)由于其高准确率和可解释性,被广泛应用于分类、回归、排序等各位问题中。目前有许多有名的GBDT算法实现,如XGBoost、LightGBM、CatBoost等。然而,这些主流实现专注于传统的机器学习场景,要求所有的训练数据都是可以访问到的。近年来,人们对数据隐私的保护逐渐注重起来,相关的法律法规也在逐渐完善,一方面,用户的数据变得更难收集,另一方面,不同公司的数据直接用于商业合作可能会导致法律纠纷。为了应对这种“数据孤岛”的现象,联邦学习逐渐成为了一个被广泛研究并应用的话题。联邦学习可以在保护数据隐私的前提下,联合多个数据源来进行机器学习模型训练,从而提高模型的精度。
得益于GBDT算法的强大能力,联邦GBDT算法不仅在学术界得到广泛研究,也受到了工业界的青睐。然而,在实际应用中,业界的联邦学习框架性能不尽人意,可支持的数据集规模也比较小。为了解决这种供需矛盾,腾讯自研的联邦学习平台Angel PowerFL(以下简称PowerFL)针对纵向联邦GBDT算法的瓶颈进行了一系列的分析与优化,并提出一种高效的纵向联邦GBDT算法实现。与业界开源框架相比,PowerFL在公开数据集上可达到18.9倍的训练性能提升,并可以支持更大规模的数据集。
在本文,笔者首先简要地对GBDT算法和纵向联邦GBDT算法进行介绍,然后讲述PowerFL中纵向联邦GBDT算法的实现与优化技巧,最后进行一系列的实验对比。
在本章节中,笔者简要介绍GBDT算法的核心思想与关键步骤。
GBDT示例
GBDT算法使用Boosting策略,通过依次学习多棵决策树(基模型)来不断地提升模型能力。上图是一个GBDT模型的示例,GBDT算法的预测输出为所有决策树的预测值之和,以分类问题为例,一个GBDT模型的预测值为
其中是树的数量,是学习率,是第棵树对样本的预测结果。
在GBDT所采取的Boosting策略中,第棵决策树学习的是前棵决策树的预测值的残差。对于第棵决策树,GBDT算法会根据前棵决策树的预测值来计算一阶梯度和二阶梯度,然后第棵决策树会根据梯度来进行训练,并达到不断拟合残差的目标。
基于梯度直方图的最优分裂点找寻
梯度直方图是GBDT算法中的核心数据结构,几乎所有主流的GBDT实现均采用基于梯度直方图的方法来训练一颗决策树。上图展示了该算法如何寻找一个特征维度上的最优分裂点,具体包括以下几个步骤。
纵向联邦是跨企业合作中十分常见的联邦学习模式,以两方为例,有且仅有一方拥有机器学习的目标label信息,称为Guest方,而没有label信息的则称为Host方。通过纵向联邦学习,Guest方可以借助Host方的特征数据,提高机器学习模型的能力,同时又能保护各个参与方的数据隐私。
如前文所述,GBDT算法中的核心步骤是梯度直方图的构建,为了寻找最优分裂点,首要条件是需要让Host方根据己方的特征构建梯度直方图。然而,由于梯度是根据label进行计算的,往往蕴涵着label的相关信息。以分类任务中常用的logistic loss为例,其一阶梯度为,不难看出,对于正样本,其梯度恒负,对于负样本,其梯度恒正。因此,直接发送梯度至Host方是会导致Guest方label信息的泄漏。
纵向联邦GBDT算法伪代码
为了解决这个问题,联邦GBDT算法需要对样本梯度进行加密保护。进一步的,由于梯度直方图的构建只含有加法运算,所有满足加法同态的加密协议(见下文)均为可选的方案。上图展示了基于同态加密的纵向联邦GBDT算法伪代码,其中参与方之间的发送和接收分别使用红色和蓝色字体高亮,主要流程可以总结为:
笔者对上述流程中,针对双方交互中传输的信息,进行隐私安全分析。
上述的纵向联邦GBDT算法协议,不但可以保证参与双方的数据安全,而且可以实现无损的计算,因此,联邦训练的模型,与将所有数据放到同一个数据中心再进行传统训练,其模型精度是完全一致的,这在本文的实验环节中也得到了验证。
Paillier加密协议是最常用的同态加密协议之一,满足加同态性质。Paillier同态加密协议支持以下操作:
PowerFL和FATE均支持Paillier加密协议,并在纵向联邦GBDT实现中应用该协议来进行样本梯度的加密,直方图的同态加法,以及直方图的解密。
接下来笔者介绍一下腾讯自研联邦学习平台PowerFL中的纵向联邦GBDT实现。
系统架构
上图是该实现的系统设计架构,包含了Guest方和Host方的独立计算,以及跨公网的交互。该系统中有三种角色,分别为:
腾讯自研的联邦学习平台PowerFL对易用性、高效性与可扩展性进行了充分的考虑:
在实际运行中,笔者观察到,存在一些十分耗时的操作,这些操作不但会导致性能的下降,而且会使得计算资源使用率降低。因此,在本章节,笔者对纵向联邦GBDT算法进行复杂度分析,并提出多项优化技术。
在联邦GBDT算法中,出于对隐私安全的保护,引入了同态加密操作,包括加密、解密和密文加法操作。由于密文的运算操作比普通浮点数的运算耗时长数十甚至数百倍,也进而成为了训练过程中的主要瓶颈。因此,笔者着重对密文操作的复杂度进行分析。
为了方便读者理解,这里首先定义一些数学标识:
接下来,笔者对加密、同态加法、解密三种密文运算的复杂度进行分析:
分析发现,对于每棵决策树,由于样本量通常比较巨大,样本梯度的加密操作往往耗时比较长。不仅如此,在短时间内发送全量的加密梯度,对于网关机来说也是一个很大的压力——由于公网带宽是受限的,传输加密梯度的耗时不可忽视。所以,在实际运行中,由于样本梯度的加密、传输比较耗时,Host方处于一个长时间的闲置状态(如下图的上半部分所示),造成计算资源的严重浪费。
梯度加密、发送、以及根结点梯度直方图构建的甘特图
显然,Host方闲置等待的主要原因是决策树根结点包含了全量的样本,使得创建梯度直方图需要使用全量的梯度。然而,笔者分析发现,梯度直方图的创建是一个梯度累加的过程,这个过程并不需要不同样本之间的协同计算。受到这个启发,笔者提出了喷砂式梯度加密策略。如上图的下半部分所示,该策略的主要思想是将全量样本分为多个小批量进行处理。每次Guest方对一批样本的梯度进行加密和发送,Host方接收到一批样本后,马上应用于根结点的梯度直方图构建中,并由后台线程继续下一批加密梯度的接收。该策略的优点可以汇总如下:
在实际的训练中,笔者发现,在大部分情况下,加密和传输梯度的耗时可以被完全覆盖,不再成为瓶颈之一。
有加密操作就势必有解密操作。通过之前的分析,解密操作只与特征维度以及候选分裂点个数相关,与样本个数无关。尽管看似并非瓶颈,然而存在三个至关重要的问题:
基于以上三点,加速梯度直方图的公网传输以及解密是十分必要的。
Paillier密文打包压缩 为了同时降低公网传输和解密的耗时,笔者提出了一种基于多项式计算的密文打包压缩算法,该算法的主要思想是将多个密文压缩为一个,在解密时只需对压缩后的密文进行解密。若将个密文打包压缩为一个,则跨公网的传输量和解密的操作次数均降低至原来的,是一个十分可观的提升。
在使用Paillier加密算法对浮点数进行加密前,首先需要将其编码为对应的大整数,随后对进行加密得到密文。熟悉低精度训练的读者应该了解,在机器学习训练中,研究者之所以可以使用更少的精度来表示浮点数,是由于模型或梯度中的数值通常在一个较小的范围内。类似的,由于的范围较小,在编码后,大整数也在一个较小的范围内。然而,为了进行高质量的加密,Paillier加密需要在一个很大的空间内,如在4096-bit的空间内,对大整数进行多次幂模运算。毫无疑问,这极大地造成了数据空间的膨胀。因此,笔者提出问题:是否可以通过多项式计算,对多个密文放缩操作,以填满膨胀的数据空间呢?
受到这个启发,笔者介绍一种通过多项式计算,将多个密文压缩为单个密文,并支持解密与解压的算法,具体公式如下:
其中分别表示密文空间中的同态加法和数乘运算,是足够大的放缩因子,如。该算法利用了密文空间的膨胀性质,将多个密文通过放缩拼接在一起,起到降低密文总大小和减少解密次数的作用。
应用于GBDT算法 在整数编码中,由于非负数和负数的编码范围不同,若同时对正数和负数进行放缩拼接,毫无疑问会让压缩率大打折扣。然而,在训练过程中,一阶梯度有正有负(二阶梯度非负),要如何保证压缩算法的正确性呢?
笔者分析发现,尽管样本梯度有正负,单个样本梯度是可以有范围限制的:对于分类任务使用的logistic loss,其一阶梯度范围在之间;对于回归任务使用的RMSE loss,可以对梯度大小进行约束(类似于L1正则化)。因此,每个直方图桶的大小,也必然是有范围的,即当前树结点的样本数量和单个梯度最大值的乘积。于是,PowerFL在压缩前对直方图桶通过加法进行偏移,使其保持恒正,在解压后再通过减法偏移恢复。由于这个偏移量是Guest和Host双方均已知的,因此不会造成任何信息泄露。
在实际运行中,PowerFL默认将32个密文压缩到一起,从而以较低的开销获取近32倍的跨公网传输和解密性能的提升。
除了对加密和解密进行优化,PowerFL对同态加法操作也进行了许多优化,包括以下几点:
在本章节,笔者对PowerFL中的纵向联邦GBDT实现进行性能测试,这里主要考量的是腾讯自研平台相比FATE的训练效率提升,以及纵向联邦训练与非联邦训练的模型精度比较,并在最后介绍PowerFL在已有业务场景中的性能指标。
首先,笔者使用两个小规模的公开数据集,对比PowerFL和FATE (SecureBoost) 的训练性能。使用的数据集,实验环境,以及超参数设置如下所示
数据集描述:
数据集 | 样本数量 | 特征数量 (Guest/Host) | 稠密度 |
---|---|---|---|
census | 22K | 70/78 | 8.78% |
a9a | 32K | 50/73 | 11.28% |
实验环境:Guest方和Host方各一个Worker,16 cores,30GB内存。
超参数设置:20棵决策树,学习率0.1,树最大深度6,样本采样率100%
下表展示了PowerFL和FATE在两个小规模数据集上的训练性能,笔者也使用XGBoost进行了模型指标对比,其中,XGBoost-Guest指的是仅用Guest方数据训练。从实验结果可以看出,
数据集 | PowerFL时间 | FATE时间 | PowerFL Loss | FATE Loss | XGBoost Loss | XGBoost-Guest Loss |
---|---|---|---|---|---|---|
census | 12秒/树 | 214秒/树 | 0.365 | 0.367 | 0.364 | 0.383 |
a9a | 14秒/树 | 265秒/树 | 0.360 | 0.372 | 0.361 | 0.384 |
接下来,笔者使用三个较大规模的公开数据集进行实验。使用的数据集,实验环境,以及超参数设置如下所示
数据集描述:
数据集 | 样本数量 | 特征数量 (Guest/Host) | 稠密度 |
---|---|---|---|
susy | 5M | 9/9 | 100% |
epsilon | 400K | 1K/1K | 100% |
rcv1 | 697K | 23K/23K | 0.15% |
实验环境:Guest方和Host方各8个Workers,8 cores,30GB内存。
超参数设置:20棵决策树,学习率0.1,树最大深度6,样本采样率20%(对于XGBoost我们使用100%采样率)
下表展示了在这三个数据集上的实验结果。
数据集 | PowerFL时间 | PowerFL AUC | XGBoost AUC | XGBoost-Guest AUC |
---|---|---|---|---|
susy | 43秒/树 | 0.864 | 0.864 | 0.856 |
epsilon | 772秒/树 | 0.853 | 0.854 | 0.823 |
rcv1 | 1890秒/树 | 0.968 | 0.968 | 0.944 |
最后,笔者简单介绍一下PowerFL在实际业务场景中的性能指标。如下表所示,PowerFL在可支持千万级别样本的训练场景,以及亿级别样本的预测场景,并在可观的运行时间内完成任务。
场景 | 训练样本量 | 训练时间 | 预测样本量 | 预测时间 |
---|---|---|---|---|
消费潜力 | 1570万 | 3小时 | 1.9亿 | 45分钟 |
诈骗风控 | 1172万 | 1小时 | 1100万 | 10分钟 |
本文介绍了腾讯自研联邦学习平台PowerFL中的纵向联邦GBDT算法实现,并对其中的运行瓶颈和优化技巧进行了简要的介绍。相比于开源联邦学习平台FATE,PowerFL在小规模数据集上可以达到18.9倍的性能提升,并支持更大规模的数据集,并达到与非联邦训练相同的模型精度。