摘要: 最近与某厂完成基于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:两种决策树生长方式

次迭代的损失函数(分)

假设在完成第

次迭代后,即前
颗树的结构以及参数都是已知的了,根据前向分步加法,下一次迭代时即
次,模型对于样本
的预测值为:

此时,将损失函数

可以展开从以下形式,

完成了在第

颗树学习时的损失函数推导;

细节

  1. 公式(4)的第一步中,跟

    式的区别是,正则项只有前
    颗树,因为此时才迭代到第
    颗树,后面的树还需要在学习;
  2. 公式(4)中的第二步,直接将公式(3)带入即可;
  3. 公式(4)从第二步到第3步,发现已经将正则项,从累加变成了第
    颗树的正则项,以及常数
    ,因此在此时前面第
    颗树是已知的,所以其正则项之后也是已知的,用
    表示即可,方便后续推导;

从损失函数到树的评分函数

众所周知,XGBoost利用二阶泰勒展开来近似表示第

次迭代的损失函数,回忆一下泰勒公式的二阶展开公式, 把函数
在点
处进行泰勒二阶展开,可以得到如下形式:

将公式(5)与XGBoost的在第

次迭代的损失函数进行对比,一一对应起来,如下表所示(可以忽略损失函数
中的
项,毕竟它一直是个常数,真实的标签值)

因此,可以定义损失函数

出的一阶导数为
, 二阶导数为
, (如果你有疑问为啥是对
求导数,参考泰勒公式,其对应的是
),因此,我们可以将损失函数公式(4)进一步展开,

上述公式中,常数

,以及
也为常数,同时
都是已知数,公式(6)中只有
为未知数,
表示在样本划分过程中,落在相同叶子节点
的样本, 而目标是最小化
, 根据一元函数的求极值得过程,只要让其导数为0即可,

即可求出,最优值为:

带回损失函数(6)中,得到如下损失函数的显示表达式(将常数部分去除),

有了该公式,我们可以用于评价生成的树的得分,得分越小,说明树的结构越好。到目前为止,我们知道了叶子节点的最优取值,以及最小的损失函数取值,然而,仔细回顾一下,我们还没有确定树的结构,公式也没有告诉我们该怎么得到最优的树的结构。

特征最优切分点算法

树长成啥样还不知道,我们只是有了评价好不好的公式。最近简单的办法,就是暴力枚举所有可能的结构,但这肯定是不能被接受的。那就要贪心法上场了,每次尝试分裂一个节点,计算分裂前后的增益,选择增益最大的那次分裂即可,依次循环下去。注意,贪心法不是XGBoost才有,从最经典的ID3,C4.5,CART树开始就有了,只不过,其使用的评估指标不一样而已;

  • ID3, 信息增益
  • C4.5, 信息增益比
  • CART, Gini系数
  • XGboost, 打分函数(该打分函数是对整颗树进行评估的)

在XGboost中具体实现中,有两种特征切分点算法, 贪心法和近似算法;先来简单看看贪心算法是的过程吧;

贪心算法

我们只要评估一次分裂的增益,用分裂之后的评估指标值,减去分裂前的值,找到增益最大的,即完成本次分裂搜索,对于XGboost而言,一次分裂之后,会将该节点的样本划分到两个不相交的样本空间, 用

,
分别表示分布在右子树的样本,左子树的样本,
表示该节点上总得样本个数,因此,我们可以用字母分别表示左,有节点两侧的一阶导数之和,二阶导数之和

每次特征分裂的增益计算: 分裂前:

分裂后:

所以,分裂之后的增益为:

贪心算法的流程如下图所示:

贪心算法对每个特征都做线性搜索,根据样本特征的排序值,逐步将更多的样本加入到左子树,根据增益函数最大的点,即为最优的分割点。 步骤:

  1. 从当前节点出发,依次为

    个特征,将属于该节点上的样本按照特征的取值进行升序排列,依次枚举出分裂点,根据增益函数得到该分裂点的增益值,保存中间结果;
  2. 选择增益最大的分裂点,作为当前节点的最佳分裂点
  3. 回到第一步,并行地为其他的节点选择最佳的分裂点;

