背景 & 论文思想
今天介绍的还是一篇去中心化联邦学习的文章,与之前分享的一篇去中心化联邦学习文章有一些相似,都是将一个模型进行分片。改文章的死想是每个client都保留一部分分片,在训练模型更新参数的时候,首先从别的client中拿到自己所没有的模型分片组合成一个完成的模型,训练后再将梯度发送给其他的client
IPLS训练模型的方法
本篇文章所介绍的训练算法主要分为以下几个部分
Initialisation phase
: 确定模型的拓扑结构(如ResNet),随机初始化模型的参数,确定优化算法和损失函数Model partitioning and distribution
:将模型进行分片,并确定两个参数的值 ρ , π \rho,\pi ρ,π,这两个参数的含义是,一个模型分片在所有的client中最多只有 ρ \rho ρ个副本,并且每个client最多只能拥有 π \pi π个模型的分片Ttraining Phase
:每个client将检查哪些分片是自身没有的,然后从别的client中拿过来组成一个新的模型,然后用该模型在本地数据集上进行训练,训练完成之后将新的分片发回给别的client
IPLS API
这篇文章有一个比较与众不同的点是设计了一系列的API来说明整个算法:
Init(String IPFS_Path, List Bootstrapers)
:这是Initialisation phase
的实现,完成模型 M M M,损失函数 L L L,参数 ρ , π \rho,\pi ρ,π的指定和初始化。之后Init()
会等待想要参与联邦的client的回应。回应(Response)中会包含着该client的通信地址、该client中可用的模型分片和可用的存储空间。这些信息都会保存在一个Lookup Table
里面UpdateModel(Vector Gradient)
:client可以调用这个方法去更新模型 W W W,首先 W W W会被分成相应的模型分片,然后对于每一个分片都会去Lookup Table
里面去寻找可以提供该分片的client。这种client可能有多种,系统会根据一些准则,如位置,连通性,信任,负载,功率级别来确定哪个client是最适合的。当找齐这些client后,将每个模型分片和分片ID发送给对应的client,并等待这些client的回应。这些client会返回一个update
给发起者(应该是一个梯度),然后发起者用这些update
对应地更新本地模型分片LoadModel()
:返回client本地缓存的模型
整个算法的过程也可以由下述伪代码所表示:
其中1-4行都是对系统的一个初始化,第5行是找出本地没有的模型分片,6-7行是让本地的模型分片的数量满足系统的要求,9-10是从其他client中拿齐模型分片之后用本地训练集进行训练
总结
这篇文章使用的方法还是跟之前的一些工作有些类似的,都是模型分片+P2P的一些变种,亮点比较少。不过之前的工作所做的模型分片都只是为了减少通信开销所使用的,每一个client都会有所有的模型分片,这篇文章的模型分片是为了保证系统的一个鲁棒性,为了防止某些节点在训练的过程中突然断开连接采取的一个冗余措施。