[TIFS 2023] 用增强压缩感知做安全模型对比联邦学习

Secure Model-Contrastive Federated Learning With Improved Compressive Sensing | IEEE Journals & Magazine | IEEE Xplore摘要:

联邦学习(FL)已广泛应用于金融风险控制、电子政务、智慧医疗等各个领域。为了保护数据隐私,许多隐私保护FL方法已被设计并在各种场景中实现。然而,现有的工作招致高通信负担的客户端,并影响训练模型的准确性,由于非独立和相同分布(非IID)的数据样本分别拥有的客户端。为了解决这些问题,在本文中,我们提出了一个安全的模型对比联邦学习与改进的压缩感知(MCFL-CS)计划,对比学习的动机。我们联合模型对比损失和交叉熵损失来设计我们的方案的局部网络架构,它可以减轻数据异构性对模型准确性的影响。然后利用改进的压缩感知算法和局部差分隐私算法来降低通信开销和防止客户端隐私泄露。 形式化安全性分析表明,该方案满足(\varepsilon,\delta)-差分保密性。使用五个基准数据集的广泛实验表明,我们的计划提高了3.45%的平均所有数据集的非IID设置下的模型精度,并减少了95%以上的通信成本,与FedAvg相比。

导言

近年来,联邦学习(FL)[1]在训练分散数据的共享全局模型方面显示出巨大的潜力。不幸的是,最近的工作[2]表明,云服务器仍然可以通过使用共享梯度和全局参数来获取用户隐私,甚至可以根据梯度重建客户端的训练数据样本。为了避免FL中的隐私泄露,已经提出了许多隐私保护解决方案并应用于各种场景[3],[4],[5]。例如,Shokri et al.提出了一种分布式选择随机梯度下降(SGD)算法[3],该算法基于SGD可以并行化和异步执行的思想。Abadi等人将最先进的机器学习方法与先进的隐私保护机制相结合,以适度的隐私预算训练神经网络[4]。和Xu et al. 提出了SecureNet [5],这是第一个可验证和隐私保护的预测协议,用于保护深度神经网络(DNN)中的模型完整性和用户隐私。一般来说,FL系统中常用的技术包括DP [6],[7],同态加密(HE)[8],[9],[10]和安全多方计算(SMC)[11]。值得注意的是,1HE和SMC分别比DP产生更高的计算和通信成本。然而,仍然存在与现有的隐私保护FL方案相关联的两个关键问题。

第一个问题是客户端的高通信负担[12],[13]。由于FL中的客户端上传的梯度通常以百万计,并且面临维度灾难。大规模的分布式训练需要大量的通信带宽用于梯度交换,这限制了FL的可扩展性。因此,提出了一些FL解决方案[14]、[15]以降低通信成本。例如,基于HE的交叉竖井FL方案[16]使用梯度裁剪、量化和编码技术来实现几乎没有准确性损失的模型,但由于同态的固有性质,仍然引起略高的计算和通信成本,例如,2\times-42\times流量膨胀。另一种基于DP的压缩FL方案[15]使用压缩感测[17],[18],[19]来减小模型大小,从而在不牺牲隐私的情况下将通信成本降低高达95%。 然而,当重建梯度时,该方案导致模型精度的更大损失。基于SMC的拜占庭鲁棒FL方案[20]利用编码和梯度裁剪来实现高效且鲁棒的模型,但仍然导致隐私泄露和准确性损失。上述隐私保护FL方案仍然不能同时实现通信效率和模型准确性。此外,由于互联网连接的上传速度至少比下载速度慢五倍[21],因此我们将只关注减少客户端到服务器上行链路通信的开销。