近似算法

由于贪心算法需要对每个特征进行排序,因此成为计算速度的瓶颈。近似算法就是根据特征的分布提前计算得到分

个分位点,
, 有了这些分为点,就可以将样本映射到对应的区间内,然后再次聚合区间内的信息,得到所有区间的最佳分裂点。很直观, 这种方式免去了贪心算法需要对每个特征进行排序的操作。

从算法流程图中,可以看到,第一步是提前全局,或者每次分裂的时候计算各个特征的分位点,而在第二个for循环中,是分别为每个特征,统计得到落在各个区间的样本的一阶导数和二阶导数汇总起来,得到对于区间的

。对比一下贪心算法中的第二个for循环,是在样本级别统计分在当前节点的左,右子树的一阶导数和二阶导致之后
;有了这样的比较,相信你很快就感受到了这样的操作对于提升速度的无疑是起到了帮助。 下图,是从网上找到一张示意图, 用于直观的描述近似算法是如何找到最佳分裂点的过程;
  1. 根据变量的分布,找到3分位点,将当前节点下的样本分成了3份;
  2. 根据损失函数,得到各个样本在某次迭代过程中的一阶导数
    和二阶导数
    ;
  3. 将各个区间内的样本的,一阶导数和二阶导数进行求和汇总,分别得到
    ,
    ,
  4. 利用与贪心算法相同的方法,寻找区间最佳的分裂点,由于只有3个区间,因此只有2两组合方式,1|2,3, 或者 1, 2 | 3

简单总结贪心算法与近似算法

  1. 贪心算法需要为每个特征进行线性搜索,枚举出所有的分裂点,而近似算法只需要统计分位点信息,枚举分位的取值即可;
  2. 贪心算法在样本级别寻找特征的最佳分裂点,而近似算法在区间级别;

论文中也对两种的算法的精度做了比较,这里先不赘述 此外,XGBoost还有多方面的优化内容,如加权分位树缩略图,稀疏感知等,由于暂时我们的主题关系不是很大,先不进行叙述。

补充:常用损失函数的一阶导数,二阶导数

其中上述

为预测的概率值。

以下对平方损失函数,对数损失函数进行求导:

  • 平方损失函数

  • 损失函数为对数损失

,表示前
颗树对于样本
的预测值,由对数损失函数的定义可知,

对数损失函数的一阶导数,以及二阶导数的的推导,由于对数损失函数是有两部分组成,因此在二分类时(

),可以分情况进行求导:

时,

时,

而对于二阶导数,只需要在对

求导即可,从上述结果可以看出,不论
或者
,求导的结果是一样的,再次回忆一下对

sigmoid函数的求导,即可得到我们的结果:

SecureBoost的原理

本文的主角SecureBoost是一种允许多方参与的纵向联邦学习算法,基本原理跟XGBoost类似, 在此基础上引入联邦学习要考虑的隐私保护问题, 是一种端到端的联邦环境中的梯度提升算法。

与传统的模型训练不一样,联邦学习中的训练问题,可以认为是将我们的master table在特征维度上,拆分到了不同的合作方中,各方拥有用户不一样的数据特征,人群,但真实标签

只再一方中,需要拥有
的那一方发起训练,模型调用预测(大部分情况下也是模型使用方)等,在论文中将参与方分成两部分:

Active Party, Passive Party

Active Party: 拥有

的那一方被称为

Active Party,在联邦学习中起主导作用,如同分布机器学习中的serverPassive Party: 只拥有数据的那一方(在实际业务中是数据提供方,如百度,京东,腾讯等大厂拥有丰富的数据, 作为数据与平台的提供方存在,赋能其他企业),他们的角色对应着client

在后面也会对这两者在训练过程中拥有的权限,获取的训练信息进行对比。SecureBoost要解决的目标是什么呢? 一句话概括就是,在

个数据提供方给定数据
以及拥有
的发起者在各方数据都不出域的情况下,训练一个机器学习模型
, 同时确保模型
的性能,与直接将多方数据合并在一起的情况下训练出来的模型
是无损的(lossless)。

