【论文代码复现2】Clustered sampling based on sample size_admin11111111的博客-CSDN博客https://blog.csdn.net/admin11111111/article/details/120817883        接着上篇的来写。

一、算法2流程:

1. 根据梯度计算相似性矩阵,相似性用cosine来衡量。

2. 对相似性矩阵进行层次凝聚聚类,cluster之间的距离用ward方式衡量。

3. 根据聚类结果得到新的权重矩阵,(最大的10种类——worker数量最多,权重保持不变)

4. 剩余的类别的权重更新,得到新的权重矩阵distri_cluster作为clients被抽样的概率矩阵,抽样的clients子集的样本作为训练数据集进行训练。

注:此处权重不是模型参数,而是作为clients被抽样的概率权重。

def get_clusters_with_alg2(linkage_matrix: np.array, n_sampled: int, weights: np.array
):"""Algorithm 2"""epsilon = int(10 ** 10)# associate each client to a clusterlink_matrix_p = deepcopy(linkage_matrix)augmented_weights = deepcopy(weights)for i in range(len(link_matrix_p)):idx_1, idx_2 = int(link_matrix_p[i, 0]), int(link_matrix_p[i, 1])new_weight = np.array([augmented_weights[idx_1] + augmented_weights[idx_2]])augmented_weights = np.concatenate((augmented_weights, new_weight))link_matrix_p[i, 2] = int(new_weight * epsilon)clusters = fcluster(link_matrix_p, int(epsilon / n_sampled), criterion="distance")n_clients, n_clusters = len(clusters), len(set(clusters))# Associate each cluster to its number of clients in the clusterpop_clusters = np.zeros((n_clusters, 2)).astype(int)for i in range(n_clusters):pop_clusters[i, 0] = i + 1for client in np.where(clusters == i + 1)[0]:pop_clusters[i, 1] += int(weights[client] * epsilon * n_sampled)pop_clusters = pop_clusters[pop_clusters[:, 1].argsort()]distri_clusters = np.zeros((n_sampled, n_clients)).astype(int)# n_sampled biggest clusters that will remain unchangedkept_clusters = pop_clusters[n_clusters - n_sampled :, 0]for idx, cluster in enumerate(kept_clusters):for client in np.where(clusters == cluster)[0]:distri_clusters[idx, client] = int(weights[client] * n_sampled * epsilon)k = 0for j in pop_clusters[: n_clusters - n_sampled, 0]:clients_in_j = np.where(clusters == j)[0]np.random.shuffle(clients_in_j)for client in clients_in_j:weight_client = int(weights[client] * epsilon * n_sampled)while weight_client > 0:sum_proba_in_k = np.sum(distri_clusters[k])u_i = min(epsilon - sum_proba_in_k, weight_client)distri_clusters[k, client] = u_iweight_client += -u_isum_proba_in_k = np.sum(distri_clusters[k])if sum_proba_in_k == 1 * epsilon:k += 1distri_clusters = distri_clusters.astype(float)for l in range(n_sampled):distri_clusters[l] /= np.sum(distri_clusters[l])return distri_clusters

上次说到 “如果有恶意攻击者命名数据量很小,却说自己数据量很大则会导致系统崩溃。也就是数据量大,则抽样概率大幅增加,计算梯度时就会受到影响。”

二、对样本量大小的攻击

然后便对算法2也进行了clients的抽样权重的人为设定,但是效果并不明显。原因是对相似性梯度进行层次聚类时,簇间距比较小,导致对梯度的分类在设定权重后和设定权重前(所有clients权重相同)的类别数量相同。也就是说,单纯改变数据量多少(这里)对梯度改变不大。

人为设定权重后的实验结果图如下,与论文中所给结果图片基本相同。

于是直接对梯度进行操作。

三、对于梯度的攻击

在server端对梯度进行可以修改,可以对算法2产生影响。但是在服务端修改就不算是workers中有恶意攻击者了,而只能说明系统失效了,这就不需要再验证系统对于worker攻击的鲁棒性了。

但是从另一方面也证明了,直接对梯度进行修改是对梯度有影响的。

从图中很明显可以看出对梯度的修改使得算法2有点失效了,不再接近target模型了。

而且直接对代表性梯度修改,哪怕是只修改一个也会对模型产生影响,如下图只攻击一个代表性梯度效果图:

        # UPDATE THE HISTORY OF LATEST GRADIENTif sampling == "clustered_2":gradients_i = get_gradients(sampling, previous_global_model, clients_models)for idx, gradient in zip(sampled_clients_for_grad, gradients_i):if(sampled_clients_for_grad[0] == idx):gradients[idx] = backward(np.array(gradient))else:gradients[idx] = gradient

这段代码就是直接攻击一个代表性梯度的。

不过有意思的是在get_gradients()函数里面对梯度进行攻击,却起不了效果。结果如下图:

代码如下:

