核心概念:隐私安全关注的是"模型是否会泄露训练数据信息"。与之前的攻击不同,隐私攻击不改变模型行为,而是通过模型输出推断敏感信息。这在医疗、金融等敏感领域尤为重要。
机器学习模型可能通过多种方式泄露敏感信息,威胁数据隐私。
隐私风险主要来自以下几个方面:
| 风险类型 | 描��� | 潜在危害 |
|---|---|---|
| 成员推断攻击 | 判断某个样本是否在训练集中 | 泄露特定用户参与训练 |
| 属性推断攻击 | 推断训练数据的敏感属性 | 泄露用户敏感信息 |
| 模型反演攻击 | 重建训练输入 | 恢复原始图像/文本 |
| 梯度泄露 | 从梯度恢复原始数据 | 隐私数据被窃取 |
| 模型逆向 | 从模型输出反推输入 | 敏感信息泄露 |
成员推断攻击是最经典的隐私攻击之一,用于判断某个样本是否在模型的训练集中。
# 成员推断攻击示例
class MembershipInferenceAttack:
def __init__(self, target_model, shadow_models):
self.target = target_model
self.shadow_models = shadow_models
self.attack_model = self.train_attack_model()
def attack(self, data):
# 获取目标模型的输出
output = self.target(data)
confidence = F.softmax(output, dim=-1).max().item()
# 训练集通常有更高的置信度
return confidence > self.threshold
def train_attack_model(self):
# 使用shadow models训练攻击模型
# shadow model需要与目标模型相似
pass
属性推断攻击用于推断训练数据是否具有某种敏感属性。
差分隐私是隐私保护的核心技术,通过在数据处理过程中引入随机性来保护个体隐私。
原始数据 + 随机噪声 = 隐私保护输出
每次查询消耗隐私预算
ε 越大 → 隐私越弱 | ε 越小 → 隐私越强
# 差分隐私 SGD (DP-SGD)
def dp_sgd(model, dataloader, epsilon=1.0, delta=1e-5):
for batch in dataloader:
# 1. 计算梯度
loss = model(batch)
gradients = torch.autograd.grad(loss, model.parameters())
# 2. 裁剪梯度范数
grad_norm = torch.norm(torch.cat([g.flatten() for g in gradients]))
clipped_gradients = [g * min(1, C/grad_norm) for g in gradients]
# 3. 添加高斯噪声
noise = torch.normal(0, C*sigma, clipped_gradients.shape)
private_grad = clipped_gradients + noise
# 4. 更新模型
update_model(private_grad)
除了差分隐私,还有其他隐私保护技术: