面向数据异构的联邦学习优化算法【附代码】
创作时间:
作者:
@小白创作中心
面向数据异构的联邦学习优化算法【附代码】
引用
CSDN
1.
https://blog.csdn.net/checkpaper/article/details/142427020
联邦学习作为解决数据孤岛问题的有效手段,能在保证用户隐私的情况下联合参与节点共建全局模型。然而,在联邦学习中,参与训练的节点通常来自不同地理位置、组织、用户群体或应用场景,这会导致数据来源和特征分布不同,产生数据异构性问题,进而使联邦学习全局模型偏移。同时,中心式联邦学习受限于中心服务器,会减慢算法收敛速度,降低全局模型推理精度。因此,在不引入大量通信开销的前提下提升数据异构条件下的联邦学习算法性能,成为当前联邦学习领域亟需解决的核心问题。
具体优化内容与贡献
- 基于惩罚正则项的联邦学习(FedAvg-Z 算法)
- 针对全局模型与本地模型之间的权重差导致的模型精度下降问题,对 FedAvg 算法中的聚合阶段进行改进,提出 FedAvg-Z 算法。
- 通过增加惩罚正则项,强制局部模型拟合,减小权重差异,从而提高联邦学习的性能。
- 在 MNIST 和 CIFAR-10 数据集上进行两种不同参数设置的实验,结果表明该算法可有效提升联邦学习算法在数据异构场景下的模型准确率。
- 基于节点选择和知识蒸馏的去中心化联邦学习
- 联邦学习通常采用随机采样策略,这会造成模型泛化能力差,且中心节点因需汇聚大量模型参数而导致通信压力大和网络拥塞。
- 采用当前轮次的局部模型性能表现和本地数据集大小来体现不同设备的数据质量差异,通过节点之间的双向选择确定本轮中心节点和邻邦节点,实现联邦学习的去中心化。
- 在联邦学习中加入知识蒸馏机制,以轻微性能损失为代价加快联邦学习运行时间。
- 在 MNIST、CIFAR-10 和 FEMNIST 数据集上进行实验,结果表明该算法可在保证模型性能的同时有效缩短运行时间。
- 基于分割学习的联邦学习
- 针对在计算资源受限的节点中训练复杂模型困难的问题,在联邦学习中引入分割学习。
- 将完整的机器学习模型拆分,节点训练部分网络,其余由计算服务器完成,减少节点端计算负载,同时结合上文节点选择机制加强收敛。
- 在 MNIST、CIFAR-10 和 FEMNIST 数据集上使用 ResNet-18 和 AlexNet 作为复杂网络并针对不同分割位置进行实验。
- 实验结果表明,该算法可有效提高联邦学习在数据异构场景下对复杂模型的处理能力。
各优化方法的具体实现与效果
- FedAvg-Z 算法的实现与效果
- 在 FedAvg 算法的聚合阶段,引入惩罚正则项。当各个节点完成本地模型训练后,在聚合全局模型时,考虑全局模型与本地模型之间的权重差异,并通过惩罚正则项来约束本地模型向全局模型靠近。
- 在 MNIST 和 CIFAR-10 数据集上的实验中,通过调整不同的参数设置,可以观察到 FedAvg-Z 算法在数据异构的情况下,能够有效地提高模型的准确率。这表明惩罚正则项的引入确实有助于减小全局模型与本地模型之间的差异,从而提升联邦学习的性能。
- 基于节点选择和知识蒸馏的去中心化联邦学习的实现与效果
- 对于节点选择,根据当前轮次的局部模型性能表现和本地数据集大小来评估不同设备的数据质量。性能表现较好且数据集较大的节点更有可能被选为中心节点或邻邦节点。这样的双向选择机制可以确保参与联邦学习的节点具有较高的数据质量和代表性。
- 知识蒸馏机制的引入,使得在联邦学习过程中,性能较好的模型可以将其知识传递给性能较差的模型,从而加快整体的学习速度。在实验中,这种方法在保证模型性能的同时,显著缩短了联邦学习的运行时间,减轻了中心节点的通信压力和网络拥塞问题。
- 基于分割学习的联邦学习的实现与效果
- 在联邦学习中引入分割学习时,首先确定模型的分割位置。将复杂的机器学习模型拆分为多个部分,节点只负责训练其中的一部分网络,而其余部分由计算服务器完成。这样可以大大减少节点端的计算负载,使得在计算资源受限的节点上也能进行有效的模型训练。
- 结合节点选择机制,选择合适的节点来训练不同部分的模型,进一步加强了联邦学习的收敛性。在不同数据集上使用 ResNet-18 和 AlexNet 等复杂网络进行实验,并针对不同的分割位置进行调整,可以观察到该算法在数据异构场景下对复杂模型的处理能力得到了有效提高。
简单联邦学习代码示例
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 定义简单的神经网络模型
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 784)
x = torch.relu(self.fc1(x))
return self.fc2(x)
# 模拟联邦学习中的节点
class Node:
def __init__(self, data):
self.model = SimpleNet()
self.optimizer = optim.SGD(self.model.parameters(), lr=0.01)
self.data = data
def train(self):
for epoch in range(5):
for images, labels in self.data:
self.optimizer.zero_grad()
outputs = self.model(images)
loss = nn.CrossEntropyLoss()(outputs, labels)
loss.backward()
self.optimizer.step()
return self.model.state_dict()
# 模拟联邦学习的过程
def federated_learning():
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
mnist_train = datasets.MNIST('data', train=True, download=True, transform=transform)
mnist_test = datasets.MNIST('data', train=False, download=True, transform=transform)
# 划分数据给不同节点
node1_data = torch.utils.data.DataLoader(mnist_train, batch_size=64, shuffle=True, sampler=torch.utils.data.SubsetRandomSampler(range(0, 10000)))
node2_data = torch.utils.data.DataLoader(mnist_train, batch_size=64, shuffle=True, sampler=torch.utils.data.SubsetRandomSampler(range(10000, 20000)))
node3_data = torch.utils.data.DataLoader(mnist_train, batch_size=64, shuffle=True, sampler=torch.utils.data.SubsetRandomSampler(range(20000, 30000)))
nodes = [Node(node1_data), Node(node2_data), Node(node3_data)]
# 全局模型初始化
global_model = SimpleNet()
global_optimizer = optim.SGD(global_model.parameters(), lr=0.01)
for round in range(5):
local_models = []
for node in nodes:
local_weights = node.train()
local_models.append(local_weights)
# 模拟聚合过程
averaged_weights = {}
for key in local_models[0].keys():
averaged_weights[key] = sum([local_model[key] for local_model in local_models]) / len(local_models)
global_model.load_state_dict(averaged_weights)
# 测试全局模型
test_loader = torch.utils.data.DataLoader(mnist_test, batch_size=64, shuffle=False)
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = global_model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the test images: {100 * correct / total}%')
if __name__ == '__main__':
federated_learning()
热门推荐
进化论视角:现代猿猴为何不再变成人
自然码双拼:让你秒变打字高手的输入法
1300万平方公里如何统一?元朝行省制度破解治理难题
退休后,大理等你来打卡!
用电脑将iPhone、iPad或iPod恢复为出厂设置
刘伯承:从川军名将到开国元勋,军事才能震惊中外
谷维素联合维生素B1:从心律到皮肤的多重保健方案
马百良安宫牛黄丸:功效获科学证实,不含朱砂更安全
冬季脚部保暖,这些小妙招让你告别“冰脚”
桑葚的双重身份:既是水果也是药材,11种养生功效详解
桑葚的三种养生吃法:山药汤、银耳羹、花生粥
2型糖尿病饮食禁忌:这6种高糖零食一口都别尝
世界献血日科普:血液组成揭秘
脂溢性皮炎:头皮屑的罪魁祸首
动真格!抖音15条新规出台:多家关店,酒商离场,直播带货生变?
东南亚签证利好:新加坡免签,越菲两国推数字化办理
2024年中国免签入境同比增266%,东盟成签证便利化重要参与者
秋冬头皮屑救星:营养师推荐的食疗清单
离岸人民币账户全攻略:概念、优势、开设流程与风险管理
人民币国际化加速:跨境支付增六成,跃居全球第四大活跃货币
猎心人老王教你创意晚安心动文案
SIM卡座的秘密:手机背后的黑科技
小寒不见雪,寡妇要发愁?今年冬天会有多冷?
小寒诗意祝福,温暖你的心
柬埔寨2024:经济领跑东盟,民主之路待破局
王星事件敲警钟:东南亚旅游安全问题频发,千人被骗至缅北
如何选择和安装多功能厅音响设备?一站式指南
耳朵被音响震到后该怎么处理?如何预防耳朵被音响震伤?
豆类胀气原理与10个缓解方案:从饮食调整到注意事项
石斛多糖促进胃液分泌,这款原浆成养胃新宠