xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理
摘要: 最近与某厂完成基于FATE的联邦学习框架的一个项目,第一次实践了一把联邦学习在实际业务场景中的应用,从模型评估结果来看,效果还不错。因此,本文将完成对于其中实现的提升算法SecureBoost进行详细的介绍,算是对这个项目算法原理上的总结。
由于SecureBoost(SecureBoost: A Lossless Federated Learning Framework)中的Boosting算法是基于XGBoost来实现的,并将其扩展到横向联邦学习任务中来,在隐私保护方面做了一些分析与证明,因此熟悉XGBoost对于理解SecureBoost会起到事半功倍的作用。
本文将分成两大部分内容,首先会简单回顾一下XGboost的基本原理,如果你对这方面内容很熟悉了,可以跳过;第二部分,将是本文的重点内容,侧重于对SecureBoost原理的讲解,包括训练与预测环节;第三部分,简单做一点总结。
XGBoost原理回顾
正则化的损失函数(总)
XGBoost是Boosting算法家族中的一员,因此其形式上也是有
其中的假设空间中的所有CART回归树模型
- 树的结构(树的深度,叶子节点个数)以及特征分裂阈值,
- 叶子节点的权重(特别说明GBDT,XGBoost等使用的回归树,因为叶子节点存在权重信息)
单颗树的结构由字母
离散化映射到
有了上述定义字母表示,就要介绍XGBoost中使用的正则化的损失函数了,相比GBDT模型,引入了正则项用于防止过拟合,其形式如下所示:
从损失函数上不难理解,在给定
正则项主要有两部分构成:
- 叶子节点权重的
范数,目的是使得权重值更平滑,连续;
- 叶子节点的个数
,在XGBoost中树的生长方式是Level-wise的方式,每一层都需要同时进行分裂,有可能导致不必要的特征参与分裂,如下图对比所示
图1:两种决策树生长方式
第
假设在完成第
此时,将损失函数
完成了在第
细节
- 公式(4)的第一步中,跟
式的区别是,正则项只有前颗树,因为此时才迭代到第颗树,后面的树还需要在学习;
- 公式(4)中的第二步,直接将公式(3)带入即可;
- 公式(4)从第二步到第3步,发现已经将正则项,从累加变成了第
颗树的正则项,以及常数,因此在此时前面第颗树是已知的,所以其正则项之后也是已知的,用表示即可,方便后续推导;
从损失函数到树的评分函数
众所周知,XGBoost利用二阶泰勒展开来近似表示第
将公式(5)与XGBoost的在第
因此,可以定义损失函数
上述公式中,常数
即可求出,最优值为:
将
有了该公式,我们可以用于评价生成的树的得分,得分越小,说明树的结构越好。到目前为止,我们知道了叶子节点的最优取值,以及最小的损失函数取值,然而,仔细回顾一下,我们还没有确定树的结构,公式也没有告诉我们该怎么得到最优的树的结构。
特征最优切分点算法
树长成啥样还不知道,我们只是有了评价好不好的公式。最近简单的办法,就是暴力枚举所有可能的结构,但这肯定是不能被接受的。那就要贪心法上场了,每次尝试分裂一个节点,计算分裂前后的增益,选择增益最大的那次分裂即可,依次循环下去。注意,贪心法不是XGBoost才有,从最经典的ID3,C4.5,CART树开始就有了,只不过,其使用的评估指标不一样而已;
- ID3, 信息增益
- C4.5, 信息增益比
- CART, Gini系数
- XGboost, 打分函数(该打分函数是对整颗树进行评估的)
在XGboost中具体实现中,有两种特征切分点算法, 贪心法和近似算法;先来简单看看贪心算法是的过程吧;
贪心算法
我们只要评估一次分裂的增益,用分裂之后的评估指标值,减去分裂前的值,找到增益最大的,即完成本次分裂搜索,对于XGboost而言,一次分裂之后,会将该节点的样本划分到两个不相交的样本空间, 用
每次特征分裂的增益计算: 分裂前:
分裂后:
所以,分裂之后的增益为:
贪心算法的流程如下图所示:
贪心算法对每个特征都做线性搜索,根据样本特征的排序值,逐步将更多的样本加入到左子树,根据增益函数最大的点,即为最优的分割点。 步骤:
- 从当前节点出发,依次为
个特征,将属于该节点上的样本按照特征的取值进行升序排列,依次枚举出分裂点,根据增益函数得到该分裂点的增益值,保存中间结果;
- 选择增益最大的分裂点,作为当前节点的最佳分裂点
- 回到第一步,并行地为其他的节点选择最佳的分裂点;
近似算法
由于贪心算法需要对每个特征进行排序,因此成为计算速度的瓶颈。近似算法就是根据特征的分布提前计算得到分
从算法流程图中,可以看到,第一步是提前全局,或者每次分裂的时候计算各个特征的分位点,而在第二个for循环中,是分别为每个特征,统计得到落在各个区间的样本的一阶导数和二阶导数汇总起来,得到对于区间的
- 根据变量的分布,找到3分位点,将当前节点下的样本分成了3份;
- 根据损失函数,得到各个样本在某次迭代过程中的一阶导数
和二阶导数;
- 将各个区间内的样本的,一阶导数和二阶导数进行求和汇总,分别得到
,,
- 利用与贪心算法相同的方法,寻找区间最佳的分裂点,由于只有3个区间,因此只有2两组合方式,1|2,3, 或者 1, 2 | 3
简单总结贪心算法与近似算法
- 贪心算法需要为每个特征进行线性搜索,枚举出所有的分裂点,而近似算法只需要统计分位点信息,枚举分位的取值即可;
- 贪心算法在样本级别寻找特征的最佳分裂点,而近似算法在区间级别;
论文中也对两种的算法的精度做了比较,这里先不赘述 此外,XGBoost还有多方面的优化内容,如加权分位树缩略图,稀疏感知等,由于暂时我们的主题关系不是很大,先不进行叙述。
补充:常用损失函数的一阶导数,二阶导数
其中上述
以下对平方损失函数,对数损失函数进行求导:
- 平方损失函数
即
时
- 损失函数为对数损失
令
,表示前颗树对于样本的预测值,由对数损失函数的定义可知,
对数损失函数的一阶导数,以及二阶导数的的推导,由于对数损失函数是有两部分组成,因此在二分类时(
当
时,当
时,
而对于二阶导数,只需要在对
sigmoid
函数的求导,即可得到我们的结果:
SecureBoost的原理
本文的主角SecureBoost是一种允许多方参与的纵向联邦学习算法,基本原理跟XGBoost类似, 在此基础上引入联邦学习要考虑的隐私保护问题, 是一种端到端的联邦环境中的梯度提升算法。
与传统的模型训练不一样,联邦学习中的训练问题,可以认为是将我们的master table在特征维度上,拆分到了不同的合作方中,各方拥有用户不一样的数据特征,人群,但真实标签
Active Party
, Passive Party
。
Active Party
: 拥有
Active Party
,在联邦学习中起主导作用,如同分布机器学习中的server
; Passive Party
: 只拥有数据的那一方(在实际业务中是数据提供方,如百度,京东,腾讯等大厂拥有丰富的数据, 作为数据与平台的提供方存在,赋能其他企业),他们的角色对应着client
在后面也会对这两者在训练过程中拥有的权限,获取的训练信息进行对比。SecureBoost要解决的目标是什么呢? 一句话概括就是,在
对于训练上述模型,要解决以下三个问题:
- 在没有
的情况下,
Passive Party
怎么根据其独有的数据参与模型参数的更新; Active Party
如何将Passive Party
的模型参数聚合成一个全局的模型;- 在训练阶段, 预测阶段,如何保证不泄露信息;
哪些信息不能泄露呢,对于Active Party
当然是
Active Party
和Passive Party
不能泄露了特征的分布,我理解的是连分位点的值都不能泄露出去,双方只知道用了哪些大类的特征,而不知道具体的特征名,逻辑,特征的取值范围,特征的分布等。
在下面的叙述中,将从三方面来回答以上的问题,第一部分是SecureBoost训练过程的细节;第二部分是预测打分是如何操作的;第三部分是信息安全性分析;
SecureBoost训练原理
回顾第一部分的XGboost的原理可知,在每一次迭代
因此,我们很容易发现:
- 在计算在最佳的叶子节点权重,以及样本特征的最佳分裂点的查找过程中,只依赖于个样本对应的一阶导数
和二阶导数;
- 一阶导数
和二阶导数的计算依赖于标签,(参见第一部分的求导过程)
因此,如果直接交换
Passive Party
获取了导数信息,以及前
[]
表示对某个数进行加密,
因此对在联邦环境中,交换的个叶子节点内的一阶导数之和,二阶导数之后,也是可加的,有了加密的导数信息就可以如同XGBoot一样,利用近似算法进行特征的分裂,树的构建,这部分原理上没什么差异,但是,如同上述所诉,在特征分裂过程中不能暴露了分位点的值,所以,下面将会展示是如何做到这一点的。
近似算法
和XGboost相似,原理如下图:
没有什么可说的,主要来讲讲怎么保证特征的分布,分位点值不泄露的问题。我们都知道,在某次节点分裂过程中, XGBoost是通过枚举在不同的分位的位置,通过计算两个区间内的导数之后,以及分裂前的总的导数,计算增益的方式来确定用哪个特征,哪个分位点,因此在联邦学习中,传递给Active Party
只需要是用这样的数据对即可,
特征最优切分点算法
下面来看看SecureBoost是如何完成特征的切分点查找的,看图说话,红色区域是与XGBoost不一样的地方:
- 首先,由于联邦学习存在多方参与,所以这里需要多方分别计算不特征在不同的分位点下的导数之和,并根据上述的加密算法,以及数据传递方式,将
传递给
Active Party
; - 第二,需要完成导数信息解密,在
Active Party
是不需要加密的; - 第三,需要依次枚举各方的特征,在某次切分过程中,找到增益最大的节点,并将切分点返回给对应的
Passive Party
,完成一次节点的分裂,当然如果是刚好是Active Party
,也一样,记录最佳特征,最佳分位点的取值即可,并将这些特征的具体分裂阈值保存在各自的平台上,生成查找表,用于后续的预测过程; - 第四,满足一定的条件停止一颗树的构建,接着迭代下一个颗树,直到满足训练终止条件;
嗯,是没啥好讲的这部分,如果对XGBoost够熟悉的话。但是在构建树的过程中,也可能存在信息泄露。下表用于总结,在训练过程中Active Party
, Passive Party
所掌握的信息;
在回归树中,虽然叶子节点中不包含样本的标签信息,权重值只与样本的导数和正则化系数有关,但落在相同的叶子节点中的样本,其标签信息大概率是相同的,因此,为了防止可能出现的标签泄露,对于Passive Party
而言,树的叶子节点是被隐藏的。在极端情况下,回归树是树桩,即一个特征只分裂一次形成一颗深度为1的树,那么Passive Party
也是可以对样本的标签进行猜测,有多大的把握猜测准确就与叶子节点中正负样本的比例有关。 对于Boosting算法而言,每一次迭代都是在拟合真实标签值与前
下面来用公式证明一下,第一颗树什么样的情况下才是安全的。 在模型迭代的第一颗树时,假设
对于第一颗树中,落在不同叶子节点的权重,可以根据具体的公式求得:
sigmoid
即可得到对应样本的在第一轮的预测结果
绝大多数时
所以如果第一颗树叶子节点的权重与
上面的部分,大部分的情况下都在讨论,如果防范Passive Party
可能获取Active Party
的信息,但是其实也需要考虑Active Party
获取Passive Party
的敏感信息。
SecureBoost预测过程
下图是预测构成的示意图,展示了3方联邦学习的预测过程,主要关注一下右下方的Lookup table
从上面可以看到,各方的特征的阈值是透明的,只能有其自己拥有
- 在预测过程在
Active Party
侧完成; Passive Party
参与特征的分裂方向的查找,对于最终的结果应该是不知道的;
xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理相关推荐
- [联邦学习] FedAvg聚合算法详解及代码实现
该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...
- 卷积神经网络原理_怎样设计最优的卷积神经网络架构?| NAS原理剖析
虽然,深度学习在近几年发展迅速.但是,关于如何才能设计出最优的卷积神经网络架构这个问题仍在处于探索阶段. 其中一大部分原因是因为当前那些取得成功的神经网络的架构设计原理仍然是一个黑盒.虽然我们有着关于 ...
- java的算法库_利用Java写开源库 覆盖70多种推荐算法
描述 在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测和物品推荐两大关键的 ...
- 万能乘法速算法大全_小学1—6年级必须掌握的数学速算法,超实用!
点击上方"学问林",选择"置顶公众号" 学问林致力于孩子的现代化学习与未来化发展 数学在线学习平台|传播前沿教育理念丨助力教师专业成长 走进千家万户的热文 ho ...
- 微博java实现原理_【转】URL短地址压缩算法 微博短地址原理解析 (Java实现)...
最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷.同时还 ...
- 纵向联邦学习及相关算法
二. 纵向联邦学习 简单一句话介绍:纵向联邦学习的参与方是用户群体相同,特征空间不同(比如同一地区的银行和电商平台) 纵向联邦学习步骤 对齐共同用户(不暴露各自数据) 加密模型训练 (1) C创建密钥 ...
- 联邦学习产品及算法运行机制简介
前言 本文目标 1.简单介绍下联邦学习产品形态2.简要介绍下样本融合.特征工程.模型训练.模型预测算法大致实现过程 声明:不涉及任何公司代码 如何快速了解算法运行内部的运行机制 首先搭建一套独立的运行 ...
- 隐私保护联邦学习之差分隐私原理
背景 什么是隐私 讲差分隐私前,说一下什么是隐私 其实隐私这个定义,各家有各家的说法,而且各人有各人不同的考量.目前普遍比较接受的是:"单个用户的某一些属性" 可以被看做是隐私.这 ...
- python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法
深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...
最新文章
- 目标检测任务中的训练宝典 |实用技巧
- 北大智能学院成立!AI视觉泰斗朱松纯教授任院长
- JAVA NIO - Buffer Channel
- 第十七单元 Samba服务
- 阿里云服务器 Windows连接不成功 提示“你的凭证不工作” 解决方法
- C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...
- jquery弹出框样式大全_jQuery中w2ui是什么?-前端问答
- 做业务千万不要把鸡蛋放在一个篮子里
- 《ETL原理及应用》学习笔记 ·003【kettle的使用-1】
- Angular 2:Web技术发展的必然选择
- 关于jpa的mappedBy用法
- Git 合并单个文件
- c# 实现语音播报功能 转发
- 【毕业季】在校生怎么看待毕业季?
- 1134:猴子与香蕉 dp
- 吴恩达又双叒叕刷屏了_你准备入坑了吗?
- 3 种保护您的网站免受恶意攻击的方法
- 好压(haozip)修复,压缩软件的别样用途
- U盘将FAT32转换NTFS时提示卷有不一致性请运行chkdsk,这样处理就ok
- MySQL - Windows 版 MySQL 下载安装教辅
热门文章
- 【转载国外好文】代工开发一个iOS应用没有那么容易
- smart-framework框架学习之DispatcherServlet分发机制
- Exchange Server2010系列之二:部署三合一角色(CAS+HT+MBX)
- 表格如何excel在线转letex
- linux下虚拟光驱,求助:谁有Linux下的虚拟光驱软件?
- php提取汉字拼音首字母,php获取汉字拼音首字母的函数(真正可以使用的)
- 分段函数是不是一定初等函数_分段函数的微积分例题选讲
- dynatrace监控发现Java代码中new对象耗时100多秒
- HTTP和RPC的区别?
- 软件测试从业者,Linux知识从入门到玩转(必读)