拜占庭容错机器学习算法之Krum算法

Krum算法是一种基于欧氏距离的拜占庭容错机器学习算法,是一种在分布式机器学习中保证其在具有拜占庭错误时仍然可以收敛的算法。

拜占庭错误

所谓的拜占庭错误在机器学习中是指,客户端在提交模型更新时,可以提交任意的随机数,或者选择不提交。当然,这有可能是由于机器故障或者网络故障等不可抗力的原因,也可能是由于恶意的用户故意提交错误的更新,来破坏训练过程。

算法假设

我们具有 n n n个客户端 { c 1 , c 2 , ⋯   , c n } \{c_1,c_2,\cdots,c_n\} {c1,c2,,cn}和一个服务器 s s s,每个客户端都具有一部分数据, c i c_i ci具有数据 D i D_i Di。一般假设数据是独立同分布的,也就是iid.
在这 n n n个客户端中,有 f f f个是不诚实的,也就是可能发起拜占庭攻击的。且满足 2 f + 2 < n 2f+2<n 2f+2<n.

算法步骤

初始化:协商模型和各种必须参数;
1、 s s s将全局的参数 W W W分发给所有客户端;
2、对于每个客户端 c i c_i ci,同时进行:根据本地的数据计算本地的梯度 g i g_i gi,然后发送给客户端;
3、模型收到客户端的梯度后,两两计算梯度之间的距离 d i , j = ∣ ∣ g i − g j ∣ ∣ 2 d_{i,j}=||g_i-g_j||^2 di,j=gigj2;
4、对于每个梯度 g i g_i gi,选择与他最近的 n − f − 1 n-f-1 nf1个距离,即 { d i , 1 , d i , 2 , ⋯   , d i , i − 1 , d i , i + 1 , ⋯   , d i , n } \{d_{i,1},d_{i,2},\cdots,d_{i,i-1},d_{i,i+1},\cdots,d_{i,n}\} {di,1,di,2,,di,i1,di,i+1,,di,n}中最小的 n − f − 1 n-f-1 nf1个,不妨设为 { d i , 1 , d i , 2 , ⋯   , d i , n − f − 1 } \{d_{i,1},d_{i,2},\cdots,d_{i,n-f-1}\} {di,1,di,2,,di,nf1},然后加起来作为该梯度 g i g_i gi的得分 K r ( i ) = ∑ j = 1 n − f − 1 d i , j Kr(i)=\sum_{j=1}^{n-f-1}d_{i,j} Kr(i)=j=1nf1di,j.
5、计算所有的梯度的得分后,求得分最小的梯度 g i ∗ g_{i^*} gi
6、更新 W = W − l r ⋅ g i ∗ W=W-lr\cdot g_{i^*} W=Wlrgi
7、重复1-6,直到模型收敛。

Multi-Krum

在Krum的算法中的第5步,选出一个最低得分的梯度后,再返回4步,继续选择,直到选择出了m个梯度,最后的梯度为这m个的平均。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
KRUMKrum filter)算法是一种基于排名的去除异常值的算法。它的原理是通过计算每个数据点与其他数据点的距离,然后选取距离最短的数据点作为最终结果,从而去除异常值的影响。 算法步骤如下: 1. 计算每个数据点与其他数据点的距离; 2. 对于每个数据点,将其与其他数据点的距离进行排序; 3. 对于每个数据点,计算其与其他数据点的平均距离; 4. 对于每个数据点,计算其与其他数据点的标准差; 5. 对于每个数据点,计算其与其他数据点的平均距离加上一个标准差; 6. 选取距离最短的数据点作为最终结果。 代码实现如下: ```python import numpy as np def krum_filter(X, k=2): ''' X: 2D array, shape (n_samples, n_features) k: int, the number of neighbors to consider ''' n_samples = X.shape[0] dist_matrix = np.zeros((n_samples, n_samples)) for i in range(n_samples): for j in range(n_samples): if i == j: continue dist_matrix[i, j] = np.linalg.norm(X[i] - X[j]) k_neighbors = np.argpartition(dist_matrix, k+1, axis=0)[:k+1, :] k_neighbors = np.delete(k_neighbors, np.where(k_neighbors == np.arange(n_samples).reshape(-1, 1)), axis=1) scores = np.zeros(n_samples) for i in range(n_samples): k_distances = dist_matrix[i, k_neighbors[:, i]] k_distances = np.delete(k_distances, np.where(k_distances == 0)) mean_distance = np.mean(k_distances) std_distance = np.std(k_distances) scores[i] = mean_distance + std_distance return X[np.argmin(scores)] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值