联邦学习的概念
简单来说,联邦学习是把 不同数据源 的数据 联合训练 ,得到更好的模型
在进行机器学习的过程中,各参与方可以借助其他方数据进行联合建模
各方无需共享数据资源,数据不出本地情况下,进行联合训练,建立共享的机器学习模型
联邦学习的意义
联邦学习是一种保护数据解决数据孤岛的一种机器学习方法
除了数据孤岛,还有可能存在数据隐私安全问题
联邦学习的分类
-
企业的数据孤岛
或者
联邦学习的应用场景
视觉横向联邦学习系统
同为目标检测任务
各个机构标注的数据集不同
各个机构在不交换数据的情况下进行协作
自然语言处理横向联邦学习系统-未登录词(OOV)生成问题
每个用户设备只存储有限大小的词库表——数据孤岛
OOV单词生成包含用户敏感内容——用户数据保护
每台移动设备在不交换数据的情况下进行协作
联邦车险定价学习系统
联邦学习产品业务实现流程
提前声明:该文章介绍的是目前联邦学习行业比较通用的实现方式 不存在涉及一家公司机密信息
备注:下面介绍的流程大部分都已实现 少部分还在技术调研阶段
联邦学习产品所具备的完整流程
概念简单描述
-
样本融合
双方数据取交集
a、发起方样本a 比如该用户金融信息
b、合作方样本b 比如该用户物流信息
c、样本a和b都有共同的字段uid 即用户编号
即通过用户编号可以取样本a获取该用户的金融信息
去样本b可以获取该用户的物流信息
d、根据uid取交集
即获取所有既有金融信息又又物流信息的用户
但发起方和合作方的双方数据都是独立的 互相不知道的
e、样本融合之后 发起方有了融合之后的金融数据
合作方也有了融合之后的物流信息
但合作方不会又金融信息
发起方也不会又物流信息
-
数据预处理/探索性分析
提高数据的质量 异常值处理
-
特征分箱
计算所有特征的IV指标 选择IV指标高的加入模型 IV指标越高对模型越有效
-
PCA 主成分分析
计算某个特征的分析指标
-
模型训练
根据双方的测试数据进行训练
样本集数据会被分成2份 训练集和验证集
-
使用训练集进行训练
-
使用验证结进行验证
双方会根据各自模型的指标来彼此调整训练的参数以达到双方的评价模型的指标参数(ks、auc、loss最小)都很好
每个流程的具体实现过程
这里仅介绍前端部分(web、java),后端部分(python)后面再一一介绍
-
数据准备阶段
-
新增数据集分为训练和预测
-
方式
a 通过csv存储数据的方式上传(小数据量)
有多种实现方式 这里简单介绍两种
a-1 上传分布式磁盘存储系统fastdfs
a-2 上传分布式内存文件系统alluxio
b 已数据库脚本的方式上传(小数据量)
c 通过Hive或Mysql导入ClickHouse的方式(大数据量)
d 通过分库分表的方式(大数据量)
大数据量如亿级别 例如双方均有10亿数据量
c、d这两种方式后面的文章会介绍
-
-
创建自己节点和多个合作方节点
-
录入节点信息
发起方节点名称、发起方java服务根路径、发起方python服务根路径、发起方加密公私钥
-
录入合作方节点
合作方名称、合作方公钥、合作方java服务跟路径、合作方python服务跟路径
-
节点信息包括:
-
注意
a 当前节点只能有一个 合作方节点可以有多个
b 通过节点名称md5加密得到节点编号 双方节点编号要保持一致
c 公私钥是用于 java之间通讯、python之间通讯数据安全加解密
d、java之间交互、python之间交互、java与python之间交互的请求url路径是从对应节点信息中获取的
-
-
新建项目信息
包含:2个节点信息(一个当前节点另外一个是合作方节点)、多个训练样本数据、多个测试样本数据
-
发起方新建任务信息
一个项目可以有多个任务
任务信息包括:任务名称和发起方节点训练样本数据
-
合作方协助任务
-
-
数据融合
-
数据预处理
探索性分析与之前端操作流程类似
-
用户触发第二次数据预处理
探索性分析与之前端操作流程类似
-
特征工程
-
特征分箱
-
-
PCA主成分分析
和特征分箱前端操作流程类似
-
模型训练
-
模型预测
部分技术点原理介绍
数据对齐两种实现方式
密码学基础知识
不经意间传输加密OT
概念
不经意传输(oblivious transfer)是一个密码学协议
在这个协议中,消息发送者从一些待发送的消息中发送一条给接收者
但事后对发送了哪一条消息仍然oblivious(不知道)
这个协议也叫茫然传输协议
举例说明
-
2选1
-
n选1
1.发送者Alice生成两对rsa公私钥,并将两个公钥puk0、puk1发送给接受者Bob
2. Bob生成一个随机数,并用收到的两个公钥之一加密随机数(用哪个秘钥取决于想获取哪条数据,例如如果想要得到消息M0 就用puk0加密随机数,如果想要得到M1就用puk1加密随机数),并将密文结果发送给Alice
3. Alice用自己的两个私钥分别解密收到随机数密文,并得到两个解密结果k0,k1,并将两个结果分别与要发送的两条信息进行异或(k0异或M0,k1异或M1),并将两个结果e0,e1发给Bob
4. Bob用自己的真实随机数与收到的e0、e1分别做异或操作,得到的两个结果中只有一条为真实数据,另外一条为随机数
RSA算法和哈希机制配合
为了解决加密样本对齐
-
RSA算法和哈希机制配合
首先,宏观上来说要想保证自己的数据不会被对方获取
A和B都需要针对数据采取只有自己了解的操作 以保证对方无法反推出数据
对于A而言,保密操作由哈希机制和随机产生的Ri来实现
对于B而言,保密操作由哈希机制和自己产生的d来实现
第一步:B由RSA算法产生n、e、d,并发送包含n、e的公钥给A
第二部:A对自己拥有的用户数据进行加密操作,哈希+Ri来实现,再将加密后的数据YA发送给B
第三步:B得到YA后,由于哈希机制的原理和Ri未知,很难反推出A的用户数据。B对YA取d次幂得到ZA,再对自己的用户数据进行加密操作,取哈希再d次幂再哈希,得到ZB,接着将ZA、ZB发送给A
第四步:A得到ZB后,同理也反推不出B的用户数据,再对自己的用户加密数据ZA除Ri再哈希,得到DA
第五步:DA和ZB本质上是对数据进行相同操作后得到的数据,所以如果源数据相同,操作后的数据也相同,所以根据DA,ZB求交集的结果,A可以判断出A和B的共同数据有哪些,最后再将结果I发送给B,样本对齐结束
-
思考为什么这么做
首先要明白求交集,必须将数据放到一起
放到一起的话那就必须要对自己的数据进行加密
我们还要明白共同用户数据经过加密操作之后必须仍然相同,暂且称之为要求1
那我们先假设对双方用户数据只进行一次哈希操作
这样虽然可以保证要求1,但是安全性不高,用户有可能反推用户数据
因此引入随机变量
我们再考虑能否只有一方发送数据另一方接收数据
假设B对自己的用户数据加密,用到了随机变量d和哈希,发送给A
接收方A接收后,A需要对自己的数据进行操作
使得自己的公共数据和B传来数据中的公共数据相等来满足要求1
但是由于A不知道d,所以A做不到公共数据相等,也就做不到样本对齐
接下来考虑双方互相发送数据
A先用随机变量Ri和哈希对自己的数据加密后发送给B
B在A发来的密文上操作,此时该密文就有了因素d
B再对自己的数据进行加密,接着将两部分数据发送给A
A接收到两份密文后,对自己的密文进行转换
此时自己的密文已经包含了因素d
所以理论上A把自己加在自己数据上的“锁”解开后
能够转化为与B数据相同的形式,此时就可以完成样本对齐了
在这过程中双方都不可能反推对方的数据
模型训练加密过程
同态加密
纵向的模型训练有用到同态加密中的加法同态加密
第一个式子表示损失函数loss
第二个等式表示梯度
下面两个式子表示加法同态加密的性质——和的密文等于密文的和
由于加法同态加密中只支持加减乘除,不支持指数运算,所以loss需要在零点处二次泰勒展开
右图表示实际工作过程,UA将加密后的ua和ua^2发送给UB,ua=wx,即己方数据的权重和特征值的乘积
UB计算己方数据的权重和特种值的乘积,再和ua相加,得到样本的所有特征的w*x
然后结合自己拥有的样本标签y计算d
d就是梯度表达式中除去x的部分
UB将d加密后发送给UA,此时UA、UB都可以用己方的特征值x乘d来计算出自己的梯度
UA、UB计算出梯度后,加密上传给arbiter,arbiter接收后解码、更新梯度,再将更新后的梯度分发下去,UAUB接收后完成模型的一次更新
不断迭代上述过程,直到loss低于预期值才停止
当数据提供方host较多时,为减少通信成本,不在计算loss,通过两次迭代之间梯度更新的幅度来判断是否结束,幅度很小时,训练结束
结语
后面会陆续介绍
-
几亿级别的数据量架构如何设计且如何实现
-
数据处理过程用一些大数据处理框架来做比如spark、flink
-
python的优势在于算法 如何支持几亿级别的数据进行模型训练
-
-
核心:后端Python 每一个阶段的介绍
-
其他联邦学习技术点介绍