现有FL方案的另一个问题是由不同客户端上的数据分布的异质性引起的FL模型的性能降级。传统的FL解决方案通常假设每个客户端所持有的数据是独立且相同分布的(IID),但是在许多现实世界的应用中,数据可以是非IID分布的。有一些研究[22],[23],[24]专注于改善非IID设置下的FL。例如,优化的FL方案[23]引入了一个近似项,该近似项是根据当前全局模型和局部模型之间的L_{2}范数距离计算的,以优化局部更新。另一种快速收敛的FL方案[22]通过引入控制变量来校正局部更新。用于异质数据的稳健FL方案[24]利用贝叶斯非参数方法以逐层方式匹配和平均权重。这些方案主要集中在使局部更新的方向尽可能相似。 但是,它们忽略了本地更新和全局更新之间的不一致性。由于存在相似的局部更新,FL更容易趋于局部收敛而不是全局收敛。

为了解决上述问题,在本文中,我们专注于支持非IID设置和降低通信成本的隐私保护FL。我们提出了一个安全的模型对比联合学习与改进的压缩感知(MCFL-CS)计划,最大限度地提高当前的局部模型表示与全局模型表示的一致性,从而优化局部模型更新。具体来说,我们首先使用改进的压缩感知方法来处理本地模型更新(而不是梯度),然后使用DP添加噪声的更新,最后在中央服务器上进行安全聚合和模型重建。我们将我们的贡献总结如下:

  • 我们联合模型对比损失和交叉熵损失设计MCFL-CS的局部网络结构,可以减轻数据异构性对模型准确性的影响。

  • 我们提出了一种改进的压缩感知方法,包括模型包装,离散余弦变换(DCT)[25]压缩,逆离散余弦变换(IDCT)重建,这大大降低了通信成本,几乎无损地重建了全局模型。

  • 我们基于我们设计的局部网络结构、改进的压缩感知方法和局部差分隐私[7],提出了一种安全、高效、高精度的隐私保护FL框架,不仅保护了所有客户端的隐私,而且提高了非IID设置下的模型精度,大大降低了通信开销。

  • 我们给予了一个全面的安全性分析,证明我们的方案满足(\varepsilon,\delta)-差分隐私。此外,我们进行了广泛的实验,使用五个基准数据集下的非IID设置,以证明我们的计划大大优于其他国家的最先进的FL方法在模型的准确性,通信成本,本地时代的数量,可扩展性,异构性和隐私预算。

本文件的其余部分组织如下:第二节回顾了关于联邦学习和对比学习的最新工作。第三节介绍了准备工作。在第四节中,我们提出了系统模型,问题定义,威胁模型和设计目标。第五节给出了我们方案的结构细节。接下来,在第六节和第七节中讨论安全性分析和性能分析。分别。第八节是本文的结论。

相关工作

在本节中,我们介绍联邦学习和对比学习方案的工作。

A.联邦学习

FL [1]能够聚合本地训练的模型和服务器通信,而无需所有数据源交换原始本地数据,从而可以使用多源数据协同训练模型以保护隐私。但由于客户端上传的大量梯度和维数灾难,通信开销也成为FL 的主要瓶颈之一[12][13] 。例如,张等人。使用梯度裁剪、量化和编码技术提出了跨筒仓 FL 方案[16]基于HE,实现了几乎没有精度损失的模型,但在一定程度上仍然会产生稍高的计算和通信成本。董等人。利用编码、梯度裁剪和 SMC 来实现高效的 FL [20]。但该方案中,服务器可以间接获取全局模型梯度的明文,容易出现隐私泄露。并且编码和梯度裁剪操作也会导致精度损失。特鲁克斯等人。在隐私保护FL中提出了一种混合方法[26] ,即使用DP来保护客户端的隐私,并使用SMC来降低噪声,避免噪声造成的模型精度损失。然而,该方案[26]仍然会产生较高的通信开销。

模型压缩[27]是目前减轻FL通信成本的有效手段。斯特罗姆等人。提出了一种梯度压缩方法[28],该方法仅将本次更新中满足预定阈值的梯度发送到服务器,在残差中累积其他剩余梯度并将其应用于下一次更新。该方案在声学建模任务中可以实现三个数量级的上行压缩率,但很难确定合适的阈值,不同的网络结构可能会有很大差异。萨特勒等人。提出了一种稀疏三元压缩方法[14]用于佛罗里达州。通过扩展top-k梯度稀疏技术,可以同时压缩上下行通信,对大量客户端具有鲁棒性。然而,该方案仅在具有低延迟和低带宽信道的FL环境中表现良好。克尔库什等人。提出了一种基于DP的FL方案[15] ,通过使用压缩感知[18][19]来减小模型尺寸,从而在不牺牲隐私的情况下降低高达95%的通信成本。不幸的是,它不支持非 IID 设置。

现有 FL 方案的另一个关键挑战是数据异构性。许多研究关注 FL 对非独立同分布数据的稳健性。李等人。在本地训练期间将近端项引入到目标中[23],该项是根据L_{2} -当前全局模型和局部模型之间的范数距离。卡里米雷迪等人。通过引入控制变量来纠正本地更新[22]。王等人。利用贝叶斯非参数方法[24]以分层方式匹配和平均权重。然而,方案[22]、[23]、[24]在具有深度学习模型的图像数据集上的有效性尚未得到很好的探索。许等人。在服务器上更新全局模型时应用动量[29] 。最近的另一项研究[30]在平均之前对本地更新进行标准化。这两个方案[29] , [30]只改进本地训练阶段,不考虑隐私。

B. 对比学习

对比学习[31][32][33]是最近的热门研究方向,它在从未标记数据中学习良好的数据表示方面取得了最先进的结果。对比学习的关键思想是减少同一图像的不同增强视图的表示(即正对)之间的距离,并增加不同图像的增强视图的表示(即负对)之间的距离。

典型的对比学习框架是 SimCLR [31]。给定一张图像X ,SimCLR 首先使用不同的数据增强运算符创建该图像的两个相关视图,表示为{x}_{i} 和{x}_{j} 。基本编码器f(\c点) 和一个投影头g(\c点) 被训练来分别提取表示向量并将表示映射到潜在空间。然后,对投影向量应用对比损失(即 NT-Xent [34] )g(f(\cdot)) ,它试图最大化同一图像的不同增强视图之间的一致性。

有一项研究[35]将对比学习应用于 FL 任务。它设计了一种名为 MOON 的对比损失,以减少局部模型学习的特征表示与先前全局模型学习的特征表示之间的距离。然而,MOON并没有考虑FL训练过程中的隐私泄露问题。与 MOON 一样,在本文中,我们专注于监督学习设置,并提出模型对比损失来比较不同模型学习到的表示,这使得局部模型能够学习到接近全局模型的表示,同时学习到比之前更好的表示本地模型。此外,传统方案在非独立同分布环境下通常表现不佳,模型对比方法通过限制局部模型和全局模型之间的距离来缓和非独立同分布环境下存在的模型漂移。我们提出的方案和现有方案的比较总结见表一

问题表述

在本节中,我们分别展示系统模型、问题定义、威胁模型和设计目标。

A. 系统模型

在本节中,我们考虑典型的 FL 设置,其中本地数据集对其他客户端不可见,并且所有本地数据集无法收集在一起来训练全局模型。如图1所示,我们方案的系统模型由中央服务器和氮 客户。各实体的作用如下所示:

  • 客户。在每一轮中,每个客户端使用其本地数据集训练本地模型,对其进行处理并将其提交到中央服务器。

  • 中央服务器。中央服务器负责控制FL过程并维护每轮的全局模型。执行安全聚合后,它将结果返回给所有客户端。

C. 威胁模型