对于训练上述模型,要解决以下三个问题:

  • 在没有

    的情况下,

    Passive Party怎么根据其独有的数据参与模型参数的更新;

  • Active Party如何将Passive Party的模型参数聚合成一个全局的模型;
  • 在训练阶段, 预测阶段,如何保证不泄露信息;

哪些信息不能泄露呢,对于Active Party当然是

, 对于

Active PartyPassive Party不能泄露了特征的分布,我理解的是连分位点的值都不能泄露出去,双方只知道用了哪些大类的特征,而不知道具体的特征名,逻辑,特征的取值范围,特征的分布等。

在下面的叙述中,将从三方面来回答以上的问题,第一部分是SecureBoost训练过程的细节;第二部分是预测打分是如何操作的;第三部分是信息安全性分析;

SecureBoost训练原理

回顾第一部分的XGboost的原理可知,在每一次迭代

过程中是通过求解损失函数
关于前
颗树的预测结果
的一阶导数
和二阶导数
,并且根据叶子节点中样本的导数
,即可获取叶子节点的最佳参数
,以及整颗树的评分值;另外为了获得树的结构,通过贪心算法或者近似算法,得到样本特征的最佳分裂点,完成树的生成。

因此,我们很容易发现:

  • 在计算在最佳的叶子节点权重,以及样本特征的最佳分裂点的查找过程中,只依赖于个样本对应的一阶导数

    和二阶导数
  • 一阶导数
    和二阶导数
    的计算依赖于标签
    ,(参见第一部分的求导过程)

因此,如果直接交换

,
,存在信息泄露的风险,当

Passive Party获取了导数信息,以及前

颗树的结果
,就可以推算出标签信息
, 要知道各种标签信息都是用钱砸出来的,都是真金白银。因此需要对导数信息进行加密,但是我们也知道,在寻找特征最佳的特征分裂节点时,需要通过叶子节点上样本的
进行求和得操作,这就需要在加密之后数据依然保持可加性,但这难不倒搞密码的大佬们,在1999年就有了一种可加性的同态加密算法(我还没来得及了解原理),大家只需要自己其性质即可,用符号

[] 表示对某个数进行加密,

因此对在联邦环境中,交换的个叶子节点内的一阶导数之和,二阶导数之后,也是可加的,有了加密的导数信息就可以如同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算法而言,每一次迭代都是在拟合真实标签值与前

颗树预测结果的残差
,在第一轮时
一般被设置成0(或者其他最优值),可以理解为是在拟合真正的
, 当
时,拟合的就是残差了,因此第一颗树能够携带更明显的标签信息,后续的树的标签都是伪标签,落在相同叶子节点的样本,可以认为是伪标签相似,而在第一颗树中,落在相同的叶子节点,真实标签相似。

下面来用公式证明一下,第一颗树什么样的情况下才是安全的。 在模型迭代的第一颗树时,假设

, 即对样本的预测为标签为1的概率值为
,有第一部分总结的损失函数求导公式,样本的一阶导数,二阶导数如下,

对于第一颗树中,落在不同叶子节点的权重,可以根据具体的公式求得:

, 将落在叶子节点
上的样本的权重转为预测值,值需要套一个

sigmoid即可得到对应样本的在第一轮的预测结果

,由于是二分类任务,假定叶子节点
上的样本个数为
, 正样本的比例为
, 当
值足够大时,正则化系数
忽略不计,那么叶子节点的预测值可以进行如下的推导:

绝大多数时

, 比较极端的情况下
时,叶子节点中的正负样本比例一致,那么就无法进行猜测,此时叶子节点的权重的取值为:

所以如果第一颗树叶子节点的权重与

越接近,泄露信息的风险越小。

上面的部分,大部分的情况下都在讨论,如果防范Passive Party可能获取Active Party的信息,但是其实也需要考虑Active Party获取Passive Party的敏感信息。

SecureBoost预测过程

下图是预测构成的示意图,展示了3方联邦学习的预测过程,主要关注一下右下方的Lookup table从上面可以看到,各方的特征的阈值是透明的,只能有其自己拥有

  • 在预测过程在Active Party侧完成;
  • Passive Party参与特征的分裂方向的查找,对于最终的结果应该是不知道的;

xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理相关推荐

  1. [联邦学习] FedAvg聚合算法详解及代码实现

    该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...

  2. 卷积神经网络原理_怎样设计最优的卷积神经网络架构?| NAS原理剖析

    虽然,深度学习在近几年发展迅速.但是,关于如何才能设计出最优的卷积神经网络架构这个问题仍在处于探索阶段. 其中一大部分原因是因为当前那些取得成功的神经网络的架构设计原理仍然是一个黑盒.虽然我们有着关于 ...

  3. java的算法库_利用Java写开源库 覆盖70多种推荐算法

    描述 在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测和物品推荐两大关键的 ...

  4. 万能乘法速算法大全_小学1—6年级必须掌握的数学速算法,超实用!

    点击上方"学问林",选择"置顶公众号" 学问林致力于孩子的现代化学习与未来化发展 数学在线学习平台|传播前沿教育理念丨助力教师专业成长 走进千家万户的热文 ho ...

  5. 微博java实现原理_【转】URL短地址压缩算法 微博短地址原理解析 (Java实现)...

    最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷.同时还 ...

  6. 纵向联邦学习及相关算法

    二. 纵向联邦学习 简单一句话介绍:纵向联邦学习的参与方是用户群体相同,特征空间不同(比如同一地区的银行和电商平台) 纵向联邦学习步骤 对齐共同用户(不暴露各自数据) 加密模型训练 (1) C创建密钥 ...

  7. 联邦学习产品及算法运行机制简介

    前言 本文目标 1.简单介绍下联邦学习产品形态2.简要介绍下样本融合.特征工程.模型训练.模型预测算法大致实现过程 声明:不涉及任何公司代码 如何快速了解算法运行内部的运行机制 首先搭建一套独立的运行 ...

  8. 隐私保护联邦学习之差分隐私原理

    背景 什么是隐私 讲差分隐私前,说一下什么是隐私 其实隐私这个定义,各家有各家的说法,而且各人有各人不同的考量.目前普遍比较接受的是:"单个用户的某一些属性" 可以被看做是隐私.这 ...

  9. python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法

    深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...

最新文章

  1. 目标检测任务中的训练宝典 |实用技巧
  2. 北大智能学院成立!AI视觉泰斗朱松纯教授任院长
  3. JAVA NIO - Buffer Channel
  4. 第十七单元 Samba服务
  5. 阿里云服务器 Windows连接不成功 提示“你的凭证不工作” 解决方法
  6. C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...
  7. jquery弹出框样式大全_jQuery中w2ui是什么?-前端问答
  8. 做业务千万不要把鸡蛋放在一个篮子里
  9. 《ETL原理及应用》学习笔记 ·003【kettle的使用-1】
  10. Angular 2:Web技术发展的必然选择
  11. 关于jpa的mappedBy用法
  12. Git 合并单个文件
  13. c# 实现语音播报功能 转发
  14. 【毕业季】在校生怎么看待毕业季?
  15. 1134:猴子与香蕉 dp
  16. 吴恩达又双叒叕刷屏了_你准备入坑了吗?
  17. 3 种保护您的网站免受恶意攻击的方法
  18. 好压(haozip)修复,压缩软件的别样用途
  19. U盘将FAT32转换NTFS时提示卷有不一致性请运行chkdsk,这样处理就ok
  20. MySQL - Windows 版 MySQL 下载安装教辅

热门文章

  1. 【转载国外好文】代工开发一个iOS应用没有那么容易
  2. smart-framework框架学习之DispatcherServlet分发机制
  3. Exchange Server2010系列之二:部署三合一角色(CAS+HT+MBX)
  4. 表格如何excel在线转letex
  5. linux下虚拟光驱,求助:谁有Linux下的虚拟光驱软件?
  6. php提取汉字拼音首字母,php获取汉字拼音首字母的函数(真正可以使用的)
  7. 分段函数是不是一定初等函数_分段函数的微积分例题选讲
  8. dynatrace监控发现Java代码中new对象耗时100多秒
  9. HTTP和RPC的区别?
  10. 软件测试从业者,Linux知识从入门到玩转(必读)