本文受众
本文旨在为对探索联邦学习中自定义聚合方案感兴趣的机器学习从业者、研究人员和工程师提供指导。对于希望在真实分布式环境中设计、测试和分析新型聚合方法的人员来说,本文尤为实用。
引言
机器学习(ML)持续推动着医疗、金融和国防等多个领域的创新。然而,尽管ML模型高度依赖大规模高质量的集中式数据,但数据隐私、所有权和法规遵从等方面的担忧依然构成了显著障碍。
联邦学习(FL)通过支持跨分布式数据集进行模型训练来应对这些挑战,它允许数据保持去中心化,同时仍为共享的全局模型做出贡献。这种去中心化的方法使得联邦学习在集中数据不切实际或受到限制的敏感领域中尤为宝贵。
为了充分利用联邦学习的潜力,理解和设计自定义聚合方案至关重要。有效的聚合不仅影响模型的准确性和鲁棒性,还能处理数据异质性、客户端可靠性和对抗行为等问题。因此,分析和构建定制的聚合方法是优化性能并确保联邦学习环境中公平性的关键一步。
在前一篇文章中,我们探讨了联邦学习中的网络攻击格局及其与传统集中式ML的区别。该讨论引入了Scaleout的开源攻击模拟工具包,该工具包帮助研究人员和从业者分析各种攻击类型的影响,并评估现有缓解方案的局限性,尤其是在数据极度不平衡、非独立同分布(non-IID)以及存在滞后者或后期加入者等挑战性条件下。
然而,那篇文章并未涵盖如何在实时分布式环境中设计、实现和测试自定义方案。
这听起来可能很复杂,但本文将提供一个快速分步指南,涵盖设计和开发适用于真实联邦学习设置的自定义聚合方案所需的基本概念。
什么是 服务器函数(Server Functions)?
自定义聚合器(Custom Aggregators)是运行在联邦学习服务器端的函数。它们定义了如何处理来自客户端的模型更新,例如聚合、验证或过滤,以生成下一个全局模型。在Scaleout Edge AI平台中,服务器函数(Server Function)是用于指代自定义聚合器的术语。
除了简单的聚合,服务器函数还使研究人员和开发人员能够设计新的方案,以纳入隐私保护、公平性、鲁棒性和收敛效率。通过定制这一层,还可以试验创新的防御机制、自适应聚合规则或针对特定数据和部署场景量身定制的优化方法。
服务器函数是Scaleout Edge AI平台中实现自定义聚合方案的机制。除了这种灵活性,该平台还包含四种内置聚合器:FedAvg(默认)、FedAdam(FedOpt)、FedYogi(FedOpt)和FedAdaGrad(FedOpt)。FedOpt家族方法的实现遵循了相关论文中描述的方法。欲了解更多详情,请参阅平台文档。
构建自定义聚合方案
本文将演示如何利用Scaleout的Edge AI平台构建和测试自己的攻击缓解方案。其中一个关键实现要素就是该平台的服务器函数功能。
本文的重点将放在如何在地理分布式设置中开发和执行自定义聚合过程。为简化说明,将跳过基本设置,并假设读者已熟悉Scaleout平台。如果您是初次接触,以下是一些有用的资源:
联邦学习快速入门示例:https://docs.scaleoutsystems.com/en/stable/quickstart.html
框架架构:https://docs.scaleoutsystems.com/en/stable/architecture.html
客户端API参考:https://docs.scaleoutsystems.com/en/stable/apiclient.html
服务器函数指南:https://docs.scaleoutsystems.com/en/stable/serverfunctions.html
示例:标签翻转攻击
我们来看一个具体的攻击案例——标签翻转攻击。在这种场景下,恶意客户端有意更改其本地数据集中的标签(例如,将“猫”翻转为“狗”)。当这些被污染的更新发送到服务器时,全局模型会学习到不正确的模式,导致准确性和可靠性降低。
本次实验使用了MNIST开源数据集,并将其划分为六个分区,每个分区分配给一个独立的客户端。其中,client-6作为恶意参与者,通过翻转其本地数据中的标签进行训练,并将生成的本地模型发送给聚合器。

Scaleout Edge平台上的连接客户端视图(图片由作者创建)
| 恶意客户端 | ID |
|---|---|
| client-6 | 07505d04-08a5-4453-ad55-d541e9e4ef57 |
这里可以看到client-6中一个数据点(灰度图像)的示例,其中标签被有意翻转。通过更改标签,该客户端试图在聚合过程中破坏全局模型。

例如,在Client-6的修改数据集中,原始标记为9的图像标签被更改为5(图片由作者创建)。
任务
阻止client-6干扰全局模型的开发。
使用余弦相似度进行缓解
为了对抗这种攻击,本文以基于余弦相似度的方法为例。其思路直接明了:将每个客户端的更新向量与全局模型进行比较(步骤1)。如果相似度得分低于预设阈值(s̄ᵢ < 𝓣),则该更新可能来自恶意客户端(步骤2-4)。在最后一步(步骤5),该客户端的贡献将被排除在聚合过程之外,这里使用加权联邦平均(FedAVG)方案。

