为何提出:
针对目前框架FedAvg进行提出,主要解决了两个问题:
1.设备异构,也就是不同设备存在不同的差距,可能会更新不同步等问题;
2.数据异构,也就是non-IID问题,通过某种方法解决数据异构的问题;
研究背景:
联邦学习主要面对两个最大的困境:高度系统异构和统计异构;
FedAvg也有两个缺点:
1.针对于设备异构下的低俗设备,简单的给予丢弃;
2.对于non-IID数据,工作并不高效;
FedProx具体细节:
对于普通联邦学习,我们一般要求最小化下面损失函数:
在实际训练中,我们采用的其实是选中一个主机集合,每个单机进行多轮训练,最后整体云服务器更新办法; 在这种情况下,就注定使得每次求得的解并不是最精确解,近似解; 普通FedAvg训练步骤如下所示:
所以,如何选取这个主机集合、如何设置训练轮次就有为主要; 如果主机集合较多,系统异构型导致的训练时间不同,会使得有的主机规定时间内; 如果训练轮次较多,会使得各自的函数更新过多,导致收敛变差;
所以,FedProx也是针对于这两个问题,来寻找一种能增大本地轮次(相当于变相减少通信)、能使得收敛更好得方法;
针对于指定时间的每个设备更新问题:
本文提出了称之为tolerating partial work得工作方式,意为把固定工作量变为可变工作量来进行更新,来防止由于硬件、网络等问题导致的不能按时更新的问题;
FedProx目标函数如下所示:
之所以采用上述形式,是因为有不精确解的存在; 对于每次梯度计算,我们可以存在一个不精确的解 ,其中t为iteration轮次,k为第k个设备;
对于传统求梯度下,如果存在
则认为 为非精度解;
可以通俗理解为,精确解的梯度比非精确解梯度要大,所以非精确解收敛速率也比较慢;
FedProx的详细步骤如下所示:
所以从这也可以看出一些问题,在针对于损失函数加了一个余项后,可以有两个优点: 1.通过限制本地更新,也就是得到一个不精确的解不用手动调整E轮次; 2.允许系统异构的设备算力等因素存在,可以完成部分任务,而不是指定的全部任务;
所以总体来说,FedProx主要增加了两个工作:
1.增加了余项,在数据异构性方面,组织了因为多轮本地训练所导致的各个损失函数更新方向上的损失;
2.增加了不精确解,不在使得每个机器更新固定的轮次,而是可以更新更少的轮次,但是具体做法在论文中并没有提及;
关于实验方面的问题:
实验主要针对三种方法进行对比;
1.FedAvg方法;
2.余项为零的FedProx方法;
3.还有余项的FedProx方法;
其中第二种可以看作不是固定Epoch的FedAvg方法,可以根据不同设备的异构性进行收敛,但是具体如何操作并没有在论文中提及,后续可以跟进一下代码;
对于第三种,余项参数采用字典方法进行枚举,来寻找最合适的参数;