联邦学习,5G时代的新机器学习?
论文笔记:Communication-Efficient Learning of Deep Networks from Decentralized Data
概念:
本文提出了一种新的机器学习范式,联邦学习 (Federated Learning)。
在定义联邦学习之前,我们要先来看一看传统的机器学习范式。
一般来说,机器学习必须的三大要素分别是:
数据,计算设备,模型(算法)
如果非要类比的话,上面的三要素分别相当于一家餐馆的:
食材,厨具,菜品(烹饪技法)
联邦学习要革新的主要是上面的数据这个要素。
现实生活中,数据大多是分散的分布在每个用户的手里。举个例子,你想训练一个能够根据照片自动推算年龄的模型,每个用户的手机上的照片就是你所需要的数据。
在传统的机器学习范式中,机器学习工程师首先要把散落在每个用户手里的数据搜集起来,合成一个大的数据集,然后再用这个数据集来训练自己的模型。
但是,这个搜集的过程,常常被人所诟病。最主要的担心,当时是隐私问题。所以,联邦学习就希望能够搭建一个机器学习范式,在这个范式里,用户不必上传自己的数据,而是只需要在本地用自己数据训练一个自己的模型,然后上传这个模型。
如果这里有1000个用户,云端就会收到1000个模型。云端再通过一定的方法,把这1000个模型合成一个模型,那么这个模型就可以认为是在1000个用户协同努力下得到的,这个模型也当然能够很好的处理每个用户的数据了。
看到这里,你会发现,这个过程其实很简单。无非就是之前我需要上传数据,现在改成上传模型了。是的,这么理解没有任何问题。
但是带来了一些问题:
- 用户 (local device) 和 云端 (server) 如何进行交互
- 上传模型并不是免费以及可靠的,如何处理其中的通信问题
- Server 如何把收到多个的模型合成一个
这篇文章是最早明确提出这种范式的,并对上面第一和第三个问题提出了最简单的解决方法。算法部分可以用这张图总结一下,
每个 round 开始的时候,server 选中一些 local device 参与到这一轮训练中(一般是全部都选),local device 要从 server 下载当前的 global model,作为自己 local model 的起点。然后每个 local device 以相同的起点,在自己的数据上进行训练,训练一定时间后,这些 local device 把自己的 local model 都上传到 server。server 然后把这些 local model 求平均,并这个这个平均作为最新的 global model。
然后下一个 round 重复上面的操作,直到模型收敛。
存在的问题
Federated Learning 里面一个的一个 Open Problem 是,如果每个 local device 上面的数据,是非常 biased,那么求平均就没那么有道理了。
举个例子。
传统机器学习里面,我们有 MNIST 数据集,里面的图片是 0-9 共 10 种手写数字。
那么可能在 Federated Learning 的情况下(假设正好有 10 个 local users),就是有个用户只有 0 的图片,另外一个用户只有 8 的图片,....。虽然总量没变,但是每个用户手里的数据是 biased 的,是 Non-IID(非独立同分布) 的,这会对优化造成很大的影响。
从这个角度来看,Federated Learning 好像也并不是什么全新的概念。如果不用 local device 上面的数据是 IID (独立同分布)的,那么 Federated Learning 就相当于是 Distributed Learning。
当然,还有其他的问题:
The FederatedAveraging Algorithm
做法很简单,就是我们上面描述的过程:
总共有 K 个 local devices, 每次选取一定数量 (C,总数的比例) 的 local device, 在上面做 local training,然后上传 local models,最后对这些 local models 求平均。
这里 C,作者认为可以类比传统方法的 batch size,所以可以称之为 global batch size 。
具体分析可以看这里:
如果 local device 每个 round 不只优化一步的话,称之为 FedAvg 。
所以,这个实验中有这么几个关键参数:
- K,local devices 的总量
- C,有多少比例的 local devices 参与了当前 round
- E,每个 local device 在自己的 dataset 上训练多少 epoch
- B,每个 local device 在自己的 dataset 上 batch size 是多大(正无穷代表batch size=dataset size)
在做平均的时候,模型们从相同的初始化开始很重要
这个是这篇 paper 观察到的一个现象,具体看这个图。
右边是两个 models 从相同的初始化开始,明显”合体“后效果要更好一些。
实验 Setting
这篇文章的方法其实是非常简单的,我们主要是要来看一下实验的设计,如何来验证和探究这种新学习范式的有效性。
数据分割
MNIST 有两种数据分割的模式:
IID 数据分割
MNIST 总共有 60,000 训练数据,有 100 个 local device,那么每个上面就是有 600 个 sample,抽取方式是随机。
Non-IID 数据分割
我们首先根据 label 来对数据进行一个排序,然后把 60,000 个 sample 分成 200 个小块,每个小块里面有 300 个 sample。注意这里排序的目的,是人为的让每个小块里面,都是同一种数据。然后每个 local device 将随机的得到两个小块。
这样分割完之后,每个 local device 都只有两种数字。
Language Modeling 也有两种数据分割的模式:
数据来源于 The Complete Works of William Shakespeare,大概形式长这个样子,就是角色有自己的台词,然后不断的进行角色切换
Non-IID 数据分割
总共有 1146个 local device,每个 local device 能够拿到一个 play 里面的某个角色的所有台词。这么做的比较有意思的是,整个dataset非常的 unbalance,因为有些角色可能台词特别多,有些角色(比如龙套那种)台词特别好,作者认为这样一个数据分布可以很好的模拟现实中不同 local device 的情况。
IID 数据分割
总共有还是有 1146 个 local device,只不过数据是随机均匀分割的。
结果分析
每轮多少 Local Devices 参与
这里先来看看每一轮的参与率对结果的影响。
这个表里面的数字代表:
达到预先设定好的 test accuracy 需要多少个 round。如果是横线,代表这种方法永远无法达到预先设定的 accuracy。
从这个表我们观察出来的这些信息:
- Local Batch Size, B 小一点反而有利于 Global Model 的收敛。
- 增加 C 对 Full Batch Size (B 是正无穷)帮助不大。
- 相对于 IID 的情况,Non-IID 情况下,增加 C 对网络收敛帮助更大。
而且,从上面看,增加 C 对收敛的提速作用并不是线性的,所以后面的时候,都设置 C=0.1 了。
增加 Local Training Steps
增加 Local Training Steps 有两种方法:
- 减小 Local Batch Size, B
- 增加 Local Epoch, E
Local Training Steps 最小的情况就是前面说的 FedSGD ,其中 E = 1,B=正无穷。这种方法其实等价于 full-batch (non-stochastic) gradient descent 可以看做是一个 baseline 方法 。但是这种方法其实我们已经知道效果肯定不是很好,因为 generalization ability 不太好。
上表中有一个公式
我们来理解一下。En 是一个 round 的总样本数。而且 KB 是一个 step 需要的样本数,所以这个 u 的含义是平均到每个 local device 上面,一个 round 里面有多少 step。但是这里的 K 其实应该是 0.1K,但是因为这个表里的所有试验都是 0.1K,所以乘不乘这个 0.1 也就无所谓了。
趋势还是比较明显的,Local Training Steps 越多,需要的 communication rounds 就越少。
关于上表的分析(来自论文作者):
- 既然减小 B 或者增加 E 带来的 mu 的增加都可以有效的减少 rounds,那么当我们在调参的时候,就可以先调 B。因为 B 受硬件限制的,但是 E 不受硬件设备。B 小了对收敛速度好,但是 B 太小了有个副作用,就不足以完全利用 local device 的计算能力,所以我们最好先根据 local device 的能力来确定 B。
- 有趣的是,FedAvg 的准确率要比 FedSGD 高。作者的解释是 model averaging produces a regularization benefit similar to that achieved by dropout
关于上表的分析(来自本文作者):
- 在 LSTM 上面的 Non-IID 的表现要比 IID 更好,但是在 MNIST 上面却不是。这个可能是因为二者划分 Non-IID data 的方式不同。
- 其实真正决定每个 round 里面,每个 local device 要迭代多少 samples 是 E。所以在 CNN 这个表里面,固定
E=5,可以观察到 B 越小,收敛的越快。这个点很有趣
Local Training 是不是越多越好
这个实验里面,一直增加 E。加入 E 增加到无穷大。也就是说每个round都train无限多步,那么大概率那么最后收敛的点都是一样的,所以 communication 只需要一个 round 就够了,多了也没用。
事实证明,E 确实不是越大越好。这件事情说来也好理解,如果在每个 local device 优化的太远的话,那么在 local dataset 就 over-optimized 了,而且这样的话,每个 local model 之间的 bias 也太大了。
其实,Federated Learning 里面两个比较本质的 Open Problem:
- 如何处理 Non-IID 的问题?
- 如何平衡(local 和 server)同步频率和收敛效果的问题?
其实这两个问题都是在探究同一个主题,那就是在 local dataset 更新的时候,更新得到的 local model 其实是在 local dataset 上面 bias 的。
当然,同步频率越高,这个 bias 就越低,但是 communication cost 也会越大。最极端的情况,local device 每更新一个 local batch 就同步,这么做的话,其实跟普通 SGD 几乎是一样的,但是显然不符合 Federated Learning 的语境。
CIFAR 实验
CIFAR 的数据分割是 IID 的。
CIFAR 10 总共有 50000 Training Samples,1000 Testing Samples。分割时候,分到 100 个 local device 上面,每个上面有 500 随机采的 Training Samples 和 100 Testing Samples。
- Standard SGD(传统方法):
Batch size=100,197500 updates,86% Acc。
如果用 Federated Learning 来模拟这个过程,那么就需要 197500 rounds 的通信。
不同的线代表不同的 Learning Rate
这个图的横轴是多少 batch 参与更新。从这个图来看,还是传统的 SGD 效果最好。可以这么理解:SGD 的不同batch 是一种 sequence 的关系。举个例子,第二个 batch 更新的对象是第一个 batch 更新之后那个模型。但是在 Federated Learning 的场景下,由于不同 batch 是分布在不同的 local device 上面的,所以不同 local device 上面的 batch 并不是 sequence 的关系。
另外,作者这里claim了一个点:
Further, we see that both standard SGD and FedAvg with only one client per round (C = 0), demonstrate significant oscillations in accuracy, whereas averaging over more clients smooths this out.
就是说,好像 FedAvg 的曲线比 SGD 的还要更稳定一些。这样的结论其实不负责任的,因为 FedAvg 在画这个图的时候,能够画的点要比 SGD 少很多,所以看起来曲线更加的平滑。这很大可能是因为作图的原因,而非真正的稳定性更好。
本文使用 mdnice 排版