乐趣区

关于字节跳动:字节跳动在联邦学习领域的探索及实践

数据是人工智能时代的石油,然而因为监管法规和商业秘密等因素限度,” 数据孤岛 ” 景象越来越显著。联邦学习(Federated Learning)是一种新的机器学习范式,它让多个参与者能够在不泄露明文数据的前提下,用多方的数据独特训练模型,实现数据可用不可见。

字节跳动联邦学习零碎架构师解浚源近期在火山引擎智能增长技术专场,以《联邦学习原理与实际》为主题,分享了联邦学习在广告投放和金融等场景中的利用模式、算法钻研、软件系统及实践经验。

联邦学习简介

首先,咱们简略介绍联邦学习的定义。

大数据是机器学习的石油,但数据孤岛问题普遍存在。因为用户隐衷、商业秘密、法律法规监管等起因,各机构无奈将数据整合在一起,用来训练一个成果更好的大模型。

联邦学习是一种为了解决数据孤岛问题而提出的机器学习算法,指标是实现公有数据、共享模型。例如当初有三个参与方,每个参与方领有一个公有集群和数据,这些参与方想独特训练一个模型,联邦学习就能够解决该问题。

在联邦学习的模式下,能够由一个地方服务器首先将参数发送给每个参与方,而后每个参与方根据本人的公有数据更新模型,模型更新后再将梯度汇总发送至地方服务器,由服务器更新模型,而后开始下一个循环。

通过这样的形式,各参与方能够在不相互走漏原始数据的状况下训练一个共享参数的模型。

常见的联邦学习范式有纵向联邦学习和横向联邦学习两种。纵向联邦学习有两个参与方,各自领有同一条样本的不同特色,比方一个参与方领有用户浏览历史,另一个参与方领有购买历史。

在这种状况下,咱们能够在两个集群各跑一部分模型,通过跨集群的形式替换两头后果,来达到训练一个模型的成果,这与机器学习中模型并行的训练形式相似。

横向联邦学习是两个参与方领有不同样本的雷同特色,比方两个参与方都领有用户的年龄、性别等,然而用户并不相同。在这种模式下,每个参与方都能够领有整个模型,然而各自用不同的数据更新模型,最终汇总模型的梯度来训练模型,这与分布式机器学习中的模型数据并行训练形式相似。

如果探索联邦学习的历史,其经验了大略 3 到 5 年的倒退。起初是 2015 年,Privacy-Preserving Deep Learning 这样的概念被提出,而后谷歌的 McMahan 提出若干深度学习方面的训练和利用模式。2018 年,微众公布联邦学习白皮书。

究其实质,联邦学习最重要的就是爱护数据的可用而不可见,也就是数据的隐衷爱护,其钻研有如下方面:一是基于差分隐衷的数据保护;二是基于机密共享的加密计算方法;三是基于同态加密的加密计算方法。

联邦学习的利用场景

如下图,第一个场景是联邦学习在深度转化广告投放畛域的利用。在广告投放场景下,媒体侧的流程是用户发动申请,媒体通过模型预测用户最可能感兴趣的广告,并将它展现给用户,用户一旦点击广告就会跳到一个落地页,这个落地页会导向广告主侧的购物网站。

对广告主而言,在这个过程中产生的深度事件为用户是否转化。以电商场景为例,转化指的是用户购买了产品,而未转化就是指用户没有购买行为,广告主会将转化事件记录到数据库外面,媒体侧也会把这些信息记录到数据库外面。在该畛域的传统做法是广告主将标签返回到媒体这一侧,而后媒体组合数据和标签用以训练模型,应用该模型晓得投放优化成果。

在这个场景下,媒体和广告主别离领有点击样本的不同信息,比方媒体侧领有用户的特色、年龄、性别,上下文特色(用户点击该广告前后看了哪些文章,点击产生的工夫及用户所处地位);单方共有的信息是广告相干的特色,比方广告图片、题目等;广告主领有的是用户历史特色,比方用户以前在该广告主处购买的商品,以及商品更细节的特色(商品价格、商品评论),广告主不会将这些信息同步到媒体侧。最初是深度事件,用户是否的确产生购买行为还是仅将商品增加至购物车。

