赞
踩
【论文代码复现】Clustered Sampling: Low-Variance and Improved Representativity for Clients Selection in Fede_admin11111111的博客-CSDN博客https://blog.csdn.net/admin11111111/article/details/120499243上一篇文章最后留了一个疑惑,经过检验确实是有问题的,那样写逻辑是错误的。并不符合论文中将所有clients都采样的说法。然后在更改了epsilon之后就可以正常运行了,但是给出的代码中直接是默认所有clients的样本量都相同,所以分配的权重也都相同。
算法1实现:
具体实现就是将100个clients按照权重大小从大到小排序再分成k=10组,然后计算根据权重大小计算每组中client的抽样概率。因为算法1中给的client的样本数量都相同,所以权重相同,各个clients抽样概率也相同。
于是这就有漏洞了——如果有恶意攻击者命名数据量很小,却说自己数据量很大则会导致系统崩溃。也就是数据量大,则抽样概率大幅增加,计算梯度时就会受到影响。
攻击方式
具体攻击策略就是还是按照他原本的样本量的shard划分,这样能保证攻击者的样本量不大,但是使得它的抽样概率大幅度增加,破坏了基于样本量大小的抽样策略。
- def get_clusters_with_alg1(n_sampled: int, weights: np.array):
- "Algorithm 1"
-
- epsilon = int(10 ** 8)
- # associate each client to a cluster
- augmented_weights = np.array([w * n_sampled * epsilon for w in weights])
- ordered_client_idx = np.flip(np.argsort(augmented_weights))
-
- # 攻击方式1 ——如果有恶意攻击者命名数据量很小却说自己数据量很大会导致系统崩溃 20211017
- # 1. 直接让k=0组的某个client权重增加,或者某几个权重增加测试结果
- # 2. 让其他组的clients在组内的权重也不同
- augmented_weights[ordered_client_idx[0]] *= 8 # 权重增加8倍,抽样概率则变为0.8
-
- n_clients = len(weights)
- distri_clusters = np.zeros((n_sampled, n_clients)).astype(int)
-
- k = 0
- for client_idx in ordered_client_idx:
-
- while augmented_weights[client_idx] > 0:
-
- sum_proba_in_k = np.sum(distri_clusters[k])
-
- u_i = min(epsilon - sum_proba_in_k, augmented_weights[client_idx])
-
- distri_clusters[k, client_idx] = u_i
- augmented_weights[client_idx] += -u_i
-
- sum_proba_in_k = np.sum(distri_clusters[k])
- if sum_proba_in_k == 1 * epsilon:
- k += 1
-
- distri_clusters = distri_clusters.astype(float)
- for l in range(n_sampled):
- distri_clusters[l] /= np.sum(distri_clusters[l])
-
- return distri_clusters
解决这种攻击方式,则需要从实际样本量入手,但是联邦学习的隐私安全性是不允许获取clients的用户数据量大小的,所以论文代码的实现方案,选择的是不管clients样本量大小如何,都分配统一权重,那么如何实现算法1基于样本量大小的抽样方式呢?
补上算法2实现:
算法2的实现也是分配给所有clients同样的权重,然后根据梯度相似性来重新计算权重,最后对梯度相似性矩阵进行聚类得到91类,也就是说梯度的相似性会影响到clients的抽样权重。
太困了明天再写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。