拜占庭鲁棒Krum聚合算法

A non-linear ,distance-based choice function ,that chooses ,among the proposed vectors ,the vector “closest to everyone else”

在这里插入图片描述

Krum 在 m 个局部模型中选择一个与其他模型相似的模型作为全局模型。
将梯度与其它梯度的范数距离的和作为该梯度的得分,然后选取得分最低,即“和大多数梯度都相似”的梯度作为聚合梯度。Krum不会影响模型的正常收敛,并且在攻击者控制worker的占比不超过50%的情况下能保证模型的鲁棒性。

Reference

### Python中的Krum实现及其在联邦学习中的应用 #### Krum简介 Krum是一种用于检测拜占庭故障的聚合方法,特别适用于联邦学习环境下的恶意客户端攻击防护。该算法旨在识别并排除异常梯度更新,从而保护全局模型免受不良影响。 #### 实现细节 为了实现在Python中使用Krum进行聚合的功能,可以采用如下方式: 1. **导入必要的库** 需要引入一些基础的数据处理科学计算包,比如NumPy等。 2. **定义Krum函数** 函数接收来自多个参与者的参数更新列表作为输入,并返回被选作最终更新的那个参与者索引。 ```python import numpy as np def krum(updates, n_attackers=0): """ 使用Krum机制选择最可信的一个更新. 参数: updates (list of ndarray): 来自不同节点的权重更新矩阵列表 n_attackers (int): 已知的最大敌对方数量,默认设为零表示无已知敌人 返回: int: 被认为是最可靠的更新对应的下标位置 """ num_workers = len(updates) # 计算每一对更新间的L2距离平方 distances = [] for i in range(num_workers): dist_i = [ np.linalg.norm(u - v)**2 for j, u in enumerate(updates) if i != j ] distances.append(dist_i) scores = [] for idx, d in enumerate(distances): sorted_d = sorted(d)[:num_workers-n_attackers-2] score = sum(sorted_d) scores.append((score,idx)) best_score,best_idx=min(scores)[1] return best_idx ``` 此段代码实现了基本版的Krum逻辑[^1]。注意这里假设`updates`是一个由各工作节点提交来的权重差异组成的数组集合;而`n_attackers`代表可能存在的恶意节点数目估计值。 当调用上述krum()函数时,传入当前轮次接收到的所有局部模型更新以及预估的攻击者数量即可得到一个整数值——即被认为最值得信任的工作节点编号。 #### 应用实例 在一个典型的联邦学习环境中,服务器端会在每次迭代结束之后收集到来自各个客户机发回的新版本模型参数变化情况(通常表现为张量形式)。此时就可以利用上面提到过的krum()来进行筛选操作了: ```python selected_worker_index = krum(client_updates, suspected_malicious_clients_count) global_model += client_updates[selected_worker_index] ``` 这段伪代码展示了如何选取最优的单个工作节点贡献来调整全局模型的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoldMinnie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值