如果利用联邦学习对该场景进行优化,在线局部放弃不变,然而用户的每个点击须要附加 request_id,这就惟一标识了用户的一次点击,并在媒体侧和广告主侧共用一个 ID,惟一标记这一次申请。广告主和媒体别离将 request_id 存到数据库中。离线训练时,媒体侧能够找到该条数据输出模型,最初将数据的 request_id 和输入的两头后果一起发送给广告主。广告主拿到 request_id 后就能够找到其对应的 label,而后用其计算样本的转化成果,再用该后果反向流传计算出梯度,最初将梯度发回媒体侧,两边别离用该梯度来更新模型。

第二个场景是金融信用场景。在该场景下,不同的金融机构心愿能够综合多方数据进步对用户信用判断的准确度。如果各方领有不同用户的雷同特色,这样就能够采纳横向联邦的形式。例如,不同的银行别离向不同的用户发放了信用卡贷款,要想建设一个更好的用户信用评估模型,多方就能够用各自领有的不同用户特色,采纳横向联邦的形式建设一个模型。

另一种状况是单方领有雷同客户的不同特色,这样就能够采纳加密的纵向联邦形式。例如,一个银行和一个信贷机构别离领有雷同用户的不同特色,比方银行晓得用户的贷款信息,信贷机构晓得用户的贷款信息,这样就能够综合训练出对用户的信用评估。思考到金融场景的习惯和数据特点,个别是采纳树模型进行建模,基于树模型的较驰名的联邦学习算法是 SecureBoost,能够用多方数据在可用不可见的状况下进行加密的树模型训练。

联邦学习的根底算法

在纵向联邦学习中,如果数据由线上申请产生,单方在存储该申请时可能呈现失落和程序不统一的状况,这就须要训练前单方对齐数据,比方后面提到的深度转化广告投放场景,用户的点击数据在媒体侧和广告主侧是别离存储、别离落盘的,单方的落盘工夫可能不统一,程序也有可能因为单方的解决形式而打乱,这样就会产生一种对应关系,比方 request_id 0 寄存在广告主的第一个地位,而 request_id 3 在媒体侧处于第一个地位。在这种状况下,咱们须要把数据进行对齐,排除掉其中一方没有的数据。流式数据求交算法能够解决该问题,删掉对方没有的数据,把共有数据依照对立程序排序。

为了实现该性能,咱们实现了分布式的流式数据求交算法。该算法中,一方作为 leader,另外一方作为 follower,leader 将数据依照本人的存储程序将 request_id 程序发送给 follower,follower 用本人的 request_id 和 leader 的 request_id 进行求交,求交完结依照 leader 的 request_id 程序生成 DataBlocks 数据块,最初将生成的数据块发送给 leader,leader 依照数据块进行排序,并删除缺失数据,最初在两边造成雷同对应的数据块。一个数据块在两方各有一半,在这个对应的数据块里,数据严格依照统一的程序排序。须要提到是在流式数据求交的算法外面,只能应用相似于 request_id 这种不泄露用户隐衷的随机数 ID 作为主键求交,如果是相似于用户的手机号这种敏感数据,就不能应用这种形式来求交。

为了解决大规模数据,咱们实现了一个基于分布式的流式求交算法,单方各自拉起一个 master 和 N 个 worker,worker 之间一一配对,配对后的两个 worker,其中一个作为 leader,另一个作为 follower,而后在一个分片上计算数据求交,从分布式文件系统上读取数据和写入后果。

上文提到流式数据求交只能用来解决非敏感的求交主键,但有时单方之间没有间接的跳转关系,所以不能用随机数关联单方的数据,比方在金融场景下,可能两个金融机构需要求交单方的共有用户,这种时候就须要用到 Private Set Intersection 求交形式。简略的哈希加密是无奈在这种状况下保障数据安全的,如果把一个手机号的哈希值传给对方,尽管这不是明文的手机号,然而因为这个手机号的总体空间是无限的,所以另一方能够应用穷举的办法来破解。作为代替,咱们应用 PSI 的形式,应用 RSA+Hash 双层加密能够无效防止撞库破解,保障求交之后的单方能够相互晓得独特领有的用户集,如果一方独有另外一方的用户,求交之后也不会泄露给对方。

