赞
踩
目录
三、FATE安全聚合(SecureAggregation)的实现
记录下联邦学习中的安全聚合机制SMPC。
《Advances and Open Problems in Federated Learning》给出了联邦学习的一个典型的流程:
对于聚合阶段,所有的梯度或者模型都会发给协调方(聚合服务器),由协调方统一进行FedAVG(梯度平均、模型平均等),此过程必然为联邦学习引入了效率和安全之类的问题。相应的存在一些优化机制,包括:增加隐私的安全聚合、为了通讯效率而对聚合进行有损压缩、使用差分隐私来增加噪声等。
本文主要关注的是联邦学习中的安全聚合算法。
联邦学习框架FATE中也使用了安全聚合机制。
例如,横向联邦中存在安全聚合(SecureAggregation),
目的:保证协调者只能拿到最终的模型,但不能获取特定Host的模型;
原理:上传模型时,增加随机数R;保证所有的随机数加起来的时候又能抵消;
例如,对于横向神经网络:
DH密钥交换的目的,是让想要通信的Alice、Bob双方,他们之间能够拥有一个私密的密钥,这个密钥只有A和B两个人知道。DH密钥交换包含如下步骤:
秘密分享通过把秘密进行分割,并把秘密在n个参与者中分享,使得只有多于特定t个参与者合作才可以计算出或是恢复秘密,而少于t个参与者则不可以得到有关秘密。Shamir算法是秘密共享协议的一种实现。
对于sharmir(t,w)方案,就是指准备w把钥匙,至少要t把钥匙才能开启。
应用举例如下:
- package main
-
- import (
- "fmt"
- "github.com/SSSaaS/sssa-golang"
- "os"
- )
-
- // sharmir(t,w):准备w把钥匙,至少要t把钥匙才能开启
- func main() {
-
- secret := "0y10VAfmyH7GLQY6QccCSLKJi8iFgpcSBTLyYOGbiYPqOpStAf1OYuzEBzZR"
- w := 5
- t := 3
-
- // 分割秘密
- secretShares, err := sssa.Create(t, w, secret)
- if err != nil {
- fmt.Printf("Create err: %v\n", err)
- os.Exit(-1)
- }
- fmt.Printf("secretShares: %v\n", secretShares)
-
- // 选择其中的3份
- testShares := []string{
- secretShares[0],
- secretShares[1],
- secretShares[2],
- }
- // 恢复秘密
- combined, err := sssa.Combine(testShares)
- if err != nil {
- fmt.Printf("Combine err: %v\n", err)
- os.Exit(-1)
- }
- if combined != secret {
- fmt.Printf("Fatal: combining returned invalid data\n")
- os.Exit(-1)
- }
- }
谷歌的Bonawitz等人,在2017年的CCS中提出了一种安全聚合加密方案(SMPC),服务器只能看到聚合完成之后的梯度,不能知道每个用户的私有的真实梯度值。
存在问题:用户掉线后,服务端收到的数据就没用了;
可能的方案:增加恢复阶段,但会引入安全问题。
详见:《Practical Secure Aggregation for Privacy-Preserving Machine Learning》
完整流程如下:
可以看到:
FATE采用的是单掩码方案,且没有采取秘密共享,如下如所示:
(1)每个客户端会先初始化一个uuid;
(2)通过dh,host和guest协商一个key作为相同的随机数;
(3)双方在权重传递给arbiter前加入数值大小相同符号相反的噪声,保证双方在arbiter方聚合后噪声可以相互抵消,在不影响最终结果的情况下使得arbiter方和其他攻击者无法获取真实的权重,符合安全聚合的设定;
公式为:w = w + r * 1 * amplify_factor或者w = w - r * 1 * amplify_factor;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。