一句话总结:隐私保护在 AI 训练中防止敏感数据泄露,在推理中保护用户隐私,同时保持模型效用。
| 威胁者 | 能力 | 目标 |
|---|
| 外部攻击者 | API 查询 | 提取训练数据 |
| 半诚实内部 | 访问模型参数 | 恢复敏感信息 |
| 恶意同谋 | 访问训练日志 | 推断用户数据 |
| 侧信道攻击者 | 观测运行时间 | 推断输入数据 |
$$DP: P(M(D) \in S) \leq e^\epsilon \times P(M(D') \in S) + \delta$$
其中 $D$ 和 $D'$ 仅相差一条记录。
class DPSGDTrainer:
def __init__(self, model, epsilon, delta, clip_norm):
self.model = model
self.epsilon = epsilon
self.delta = delta
self.clip_norm = clip_norm
self.noise_multiplier = self.compute_noise()
def compute_noise(self):
"""计算噪声系数"""
return (clip_norm * math.sqrt(2 * math.log(1.25 / delta))) / epsilon
def train_step(self, batch):
"""差分隐私训练步骤"""
gradients = []
for sample in batch:
grad = compute_gradient(self.model, sample)
grad = clip_gradient(grad, self.clip_norm)
gradients.append(grad)
mean_grad = torch.stack(gradients).mean(dim=0)
noise = torch.randn_like(mean_grad) * self.noise_multiplier
noisy_grad = mean_grad + noise
self.model.apply_gradient(noisy_grad)
| ε 值 | 保护强度 | 适用场景 |
|---|
| 1.0 | 极高 | 医疗数据 |
| 5.0 | 高 | 金融数据 |
| 10.0 | 中高 | 一般个人数据 |
| 100.0 | 中 | 公开数据集 |
| 算法 | 描述 | 鲁棒性 |
|---|
| FedAvg | 简单平均 | 低 |
| FedProx | 加入 proximal 项 | 中 |
| FedMedian | 中值聚合 | 高 |
| Krum | 基于距离选择 | 高 |
| Trimmed Mean | 修剪均值 | 高 |
class FedAvgServer:
def __init__(self, model, n_clients, round_fraction=0.1):
self.model = model
self.n_clients = n_clients
self.round_fraction = round_fraction
def train_round(self, clients, local_epochs=5, batch_size=32):
"""单个联邦训练轮次"""
active_clients = random.sample(clients,
int(len(clients) * self.round_fraction))
global_weights = self.model.get_weights()
updates = []
for client in active_clients:
local_model = client.train(local_weights,
local_epochs, batch_size)
update = local_model.get_weights() - global_weights
updates.append((client.data_size, update))
total_size = sum(size for size, _ in updates)
aggregated = np.zeros_like(global_weights)
for size, update in updates:
aggregated += (size / total_size) * update
self.model.set_weights(global_weights + aggregated)
return self.evaluate()
class PrivacyPreservingFedAvg:
def __init__(self, server, dp_epsilon, secure_aggregation=True):
self.server = server
self.epsilon = dp_epsilon
self.secure_agg = secure_aggregation
def secure_aggregate(self, updates):
"""安全聚合:服务器只看到和,看不到单个更新"""
encrypted_updates = [self.encrypt(u) for u in updates]
aggregated = self.decrypt_sum(encrypted_updates)
return aggregated
| 方案 | 通信复杂度 | 计算复杂度 | 适用场景 |
|---|
| GMW | O(n) | O(n) | 两方计算 |
| SPDZ | O(n) | O(n²) | 多方计算 |
| TFHE | O(log n) | O(n log n) | 同态加密 |
| Secret Sharing | O(n²) | O(n²) | 通用场景 |
class KAnonymizer:
def __init__(self, k):
self.k = k
def anonymize(self, df: pd.DataFrame) -> pd.DataFrame:
"""实现 k-匿名"""
quasi_identifiers = self.identify_qi(df)
generalization_hierarchy = {
'age': [0, 10, 20, 30, 40, 50, 60, 70, 80, 90],
'zip_code': ['*', '123', '1234', '12345'],
'gender': {0: 'M', 1: 'F'}
}
equivalence_classes = df.groupby(quasi_identifiers)
for name, group in equivalence_classes:
if len(group) < self.k:
df = self.suppress_or_generalize(df, group)
return df
| 等级 | 技术 | 保护强度 | 数据效用 |
|---|
| 原始 | 无 | 无 | 100% |
| L1 | 删除标识符 | 低 | 80% |
| L2 | 泛化 | 中 | 60% |
| L3 | k-匿名 | 中高 | 50% |
| L4 | 差分隐私 | 高 | 30-70% |
| L5 | 联邦 + DP | 最高 | 25-65% |