具体来说,PSI 数据求交的形式须要 A 首先把本人的用户 ID 进行加盲,乘以随机数做加密,而后发送给 B,B 对加盲过的 ID 进行 RSA 加密的签名,把签名过后的数据发送回客户。

在这个过程中,B 无奈得悉客户 ID,因为进行了加盲解决,当然也无奈解盲,然而 A 能够在加了密的 ID 上进行去盲,失去有 RSA 签名过的 ID,再在下面套一层哈希存到数据库外面。因为私钥只有 B 领有,所以 A 失去了加密的哈希 ID 也无奈进行伪造。另一方面,B 将本人的 ID 进行 RSA 签名加密,而后再哈希,并将哈希和加密过后的 ID 发送给 A,A 用这个哈希加密的 ID 能够和之前本人进行加密哈希的 ID 做匹配求交。这一过程中,A 和 B 都无奈得悉对方的原始 ID,同时也无奈伪造一个 ID 来和对方求交,单方都能够管制用来求交的 ID 数据总量。

联邦学习中的隐衷爱护

在纵向联邦学习中,有一方把 Label 泄露给另一方的危险,因为领有 Label 的一方须要向另外一方发送每个样本的梯度。然而当正负样本不平衡的时候,负例的相干梯度会远远小于正例相干的梯度,因为正例很稀少,所以当正例呈现的时候,模型对它的加权会比拟大,它对梯度的影响也会比拟大,接管方就能够依据梯度的范数判断是属于正样本还是负样本,最简略的形式是把梯度取一个范数而后排序,把超过一个阈值的所有样本认为是正例,否则就是负例。

为了升高泄露危险,咱们抉择在梯度上叠加高斯噪声,通过最小化退出噪声的正负例之间的散布差别缩小泄露。如下图,G+ 和 G- 别离是正负例对应的梯度,咱们在其上加上正例和负例用的噪声,失去加过噪声的梯度,而后用 KL 散度最小化正例和负例之间的散布差别,同时为了防止噪声过大导致机器学习的成果过多受损,咱们减少一个束缚,别离计算正例和负例的相关性矩阵,而后束缚它们的噪声大小在 P 的范畴之内,这个 P 是一个可调的参数。

通过试验验证,咱们能够在小幅损失 AUC 的状况下大幅升高泄露 Label 的机率。上图右边是在不同 P 值的状况下模型的 AUC,左边是接管梯度那一方通过梯度来判断正负例的准确度。咱们能够看到蓝线是齐全不进行噪声增加的训练场景,接管方能够 95% 的准确率判断 Label 是正例还是负例。其余的几条线是别离增加了不同水平的噪声,咱们能够看到只有稍微增加一些噪声,就能够大幅升高 Label 泄露的准确率到 50% 和 55% 两头,这就相当于泄露的机率非常低了,曾经在随机猜想左近了,模型的 AUC 值降落 1% 左右。

同时在纵向联邦学习中,一方还须要传 Embedding 给另一方,这也存在一些信息泄露的危险,有两种办法能够爱护 Embedding 不泄露信息:一是采纳同态加密或者密钥共享的形式加密传输 Embedding,来保障对方不能失去明文的 Embedding 信息;另一种办法是采纳差分隐衷反抗训练等形式,想方法升高 Embedding 中的信息含量,尽量减少隐衷泄露。

Fedlearner 联邦学习零碎

接下来介绍咱们开发的 Fedlearner 联邦学习零碎,目前该零碎也曾经在火山引擎有了大规模的 To B 利用。

为了在客户侧部署一个咱们的联邦学习零碎,咱们将整个零碎都集成在了 Kubernetes 外面,其最底层是 NFS 挂载层,提供分布式的文件存储。之上应用 ElasticSearch、FileBeat 和 Spark 等起源解决日志和数据流。在此之上,咱们实现了为联邦学习定制的工作资源管理调度器,以及用来查问工作信息的 ApiServer 和联邦学习镜像。这些基础设施实现后,咱们就能够拉起联邦学习的工作了,咱们反对多种工作,包含数据分片、数据求交、NN 模型、神经网络模型和树模型训练。在这之上,咱们开发了一个可视化的 WebConsole 界面不便算法工程师操作,所有单方通信都通过 Ingress-Nginx 的接入层来进行加密的跨公网通信。