我们假设每个客户端和中央服务器之间的通道是安全的。这保证了客户端在本地上传模型时不会被篡改和推断。其次,这允许中央服务器验证传入消息并防止外部人员注入其响应。我们假设客户端是诚实的并且诚实地运行原始协议。中央服务器是诚实但好奇的,忠实地遵循学习协议,但可能会好奇地推断出其他参与者使用的训练数据集。根据对手可获得的信息,我们考虑以下三种威胁:

  • 本地数据集隐私泄露。如果客户端直接上传本地模型的明文信息,则面临来自中心服务器的推理攻击等恶意攻击导致的隐私泄露风险。

  • 全局模型精度降低。由于客户端的数据集可能呈现非独立同分布的数据分布。全局模型精度很容易受到非独立同分布数据的影响,甚至导致模型无法使用。

  • 沟通成本高。FL训练的模型平均有数百万个参数和维数灾难,那么网络可能会承受较高的流量和通信成本。

D. 设计目标

为了在非独立同分布环境下实现安全、通信高效、高精度的FL,我们的目标是实现以下设计目标:

  • 数据隐私。客户端不应该有泄露本地数据集隐私的风险。

  • 模型精度。FL 获得的全局模型精度应该大约等于在所有数据集上集中训练的模型精度\数学{D} 。

  • 沟通成本更少。中央服务器和客户端之间的通信应该高效,并且通信数据包应该最小化。

提议的 MCFL-CS

在本节中,我们将描述我们的方案如何运作。我们首先介绍基于对比学习思想的具有局部损失的修改后的局部网络架构。然后我们讨论如何改进现有的压缩感知技术以适应我们的联邦学习模型,最后介绍 MCFL-CS 的总体结构。为了便于参考,表二总结了一些重要的符号。

A. 具有局部丢失的改进网络架构

根据第二节,我们知道传统网络架构下FL方案的全局模型精度很容易受到数据异构性的影响,甚至导致模型无法使用。为此,我们重新设计了MCFL-CS的本地网络架构。此外,我们结合模型对比损失和交叉熵损失来定义新的损失函数来优化局部训练。

受最近对比学习算法的启发,我们重新设计了 MCFL-CS 的本地网络架构,以减轻数据异构性对全局模型精度的影响。与传统的对比学习相比,我们的方案的不同之处在于损失函数目标的设置和损失函数目标。在传统的对比学习中,目标是通过比较潜在空间中的正样本和负样本来学习数据的良好表示。在训练之前,往往需要进行数据增广操作设置。而在我们的 MCFL-CS 中,目标是学习跨多个客户端的模型共享表示,而不与中央服务器共享原始数据。目标是学习一种可用于对新客户数据做出良好预测的表示,同时维护每个客户数据的隐私。我们直接处理模型(而不是样本)。如图所示图3,网络架构包括三个主要组成部分:

 

 

B. 改进的压缩感知方法

当本地训练完成时,每个随机选择的客户端倾向于将其完整模型更新发送到中央服务器。由于平均具有数百万个参数的模型存在维数灾难,因此网络可能会承受高流量和通信成本。压缩传感[18] , [19]是减少通信开销的有效方法。与基于奈奎斯特-香农定理的其他采样技术相比,它的目的是利用信号的稀疏性从更少的样本中恢复原始信号。然而,传统的压缩感知方法仅上传梯度的一些随机频率分量,这容易导致精度损失。因此,我们提出了一种改进的压缩感知方法,可以在不损失精度的情况下显着降低通信成本。总体而言,改进的压缩感知方法可能是减少模型精度损失并减少通信和计算开销的更好选择。此外,基于改进的压缩感知方法和DP的FL可以通过压缩和传输模型参数来提高模型的鲁棒性和安全性,并减少通信和计算开销。与传统的基于DP、HE和SMC的FL方案相比,该方法引入的噪声较少,不存在复杂的同态运算和通信交互。此外,该方法可以大大减轻数据传输和存储的负担,有效防止数据泄露和攻击,提高模型的训练速度和效率,从而提高模型的准确性。

我们改进的压缩感知方法由三个过程组成:(1)模型打包,(2)DCT压缩,(3)IDCT重建。这些过程详细描述如下。

