跨机构联邦学习实践
跨机构联邦学习(Cross-Silo FL)涉及少量(2-50)可信机构间的协作训练。与跨设备场景不同,机构间网络稳定、算力充足,但数据合规和商业机密保护要求更高。
跨机构 vs 跨设备
| 特性 | 跨机构 | 跨设备 |
|---|---|---|
| 参与方数量 | 2-50 | 百万级 |
| 网络条件 | 稳定高带宽 | 不稳定 |
| 参与方可靠性 | 高 | 低(随时掉线) |
| 数据规模 | 每方大量 | 每设备少量 |
| 隐私要求 | 极高(商业机密) | 高(个人隐私) |
| 典型场景 | 医院联合建模 | 输入法优化 |
系统架构
python
class CrossSiloFLSystem:
"""跨机构联邦学习系统"""
def __init__(self, config):
self.num_parties = config["num_parties"]
self.security_level = config["security_level"]
self.audit_enabled = config.get("audit", True)
def train(self, num_rounds=100):
for round in range(num_rounds):
# 1. 所有机构参与(无采样)
updates = []
for party in self.parties:
update = party.local_train(
self.global_model,
epochs=5,
dp_noise=self.security_level
)
updates.append(update)
# 2. 安全聚合
if self.security_level > 0:
aggregated = self.secure_aggregate(updates)
else:
aggregated = self.plain_aggregate(updates)
# 3. 审计日志
if self.audit_enabled:
self.audit_log(round, len(updates))
# 4. 更新全局模型
self.update_global_model(aggregated)数据合规
医疗场景
python
# 医疗数据脱敏
class MedicalDataSanitizer:
def sanitize(self, records):
sanitized = []
for record in records:
# 移除直接标识符
record.pop("patient_name", None)
record.pop("id_number", None)
record.pop("phone", None)
# 泛化准标识符
record["age"] = record["age"] // 10 * 10 # 10岁区间
record["zip"] = record["zip"][:3] + "00" # 邮编泛化
sanitized.append(record)
return sanitized金融场景
- 数据不出域:原始数据不可离开机构
- 用途限定:仅用于约定的建模任务
- 审计追踪:所有操作留痕
- 结果控制:模型使用需授权
治理框架
| 角色 | 职责 | 人数 |
|---|---|---|
| 协调方 | 聚合、调度、密钥管理 | 1 |
| 数据方 | 提供数据、本地训练 | N |
| 审计方 | 监督合规、审计日志 | 1 |
| 监管方 | 最终监督 | 1 |
跨机构协作要点
- 签署数据协作协议,明确权责
- 建立技术审计机制
- 模型贡献度可量化(如 Shapley 值)
- 收益分配机制前置约定
模型归属
跨机构训练的模型归属权需要提前约定。常见方案:1) 共同所有;2) 协调方所有,参与方获得使用权;3) 按贡献度分配。