想象一个周末夜晚,你和八位朋友走进一家火锅店,热热闹闹点了一桌菜。结账时店长递来账单,却提出一个奇怪的要求:“为了公平,我得算出总账单AA,但我一点都不想知道谁吃了毛肚、谁喝了三瓶啤酒。”大家面面相觑——怎么在一桌明晃晃的菜面前,藏住每个人各自吃了什么? 这个场景,就是联邦学习里最棘手的难题:几十个客户端各自用私有数据训练模型,把梯度(相当于“点菜记录”)交给服务器聚合加总。服务器本该只看大局——所有客户端梯度的总和——可梯度就像点菜单一样,藏着用户数据的蛛丝马迹。有研究者证明,仅仅拿到一份梯度,就能反推出原始图片或文本。于是,密码学家设计了一套精妙的“匿名AA制”协议,正是本文的主角:安全聚合(Secure Aggregation)。 这顿饭的妙处在于:每个食客都偷偷在自己的份子钱上加一个只有邻座才懂的暗号。两人一组互相约定“你多报5块,我少报5块”——单看任何人的数字都是失真的,可一桌人凑起来却分毫不差。更聪明的是,为了应对有人中途上厕所(客户端掉线),大家还事先把“暗号本”撕成碎片分给不同朋友保管。这套流程,就是安全聚合的全部奥秘:秘密共享、成对掩码、容错恢复。接下来,我们把这桌火锅账,一页一页翻开。
安全聚合是联邦学习隐私保护的基石级技术。掌握它的设计思想,你就能理解“在不可信服务器下完成集体计算”如何成为可能——这是从事隐私计算、可信AI方向绕不开的核心一课。
目录
可视化演示
展示安全聚合三维度:成对掩码加噪(DH协商-加减掩码-掩码抵消聚合)、Shamir秘密共享掉线容错(秘密分割-客户端掉线-份额恢复)、双掩码可验证聚合(恶意检测-验证放行),理解联邦学习隐私保护密码学机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
成对掩码梯度加噪机制 DH协商共享掩码rho_ij 客户端i加rho_j减rho sum(x_i + rho_ij) = sum(x_i) 成对掩码使掩码在聚合时相互抵消,服务器仅见梯度总和。
隐私威胁模型:先弄清这顿饭要防谁
火锅店的秘密在于,店长不是坏人,他只是“好奇心重”。他不会去抢你的菜,但会忍不住偷看你的点菜单,甚至根据你夹菜的速度推断你对某道菜的喜好。联邦学习中的服务器正是这样一位“诚实但好奇”(honest-but-curious)的店长:它严格按协议聚合梯度,但心里痒痒地想窥探每个客户端单独上传的梯度。
为什么单个梯度如此敏感?因为梯度是训练数据的“影子”。神经网络在梯度里记下了数据的统计痕迹:一张人脸图片、一句私人消息、一笔医疗记录,都可能从梯度中被逆向还原出来。这就好比店长只要扫一眼你碗里的蘸料,就能猜出你底料里加了多少辣椒——单个梯度泄露的细节,远超你的想象。
安全聚合要实现的,就是让这顿火锅真正变成“集体匿名AA”:服务器只能得到所有客户端梯度的总和,而对任何单独的一份梯度都无从下手。形式化地说,目标是:
当然,光说“只想让你看总和”是不够的,还得考虑更坏的情况:万一某些食客私下里是店长的“眼线”呢?比如一个客户端与服务器串通,把别人的掩码秘密泄露出去。安全聚合的威胁模型必须把“最多能容忍几个内鬼”“最多能容忍几个人掉线”都写清楚。这正是它作为密码学协议的严谨之处——不假设人心向善,只假设数学足够坚硬。回到火锅桌上,这就像是说:哪怕有好几个食客是店长的亲戚,只要不是全员串通,账就算不穿。
g,是所有客户端梯度 x 的加总,仅此而已。- g_server(服务器聚合结果)一轮训练结束时,服务器拿去更新全局模型的唯一梯度信号。它只能是一个加总后的值,拆不开。
- Σ(求总和符号)把所有参与者的梯度从头到尾加一遍,不允许挑出其中任何一项单独查看。
- x_i(单个客户端梯度)每个客户端用本地数据训练出的私有梯度,是被保护的对象。
掩码机制原理:给每份份子钱戴上隐身衣
让邻座之间互相“代瞒”,是火锅AA暗号系统的第一步。你悄悄对旁边的朋友说:“这一轮我多报5块,你少报5块,咱俩合计不变。”于是服务员看到的账目上,你的数字虚高,朋友的数字虚低,但两个人的总和纹丝不动。在安全聚合里,这“多报/少报”的数叫做成对掩码。
协议要求每两个客户端之间协商一个随机种子,由种子生成一个与梯度同样大小的随机向量作为掩码。约定编号小的客户端加上这个掩码,编号大的客户端减去同一个掩码。于是,每个客户端上传的“带掩码梯度”真实与否已经无所谓,因为掩码会在服务器加总时自动抵消。数学形式如下:
这里的关键在于,掩码的种子只有配对双方知道,服务器毫不知情。于是服务器眼里每个客户端的数值都是“加了料”的,但把所有 y 加起来,所有掩码干净地归零,剩下的恰好就是所有真实梯度的总和。这像极了火锅店里的两两代瞒:服务员看谁都像“大吃货”或“小鸟胃”,凑一桌总账却精准无比。掩码机制用一句话总结就是:让单点失真,让总和精确。
y,等于它的真实梯度 x 加上所有配对掩码的叠加;这些掩码在服务器求和时会两两抵消。- y_i(带掩码梯度)客户端真正上传服务器的数值,外人看起来完全是一串随机数。
- x_i(原始梯度)客户端本地训练得到的真实梯度,是被层层保护的核心隐私。
- sgn(i,j)(符号函数)规定配对两人一个加掩码、一个减掩码,确保成对抵消。编号小者加,编号大者减。
- PRG(s_ij)(伪随机生成器)把两个客户端协商出的共享种子,扩展成与梯度长度完全相同的随机向量。
秘密共享协议:把“暗号本”撕成碎片分给众人
火锅AA的一次意外提醒大家:万一有人中途离席,他答应邻座的“代瞒”承诺怎么办?这个秘密随着他离开而消失,账就对不上了。聪明的办法是:每个人在入座前,把自己的“暗号本”(私钥)撕成许多张碎片,分发给不同朋友保管。只要凑齐足够多的碎片,就能拼出完整的暗号本;而碎片太少,则什么都拼不出来。
这个思想在密码学里叫秘密共享(Secret Sharing),最经典的是 Shamir 方案。假设秘密是 s,我们随机生成一个 t 次多项式,让常数项恰好等于 s。把 1,2,...,n 分别代入多项式,得到 n 个点,分给 n 个人各持一点。因为 t+1 个点能唯一确定一条 t 次曲线,所以只要凑齐 t+1 个点就能插值出曲线的常数项——也就是秘密 s;而少于 t+1 个点,则完全无法确定秘密,数学上保证信息量为零。
回想火锅桌:每个人把自己的“暗号本”撕成多页,交给不同朋友。如果同桌有10个人,暗号本被撕成9份,只要凑齐比如4份就能拼出完整内容——这就是阈值的含义。秘密共享是安全聚合能够容忍“中途离席”的基石:离席者带走了自己的暗号本,但碎片还留在朋友们手里,大家合力就能把他在账目上留下的“代瞒”痕迹一笔勾销。
t 次多项式上取点,达到阈值就能还原曲线在零点的秘密值。- s(要保护的秘密)客户端在安全聚合中的真实身份密钥,所有掩码都由它派生。
- a_1,……,a_t(随机系数)随机选取的系数,用来构造一条在零点取值为
s的随机曲线。 - z(自变量)把不同编号代入多项式,得到不同的份额点
(z, f(z))。 - t(多项式次数/阈值)曲线次数越高,需要的恢复点越多。
t+1个点即可重建秘密。
协议握手流程:七步配合同一桌火锅开席
火锅聚餐开始前,有一连串看似繁琐的仪式:先确认谁来了、谁没来,然后两两配对“对暗号”,再交换“暗号本碎片”。这套仪式,在安全聚合中就是协议握手流程。每一步都有明确目的,缺一不可。
第一步,所有客户端与服务器建立连接并“签到”,服务器公布当前在线用户列表。第二步,每对客户端之间通过类似 Diffie-Hellman 的密钥协商,分别派生出共享的掩码种子——注意,这一步完全绕开服务器,保证种子不被第三方知晓。第三步,每个客户端把自己的私钥通过 Shamir 秘密共享拆成份额,分发给其他在线用户。第四步,服务器宣布“冻结”参与者集合,此后不再允许新用户加入。第五步,各客户端计算带掩码梯度并上传,服务器开始聚合。
整个过程可以形式化地记为:
这套握手仪式像极了聚会前的繁琐确认:谁也没到齐就开席,容易漏算;谁偷偷离席不打招呼,账目就乱套。安全聚合把“开席”的时机、名单的锁定都写成了协议条款,一切以冻结那一刻的集合为准。此后无论谁掉线,都有后备方案应对——这正是下一节要讲的问题。
- U_all(全部候选客户端)最初尝试连上服务器的所有客户端的集合。
- U_active(活跃用户集合)完成密钥协商和份额分发、最终被服务器确认参与聚合的客户端。
- ⊆(子集关系)活跃集合是全部集合的子集,部分迟到或掉线的用户会被排除在外。
容错处理设计:中途离席的人怎么办
再严密的AA制也怕有人中途离席。设想你的邻座小张答应“你多报5块,他少报5块”,结果他吃到一半去接了个电话就再也没回来。他的“少报5块”还留在账上,没人兑现承诺,账目凭空多出5块缺口。幸运的是,小张离席前把“暗号本”撕成碎片分给了大家——现在,幸存者们只需要合作把暗号本拼出来,就能知道他那份掩码到底是多少。
在安全聚合中,如果一个客户端掉线,服务器和其他客户端会执行一个“恢复流程”:幸存者们各自交出持有的关于掉线者私钥的份额,只要份额数量达到阈值 t+1,就能用拉格朗日插值恢复掉线者的私钥。有了私钥,就能重新推导出掉线者与每个幸存者之间协商过的成对掩码,然后从聚合结果中精确移除他的掩码影响。这一恢复过程的核心公式是:
将这个恢复出的私钥代入伪随机生成器,服务器就能重新计算掉线者相关的所有掩码,并对聚合值做出修正:对每个与掉线者配对过的幸存者,要么补偿回被减掉的掩码,要么扣除被加上的掩码。最终,服务器手里的总和依然精确地等于所有幸存者真实梯度的和。这就像大家拼好小张的暗号本,在账上划掉他那份“已消失的承诺”,整桌账目分毫未乱。
t+1 个份额点,通过拉格朗日插值算出零点处的值,从而恢复掉线者私钥。- z_i, f(z_i)(已知份额点)从幸存客户端处收集到的
t+1个有效份额。 - 连乘项(拉格朗日基)在每个已知点上构造的插值基函数,专门用于计算零点处的插值权重。
- Σ(加权求和)把每个份额的纵坐标乘上对应权重再相加,恰好恢复出曲线常数项,也就是秘密
s。
工程实现要点:从纸面密码学到田间地头
火锅店接了一百桌客人的时候,如果每桌每个人都得跟其他所有人“对暗号”,服务员和食客们光对暗号就得忙活一晚上。安全聚合的理论很美,但落地时最头疼的是开销:每对客户端都要协商密钥、交换份额,通信量随客户端数量平方增长;每个客户端都要生成长度与梯度相同的掩码向量,计算量也不容小觑。
工程上最核心的诀窍是:不传掩码本体,只传种子。既然掩码是由伪随机生成器从种子扩展出来的,那么客户端之间只需要协商一个短小的种子,然后在本地各自生成掩码即可——这极大压缩了通信量。更进一步的优化包括位打包(bit packing),把多个浮点数掩码的模运算打包进一次更宽的整数运算中,以及批量加密,让多轮训练复用同一组密钥材料。总的通信开销可用下面的公式刻画:
理解了折子的原理,再看工程优化就一目了然:种子就是“暗号”,远比“报数”轻量。大家不需要把整本暗号背给彼此听,只需要约定“用今天火锅店的名字做暗号”——种子一传,双方各自默念生成整串掩码。于是,一百桌的火锅店也能高效运转:每桌内部悄悄对暗号,店长只管收总账。这正是安全聚合从理论走向生产的关键一步。
- C(n,2)(配对组合数)
n个客户端两两配对的边数,表示需要建立密钥协商的通道数量。 - L_seed(种子长度)每对客户端交换的种子长度,通常只有几十字节,远小于掩码本身。
- T_comm(总通信量)一轮安全聚合中,所有密钥协商环节消耗的通信总量。
安全特性分析:这桌账到底稳不稳
火锅 AA 制的“安全感”到底有多强?要回答这个问题,必须严谨地分析它能防什么、不能防什么。安全聚合的安全保证是:只要参与聚合的客户端里至少有两个诚实用户,且掉线人数不超过阈值 t,服务器对任何单个用户的梯度在信息论意义上都一无所知——它能看到的全部消息里,根本不存在足够的信息来还原某个单独的梯度。用信息论的术语,就是互信息为零:
不过,这桌账也不是万能的。安全聚合防的是“半诚实”服务器——它协议执行得规规矩矩,只想偷看;但协议防不了恶意客户端故意上传错误梯度(投毒攻击),也防不了掉线人数超过阈值导致无法恢复掩码。就好比火锅店的暗号系统能防店长偷看你吃了什么,却防不了有食客往锅里倒奇怪的东西故意毁掉整桌菜。理解安全边界,比理解安全承诺本身更重要——知道锁能防住谁,才能知道还该加什么锁。
- S(服务器观察)服务器在整个协议过程中收取到全部消息的集合,包括所有带掩码梯度。
- x_i(单用户梯度)服务器试图推断的某个诚实客户端的真实梯度。
- I(·;·)(互信息)衡量两个随机变量之间共享信息量的指标。等于零,意味着观察到
S不透露关于x_i的任何信息。
应用价值展望:把匿名AA制端上更多餐桌
这套“集体保密AA制”已经从论文走向真实的产业餐桌。医疗领域,多家医院组成联邦学习联盟,合作训练 MRI 影像识别模型,每家医院的数据源不出院区,安全聚合保证任何一个参与方都无法窥探别家的影像数据——这相当于每位医生都把自己的点单模糊化,却仍然能精确算出全桌的总账。金融领域,多家银行联合训练反欺诈模型,客户交易流水作为“菜谱”被层层掩码保护,安全聚合让竞争者之间也能共享模型收益而不交换核心数据。
安全聚合的价值,在于它为“不想互相信任、又必须共同合作”的场景提供了一个数学上可证明的解决方案。它的应用场景还在扩展:手机输入法团队用它训练个性化推荐模型,同时保护用户每次敲击的键盘数据;车联网用它聚合各车的行驶状态,又防止轨迹被追踪。可以预见,随着隐私法规逐步收紧,安全聚合会成为隐私保护机器学习的基础设施,像火锅店里的 AA 制一样,成为默认选项。
从火锅桌到医疗联盟,安全聚合讲了一个朴素却深刻的故事:隐私保护不必以牺牲合作为代价。小小的暗号、撕碎的暗号本、拼凑的约定,这些市井智慧被密码学写成严谨的协议,就成了支撑整个隐私计算时代的基石。当你下一次和朋友们 AA 聚餐时,不妨想想——那个不让服务员看见单点、却又能算出总账的魔法,此刻正在全球成千上万个联邦学习服务器上悄然上演。
- E[·](数学期望)对随机掩码的所有可能取值取平均,掩码必然两两抵消。
- tilde g_server(安全聚合后的梯度)经过掩码、传输、去掩码整个流程后的服务器聚合结果。
- 1/n Σ x_i(真实平均梯度)普通联邦学习中“裸奔”的聚合结果,两者在期望上完全相等。
AI 应用场景
医院联合诊断模型的隐私保护
阶段:联邦学习聚合阶段
解决的问题:传统方案中,多家医院若想合作训练影像诊断模型,必须把病人影像数据集中到一个中心服务器,这涉及数据合规、患者隐私泄露风险,且常常被法规禁止。安全聚合让各医院只上传“被掩码”的梯度,服务器算总和却看不到任何一家的单独梯度,既满足合规要求,又能联合训练出更强模型。
具体案例:某跨院脑瘤 MRI 识别项目,三家三甲医院在不共享任何影像数据的前提下,用安全聚合完成每轮联合训练。院方只需要运行统一的联邦学习客户端,各院数据完全不出内网,最终模型泛化能力比单院训练提升了 18%。
银行间反欺诈模型的联合风控
阶段:跨机构模型训练
解决的问题:银行之间共享黑样本可显著提升反欺诈效果,但客户交易明细是企业核心机密。安全聚合作到“只学模式、不见数据”:各家银行本地训练子模型,带着掩码的梯度上传至联合计算节点,聚合后各银行同步拿到全局模型。
具体案例:数家股份制银行联合构建信用卡反欺诈模型,借助安全聚合在加密层面阻断梯度泄露。即使聚合服务器被攻击,攻击者也拿不到任何一家银行的单独梯度,模型对新型电信诈骗的识别率提升到 92%。
手机输入法的个性化学习
阶段:端侧模型更新聚合
解决的问题:手机输入法想根据用户打字习惯做个性化预测,但每次敲击都涉及个人隐私。传统方案只能把数据上传到云端学习,用户心理接受度低。安全聚合让每一部手机只上报加过掩码的模型更新,服务器永远不知道哪条更新来自哪个用户。
具体案例:某智能输入法在 Gboard 式联邦学习框架中接入安全聚合,模型冷启动词汇推荐准确率提升 23%,同时用户打字记录零出网。由于掩码机制,即便某批次只有 5 部手机参与更新,也保证服务器无法拆出单部手机的贡献。
Python 演示
"""Secure Aggregation demo: masks + secret sharing + dropout recovery."""import random PRIME = 2**31 - 1 class Client: def __init__(self, cid, grad, sk): self.cid = cid self.grad = grad self.sk = sk self.mask = 0.0 def share_masks(self, others): # 与编号更大的客户端两两协商: 自己加 m, 对方减 m for other in others: if other.cid <= self.cid: continue seed = (self.sk * 7 + other.sk * 13) % PRIME m = random.Random(seed).uniform(-5, 5) self.mask += m other.mask -= m def shamir_split(secret, n, k): # 把 secret 分成 n 份, 至少 k 份可恢复 coeffs = [secret] + [random.randrange(PRIME) for _ in range(k - 1)] return [(x, sum(c * x**e for e, c in enumerate(coeffs)) % PRIME) for x in range(1, n + 1)] def shamir_recover(points): # 拉格朗日插值求 f(0) s = 0 for i, (xi, yi) in enumerate(points): num = den = 1 for j, (xj, _) in enumerate(points): if i != j: num = num * (-xj) % PRIME den = den * (xi - xj) % PRIME s = (s + yi * num * pow(den, PRIME - 2, PRIME)) % PRIME return s def main(): n, k = 4, 2 # 4 个客户端, 容忍 2 个掉线 grads = [1.0, 2.0, 3.0, 4.0] clients = [Client(i, g, random.randrange(PRIME)) for i, g in enumerate(grads)] # 1. 两两协商成对掩码 for c in clients: c.share_masks(clients) print("mask of clients:", [round(c.mask, 3) for c in clients]) # 2. 客户端 2 掉线, 只有其余客户端上传带掩码梯度 dropout = 2 alive = [c for c in clients if c.cid != dropout] masked = [c.grad + c.mask for c in alive] total = sum(masked) print("server total before fix:", round(total, 3)) # 3. 幸存者用共享份额恢复掉线者私钥 shares = shamir_split(clients[dropout].sk, n - 1, k) picked = random.sample(shares, k) sk_rec = shamir_recover(picked) assert sk_rec == clients[dropout].sk print("recovered dropout secret key: True") # 4. 重建掩码并修正聚合结果 for j in range(n): if j == dropout: continue if j < dropout: seed = (clients[j].sk * 7 + sk_rec * 13) % PRIME total += random.Random(seed).uniform(-5, 5) else: seed = (sk_rec * 7 + clients[j].sk * 13) % PRIME total -= random.Random(seed).uniform(-5, 5) print("server total after fix:", round(total, 3)) print("true total:", sum(grads) - grads[dropout]) if __name__ == "__main__": main()
coeffs = [secret] + [random.randrange(PRIME) for _ in range(k - 1)]随机构造一条k-1次多项式,常数项就是要保护的私钥。seed = (self.sk * 7 + other.sk * 13) % PRIME用双方私钥派生共享种子,模拟真实协议中的密钥协商。self.mask += m; other.mask -= m成对掩码一加一减,是“邻座互瞒”的数学实现。picked = random.sample(shares, k)从幸存者份额中随机挑选k份,达到阈值即可恢复。pow(den, PRIME - 2, PRIME)利用费马小定理计算模逆元,完成拉格朗日插值的除法。if j < dropout: total += ...掉线者此前“减掉”的掩码需要补回;反之则扣除,保证总额精确。
常见误区
误区以为安全聚合让服务器看不到单个梯度,所以恶意客户端就无法破坏模型了——“既然看不见是谁发的,那谁也没法使坏”。
正解安全聚合保护的是隐私,不是鲁棒性。恶意客户端依然可以上传一份精心构造的毒化梯度,服务器虽然“看不见”它是谁的,但这毒梯度照常进入总和,一样会破坏全局模型。打个比方:火锅匿名 AA 能防止店长偷看谁吃了什么,但防不住有人往锅里偷偷倒洗洁精。防投毒需要另外的鲁棒聚合机制(如可信聚合、异常检测)。
为何常见:把“隐私保护”和“安全防护”两个维度混为一谈。隐私关心“看不看得见”,鲁棒性关心“坏东西会不会起作用”,是两个正交的问题。
误区以为服务器像加差分隐私噪声那样,给每个客户端发一份随机掩码,让梯度“变花”再回收。
正解安全聚合的掩码完全由客户端两两协商生成,服务器全程不参与、不接触任何种子。如果掩码由服务器生成,那它对每个客户端都能轻松减去掩码、还原梯度,整个协议就形同虚设。真实场景中,服务器连客户端之间“正在对暗号”这件事的细节都无从知晓。
为何常见:直觉认为“加噪声”这种事一定由一个中心权威来干,忽略了在联邦学习中服务器本身就是不可信的那一方。
误区觉得掉线的人多了,剩下的人手里的碎片更多,拼出秘密更容易,所以掉线越多越“方便”。
正解Shamir 秘密共享是阈值制的:只要凑齐 t+1 份就能唯一恢复,但少于 t+1 份时信息量为零。掉线人数一旦超过 t(通常设成参与人数的一半以下),幸存者手中的份额就不够恢复掉线者私钥了,整个聚合只能宣告失败。掉线多并不会“帮忙”,只会让拼图缺角。
为何常见:把“人多力量大”的日常直觉误用到秘密共享上,忽略了阈值设计的核心是“少于阈值反而什么都得不到”。
误区谈起联邦学习隐私保护,就认为安全聚合 = 差分隐私,都是“给数据加噪声”。
正解两者机制完全不同。安全聚合靠密码学(掩码 + 秘密共享)保证服务器在信息论意义上拿不到单点梯度,它不加任何噪声、不损失模型精度;差分隐私靠给结果注入统计噪声来模糊单点的影响,会带来精度损失。实践中二者常搭配使用:安全聚合先保证传输过程不可见,差分隐私再给聚合结果加一道保险。
为何常见:对“隐私保护技术”的类别认识模糊,把所有手段都笼统归为“加噪声”,忽略了密码学与统计学的分野。
面试题
Q1. 安全聚合要达成的核心目标是什么?
- A.防止恶意用户篡改提交梯度
- B.让服务器只见到梯度总和← 正确答案
- C.压缩梯度传输的通信带宽
- D.提升全局模型的训练精度
答案:B。安全聚合的核心目标是“只见森林、不见树木”——服务器聚合后只得到所有客户端梯度的总和,无法拆出任何单份梯度。A 是鲁棒性问题,C 是工程优化,D 是模型效果,都不是安全聚合的设计初衷。
Q2. 成对掩码中两个用户之间的关系是什么?
- A.两个用户使用相同数值的掩码
- B.一个用户加掩码另一个减掩码← 正确答案
- C.掩码数值由服务器统一分配
- D.掩码只作用于部分的训练轮次
答案:B。成对掩码的精髓是“一加一减、合计不变”。用户 i 加 m,用户 j 减同一个 m,这样单个值失真,但两者之和不受影响。相同掩码无法抵消,服务器指定则失去隐私意义,轮次限制与掩码原理无关。
Q3. Shamir 秘密共享中恢复秘密需要满足什么?
- A.需要拿到全部客户的份额
- B.达到阈值人数即可恢复← 正确答案
- C.只需要持有单一任意份额
- D.至少需要一半以上的人数
答案:B。Shamir 秘密共享基于 t 次多项式,恢复秘密需要 t+1 个份额点,这个数量叫阈值。并非要全部份额,也非任意一份或简单过半——阈值是由多项式次数决定的。少于阈值份额时,数学上保证零信息泄露。
Q4. 客户端 k 掉线后服务器如何消除其掩码影响?
- A.让其他客户端重新训练模型来补救
- B.丢弃与 k 有关联的所有用户梯度
- C.幸存者恢复 k 私钥重建掩码修正← 正确答案
- D.服务器自行猜测掩码凑数抵消
答案:C。掉线者 k 的私钥早已通过秘密共享分发给幸存者,幸存者凑够阈值份额后恢复其私钥,再据此重新生成 k 与各人的成对掩码,从聚合值中精确扣除或补回。丢弃梯度会损失数据,重新训练不可行,猜测掩码无法保证正确。
Q5. 安全聚合可以抵御下列哪些威胁?
- A.好奇心重的服务器窥探梯度← 正确答案
- B.少数用户与服务器暗中串通← 正确答案
- C.恶意用户故意做强毒梯度攻击
- D.攻击者在传输链路上窃听消息← 正确答案
答案:ABD。安全聚合用掩码让服务器无法拆解单点梯度(A),用秘密共享保证少数串通者也无法凑出完整信息(B),传输链路只看到掩码后的密文自然也安全(D)。但恶意用户上传的毒梯度会原样进入聚合,协议对此束手无策(C)。
Q6. 成对掩码的随机性来源于什么地方?
- A.由服务器为每对用户分发的种子
- B.两人协商出的共享密钥派生种子← 正确答案
- C.客户端本地时钟作为随机数种子
- D.模型参数哈希计算出的随机结果
答案:B。真实安全聚合中,每对客户端通过类似 Diffie-Hellman 的方式协商出一个共享密钥,再由它派生出掩码。服务器完全不参与种子生成,否则它能反推出掩码。本地时钟可预测,模型参数哈希与掩码构造无关。
Q7. 安全聚合中服务器最终能够得到什么?
- A.每个用户单独上传的梯度值
- B.所有用户梯度的加总结果← 正确答案
- C.每个用户秘密共享的份额值
- D.用户模型训练使用的原始数据
答案:B。安全聚合的最终产物就是所有梯度的总和,服务器用这个总和去更新全局模型。单个梯度(A)、秘密份额(C)和原始数据(D)都在协议设计中被严格隔离,服务器永远接触不到。
Q8. 关于安全聚合与差分隐私的说法正确的是?
- A.两种技术可以在协议中结合使用← 正确答案
- B.安全聚合本身不向结果添加噪声← 正确答案
- C.差分隐私防止单点数据被推断出← 正确答案
- D.它们属于同一种密码学技术机制
答案:ABC。安全聚合是密码学方案,用掩码保证传输和聚合中的不可见性,不引入统计噪声(B);差分隐私是统计学方案,通过给结果加噪防止单点推断(C);两者可以叠加:先安全聚合再差分加噪(A)。它们机制完全不同,不是同一门技术(D)。
Q9. 掉线用户数超过阈值 t 时聚合结果如何?
- A.掩码无法恢复只能宣告聚合失败← 正确答案
- B.服务器会自动补发一份新的掩码
- C.保留掉线者原有梯度继续聚合成
- D.服务器能成功解密所有用户的梯度
答案:A。阈值 t 是秘密共享的参数,掉线人数超过 t 意味着幸存者手中的份额不足以恢复掉线者私钥,相关掩码成为永远解不开的死结,聚合只能失败。服务器没有掩码信息可补发,保留掉线梯度会算错总和,更谈不上解密。
Q10. 为降低安全聚合的通信开销通常采用什么办法?
- A.每个用户上传完整掩码的明细
- B.只传种子再由本地生成掩码← 正确答案
- C.服务器集中广播所有的掩码值
- D.用户之间直接共享梯度的明文
答案:B。掩码是由伪随机生成器从种子扩展出来的,因此用户之间只需协商一个短种子,双方在本地各自展开出完整掩码即可,不需要传输掩码本体。传完整掩码、服务器广播掩码都会破坏隐私和安全模型,共享明文梯度更是直接放弃保护。