本文主要是介绍联邦学习(Federated Learning)学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、联邦学习FedAVG和分布式SGD
- 二、联邦学习中的SGD
- 三、梯度压缩和误差补偿
- 四、两种文中给出的新算法
- 总结
前言
内容仅为笔者主观想法,记录下来以供之后回顾,如有错误请谅解。
一、联邦学习FedAVG和分布式SGD
文献:Federated Learning of Deep Networks using Model Averaging
在笔者理解中,联邦学习的目的就是利用多个个体所拥有的数据,实现模型的有效训练。其要克服的第一个问题就是个体信息的安全性和隐私性。如何在保障个体数据不被他人获取的情况下,利用该数据进行训练,这是首要问题。第二个问题就是个体的数据差异很大,基本可以视为不满足独立同分布条件的,同时数据量也十分不均衡,无法保障不同个体所拥有的数据是相同量级的。基于这些问题,联邦学习才被提出。
从分布式训练的角度来看,分布式SGD的主要思想就是将训练的过程分散到多个workers中,而server将各worker上传的梯度用于参数更新,再将结果传回各worker。
而联邦学习,直观上感觉与分布式SGD十分相似,都是有多个worker和一个server,也需要在worker上训练,在server上对多个worker上传的数据进行处理。但二者实际上有很大不同,在联邦学习中,worker和server中传递的只是参数信息,不会涉及到各worker内部的数据。如下图所示
此外,在联邦学习中,通信损耗比训练损耗更大,因此,相较于不同的优化算法等训练加速方法,有效的通信方式更多地被研究者探索。联邦学习的主要损耗是如何在大量的worker和server的通信中,减少通信量,同时保证传递了足够有效的信息。因此,训练通常使用SGD或SGD-M就足够了,有研究者认为探索联邦学习和AdaGrad和Adam算法的兼容性也是有意义的,但笔者没有找到太多的相关研究,虽然有部分论文使用了类Adam的优化算法,但联邦学习领域主要的创新还是集中在对通信过程的改进和优化。
二、联邦学习中的SGD
在联邦学习中,有两种常见的使用SGD的方法,分别是Parallel SGD和Local SGD。
Parallel SGD如下图所示,就是最简单的模式:worker获得梯度,上传数据,接收数据。
或者可以简单看作:
而Local SGD就是在Parallel SGD的基础上改进的,其实就是先在worker本地训练几个周期,然后再上传数据,如下图所示:
三、梯度压缩和误差补偿
前面说过,在联邦学习中,最需要解决的就是通信损耗问题。因此很自然就有研究者提出梯度压缩的方法,也就是在worker和server的数据传递中,不用将梯度的所有信息都进行通信,而只需要找到梯度向量中最有价值的那部分数据,其余的予以舍弃,从而减少通信的损耗。
在梯度压缩中,最常用的两种方法就是稀疏化和量化,在笔者所阅资料中,主要用的都是稀疏化,这里给出一个例子,Top-k稀疏化方法,其实就是在梯度向量中找到绝对值最大的k个元素,其余的元素全部置为0,将处理后的向量进行通讯。
既然进行了梯度的压缩,那么肯定梯度的真实值和用于计算的值之间存在差异,那么就需要对这个误差进行补偿。在文献中给出了一种基于残差补偿的方法。
四、两种文中给出的新算法
文献:On the Convergence of Communication-Efficient Local SGD for Federated Learning
第一种,作者声称其创新点在于在server的回传数据过程中也进行了压缩,也就是下图中所示的第四步。此前随有在上传过程中进行压缩,但没有回传压缩的。
第二种,没有什么太大区别,就是加了动量项。
总结
联邦学习在越来越重视数据的当下,具有很大的应用价值和意义。这是一个大数据时代,而许多数据都离散地分布在许多智能设备上,如手机电脑等,或是一些公司的服务器上,而这些数据都具有各自的隐私性,不能随意获得。而联邦学习可以在保证数据隐私性的前提下,有效利用分散的数据,这是十分难得的。
这篇关于联邦学习(Federated Learning)学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!