鉴于数据隐私的重要性,国内外对于数据的保护意识逐步加强。2018年欧盟发布了《通用数据保护条例》(GDPR),我国国家互联网信息办公室起草的《数据安全管理办法(征求意见稿)》因此数据在安全合规的前提下自由流动,成了大势所趋。这些法律法规的出台,不同程度的对人工智能传统处理数据的方式提出更多的挑战。
AI高度发展的今天,多维度高质量的数据是制约其进一步发展的瓶颈。随着各个组织对于数据的重视程度的不断提升,跨组织以及组织内部不同部门之间的数据合作将变得越来越谨慎,造成了数据大量的以孤岛的形式存在
联邦学习的本质是基于数据隐私保护一种分布式机器学习技术或机器学习框架。它的目标是在保证数据隐私安全及合法合规的基础上,在模型无损的前提实现共同建模,提升AI模型的效果,进行业务的赋能。
那么既然是建模,在工业界最近若干年比较出名的大致可以分为GBDT和神经网络了,但是由于联邦学习的特性,需要对用户的特征与Label进行隐私安全保护,所以需要采用同态加密、秘钥分享、差分隐私等隐私计算手段保障安全。但是基于此带来了比较大的挑战,神经网络的复杂运算,指数、对数等会给建模提出非常大的难题,以目前的硬件与软件加密技术还是非常困难的,但是对于SecureBoost来说,只需要进行简单的同态运算就解决,达到和Xgboost同样的建模效果,所以本篇文章会和大家分享下联邦学习的安全树模型-Secure Boost。
BTW,目前神经网络虽然比较难做安全屏障,无法很好的做到计算性能与模型性能的Balance。但是经过笔者长期的思考与实践,高质量的方案已经成熟在胸,近段时间会再做一些些实验,再调教下代码,以及相关论文的撰写,BTW,笔者的英文比较烂,写起来还是相当吃力的。论文发出后,相关代码会在个人的github进行分享,大家敬请期待。
最开始写这个联邦学习树模型,本来只想写一篇,但是由于树模型相对来说知识较多,无法一步到位解决清晰SecureBoost,感觉一篇文章也太长了,不好说清楚。故本文章分成以下主题来进行,主要的脉络就是:决策树 -> 集成方法Bagging & Boosting -> GBDT -> XGBoost -> Secure Boost Tree。希望读者可以通过这一系列文章,对联邦学习的SecureBoost方法有一个整体的全方位的掌握,所以就写成了四篇,历时一个多月(笔者还有比较多的工作,平时比较忙,只能周末抽空写),终于终章来临,颇有不舍。最近一段经历太多,各种事情都遇到了,很多事情从不明白到明白,从执着执念到放下执念,一夕之间,仿佛悟道了,也仿佛没有悟道,但是大抵目前内心是颇为平静的,坦然接受一切变化,不喜不悲,这可能是我最大的收获吧。
其实,对于树模型系列来说,笔者以前做算法的时候,也在大量的使用,并且觉得自己是理解到位的,但是在我写联邦学习安全树模型的时候,发现很多的地方并没有理解透彻,有很多细节是没有考虑到的,写着写着就会发现自己的理论厚度不够,细节没有吃透。后来也花了大量的精力和时间去充电,这个事情也让我明白了,很多东西你看起来懂了,其实并没有懂,只有去真正的用心的去做过一遍,你才有些懂了,无论做什么事情脚踏实地才是最重要的,有些事情你觉得你赚到了,其实是输了。
众所周知,上古时期的机器学习,受限于大数据、大算力与大框架的三座大山,传统的统计机器学习方法大方异彩,基本是LR、Xgboost的天下,LR属于线性的模型,无法充分的拟合非线性的数据分布。但是GBDT则属于非线性的模型,虽然说相对深度学习来说,他的非线性拟合能力并不是那么强大,但是也可以在有限的程度下,对非线性的分布进行形式化,从而形成核心的竞争力。在当时的情况下,也算是一个新的比特大陆,一个机器学习从业者,只要会用Xgb,并且能够深度理解Xgb基本都会有大把的公司排队欢迎,Offer拿的手软,其实知道今天XGB依然是校招的一个热点话题,作为对一个候选人的重要考量。
在工业界搜广推的场景中,基本上都可以看到Xgboost的身影,基本可以说一个Xgb能用的明白,就可以在工业界占据一个位置。同时在Kaggle竞赛中,Xgb也是经常作为黑马出现。所以说Xgb就是一个大杀器,兵锋所致,所向披靡。即使在现在深度学习大行其道的情况下,Xgb依然活跃,在一些领域数据量不是那么巨大的情况下,Xgb依然在继续发光发热。
哲学告诉我们,万事万物都不是作为孤立的存在,都有着千变万化的联系。故针对联邦学习而言,我们既要做安全的深度网络模型,也要做安全的Xgb模型,那么在前两章介绍了《联邦学习-安全树模型 SecureBoost之Desicion Tree》、《联邦学习-安全树模型 SecureBoost之集成学习》和《联邦学习-安全树模型 SecureBoost之XGBoost》,我们已经介绍了决策树、集成学习、Bagging、Boosting、GBDT以及XGBoost后,那么本章作为联邦学习树模型的终章,会介绍下SecureBoost算法,在前三章的基础上,大家已经理解了树模型的相关知识,本章我们会利用隐私计算的技术,在XGB的基础上,进行数据的密态隐私运算,从而达到在隐私保护的基础上的联合建模,达到计算性能与模型性能的共赢。
在正式介绍SecureBoost之前,首先和大家介绍下我一直在使用的学习新技术的方法论,算是和大家的一个分享吧,本文也安全这个模式来讲述,这样比较符合我以前在研究这个话题的时候的思路历程,希望对大家有些帮助。
笔者工作的时间比较长了,有15年了,一直从事互联网前沿工作。在工作的前期我基本是从事纯架构的工作,中期开始接触算法,进而转到纯算法领域,后期由于工作需要,我又开始接触算法框架与隐私计算方面的工作,而且一直都是没有脱离一线,核心问题带头攻关。我曾经不止一次的自嘲:“除了界面方面的工作,我基本都做了,感觉自己啥都做,样样通、样样松 哈哈”。而且主导了多个大型项目,包括近期的京东的联邦学习项目,从0到1就是搭建的,开门红业务也是主导的。所以我带过的很多人以及一些同事经常问我的话题有两个。”第一个,你为啥这么折腾,换个领域多累。第二个,为啥你能快速的切换到一个新领域“。第一个吧,我的回答是我喜欢学习自己未知的技术,不学会不甘心。第二个呢,其实方法比较多,维度比较大,不好简单说,但是这次借着这篇博客,我分享一下我的学习、研究与掌握一门技术的认知方法论,这个是我比较依仗的。本篇文章通过理论联合实际的方式,与大家分享下这个方法,希望对大家有所帮助。本方法是综合学习了多门逻辑思维课程、思考方式与学习方法(包含麦肯锡方、金字塔原理、大逻辑与小逻辑等多门经典书籍的基础上提炼的,我给他起了个名字就叫“认知方法论”。
认知方法论,分为几个关键的步骤,我基本是按照这个方法进行学习与工作的:
所以,本篇介绍SecureBoost我们来按照这个方式来阐述下,不足之处,欢迎大家指教。
首先,我们回顾下上篇文章的XGB的关键流程,为什么要回顾呢?因为我们要做的事情是基于整个底层的构建,整个模型训练运行态的隐私保护,并不是在XGB上套个壳就可以解决的,所以需要对底层有着深刻的理解与认知,清楚其理念、流转机制、关键数据结构与关键算法。总结来说,做这种底层的事情本身就是要吃苦,讨不到巧的,而且所有的讨巧最后都需要还的。
首先,定义关于目标函数的一阶与二阶偏导数,如下
g i = ∂ y ‘ ( t − 1 ) L ( y i , y i ‘ ( t − 1 ) ) , h i = ∂ 2 y ‘ ( t − 1 ) L ( y i , y i ‘ ( t − 1 ) ) , g_i=\partial {y^`}^{(t-1)}L(y_i, {y^`_i} ^{(t-1)}), h_i= {\partial }^2{y^`}^{(t-1)}L(y_i, {y^`_i} ^{(t-1)}), gi=∂y‘(t−1)L(yi,yi‘(t−1)),hi=∂2y‘(t−1)L(yi,yi‘(t−1)),
然后,将一阶导数与二阶导数代入,那么目标函数变为如下
O b j ( t ) = ∑ i = 1 n [ g i f i ( x i ) + 1 2 h i f t 2 ( x i ) ] + ∑ i = 1 n Ω ( f n ) + c o n s t a n t Obj^{(t)}= \sum_{i=1}^n[g_if_i(x_i) + \frac 12h_if_t^2(x_i)] + \sum_{i=1}^n\Omega(f_n) + constant Obj(t)=i=1∑n[gifi(xi)+21hift2(xi)]+i=1∑nΩ(fn)+constant
然后,去掉常量,由于函数中的常量在函数最小化的过程中不起作用,所以可以直接去掉
O b j ( t ) = ∑ i = 1 n [ g i f i ( x i ) + 1 2 h i f t 2 ( x i ) ] + ∑ i = 1 n Ω ( f n ) Obj^{(t)}= \sum_{i=1}^n[g_if_i(x_i) + \frac 12h_if_t^2(x_i)] + \sum_{i=1}^n\Omega(f_n) Obj(t)=i=1∑n[gifi(xi)+21hift2(xi)]+i=1∑nΩ(fn)
求最值,因为一元二次函数最小值处,一阶导数等于零,套用一元二次函数的最值公式,我们可以轻易求出,每个叶子结点的权重 wj* 及其此时达到最优的 Obj 的目标值:
树的生成策略,整体来说还是比较简单的,对树中的每个叶子结点尝试进行分裂;每次分裂后,原来的一个叶子结点继续分裂为左右两个子叶子结点,原叶子结点中的样本集将根据该结点的判断规则分散到左右两个叶子结点中;新分裂一个结点后,我们需要检测这次分裂是否会给损失函数带来增益,增益的定义如下:
现在,我们复习了下XGB的计算流程,接着我们看下我们需要适配的场景,理清其本质。
最终的问题的界定:
保护双方的特征不被泄露。
保护持有Label的一方的标签不被泄露。
在不泄露双方数据信息的基础上完成联合建模,提振业务。
至此,问题界定完毕。
目前,我们已经完成了问题的界定,给整个问题是什么样做了个定性、定量的本质的描述,接着我们需要将这个界定的问题,分析出具体的方案,并且分解成几个可以执行子问题,通过子问题的轮转与有机的组合,最终完成整个问题的解决。
可以供选择的隐私计算方法其实还是比较多的,包含同态加密、秘钥分享、混淆电路以及不经意传输等,不过不同的加密有不同的适配场景,所以我们看看这个算法过程哪里需要加密,如何加密。
整个XGB计算的核心在于梯度直方图的计算,但是梯度直方图的计算是需要Label的,所以需要持有Label的一方将计算好的一阶与二阶梯度加密传递给没有label的一方,进行梯度直方图的构建。
但是,如果直接传输一阶与二阶导数,以分类任务中常用的Logistic Loss为例,观察一阶梯度,那么对于正样本,其梯度恒负,对于负样本,其梯度恒正,所以直接传输会暴露Label标签,所以我们需要进行隐私加密算法的引入。由于梯度直方图的建立过程中只需要使用加法计算(一阶导与二阶导分别累加,然后代入最终的目标函数),所以可以采用同态加密(半同态,只有加法运算)的方式将梯度传递给无Label的一侧,进行梯度直方图的构建,梯度直方图构建好之后,再传递给持有Label的一方进行整体的计算,这样的话Feature和Label都没有泄露。
同时,由于通过了梯度直方图,实现了未持有Label一侧特征数据分布的压缩变换刻画,使其不具备具体的精确信息,所以基于大数据、特征分布离散的情况下,想要针对这个进行反推,基本是不太可能(但是有前提,后续会对这个地方进行讲解,需要什么样的适应条件)。
相对于整体分析,关键分析更为细致,会进行方案的细致推演,完成上下游全链路以及相关依赖的推导,请看如下。
上面描述过,SecureBoost算法对样本梯度进行加密保护。由于梯度直方图的构建只含有加法运算,所有满足加法同态。下面讲解下这个具体的全链路轮转流程。
首先,定义持有Label一方为Active Party;不持有Label的一方称为Passive Party。
Actice Party侧对梯度的加密:在建立一颗新的树的构建过程中,以Active Party的视角进行分析
构建梯度直方图:
寻找最优分裂点:到这里,Active Party侧已经完成了对端的梯度直方图的解密,拥有双方联合的所有特征的梯度直方图,所以并根据分裂增益计算公式,枚举每个特征基于直方图进行计算最优解,找到全局最优分裂点;
树结点:拥有最优分裂点的一侧,对该树结点上的样本进行分裂,划分成左右两个子数据集,并将划分结果发送给对侧,作为子节点的分裂样本。
预测值的更新:Active Party侧根据计算公式,计算叶子结点的预测值;但是不会同步,所以Passive Party侧无法得知叶子结点的权重。
至此,整体全链路流程描述完毕。
上面的分析,油粗到细,从整体到全面,全方位立体的综合分析了下SecureBoost的构建过程,现在我们做下延伸,这个方案有没有不安全的地方,有没有的安全的漏洞,会不会造成数据的泄露,带来安全隐患。
做隐私计算的人,其实我觉得是应该拥有敬畏之心的,因为大家的一个疏忽,一个认知不足,就会造成巨大的、不可弥补的损失,从而给自己、给公司、给行业带来强烈的信任危机,万丈高楼平地起,但是一个疏忽就会造成整个地基的不稳,到头来就是一场空。所以以我们很有必要进行审视一下,这个方案,到底有没有缺陷,或者说在某些特定的场景下是否会有缺陷,有没有什么使用的限制。所以我们做事情,介绍方案都要讲清楚,说明白,不遮掩、不做作,做真实的自我,经得住考验。
笔者对上述流程中,针对双方交互中传输的信息,进行隐私安全分析,主要针对两个维度吧,一个是Label的维度,一个是Feature的维度,这个也是整个训练过程中涉及到的所有的数据要素,要泄露也就是从这两方面有隐患了。
Label标签保护:上面描述过,如果不加密的话,针对不同的Loss Funtion,logistic loss为例,其一阶梯度为,不难看出,对于正样本,其梯度恒负,对于负样本,其梯度恒正。锁以针对Passive Party侧的特征,Active Party侧会首先依据Label计算计算一阶与二阶导数,并且进行同态加密发送给Passive Party侧。
梯度直方图:Passive Party主要使用加密的梯度构建梯度直方图,这个过程中由于加密保证了Active Party侧不泄露。梯度直方图是刻画特征维度的信息,本质思想是想将分布非常分散的数据量巨大的特征分布归一到一个有限分布区间的压缩转换,但是这个过程中是有风险的。
那么,笔者经过思考,有几个建议如下
隐私计算是个永恒的话题,任何一个框架都需要结合数据算法进行演练,所以整个隐私保护需要框架结合数据算法进行联动,单一的保护可能会被另外一方的随意给破坏,造成泄露!
个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:[email protected]