Model Packing. There are structural differences between different models, and the structure of the model parameters obtained through local training is also different. To be more compatible with models of different structures, we propose an “index block” based on the idea of a single continuous storage. For simplicity, we use packing(⋅) to denote a general model packing method which can shield the structural differences between different models by packing the model parameters. At the same time, the continuous storage mechanism is simple to manage and easy to use, and its computational cost is linear.

如图5所示,模型参数将按顺序打包。本文默认每个子包的容量为200*200。对于长度超过子包容量的模型参数,会被分成多个小块,存放在相邻的子包中。另外,对于同一个子包中存储多个模型参数的情况,会进行连续密集的打包。根据子包号和包内的偏移量来定位模型参数,并通过索引记录每个模型参数的存储位置和体积。

 

这种线性度允许将 DP、安全聚合和我们改进的压缩传感方法结合起来。这里压缩的局部模型更新是通过 DCT 获得的,它通过减少模型大小和添加额外的噪声来加速模型收敛。同时,沟通成本也大大降低。此外,聚合后,我们可以使用IDCT在中央服务器上无损地重建全局模型。

C. MCFL-CS 的构建

我们的方案包括五个过程,即局部训练、模型打包和压缩、模型加密、安全聚合和模型重建

客户端Ci在收到全局模型后,基于模型对比损失和监督学习损失进行局部训练,得到局部模型更新。

接下来,Ci对本地模型更新进行模型打包和压缩操作,

然后对更新进行加密,

最后将加密的本地模型更新发送到中央服务器。

中央服务器通过安全聚合的方式对收集到的加密更新进行聚合,然后结合动量累积和错误修正来修正全局模型更新,最后通过IDCT对全局模型进行解压和重构。中央服务器将新的全局模型返回给所有客户。

安全分析


中央服务器只能访问经过充分扰动的加密模型更新,以确保DP。任何可以从加密的模型更新中推断出的客户的私人信息都会被会计师追踪到。

矩值会计师跟踪隐私损失的矩值边界(定义见下文公式23)。它概括了跟踪(ϵ,δ)的标准方法,并使用强组合定理。我们表明,它可以适用于随机抽样的高斯机制的组合,并对算法4的隐私损失提供更严格的估计。