联邦学习的过程须要参加单方通过公网来传输数据,为了平安的通过公网通信,咱们采纳了 HTTPS 双向加密认证的形式来保障通信单方的身份牢靠,而信息是加密并不能够被第三方监听的。同时,为了不便外部联邦学习工作的逻辑开发,咱们采纳了 Ingress-Nginx 来做通明加减密和域名转发。这样在 Ingress-Nginx 接入层前面的联邦学习工作能够应用一般的 gRPC 调用,通明的将信息传递到另外一个集群。

联邦学习工作的一大特点是须要单方同时各自拉起一个工作,配对当前进行通信能力开始学习工作。落地的过程中,咱们发现单方要同时提交一个工作,而同时进行操作的沟通老本十分高,须要线下通过多轮协调,尤其是调优模型参数,或者是排查问题时,单方须要同时在线的沟通老本是很高的。

为了简化这个过程,咱们开发了一套基于 Ticket 的预受权机制,应用这个机制的时候分为被动方和被动方,被动方能够创立一个 Ticket,被动方同时也创立一个 Ticket,Ticket 外面蕴含的信息次要是工作能够应用的数据和模型等,但不规定模型具体应用的超参数,比方学习率这些不敏感的超参数。一旦单方 Ticket 建设好,被动方就能够发动一个工作,被动方在接管到工作申请当前,零碎就会主动响应拉起工作,这样单方能够各自拉起一个工作,这个过程能够反复很屡次,每次拉起的工作能够应用不同的参数。这样,被动方在创立了一个 Ticket 当前,就能够不必进行操作了,只有在多轮训练完结当前查看一下后果就能够了。

如上这些操作都能够通过 WebConsole 进行可视化,工作信息也能够通过可视化的展现,能够在网页上查看工作的成果、日志、图表等信息。

将来布局

最初来聊咱们下一步的倒退方向。在落地过程中,咱们总结出了遇到的三个痛点:

一是 Ticket 预受权机制容许主动拉起单个工作,然而联邦的流程通常须要多个工作的联动,比方上传、求交、训练均须要单方人工的参加,所以咱们下一个版本会开发基于 Workflow 的受权,Workflow 就是一个蕴含多任务的工作流,这多个工作会主动轮换实现调度;

二是合作方须要先自行实现特色工程,并且以特定格局灌入零碎。这对于客户的特色工程能力要求是比拟高的,客户往往只能应用一些无限的特色。为解决该问题,咱们会减少基于 Spark 的流式归因和特色抽取能,Fedlearner 零碎能够集成式读取用户原始数据,而后自动化抽取特色,并输出到最终的模型零碎外面;

三是随着合作方的减少,一对一的联邦保护老本一直进步。为了降低成本,咱们会摸索多方联邦,同一个行业的多个合作方能够同时训练一个模型,这样能够缩小模型的数量,升高人工保护老本。

首先具体介绍 Workflow 受权,咱们在下一个版本会从新设计 WebConsole 的 2.0 版本,WebConsole2.0 版本反对图形化配置工作流,能够看到工作流中蕴含多个工作,工作之间能够有各种依赖关系,每个工作能够有一些参数配置,用户只有配置好工作流,就能够一键运行多个工作。另一个解决方案是集成化的特色工程会基于 Spark 开发一个特色抽取零碎,该零碎蕴含归因模块、特色抽取、统计模块和模型训练模块。同时还蕴含在线服务的性能,用户在抽取完特色后,能够在线服务中抽取同样的特色,输出到在线服务的模型中。

最初是多方联邦,多方联邦有两种形式:横向 + 纵向;纵向 + 纵向。

横向 + 纵向指不同参与方领有局部重合数据的不同特色,能够独特训练一个模型;纵向 + 纵向指不同客户领有不同的特色维度,能够采纳三方纵向联邦的形式综合同一个用户的更多维度信息进行训练。

退出移动版