def get_gradients(sampling, global_m, local_models):"""return the `representative gradient` formed by the difference betweenthe local work and the sent global model"""local_model_params = []for model in local_models:local_model_params += [[tens.detach().cpu().numpy() for tens in list(model.parameters())]] #20211014global_model_params = [tens.detach().cpu().numpy() for tens in list(global_m.parameters())] #20211014local_model_grads = []#lst = list(range(100))#lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   #因为这是固定攻击前10个client,后面也不能保证前10个client一定被分到一个类中,而代表性client梯度是根据聚类大小来的,也就是说类簇小了,就不被采取作为代表性梯度了,也就不会被采样了,所以梯度的改变也就没有影响了。for id, local_params in enumerate(local_model_params):#if id in lst:# local_model_grads += [[backward(local_weights - global_weights) for local_weights, global_weights in zip(local_params, global_model_params)]]#else:local_model_grads += [[local_weights - global_weights for local_weights, global_weights in zip(local_params, global_model_params)]]#local_model_grads = backward(np.array(local_model_grads))return local_model_grads

仔细分析后,原因可能是固定攻击前10个client,而这10个client只要不是被同时分到一个类簇中,则它们就有可能全部都不会被采样到,因为每次采样是按照类簇大小(簇内client数量)来抽取10个client。也就是如果前10个client都分散为一个前10大小的类簇之外,就有可能采样到的全部是未被攻击的client;如果在一个类簇中,则类簇大小为10,就一定会被采样到了。

下周试一下直接在local_learning中修改,这样才能算是真正在worker端的攻击。

【论文复现3】算法2——Clustered sampling based on model similarity相关推荐

  1. 【论文代码复现2】Clustered sampling based on sample size

    [论文代码复现]Clustered Sampling: Low-Variance and Improved Representativity for Clients Selection in Fede ...

  2. 【总结】Clustered Sampling 小结

    (2条消息) [论文复现3]算法2--Clustered sampling based on model similarity_admin11111111的博客-CSDN博客https://blog. ...

  3. 【论文代码复现】Clustered Sampling: Low-Variance and Improved Representativity for Clients Selection in Fede

    目录 一.前言 二.论文内容概要 1. 论文背景: 2. 已有解决方案 3. 论文方法 三.实验 1. 实验设置 2. 代码 3. 修改后试验结果和论文结果对比: 参考: 一.前言 1. 论文地址: ...

  4. 【图像去噪】兴智杯论文复现赛——NAFNet

    论文复现--Low-level算法 NAFNet (去噪) Simple Baselines for Image Restoration--一个简单的用于图像恢复的强基线模型 官方源码:https:/ ...

  5. 经典论文复现 | 基于深度卷积网络的图像超分辨率算法

    过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...

  6. 组队瓜分百万奖金池,资深算法工程师带你挑战飞桨论文复现赛!

    你是否正在焦虑找不到好的论文? 好不容易找到了paper,无法复现出code? 缺少科研同行交流,只能独自一人闭门造车? 是的,论文复现是要想最快的学习和了解AI领域的方式,复现困境也被叫做" ...

  7. 顶尖!百度AI算法专家手把手带你论文复现打比赛!

    你是否正在焦虑找不到好的论文? 好不容易找到了paper,无法复现出code? 缺少科研同行交流,只能独自一人闭门造车? 是的,论文复现是要想最快的学习和了解AI领域的方式,复现困境也被叫做" ...

  8. 何恺明 matlab,[论文复现]何恺明博士CVPR2009去雾算法(1)

    一.前言 近期打算研读一下何博士第一篇文章,复现其论文算法,主要参考的博文有: [1] Kaiming He论文心得 https://www.cnblogs.com/molakejin/p/57088 ...

  9. 点云配准论文复现:Robust generalized point cloud registration with orientational data based on expectation ma

    参考论文 Min Z, Wang J, Meng M Q H. Robust generalized point cloud registration with orientational data ...

最新文章

  1. 心路历程(五)-find work and find house
  2. 【python数据挖掘课程】二十三.时间序列金融数据预测及Pandas库详解
  3. python中int转换为时间戳_python日期和时间戳互相转化操作详解
  4. Spark 中 map 与 flatMap 的区别
  5. 软工导论 12-13-2 实验任务一
  6. 【C++】指针的引用及面向对象
  7. java 僵尸进程_僵尸进程ZOMBIE
  8. EXFO 收购RF over CPRI 测试方案提供商Absolute Analysis
  9. (转)什么是BD,怎么做一个好BD
  10. 独立同分布的大样本OLS回归
  11. 3D三角形网格补洞算法及源码(转)
  12. 文献阅读-FCER1G与透明细胞癌中巨噬细胞的浸润相关并且通过调节肿瘤免疫产生不良预后
  13. InputStream与OutputStream归纳
  14. 关于SSL证书链的一些认识
  15. PYTHON 牛客刷题记录
  16. 追觅三大无线吸尘器对比,看哪款适合你?
  17. IDEA 报 Error:java: java.lang.StackOverflowError
  18. 计算机应用基础考查方案,《计算机应用基础》考查方案
  19. Fluke TiS60+红外热像仪 福禄克TiS60+热成像仪
  20. 无线网卡性能怎么测试软件,Mercury MW150U 无线网卡性能测试

热门文章

  1. luogu2763 试题库问题
  2. OpenCV肤色检测
  3. LKY_OfficeTools 一键优雅的安装并激活你的Office
  4. 持续更新:免费的IT学习资源分享
  5. 2010年3月23日
  6. 牧羊人之心服务器维护中,牧羊人之心6月1日停服维护说明_6月1日全服停服维护公告_软吧...
  7. iPhone屏幕知识点解析
  8. DSNIRNXT:53CD abend during query
  9. 选择服务器租用托管机房的关键
  10. discuz x3.5