基于FederatedScope框架实现个性化联邦学习
引言
联邦学习(Federated Learning, FL)作为一种分布式机器学习范式,允许多个客户端在不直接共享原始数据的情况下协作训练模型。然而在实际应用中,不同客户端之间往往存在显著差异:
- 数据分布差异:包括数据量倾斜、特征分布倾斜、标签分布倾斜和时间分布倾斜
- 系统资源差异:包括计算能力和通信带宽等
这些差异使得简单的全局共享模型难以在所有客户端上取得最优性能。个性化联邦学习(Personalized FL, pFL)通过为不同客户端定制模型,成为解决这一挑战的有效方法。
个性化联邦学习的必要性
多任务学习视角
联邦学习可以被很好地建模为多任务学习问题,将每个客户端的学习视为一个子任务。在多任务学习场景中,各个子任务可能使用不同且不重叠的特征和标签。虽然表面上看这些特征和标签不同,但通过联邦过程可以实现模型能力的迁移和增强。
当特征和标签的形状不同时,必须对输入和输出层进行个性化处理,以确保聚合兼容性。本文将以一个多任务图数据集为例进行演示,该数据集规模较小,便于快速验证性能。
实现方法
1. 配置管理
FederatedScope通过扩展yacs.config.cfgNode
来组织配置。我们可以轻松地通过配置文件指定哪些层应该作为本地个性化参数:
from federatedscope.core.configs.config import global_cfg
import torch
pfl_cfg = global_cfg.clone()
pfl_cfg.merge_from_file("federatedscope/gfl/baseline/fedavg_gnn_minibatch_on_multi_task.yaml")
pfl_cfg.use_gpu = torch.cuda.is_available()
print(pfl_cfg.personalization)
2. 数据准备与模型检查
首先加载图多任务数据集并检查GIN模型:
from federatedscope.core.auxiliaries.data_builder import get_data
data, modified_cfg = get_data(pfl_cfg.clone())
pfl_cfg.merge_from_other_cfg(modified_cfg)
print(f"数据配置信息:\n{pfl_cfg.data}\n")
print(f"数据元信息:\n{data}\n")
print(f"客户端1的训练数据:\n{data[1]['train'].dataset}\n")
3. 基础FedAvg性能
在不使用个性化方法的情况下,我们先运行标准的FedAvg算法:
from federatedscope.core.fed_runner import FedRunner
from federatedscope.core.auxiliaries.worker_builder import get_server_cls, get_client_cls
from federatedscope.core.auxiliaries.utils import setup_seed
from federatedscope.core.auxiliaries.logging import update_logger
update_logger(pfl_cfg)
setup_seed(pfl_cfg.seed)
Fed_runner = FedRunner(data=data,
server_class=get_server_cls(pfl_cfg),
client_class=get_client_cls(pfl_cfg),
config=pfl_cfg.clone())
Fed_runner.run()
实验结果显示,FedAvg在使用加权汇总方式时获得了0.615的准确率,测试准确率的标准差为0.140,最高和最低十分位数分别为0.86和0.465。
4. 引入FedBN的改进
FedBN(Federated Batch Normalization)通过保持批归一化层参数本地化来适应客户端间的数据分布差异:
print(f"[修改前]个性化配置:\n{pfl_cfg.personalization}\n")
pfl_cfg.merge_from_file("scripts/personalization_exp_scripts/fedbn/fedbn_gnn_minibatch_on_multi_task.yaml")
pfl_cfg.use_gpu = torch.cuda.is_available()
print(f"[修改后]个性化配置:\n{pfl_cfg.personalization}\n")
运行FedBN算法:
Fed_runner = FedRunner(data=data,
server_class=get_server_cls(pfl_cfg),
client_class=get_client_cls(pfl_cfg),
config=pfl_cfg.clone())
Fed_runner.run()
结果显示,FedBN在使用加权汇总方式时获得了0.741的准确率,相比FedAvg提升了12.6%。同时,公平性指标也有所改善:测试准确率的标准差为0.138(改善0.2%),最高和最低十分位数分别为0.927(改善6.7%)和0.514(改善4.9%)。
总结
通过FederatedScope框架,我们可以轻松实现各种个性化联邦学习算法。本文演示了:
- 如何配置个性化参数层
- 基础FedAvg算法的实现与评估
- FedBN算法的实现与性能对比
实验结果表明,简单的个性化方法(FedBN)就能带来显著的性能提升。FederatedScope框架的灵活性使得研究人员可以轻松尝试更多先进的pFL算法,为解决联邦学习中的异质性问题提供了强大工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考