小区业委会要编一本《社区百家菜谱》:每户人家在自己厨房里做菜、试味,只把改良后的配方交到业委会,由业委会汇总出最新版菜谱再发回各家。这样谁也不用到别人家翻冰箱,隐私保住了,菜谱却越编越好——这套玩法,就是联邦学习。 但林子大了,什么鸟都有。总有一两个住户不安好心:有的把配方里的盐写成二十斤,一锅菜瞬间齁到没法吃;有的故意把“加糖”写成“加盐”,让整本菜谱串味;还有的在配方里藏一个小机关,让菜谱在特定时刻出错。业委会要是对每份配方照单全收,一桌好菜就会被搅成一锅乱炖。 于是,业委会需要一套“坏心眼侦察术”:看看谁的配方口味离大谱、谁在人群里不合群、给每户记一本积分账、连盯好几轮防止冤枉好人;还要把“怀疑的尺度”校准好,既不能草木皆兵误伤热心邻居,也不能反应太慢让坏配方混进菜谱。这本侦察手册,就是我们要讲的——联邦学习里的恶意客户端检测。
掌握恶意客户端检测,是联邦学习安全运维的必修课——AI 从业者借此理解“分布式信任”的工程实现,直接对接口碑、风控、IoT 等真实联邦平台的客户端准入与监控体系设计。
可视化演示
动态演示联邦学习恶意客户端检测的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
联邦学习恶意客户端检测:恶意客户 恶意客户端检测的基本框架与威胁 基于梯度异常分析的统计检测方法 核心机制可视化 联邦学习恶意客户端检测整体架构与关键组件
一、威胁模型认知
百家宴的规矩是各户交配方,但有些人不是来分享的,而是来搅局的。要逮住他们,第一步不是动手,而是先翻开“坏人档案簿”:他们通常用什么招?长什么样?最想要什么?把这些摸清了,后头的侦察才有方向。
在联邦学习中,“搅局者”被称为恶意客户端,它们通过篡改本地数据或上传的模型更新来影响全局模型,这类攻击统称投毒攻击(Poisoning Attack)。检测系统的第一课,就是建立威胁模型——把攻击者的手法、特征和目标抽象成可识别的画像。
常见投毒攻击分三类。一是数据投毒:攻击者污染本地训练数据,典型如标签翻转,训练出的模型更新已经“带病上岗”;二是模型投毒:直接篡改上传的梯度,比如把梯度幅值放大数倍、反方向提交或注入随机噪声;三是后门注入:在更新中植入特定触发器,使全局模型遇到指定输入时产生错误输出。恶意客户端在统计上也有共性:梯度方向与主流不一致、更新范数异常大、跨轮行为忽好忽坏。它们的核心目标无非三种:拉低全局精度、埋后门、拖慢模型收敛。
所以威胁模型认知,就像业委会先把坏人档案背熟:知道他们爱往配方里加什么料、伪装成什么风格、图谋什么东西。有了这份档案,后面的每一条侦察术——离群判定、聚类、信誉分——才有的放矢。
- 真实梯度第 t 轮客户端 i 在自己数据上学习到的正常更新方向,相当于“真心实意按自家菜谱改进”。
- 恶意扰动攻击者注入的偏差,数据投毒、模型投毒、后门注入都可以统一写成这种“加料”。
- 观测结果服务器实际收到的是叠加了扰动后的污染梯度,也是检测器唯一的“第一手现场”。
二、梯度异常检测
配方交上来后,业委会怎么快速挑出可疑分子?最朴素的办法是“凭舌头比较”——看看每份配方和大多数人认可的基准口味差多远,差得特别离谱的先记上小本本。
对应到技术上,这叫梯度异常检测。服务器把每个客户端提交的模型更新与全局模型作比较,计算一个“距离”,再用一个不太容易被坏人影响的标准来判断:多远才算离谱?
距离度量常用 L2 范数(欧氏距离),也有用余弦相似度、相对熵的。关键在第二步——基准与尺度的选择。如果用均值当基准,恶意客户端分分钟把均值拉偏,得出“大家都疯了”的错误结论。更稳妥的做法是用中位数当基准,用 MAD(中位数绝对偏差)当尺度,两者都对极端值不敏感,统计上叫“稳健统计量”。把距离标准化成 z 分数后,超过阈值(如 3)的客户端直接进入嫌疑名单。
这就像业委会不先问“平均口味”,而是先找“大多数人的中间口味”,再用“大家偏离中间口味的典型幅度”当尺子去量。个别邻居把盐放了三倍,一量便原形毕露——这就是统计检测揪出“盐放二十斤”那双手的原理。
- 距离计算每个客户端更新与全局模型之间的欧氏距离,离得越远,口味越怪。
- 稳健基准取所有客户端距离的中位数而非均值,防止恶意值把“正常口味”拉偏。
- 稳健尺度MAD 是中位数绝对偏差,乘 1.4826 后近似等于标准差,量化“正常波动有多大”。
- 异常判定只有 z 分数超过阈值 τ(如 3)的客户端才会被判为可疑。
三、行为聚类分析
单看一份配方,也许难断善恶;但把几十户的配方摊开,业委会会发现热心邻居们的风格总是扎堆——酱油多寡差不多、步骤详略差不多。而某个配方孤零零飘在人群之外,就格外扎眼。
这启发了一种无监督检测思路:行为聚类。它不预先定义“什么是正常”,而是把客户端的历史行为压缩成特征向量,放进同一个特征空间,让主流行为自动聚成几个簇;落在小簇、或离所有簇都很远的点,就是候选的孤立点。
特征提取是关键一步:梯度方向、更新范数、前后轮更新一致性、参与频率等,都可以压缩成低维向量。聚类算法可选 K-Means(需指定簇数)、DBSCAN(无需指定簇数、天然支持孤立点标记)、层次聚类等。孤立点识别可以基于“到所属簇质心的标准化距离”,也可以直接采用 DBSCAN 的噪声点标记。
百家宴上,寡淡的、重口的、爱用香料的自然扎堆。突然有一份配方又咸又甜、风格对不上任何一堆,它的“不合群指数”就会爆表。业委会不必知道它具体哪里坏了,只要知道它不属于任何主流群体,就值得多盯几眼——这正是无监督检测的魅力。
- 归属主流簇每个客户端按行为特征找到自己最像的簇,对应风格最接近的那一堆邻居。
- 主流质心该簇的质心代表这群客户端的“共同风格”。
- 不合群指数与质心的距离除以簇内标准差,归一化后数值越大,说明该客户端越孤僻。
四、信誉评分机制
光凭一次可疑就赶人,容易误伤。业委会决定给每户建一本积分账:提交正常配方,加分;行为可疑,扣分。积分掉到红线以下,直接取消下一届百家宴的参与资格。
这就是信誉评分机制(Reputation-based Dynamic Removal)。服务器为每个客户端维护一个连续变化的信誉分,结合检测结果做“奖惩式”更新,长期低于阈值或持续下降的客户端就从参与集合中动态剔除。
更新规则通常“惩重奖轻”:每次可疑扣 β 分,每次正常加 α 分,且 β > α,让破坏一次的成本远高于正常贡献多次的收益。对于证据不确凿的,可以设置“观察带”小扣分;被冤枉的客户端在后续轮次表现正常,则逐步恢复。冷启动问题——新客户端没有历史积分——通常用“观察员身份”解决:给一个中等初始分(如 55),先只读不参与加权聚合,试运行几轮再定档。
积分账的好处是“记性长”。偶尔糊涂的好邻居扣几分还能补回来;持续捣蛋的家伙积分一路滑坡,跌到红线就出局。这既给了悔改机会,又不给惯犯留余地——比“一次定罪、终身拉黑”公平得多,也稳健得多。
- 当前信誉客户端 i 在第 t 轮结束时的信誉分,新客户端初始 100。
- 正常奖励本轮判定正常则加 α 分,小步快跑,鼓励持续贡献好配方。
- 可疑惩罚本轮判定可疑则扣 β 分,且 β > α,体现“做坏事的代价更大”。
- 区间剪裁clip 把分数限制在 0~100;低于剔除阈值(如 55)则移出聚合。
五、多轮验证方法
业委会明白,谁都有发挥失常的时候:也许是邻居熬夜把糖当盐,也许是网络抖动把配方传丢了。所以,单轮异常绝不拍板,要连续几轮盯住同一个对象,看异常到底是“偶发事故”还是“持之以恒的恶意”。
这就是多轮验证(Multi-round Verification):把检测从“单轮快照”升级成“时间序列审判”。系统记录每个客户端在历史各轮的检测结论,用命中率或累计可疑度决定是否正式定罪,从机制上摊薄单轮的噪声。
具体做法有三种。交互式验证:对高分嫌疑者下发探针任务,比如要求它用同一批数据重训并提交两次更新,比对两次结果是否一致;历史行为追踪:把跨轮的梯度模式、信誉轨迹、异常命中率串成时间线;误判纠正:被误标者后续连续正常时,触发恢复流程、补回信誉并解除隔离。
连续几轮盯梢,就像业委会在嫌疑户楼下多站了几个班:坏邻居早晚露出马脚,而被误会的邻居则被“无罪释放”,信誉照常恢复。多轮验证给检测加上了“证据链”,让定罪经得起推敲。
- 观察窗口取最近 T 轮(如 T=5)作为定罪依据,避免“一锤子买卖”。
- 单轮判定第 t 轮检测器对客户端 i 的结论,命中恶意记 1、否则记 0。
- 恶意命中率窗口内被判恶意的比例,反映攻击行为的“持续性”。
- 定罪阈值命中率超过 θ(如 0.6)才发起剔除或降权,给偶发失常留活路。
六、误报率控制
菜谱审查最难的不是逮坏人,而是别冤枉好人。一个热心邻居因为自家口味偏淡就三天两头被点名,下一届他还会来交配方吗?反过来,尺度太松,坏配方又会畅通无阻。业委会得把“怀疑的尺度”校准到刚刚好。
在检测领域,这把尺度就是判定阈值,而校准则围绕两类错误展开:误报(False Positive,把正常客户端判为恶意)和漏报(False Negative,把恶意客户端放过去)。误报率 FPR 与漏报率 FNR 是一对此消彼长的指标。
误报的最大来源是 Non-IID 数据异构——各客户端本地数据分布天然不同,正常梯度差异也很大,极易被统计方法误判。控制手段包括:用中位数、MAD 替代均值、方差;在带标注的验证集上扫描阈值;引入“可容忍带”(borderline 先观察、不剔除)缓冲模糊地带。安全敏感场景可调大漏报的代价权重 λ,宁可多查也不放过。
好比业委会定了规矩:冤枉一个好邻居的代价,相当于放跑三个坏邻居(λ=3),于是尺子略偏向“宁严勿松”,但又不至于严到人人自危。校准的本质不是追求零误报,而是在两类错误之间找到组织能接受的那个平衡点。
- 误报率所有正常客户端中被冤枉的比例,越低越不让好人寒心。
- 漏报率所有恶意客户端中漏网的比例,越低系统越安全。
- 权衡系数λ 表示漏报相对误报的代价权重,安全敏感场景取大值。
- 最优阈值在验证集上找使“误报 + 加权漏报”之和最小的 τ,作为怀疑尺度。
七、工程部署实践
光有侦察理论还不够。业委会每天要处理几百份配方:既要快,不能让大家饿着肚子等菜谱;又要和“配方汇总”无缝衔接,不能检测归检测、做菜归做菜。
真实联邦学习平台上,恶意检测必须解决两道工程题:实时性开销,以及与鲁棒聚合的协同。检测负责把明显有害的客户端挡在聚合门外,鲁棒聚合则作为“后厨质检员”,对侥幸漏网的扰动做二次消毒。
实时性优化有三个抓手:增量式信誉更新(只算本轮变化,不重算全部历史)、异步检测流水线(上一轮聚合的同时检测下一轮梯度)、检测与聚合并行计算。鲁棒聚合如 Krum、Trimmed Mean、坐标中位数,对异常更新天然不敏感,与检测互补。此外还要配监控告警:信誉分走势图、异常命中率雷达、剔除审计日志,让安全运营可以及时人工干预。
检测像门卫,把带刀的挡在门外;鲁棒聚合像后厨质检员,对混进来的材料再尝一口。两道关卡各司其职、并行不误,百家宴才能既快又稳地开席——这就是恶意客户端检测在真实系统中的最终形态。
- 可信集合通过检测且信誉分达标的客户端才能进入本轮聚合。
- 鲁棒聚合器对可信更新做稳健合成,如按范数裁剪后取平均(Trimmed Mean)。
- 全局更新合成出的下一轮全局模型,安全又高效地发给所有客户端继续迭代。
AI 应用场景
金融风控联盟中的恶意参与方拦截
阶段:模型训练阶段的数据可信保障
解决的问题:传统方式只监控聚合后的全局指标(如 AUC),定位不到是哪家参与方“带病训练”;内鬼机构可以合法地提交有毒梯度。AI 检测在每轮聚合前计算梯度稳健 z 分数并维护信誉分,把异常参与方挡在聚合门外。
具体案例:某银行间反欺诈联盟(12 家机构)部署“MAD z 分数 + 信誉分”双层检测。第 6 轮起一家机构的梯度因标签翻转异常,第 8 轮信誉跌破 55 被自动剔除,全局模型 AUC 从 0.72 回升到 0.84,后续 20 轮再无投毒痕迹。
智能终端联邦推荐的后门防御
阶段:模型聚合与上线前的安全监控
解决的问题:手机输入法、智能音箱等厂商用联邦学习做个性化推荐,攻击者可以注册大量僵尸设备参与训练并植入后门。传统基于规则的过滤无法区分“真实用户差异”和“攻击行为”,容易大面积误杀正常设备。
具体案例:某智能音箱厂商对 50 万台设备的更新做行为聚类 + 多轮验证:先压缩出低维行为特征,聚类后检出 3 个异常小簇,再经 5 轮交叉验证确认其中 2 簇是僵尸设备群,执行剔除并触发告警,语音指令误识别率从 6.1% 降回 1.2%。
医疗影像联邦学习的信任准入
阶段:客户端接入与持续合规监控
解决的问题:多家医院影像数据不出院,通过联邦学习共建病灶识别模型。新接入的院区标注规范可能不一致,也可能存在竞争性恶意参与。用“冷启动观察期 + 信誉分门禁”解决“新客户不可信也不可不用”的矛盾。
具体案例:某区域医疗影像联盟(8 家医院)给两个新建院区设初始信誉 55 分(观察档),前 3 轮只读不参与加权聚合,表现正常后升入正式档。上线 6 个月零投毒事件,误报率稳定在 1.5% 以下。
Python 演示
import numpy as np np.random.seed(42)DIM = 32N_CLIENTS = 10N_ROUNDS = 12MAL_IDS = {3, 7}EVICT_SCORE = 55Z_THRESHOLD = 3.0 class ReputationLedger: """信誉账本:记录并更新每个客户端的信誉分""" def __init__(self, num_clients, initial=100.0): self.scores = np.full(num_clients, initial) def update(self, cid, delta): self.scores[cid] = max(0.0, min(100.0, self.scores[cid] + delta)) def evicted(self, cid): return self.scores[cid] < EVICT_SCORE def make_update(cid, t): """模拟一个客户端在第t轮的梯度更新:恶意时大幅偏离""" if cid in MAL_IDS and t >= 4: return 2.5 + 0.4 * t + np.random.randn(DIM) * 0.3 return np.random.randn(DIM) * 0.15 def outlier_z_scores(updates): """用中位数加MAD计算每个更新的稳健z分数""" dists = np.array([np.linalg.norm(u) for u in updates]) med = np.median(dists) mad = np.median(np.abs(dists - med)) if mad < 1e-9: mad = 1e-9 return (dists - med) / (1.4826 * mad) def main(): ledger = ReputationLedger(N_CLIENTS) for t in range(1, N_ROUNDS + 1): updates = [make_update(cid, t) for cid in range(N_CLIENTS)] zs = outlier_z_scores(updates) for cid in range(N_CLIENTS): if ledger.evicted(cid): continue if zs[cid] > Z_THRESHOLD: ledger.update(cid, -8.0) else: ledger.update(cid, 1.0) if t in (4, 8, 12): print("round %2d scores:" % t, [int(ledger.scores[cid]) for cid in range(N_CLIENTS)]) bad = sorted([cid for cid in MAL_IDS if ledger.evicted(cid)]) good_dead = [cid for cid in range(N_CLIENTS) if cid not in MAL_IDS and ledger.evicted(cid)] print("恶意客户端被剔除:", bad) print("正常客户端被误杀:", good_dead) if __name__ == "__main__": main()
self.scores = np.full(num_clients, initial)每个客户端初始 100 信誉分dists = np.array([np.linalg.norm(u) for u in updates])计算每个更新向量的模长作为“口味偏差”med = np.median(dists)用中位数当基准,防止恶意值拉偏正常参照mad = np.median(np.abs(dists - med))MAD 给出正常波动的稳健尺度return (dists - med) / (1.4826 * mad)得到稳健 z 分数,越大越可疑if cid in MAL_IDS and t >= 4:前 3 轮伪装正常,第 4 轮起开始投毒if zs[cid] > Z_THRESHOLD:超过 3 个稳健标准差就判为可疑ledger.update(cid, -8.0)` / `ledger.update(cid, 1.0)可疑重扣 8 分、正常轻奖 1 分if ledger.evicted(cid): continue跌出红线的客户端直接跳过,不再参与后续更新
常见误区
误区只要某个客户端这次上传的梯度和全局模型差得远,就可以直接判成恶意客户端并立刻拉黑,不用再观察。
正解联邦学习的常态是 Non-IID 数据——各家用户习惯不同,正常客户端的梯度天生差异很大。必须用中位数与 MAD 这类稳健统计量做基准,再结合信誉分、多轮验证综合判断。否则,检测系统会在第一轮就把最有个性的好客户当成坏人剔除,全局模型反而越来越偏。
为何常见:初学者容易把“偏离”直接等同于“异常”,忽略了分布本身就有宽度;攻击者也恰恰利用这种急于求成的心态,伪装成“个性化用户”来规避检测。
误区为了绝对安全,应该把信誉分红线调得很高,比如 80 分,让大部分客户端都处于被观察状态,宁可错杀一千。
正解阈值过高会造成大面积误杀:正常客户端因为数据异构被扣分出局,参与多样性下降,全局模型性能反而崩坏。正确做法是在验证集上优化 FPR + λ·FNR,兼顾“误伤好人”与“放过坏人”两个方向,再配合观察带(borderline)暂不剔除,而不是一刀切。
为何常见:安全焦虑让人本能地“从严从重”,却忽略了检测系统是一个需要长期可用性的工程系统,而非一次性的安检门。
误区只要恶意检测做得足够好,把所有坏人都拦在门外,聚合阶段直接用朴素平均就行。
正解检测不是万能的:自适应攻击者会在阈值边缘做小幅持续污染,绕过单轮统计。鲁棒聚合(Krum、Trimmed Mean、坐标中位数)在聚合阶段天然压低离群更新的权重,与检测形成双保险——一个管“门前筛查”,一个管“后厨质检”。
为何常见:把两道防线当成“二选一”的替代关系,是安全工程里最常见也最危险的简化思维。
误区某一轮出现异常就立即永久剔除该客户端,这样最干脆。
正解单轮异常可能是训练波动、网络抖动或数据漂移,直接永久剔除会误伤好人,也给攻击者留下“投毒—逃跑—再伪装”的可乘之机。多轮验证通过跨轮命中率定罪,信誉分通过扣分而非直接封杀,给了悔改空间也保留了证据链。
为何常见:人们习惯用“一次犯错、终身拉黑”的直觉处理安全问题,但联邦学习环境噪声大,单次证据的置信度太低。
面试题
Q1. 联邦学习中,恶意客户端危害全局模型最直接的手段是什么?
- A.窃取中央服务器的全局模型权重
- B.提交有毒模型更新污染聚合结果← 正确答案
- C.拒绝参与联邦训练静默退出
- D.私自备份本地训练数据留底
答案:B。联邦学习的聚合完全依赖客户端上传的更新,恶意客户端最省事的手段就是直接在更新里“下毒”,相当于往百家宴的大锅里倒脏水。窃取权重、退出训练、备份数据都不直接影响聚合质量。
Q2. 梯度异常检测中,为什么基准用中位数而非均值?
- A.中位数计算速度更快省算力
- B.中位数能精确刻画所有分布特征
- C.均值更容易被恶意离群值带偏← 正确答案
- D.均值需要先上传所有原始数据
答案:C。恶意客户端会把距离均值拉偏,就像锅里掉进一勺盐,“平均口味”就被带咸了。中位数是“大多数人的中间口味”,对离群值不敏感,配上 MAD 才能得到稳健的“离谱尺度”。
Q3. 信誉评分机制中的“冷启动问题”指的是什么?
- A.服务器重启后信誉分全部丢失
- B.信誉分超过上限后无法继续累加
- C.客户端在低温环境下无法正常计算
- D.新客户端没有历史分难以定级← 正确答案
答案:D。冷启动指新来的“邻居”没有历史积分记录,无法判断是好人还是惯犯。实践中通常给一个观察档初始分(如 55),先试运行几轮再定级,而不是直接给满分或零分。
Q4. 多轮验证方法对抗单轮误判的核心手段是?
- A.单轮内增加更多统计特征来判定
- B.每轮随机更换参与客户端的集合
- C.跨多轮统计恶意命中率再定罪量刑← 正确答案
- D.完全依赖单轮检测器给出的结论
答案:C。单轮异常可能只是数据波动,像邻居偶尔手抖把糖当盐。多轮验证统计窗口期内的“恶意命中率”,连续命中才定罪,能大幅降低单轮误判。A 是增强单轮特征、B 随机换人、D 完全信任单轮,都与“多轮”思想相悖。
Q5. Non-IID 数据异构为什么容易造成检测误报?
- A.异构数据让全局模型收敛更迅速
- B.异构数据无法上传到中央服务器
- C.数据异构会自动拉高客户端信誉
- D.正常客户端梯度差异大形似异常← 正确答案
答案:D。Non-IID 意味着各家本地数据分布天然不同,正常客户端的梯度差异也会很大,看起来像异常。所以检测必须用稳健统计量配合多轮验证,区分“个性化”与“恶意”,否则最有个性的好客户最先被误杀。
Q6. 信誉分奖惩中“惩罚权重大于奖励”的目的是?
- A.防止恶意行为收益大于贡献成本← 正确答案
- B.让所有客户端都迅速被淘汰出局
- C.降低服务器计算信誉分的开销
- D.使信誉分永远无法达到一百分
答案:A。如果做好事的收益大于做坏事的代价,攻击者会反复试探。设定 β > α,让“搞一次破坏的损失”盖过“多次正常贡献的收益”,才能从经济性上抑制持续投毒。
Q7. 攻击者采用“伪装-攻击-逃跑”策略时,最有效的对抗手段是?
- A.提高单轮检测阈值的灵敏度
- B.结合历史行为与多轮验证跟踪← 正确答案
- C.每轮随机剔除一定比例的客户端
- D.禁止所有新客户端参与训练
答案:B。伪装-攻击-逃跑的攻击者在轮次间切换状态,单轮阈值再怎么调都防不住“打一枪换一个地方”。最有效的对抗是把历史行为轨迹串起来,用累计可疑度和多轮验证识别“惯犯”,而随机剔除会误伤大量好人。
Q8. 检测器连续 5 轮把 3 个正常客户端误判为恶意,每轮每人扣 8 分,这 3 人累计损失多少信誉分?
- A.总共累计损失 120 分信誉← 正确答案
- B.总共累计损失 40 分信誉
- C.总共累计损失 15 分信誉
- D.总共累计损失 8 分信誉
答案:A。3 个正常客户端 × 5 轮 × 每轮 8 分 = 120 分信誉损失。误报不是一次性事件,它会在每一轮重复惩罚同一个好人,这正是误报率控制要把阈值校准到“既不小气也不放肆”的原因。
Q9. 行为聚类无监督检测中,可用的行为特征包括哪些?
- A.梯度方向与更新范数统计← 正确答案
- B.前后轮更新一致性轨迹← 正确答案
- C.与主流行为簇的偏离程度← 正确答案
- D.客户端地理位置和网络时延
答案:ABC。行为聚类把梯度方向、更新范数、前后轮一致性等行为特征压缩成向量,再用无监督聚类找孤立点。网络地理位置属于基础设施信息,一般不用作机器学习的行为特征,与“菜谱风格”无关。
Q10. 部署“检测 + 鲁棒聚合”双保险时,正确的工程做法有哪些?
- A.检测剔除大多数恶意客户端← 正确答案
- B.鲁棒聚合对漏网之鱼二次消毒← 正确答案
- C.聚合阶段放弃所有稳健性处理
- D.增量信誉更新提升检测实时性← 正确答案
答案:ABD。“检测为主、聚合兜底”是双保险:检测把明显带毒的配方拦在门外,鲁棒聚合(Krum、Trimmed Mean 等)对小幅扰动不敏感,增量信誉更新保证检测速度跟得上训练节奏。C 放弃稳健性会让单点防线一旦被突破就全线崩溃。