所实现方法的数学表示(图片由作者创建)。
注意:这是一种简单的攻击缓解方案,主要目的是演示在真实联邦学习场景中支持自定义聚合的灵活性。对于高度挑战性的情况,例如数据集不平衡或非独立同分布(non-IID)条件,同样的方案可能无效。
下面的Python实现展示了自定义聚合器的工作流程:识别在线客户端(步骤1)、计算余弦相似度得分(步骤2-3)、排除恶意客户端(步骤4)以及执行联邦加权平均(步骤5)。
步骤1
# --- 计算增量 (客户端模型 - 上一个全局模型) ---
prev_flat = self._flatten_params(previous_global)
flat_deltas, norms = [], []
for params in client_params:
flat = self._flatten_params(params)
delta = flat - prev_flat
flat_deltas.append(delta)
norms.append(np.linalg.norm(delta))
步骤2和3
# --- 余弦相似度矩阵 ---
similarity_matrix = np.zeros((num_clients, num_clients), dtype=float)
for i in range(num_clients):
for j in range(i + 1, num_clients):
denom = norms[i] * norms[j]
sim = float(np.dot(flat_deltas[i], flat_deltas[j]) / denom) if denom > 0 else 0.0
similarity_matrix[i, j] = sim
similarity_matrix[j, i] = sim
# --- 每个客户端的平均相似度 ---
avg_sim = np.zeros(num_clients, dtype=float)
if num_clients > 1:
avg_sim = np.sum(similarity_matrix, axis=1) / (num_clients - 1)
for cid, s in zip(client_ids, avg_sim):
logger.info(f"Round {self.round}: Avg delta-cosine similarity for {cid}: {s:.4f}")
步骤4
# --- 标记可疑客户端 ---
suspicious_indices = [i for i, s in enumerate(avg_sim) if s < self.similarity_threshold]
suspicious_clients = [client_ids[i] for i in suspicious_indices]
if suspicious_clients:
logger.warning(f"Round {self.round}: Excluding suspicious clients: {suspicious_clients}")
# --- 仅保留非可疑客户端 ---
keep_indices = [i for i in range(num_clients) if i not in suspicious_indices]
if len(keep_indices) < 3: # 安全保障
logger.warning("Too many exclusions, falling back to ALL clients.")
keep_indices = list(range(num_clients))
kept_client_ids = [client_ids[i] for i in keep_indices]
logger.info(f"Round {self.round}: Clients used for FedAvg: {kept_client_ids}")
步骤5
# === 加权联邦平均 ===
weighted_sum = [np.zeros_like(param) for param in previous_global]
total_weight = 0
for i in keep_indices:
client_id = client_ids[i]
client_parameters, metadata = client_updates[client_id]
num_examples = metadata.get("num_examples", 1)
total_weight += num_examples
for j, param in enumerate(client_parameters):
weighted_sum[j] += param * num_examples
if total_weight == 0:
logger.error("Aggregation failed: total_weight = 0.")
return previous_global
new_global = [param / total_weight for param in weighted_sum]
logger.info("Models aggregated with FedAvg + cosine similarity filtering")
return new_global
完整代码可在Github获取:https://github.com/sztoor/serverfunctionscosinesimilarityexample.git
服务器函数的分步激活
- 登录Scaleout Studio并创建一个新项目。
- 将计算包(Compute Package)和种子模型(Seed Model)上传到项目。
- 通过pip安装Scaleout的客户端库(# pip install fedn)将客户端连接到Studio。本示例中连接了六个客户端。
注意:关于步骤1-3的详细说明,请参阅快速入门指南。
-
从提供的链接克隆Github仓库。该仓库包含两个Python文件:
- server_functions.py – 包含了基于余弦相似度的聚合方案。
- scaleout_start_session.py – 连接到Studio,推送本地服务器函数,并根据预定义设置(例如,5轮,180秒的轮次超时)启动训练会话。
-
执行scaleoutstartsession.py脚本。
有关这些步骤的完整详情,请参阅官方的服务器函数指南。
结果与讨论
运行scaleout_start_session.py所涉及的步骤概述如下。
在此设置中,六个客户端连接到Studio,其中client-6使用故意翻转的数据集来模拟恶意行为。Scaleout Studio的日志提供了服务器函数执行和系统在聚合过程中响应的详细视图。在第1节中,日志显示服务器成功接收到所有客户端的模型,证实通信和模型上传按预期运行。第2节展示了每个客户端的相似度得分。这些得分量化了每个客户端的更新与总体趋势的对齐程度,为检测异常提供了指标。
第1节
2025-10-20 11:35:08 [INFO] Received client selection request.
2025-10-20 11:35:08 [INFO] Clients selected: ['eef3e17f-d498-474c-aafe-f7fa7203e9a9', 'e578482e-86b0-42fc-8e56-e4499e6ca553', '7b4b5238-ff67-4f03-9561-4e16ccd9eee7', '69f6c936-c784-4ab9-afb2-f8ccffe15733', '6ca55527-0fec-4c98-be94-ef3ffb09c872', '07505d04-08a5-4453-ad55-d541e9e4ef57']
2025-10-20 11:35:14 [INFO] Received previous global model
2025-10-20 11:35:14 [INFO] Received metadata
2025-10-20 11:35:14 [INFO] Received client model from client eef3e17f-d498-474c-aafe-f7fa7203e9a9
2025-10-20 11:35:14 [INFO] Received metadata
2025-10-20 11:35:15 [INFO] Received client model from client e578482e-86b0-42fc-8e56-e4499e6ca553
2025-10-20 11:35:15 [INFO] Received metadata
2025-10-20 11:35:15 [INFO] Received client model from client 07505d04-08a5-4453-ad55-d541e9e4ef57
2025-10-20 11:35:15 [INFO] Received metadata
2025-10-20 11:35:15 [INFO] Received client model from client 69f6c936-c784-4ab9-afb2-f8ccffe15733
2025-10-20 11:35:15 [INFO] Received metadata
2025-10-20 11:35:15 [INFO] Received client model from client 6ca55527-0fec-4c98-be94-ef3ffb09c872
2025-10-20 11:35:16 [INFO] Received metadata
2025-10-20 11:35:16 [INFO] Received client model from client 7b4b5238-ff67-4f03-9561-4e16ccd9eee7
第2节
2025-10-20 11:35:16 [INFO] Receieved aggregation request: aggregate
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for eef3e17f-d498-474c-aafe-f7fa7203e9a9: 0.7498
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for e578482e-86b0-42fc-8e56-e4499e6ca553: 0.7531
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for 07505d04-08a5-4453-ad55-d541e9e4ef57: -0.1346
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for 69f6c936-c784-4ab9-afb2-f8ccffe15733: 0.7528
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for 6ca55527-0fec-4c98-be94-ef3ffb09c872: 0.7475
2025-10-20 11:35:16 [INFO] Round 0: Avg delta-cosine similarity for 7b4b5238-ff67-4f03-9561-4e16ccd9eee7: 0.7460
第3节
2025-10-20 11:35:16 [WARNING] Round 0: Excluding suspicious clients: ['07505d04-08a5-4453-ad55-d541e9e4ef57']
第4节
2025-10-20 11:35:16 [INFO] Round 0: Clients used for FedAvg: ['eef3e17f-d498-474c-aafe-f7fa7203e9a9', 'e578482e-86b0-42fc-8e56-e4499e6ca553', '69f6c936-c784-4ab9-afb2-f8ccffe15733', '6ca55527-0fec-4c98-be94-ef3ffb09c872', '7b4b5238-ff67-4f03-9561-4e16ccd9eee7']
2025-10-20 11:35:16 [INFO] Models aggregated with FedAvg + cosine similarity filtering
第3节突出显示了client-6(ID …e4ef57)被识别为恶意客户端。警告消息表明该客户端将被排除在聚合过程之外。这种排除是合理的,因为其相似度得分极低,为–0.1346,是所有客户端中最低的,并且低于服务器函数中设置的阈值(𝓣)。通过移除client-6,聚合步骤确保全局模型不受异常更新的不利影响。第4节随后列出了包含在聚合中的客户端ID,确认只有受信任的客户端对更新后的全局模型做出了贡献。
任务达成
使用自定义聚合方案,client-6已成功从聚合过程中被排除。
除了日志消息,该平台还提供了丰富的、每个客户端的洞察力,增强了对客户端行为的理解。这些洞察包括每个客户端的训练损失和准确率、全局模型性能指标以及每个客户端的训练时间。另一个关键功能是模型轨迹,它跟踪模型随时间的更新,并能详细分析单个客户端如何影响全局模型。综合这些部分和补充数据,提供了一个全面的客户端贡献视图,清晰地说明了正常客户端与恶意client-6(ID …e4ef57)之间的区别,并展示了服务器函数在缓解潜在攻击方面的有效性。

每个客户端的训练准确率。Client-6(ID …e4ef57)的准确率最低(图片由作者创建)。

所有客户端的训练损失。Client-6(ID …e4ef57)显示出最高的损失值(图片由作者创建)。

全局模型在连续五轮中的准确率(图片由作者创建)。
客户端训练准确率和损失曲线突出了每个客户端的性能。它们表明client-6与其他客户端显著偏离。将其纳入聚合过程将损害全局模型的性能。
总结
本文强调了自定义聚合器在解决特殊需求、以及在联邦机器学习设置中开发鲁棒、高效和高准确度模型方面的重要性。它还强调了利用现有构建块的价值,而不是从零开始,耗费大量时间在并非核心思想的组件上。
联邦学习提供了一种强大的方式来解锁难以或甚至不可能集中到单一位置的数据集。像这样的研究表明,尽管这种方法极具前景,但也需要仔细理解底层系统。幸运的是,现有平台使得探索真实世界用例、试验不同的聚合方案以及设计针对特定需求的解决方案变得更加容易。
有用链接
- Scaleout Studio中的自定义服务器函数
- Scaleout Studio入门
- 联邦学习详解:概念、优势与实际应用
- 使用最少资源进行跨设备联邦机器学习
- Scalable federated machine learning with FEDn,2022 22nd IEEE International Symposium on Cluster, Cloud and Internet Computing (CCGrid).
