剪枝平均
剪枝平均数,是指去掉一部分最大值和最小值后,剩余部分的平均数。
更确切的定义是:假设有
a
1
<
a
2
<
a
3
<
⋯
<
a
n
a_1<a_2<a_3<\cdots <a_n
a1<a2<a3<⋯<an,
2
β
<
n
2\beta<n
2β<n,那么
{
a
1
,
a
2
,
a
3
,
⋯
,
a
n
}
\{a_1,a_2,a_3,\cdots,a_n\}
{a1,a2,a3,⋯,an}的
β
\beta
β剪枝平均数定义为
m
β
=
∑
i
=
β
+
1
n
−
2
β
a
i
n
−
2
β
m_{\beta}=\frac{\sum_{i=\beta+1}^{n-2\beta}a_i}{n-2\beta}
mβ=n−2β∑i=β+1n−2βai.
剪枝平均数可以不受到部分极值的影响,同时还能保持大部分数的平均值,是一个比较健壮的统计量。
c++代码示例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
double trimmed_mean(vector<double> a,int beta){
double res=0;
//if 2*beta<n, return the mean of elements.
if(2*beta>=a.size()){
for(auto x:a){
res+=x;
}
return res/a.size();
}
sort(a.begin(),a.end());
for(int i=beta;i<a.size()-beta;i++){
res+=a[i];
}
return res/(a.size()-2*beta);
}
int main(){
vector<double> a={1,2,3,4,5,6,7,8};
vector<double> b={-12,-32,3,4,5,6,7,80};
cout<<"The a's 2-trimmed mean is "<<trimmed_mean(a,2)<<endl;
cout<<"The b's 2-trimmed mean is "<<trimmed_mean(b,2)<<endl;
}
逐坐标剪枝平均聚合算法
拜占庭容错机器学习的大部分算法,都是寻找一个健壮的统计量,来抵抗拜占庭攻击。所以剪枝平均数是可以用来设计拜占庭容错机器学习算法的。
拜占庭容错机器学习算法与分布式机器学习的区别主要是在参数聚合过程,其他都是一样的。所以在描述算法的时候,重点在参数聚合的过程。
可在参数聚合过程中使用的更新或者梯度,往往是一个向量,无法直接比较排序。一个可能的方法是,逐个坐标(或者逐个维度)求剪枝平均,然后组合成聚合后的结果。
具体算法描述如下:
一个聚合服务器 S S S,n个客户端 C 1 , C 2 , ⋯ , C n C_1,C_2,\cdots,C_n C1,C2,⋯,Cn,每个客户端 C i C_i Ci都有自己本地的数据 D i D_i Di.
初始化:协商一个统一的模型结构,给每个客户端相同的权重参数 W W W.这里的权重被扁平化为一个一维向量 W = ( w 1 , w 2 , ⋯ , w p ) W=(w_1,w_2,\cdots,w_p) W=(w1,w2,⋯,wp)
1、每一个客户端 C i C_i Ci使用本地的数据 D i D_i Di和当前的权重 W W W,进行一轮训练,得到 W i W^i Wi。将 W i W^i Wi发送给服务器。
2、服务器收到所有客户端发来的新的权重后,开始聚合。 w j ′ = m β ( w j 1 , w j 2 , ⋯ , w j n ) . \begin{aligned} w^\prime_j=m_\beta(w^1_j,w^2_j,\cdots,w^n_j). \end{aligned} wj′=mβ(wj1,wj2,⋯,wjn).其中, m β m_\beta mβ函数是指求输入的数的 β \beta β剪枝平均。
3、聚合后的权重为 W ′ = ( w 1 ′ , w 2 ′ , ⋯ , w p ′ ) W^\prime=(w^\prime_1,w^\prime_2,\cdots,w^\prime_p) W′=(w1′,w2′,⋯,wp′).服务器将当前权重更新, W = W ′ W=W^\prime W=W′,并分发给所有客户端。
4、重复1-3步,直到模型收敛或者满足特定条件。
参考论文
《Byzantine-Robust Distributed Learning: Towards Optimal Statistical Rates》