Krum算法是一种基于欧氏距离的拜占庭容错机器学习算法,是一种在分布式机器学习中保证其在具有拜占庭错误时仍然可以收敛的算法。
拜占庭错误
所谓的拜占庭错误在机器学习中是指,客户端在提交模型更新时,可以提交任意的随机数,或者选择不提交。当然,这有可能是由于机器故障或者网络故障等不可抗力的原因,也可能是由于恶意的用户故意提交错误的更新,来破坏训练过程。
算法假设
我们具有
n
n
n
个客户端
{
c
1
,
c
2
,
⋯
,
c
n
}
\{c_1,c_2,\cdots,c_n\}
{
c
1
,
c
2
,
⋯
,
c
n
}
和一个服务器
s
s
s
,每个客户端都具有一部分数据,
c
i
c_i
c
i
具有数据
D
i
D_i
D
i
。一般假设数据是独立同分布的,也就是iid.
在这
n
n
n
个客户端中,有
f
f
f
个是不诚实的,也就是可能发起拜占庭攻击的。且满足
2
f
+
2
<
n
2f+2<n
2
f
+
2
<
n
.
算法步骤
初始化:协商模型和各种必须参数;
1、
ss
s
将全局的参数
WW
W
分发给所有客户端;
2、对于每个客户端
ci
c_i
c
i
,同时进行:根据本地的数据计算本地的梯度
gi
g_i
g
i
,然后发送给客户端;
3、模型收到客户端的梯度后,两两计算梯度之间的距离
di
,
j
=
∣
∣
g
i
−
g
j
∣
∣
2
d_{i,j}=||g_i-g_j||^2
d
i
,
j
=
∣
∣
g
i
−
g
j
∣
∣
2
;
4、对于每个梯度
gi
g_i
g
i
,选择与他最近的
n−
f
−
1
n-f-1
n
−
f
−
1
个距离,即
{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}\}
{
d
i
,
1
,
d
i
,
2
,
⋯
,
d
i
,
i
−
1
,
d
i
,
i
+
1
,
⋯
,
d
i
,
n
}
中最小的
n−
f
−
1
n-f-1
n
−
f
−
1
个,不妨设为
{d
i
,
1
,
d
i
,
2
,
⋯
,
d
i
,
n
−
f
−
1
}
\{d_{i,1},d_{i,2},\cdots,d_{i,n-f-1}\}
{
d
i
,
1
,
d
i
,
2
,
⋯
,
d
i
,
n
−
f
−
1
}
,然后加起来作为该梯度
gi
g_i
g
i
的得分
Kr
(
i
)
=
∑
j
=
1
n
−
f
−
1
d
i
,
j
Kr(i)=\sum_{j=1}^{n-f-1}d_{i,j}
K
r
(
i
)
=
∑
j
=
1
n
−
f
−
1
d
i
,
j
.
5、计算所有的梯度的得分后,求得分最小的梯度
gi
∗
g_{i^*}
g
i
∗
;
6、更新
W=
W
−
l
r
⋅
g
i
∗
W=W-lr\cdot g_{i^*}
W
=
W
−
l
r
⋅
g
i
∗
;
7、重复1-6,直到模型收敛。
Multi-Krum
在Krum的算法中的第5步,选出一个最低得分的梯度后,再返回4步,继续选择,直到选择出了m个梯度,最后的梯度为这m个的平均。