隐私损失是一个随机变量,取决于加入算法的随机噪声。一个机制A是(ϵ,δ)-差异性隐私,这相当于A的隐私损失的某个尾部界限。虽然尾部界限是关于分布的非常有用的信息,但直接由它组成会导致相当宽松的界限。我们改用计算隐私损失的矩生成函数的对数来评估。然后,我们使用时刻约束来获得尾部约束。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:本文为AI(人工智能)语言模型输出的结果,可能需要人工修订。 暂无NSL-KDD数据集,下面给出的是在CIFAR-10数据集上训练的联邦学习模型,可以参考实现方法。 首先,我们需要准备数据集,并按照设定的参与者(client)数量划分数据集。 ```python import copy import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader, Subset # 数据增强以及归一化处理 train_transform = transforms.Compose( [ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ] ) test_transform = transforms.Compose( [ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ] ) # 加载CIFAR-10数据集 train_dataset = datasets.CIFAR10(root="./data", train=True, download=True, transform=train_transform) test_dataset = datasets.CIFAR10(root="./data", train=False, download=True, transform=test_transform) # 划分成 5 个客户端,并创建对应的 DataLoader clients_num = 5 clients_data_size = len(train_dataset) // clients_num clients_datasets = [] for i in range(clients_num): start_idx = i * clients_data_size end_idx = (i + 1) * clients_data_size if i != clients_num - 1 else len(train_dataset) data_subset = Subset(train_dataset, range(start_idx, end_idx)) clients_datasets.append(data_subset) clients_data_loaders = [ DataLoader(dataset, batch_size=64, shuffle=True, drop_last=True) for dataset in clients_datasets ] test_data_loader = DataLoader(test_dataset, batch_size=128, shuffle=False) ``` 接着,我们需要定义模型以及训练逻辑。 ```python # 定义模型 class CnnClassifier(nn.Module): def __init__(self, num_classes=10): super(CnnClassifier, self).__init__() self.main = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1), nn.BatchNorm2d(128), nn.ReLU(inplace=True), nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1), nn.BatchNorm2d(256), nn.ReLU(inplace=True), nn.AvgPool2d(kernel_size=4), nn.Flatten(), nn.Linear(256, num_classes), ) def forward(self, x): return self.main(x) # 训练单个客户端模型 def train(model, train_loader, criterion, optimizer, device): model.train() total_loss, correct, total = 0, 0, 0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() output = model(images) loss = criterion(output, labels) loss.backward() optimizer.step() total_loss += loss.item() * images.shape[0] _, predicted = output.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() avg_loss = total_loss / total accuracy = correct / total return avg_loss, accuracy # 在测试集上验证多个客户端模型 def validate(model, data_loader, criterion, device): model.eval() total_loss, correct, total = 0, 0, 0 with torch.no_grad(): for images, labels in data_loader: images, labels = images.to(device), labels.to(device) output = model(images) loss = criterion(output, labels) total_loss += loss.item() * images.shape[0] _, predicted = output.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() avg_loss = total_loss / total accuracy = correct / total return avg_loss, accuracy # 定义联邦学习主流程 def federated_train(clients_models, clients_loaders, test_loader, num_epochs, criterion, optimizer, device, model_type="average"): """ clients_models: 初始参与者模型列表 clients_loaders: 初始参与者训练集 DataLoader 列表 test_loader: 验证集 DataLoader num_epochs: 训练轮数 criterion: 损失函数 optimizer: 优化器 device: 设备 model_type: 聚合模型类型 - "last": 取最后一次的模型参数 - "average": 取平均模型参数 """ best_avg_loss = float("inf") best_accuracy = 0 server_model = copy.deepcopy(clients_models[0]) server_model.to(device) for epoch in range(num_epochs): print(f"Epoch {epoch + 1}\n{'-' * 10}") # 分别在每个客户端上进行训练 clients_models_copy = copy.deepcopy(clients_models) for i, (client_model, train_loader) in enumerate(zip(clients_models_copy, clients_loaders)): print(f"Client {i}") client_loss, client_acc = train(client_model, train_loader, criterion, optimizer, device) print(f"Loss: {client_loss:.4f} | Accuracy: {client_acc:.4f}\n") # 使用“平均”或“最后”的方式聚合所有参与者的模型参数 if model_type == "average": for param in server_model.parameters(): param.data *= 0 for client_model in clients_models_copy: for param, client_param in zip(server_model.parameters(), client_model.parameters()): param.data += client_param.data for param in server_model.parameters(): param.data /= len(clients_models) elif model_type == "last": server_model = copy.deepcopy(clients_models_copy[-1]) # 在验证集上验证聚合后的模型 test_loss, test_acc = validate(server_model, test_loader, criterion, device) print(f"Test Loss: {test_loss:.4f} | Test Accuracy: {test_acc:.4f}\n") # 根据模型准确率进行模型保存 if test_loss <= best_avg_loss and test_acc >= best_accuracy: print(f"Saving model...\n") best_avg_loss = test_loss best_accuracy = test_acc return server_model, best_avg_loss, best_accuracy ``` 接着,我们可以初始化参与者模型并运行联邦学习。 ```python # 初始化参与者模型 clients_models = [CnnClassifier() for _ in range(clients_num)] # 定义超参数 num_epochs = 10 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(clients_models[0].parameters(), lr=0.1, momentum=0.9) # 开始联邦学习 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") federated_train(clients_models, clients_data_loaders, test_data_loader, num_epochs, criterion, optimizer, device, model_type="average") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值