发布时间:2023-04-18 文章分类:电脑基础 投稿人:樱花 字号: 默认 | | 超大 打印

文章目录

  • 横向联邦学习的定义
  • 横向联邦学习架构
    • 客户-服务器架构
    • 对等网络架构
  • 联邦平均算法

横向联邦学习的定义

横向联邦学习也称为按样本划分的联邦学习,可以应用于联邦学习的各个参与方的数据集有相同的特征空间和不同的样本空间的场景,类似于在表格视图中对数据进行水平划分的情况。
【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg

例如,两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体,所以他们的客户交集非常小,他们的数据集有不同的样本ID。然而,他们的业务模型非常相似,因此他们的数据集的特征空间是相同的。这两家银行可以联合起来进行横向联邦学习以构建更好的风控模型。

横向联邦学习架构

客户-服务器架构

具有K个参与方(客户端)在服务器的帮助下,协作地训练一个机器学习模型。
横向联邦学习系统的训练过程通常由如下四步组成:

  1. 各参与方在本地计算模型梯度,并使用同态加密、差分隐私或秘密共享等加密技术,对梯度信息进行掩饰,并将掩饰后的结果(加密梯度)发送给聚合服务器。
  2. 服务器进行安全聚合操作,如使用基于同态加密的加权平均。
  3. 服务器将聚合后的结果发送给各参与方。
  4. 各参与方对收到的梯度进行解密,并使用解密后的梯度结果更新各自的模型参数。

【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg
然后迭代执行上述步骤,直到损失函数收敛或者达到允许的迭代次数的上限或允许的训练时间。这种架构独立于特定的机器学习算法,并且所有参与方将会共享最终的模型参数。

对等网络架构

在这种架构中,横向联邦学习系统的K个参与方也被称为训练方(trainer)或分布式训练方。每一个训练方负责只使用。此外,训练方们使用安全链路在相互之间传输模型参数信息。为了保证任意两方之间的通信安全,需要使用例如基于公共密钥的加密方法等安全措施。
【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg

由于对等网络架构中不存在中央服务器,训练方们必须提前商定发送和接收模型参数信息的顺序,主要有两种方法可以达到这个目的:

  1. 循环传输:训练方们被组织成一条链。第一个训练方(即链首)将当前的模型参数发送给它的下一个训练方。该训练方接收来自上游的模型参数后,将使用来自本地数据集的小批量数据更新收到的模型参数。之后,它将更新后的模型参数传输给下一个训练方。这一过程将被持续重复,直到模型参数收敛或达到允许的最大训练时间。
  2. 随机传输: 随机传输模式中 ,第k个训练方从 {1 ,···,L}中选取i,并将模型参数发送给训练方i。当第i个训练方收到来自第k个训练方的模型参数后,它将使用来自本地数据集的数据的mini-batch更新收到的模型参数。之后,第i个训练方也从{1,···,L}中等概率地随机选取一个数字j,并将自己的模型参数发送给训练方j。这一过程将会重复,直到K个训练方同意模型参数收敛或达到允许的最大训练时间。

联邦平均算法

联邦平均算法(Federal Average Algorithm)是一种用于计算加权平均值的算法,的基本思想将数据点按照某个权重进行加权平均,从而得到一个加权平均值。
【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg

H. B. McMahan, E. Moore, D. Ramage, S. Hampson, and B. A. Y. Arcas, “Communication-efficient learning of deep networks from decentralized data,” in Proc. AISTATS, 2016, pp. 1273–1282.

在原文中对联邦平均算法的描述如下:
【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg

  1. 假定在多轮通信中的一个同步更新方案,有一组K个客户端组成的固定集合,每个客户端都有一个固定的本地数据。

  2. 在每一轮开始,随机的一小部分比例 的客户端被选定,并且服务端把当前全局算法状态(当前的模型参数)发送给被选中的每一个客户端。【为了提高效率我们只选中一小部分客户端,因为我们的实验表明超过某一点继续增加客户端的数量回报就会持续衰减。】

  3. 基于全局模型参数以及本地数据集,每一个被选中的客户端开始执行本地计算,并再把更新发送到服务端。

  4. 而后服务端再把收到的这批更新应用给全局参数,然后就是不断重复执行这个过程。

这里给出它的伪代码描述:

# local_w 表示每个客户端训练得到的权重列表
weights_avg = local_w[0]
for k in weights_avg.keys():
    for i in range(1, len(local_w)):
        # weights_avg[k] += local_w[i][k] * weight
        weights_avg[k] = weights_avg[k] + local_w[i][k]
    weights_avg[k] = weights_avg[k] / len(local_w)
global_weights = weights_avg
model.load_state_dict(global_weights)

在联邦平均算法的实现中,在每一个全局模型训练轮次中,每一个参与方都需要给服务器发送完整的模型参数更新。由于现代的DNN模型通常有数百万个参数,给协调方发送如此多的数值将会导致巨大的通信开销,并且这样的通信开销会随着参与方数量和迭代轮次的增加而增加。当存在大量参与方时,从参与方上传模型参数至协调方将成为联邦学习的瓶颈。可以从以下两个方面对联邦平均算法进行改进: