[联邦学习] FedAvg聚合算法详解及代码实现

该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处。
论文原文:Communication-Efficient Learning of Deep Networks from Decentralized Data

概述

在现代计算机科学中,机器学习被广泛应用于各种领域。然而,机器学习需要大量的数据才能达到最佳性能。在某些情况下,由于数据隐私和安全的原因,集中式训练模型可能不可行。这就是联邦学习的概念出现的原因。联邦学习是一种机器学习范式,其中模型在本地设备上训练,而不是在集中式服务器上训练。本篇博客将介绍一种常用的联邦学习算法——FedAvg。

FedAvg是一种常用的联邦学习算法,它通过加权平均来聚合模型参数。FedAvg的基本思想是将本地模型的参数上传到服务器,服务器计算所有模型参数的平均值,然后将这个平均值广播回所有本地设备。这个过程可以迭代多次,直到收敛。

为了保证模型聚合的准确性,FedAvg算法采用加权平均的方式进行模型聚合。具体来说,每个设备上传的模型参数将赋予一个权重,然后进行加权平均。设备上传的模型参数的权重是根据设备上的本地数据量大小进行赋值的,数据量越多的设备权重越大。

FedAvg的优势

与其他联邦学习算法相比,FedAvg有以下优点:

  • 低通信开销:由于只需要上传本地模型参数,因此通信开销较低。

  • 支持异质性数据:由于本地设备可以使用不同的数据集,因此FedAvg可以处理异质性数据。

  • 泛化性强:FedAvg算法通过全局模型聚合,利用所有设备上的本地数据训练全局模型,从而提高了模型的精度和泛化性能。

FedAvg的缺点

尽管FedAvg具有许多优点,但它仍然存在一些缺点:

  • 需要协调:由于需要协调多个本地设备的计算,因此FedAvg需要一个中心化的协调器来执行此任务。这可能会导致性能瓶颈或单点故障。

  • 数据不平衡问题:在FedAvg算法中,每个设备上传的模型参数的权重是根据设备上的本地数据量大小进行赋值的。这种方式可能会导致数据不平衡的问题,即数据量较小的设备对全局模型的贡献较小,从而影响模型的泛化性能。

FedAvg的算法流程

伪代码

fedavg-pseudocode.png

详解

  1. 服务器初始化全局模型参数 w 0 w_0 w0

  2. 所有本地设备随机选择一部分数据集,并在本地计算本地模型参数 w i w_i wi

  3. 所有本地设备上传本地模型参数 w i w_i wi 到服务器;

  4. 服务器计算所有本地模型参数的加权平均值 w ˉ \bar{w} wˉ,并广播到所有本地设备;

  5. 所有本地设备采用 w ˉ \bar{w} wˉ 作为本地模型参数的初始值,重复步骤2~4,直到全局模型收敛。

代码实现 Code

def fedavg(self):
        # FedAvg with weight
        total_samples = sum(self.num_samples)
        base = [0] * len(self.weights[0])
        for i, client_weight in enumerate(self.weights):
            total_samples += self.num_samples[i]
            for j, v in enumerate(client_weight):
                base[j] += (self.num_samples[i] / total_samples * v.astype(np.float64))

        # Update the model
        return base

结论

总体来说,FedAvg算法是一种有效的联邦学习算法,能够在保护隐私数据的同时,利用本地数据训练全局模型,降低通信开销和支持分布式设备,同时提高模型的精度和泛化性能。随着联邦学习的发展和应用场景的不断扩大,FedAvg算法的研究和应用也将不断深入。未来,FedAvg算法有望在算法优化、隐私保护、模型压缩等方面得到进一步改进,并应用于更多的领域和场景中。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 导入库 import numpy as np import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # 定义卷积神经网络模型 def create_model(): model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) return model # 定义联邦学习FedAvg算法 def federated_averaging(num_clients, epochs, batch_size, lr): # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 对数据进行预处理 x_train = x_train.reshape((-1, 28, 28, 1)).astype(np.float32) / 255.0 x_test = x_test.reshape((-1, 28, 28, 1)).astype(np.float32) / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # 定义全局模型 global_model = create_model() # 复制全局模型作为本地模型 local_models = [tf.keras.models.clone_model(global_model) for _ in range(num_clients)] # 定义优化器 optimizer = tf.keras.optimizers.Adam(lr=lr) # 定义损失函数 loss_fn = tf.keras.losses.CategoricalCrossentropy() # 进行联邦学习 for epoch in range(epochs): # 在每个客户端上训练本地模型 for i in range(num_clients): # 获取本地训练数据 local_x_train, local_y_train = x_train[i*batch_size:(i+1)*batch_size], y_train[i*batch_size:(i+1)*batch_size] # 在本地模型上进行训练 local_models[i].compile(optimizer=optimizer, loss=loss_fn, metrics=['accuracy']) local_models[i].fit(local_x_train, local_y_train, epochs=1, verbose=0) # 对本地模型进行聚合 for layer in global_model.layers: if isinstance(layer, tf.keras.layers.Conv2D) or isinstance(layer, tf.keras.layers.Dense): # 获取本地模型的参数 local_params = [local_model.get_weights()[i] for local_model in local_models for i in range(len(layer.get_weights()))] # 将本地模型的参数进行平均 global_params = np.mean(local_params, axis=0) # 将全局模型的参数更新为平均值 layer.set_weights(global_params) # 在测试集上测试全局模型 global_model.compile(optimizer=optimizer, loss=loss_fn, metrics=['accuracy']) loss, accuracy = global_model.evaluate(x_test, y_test, verbose=0) print('Epoch', epoch, 'Test loss:', loss, 'Test accuracy:', accuracy) # 运行联邦学习FedAvg算法 federated_averaging(num_clients=10, epochs=10, batch_size=32, lr=0.001)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值