差分隐私介绍与实践
0x01 序言
随着人工智能和大数据技术的快速发展,个人隐私数据正不断被各种技术平台和厂商收集。这些数据可能被用于商业利益或技术提升,导致用户隐私受到侵害。为保护个人隐私,全球范围内陆续出台了相关法律法规,如欧盟的《通用数据保护条例》(GDPR)和中国的《个人信息安全规范》。
传统的数据匿名化技术通过抑制、泛化、聚合等手段隐藏敏感信息,但面对专业的隐私窃取组织仍显不足。统计数据库再识别技术可以通过分析查询结果和条件来推断个人隐私信息。差分隐私(Differential Privacy, DP)正是为防护这类技术而提出的概念。
0x02 差分隐私介绍
2.1 差分隐私的基本概念
差分隐私是一种在统计学和机器学习分析背景下关于隐私的强数学定义。其目的是使数据库查询结果对数据集中单个记录的变化不敏感,即某个记录在不在数据集中对最终查询结果的影响非常小。这样可以防止攻击者通过增加或删除数据集中的记录,根据查询结果进行差分分析来提取隐私。
2.2 差分隐私实现思想
差分隐私通过给查询结果增加随机噪声来实现保护。例如在医疗科室查询案例中,增加随机噪声后,攻击者无法确定噪声值,也就无法判断特定个人是否患病。
差分隐私通过以下方式平衡隐私保护和数据准确性:
- 使用更准确的概率模型使查询结果尽可能精准
- 提供隐私预算ε来量化隐私保护级别,ε值越低保护越好但准确度也越低
经典案例:社会调查男性出轨比例
- 被调查者先抛硬币,正面朝上则如实回答
- 正面朝下则再抛一次,正面朝上回答"是",反面朝下回答"否"
- 通过概率统计方法计算真实比例
2.3 差分隐私数学定义
设随机算法M,S是M所有可能输出结果组成的集合,Pr[·]表示概率。对于任意两个相邻数据集D和D'(仅相差一条记录),若满足:
Pr[M(D) ∈ S] ≤ e^ε × Pr[M(D') ∈ S] + δ
当δ=0时,称算法M提供ε-差分隐私保护(ε-differentially private)。ε称为差分隐私预算。
ε越接近0,随机算法M在D和D'输出的数据分布越接近,隐私保护程度越高。当ε=0时,输出结果完全随机,失去数据价值。
2.4 拉普拉斯机制
拉普拉斯分布能够满足ε-差分隐私保护,可在数值型数据库查询结果中加入服从拉普拉斯分布的噪声实现保护。拉普拉斯分布的概率密度函数为:
f(x|μ,b) = (1/2b)exp(-|x-μ|/b)
其中μ是位置参数,b是尺度参数。
2.5 RNM算法
RNM(Report Noisy Max)算法用于报告最大含有噪声的计数,而不是公布所有计数结果。例如在查询最常见疾病时:
- 在每个计数中添加Lap(1/ε)噪声
- 只报告最大的含有噪声的计数
- 符合ε-差分隐私保护
0x03 差分隐私保护实践
3.1 模型反转攻击
模型反转攻击利用机器学习模型的置信度反推训练数据。研究表明,仅使用姓名就能通过人脸预测模型还原训练时使用的人脸图像。这表明在机器学习领域应用差分隐私保护的必要性。
3.2 差分隐私在机器学习中的应用思想
通过在机器学习过程中加入随机性,使得攻击者难以区分结果中的随机噪声和真实训练数据影响。目标是改变单条训练样本时,模型训练结果保持大致相同。
3.3 PATE框架
PATE(Private Aggregation of Teacher Ensembles)是Google Brain提出的方案,通过差分隐私技术实现在不暴露原始数据的前提下训练公共数据。
PATE实现步骤:
-
教师模型训练:
- 将隐私数据集划分为N个不重叠的子集
- 使用N个"教师模型"分别训练这些子集
- 训练完成后得到N个预测模型
-
隐私聚合处理:
- 统计所有教师模型的结果
- 增加符合高斯分布的噪声
- 使用RNM算法返回投票值最高的标签
- 输出聚合结果
-
引入学生模型:
- 通过迁移教师模型知识完成训练
- 对公开无标签数据集调用PATE API获得预测值
- 学生模型使用这些带标签数据训练
3.4 PATE模型的隐私损失分析
使用PySyft工具分析PATE框架的隐私损失:
- Data Dependent Epsilon:结合数据本身和当前ε取值分析隐私损失
- Data Independent Epsilon:仅分析ε取值对应的隐私损失
通过实验证明:
- 当教师模型输出结果相同时,隐私损失小
- 当教师模型输出结果差异大时,隐私损失大
- 降低ε值可有效减少隐私损失
3.5 PATE实践案例:MNIST手写数字识别
实现步骤:
- 准备MNIST数据集,分为隐私数据(训练集)和公开数据(测试集)
- 将隐私数据划分为250份,每份240个样本
- 训练250个教师模型
- 使用90%测试集作为学生模型训练集,10%作为测试集
- 设置隐私等级ε=0.25
- 教师模型对训练集预测并增加拉普拉斯噪声
- 使用RNM算法得到最终标签
- 学生模型使用重新标注的数据训练
实验结果:
- 测试准确率达到92.8%
- 虽略低于直接训练的准确率,但有效保护了隐私
0x04 关键代码实现
# 差分隐私关键代码实现
# 1. 定义分类器模型
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 256)
self.fc2 = nn.Linear(256, 128)
self.fc3 = nn.Linear(128, 64)
self.fc4 = nn.Linear(64, 10)
self.dropout = nn.Dropout(p=0.2)
def forward(self, x):
x = x.view(x.shape[0], -1)
x = self.dropout(F.relu(self.fc1(x)))
x = self.dropout(F.relu(self.fc2(x)))
x = self.dropout(F.relu(self.fc3(x)))
x = F.log_softmax(self.fc4(x), dim=1)
return x
# 2. 教师模型训练
num_teachers = 250
models = []
for i in range(num_teachers):
model = Classifier()
# ...训练代码...
models.append(model)
# 3. 差分隐私聚合
epsilon = 0.25
preds = torch.zeros((len(models),9000), dtype=torch.long)
for i, model in enumerate(models):
results = predict(model, student_trainloader)
preds[i] = results
labels = np.array([]).astype(int)
for image_preds in np.transpose(preds):
label_counts = np.bincount(image_preds, minlength=10)
beta = 1/epsilon
for i in range(len(label_counts)):
label_counts[i] += np.random.laplace(0, beta, 1)
new_label = np.argmax(label_counts)
labels = np.append(labels, new_label)
# 4. 学生模型训练
student_labels = np.array(labels)
# ...训练学生模型...
0x05 参考文献
-
Fredrikson M, Jha S, Ristenpart T. Model Inversion Attacks that Exploit Confidence Information and Basic Countermeasures[C]//Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security. 2015.
-
Papernot N, Abadi M, Erlingsson U, et al. Semi-supervised Knowledge Transfer for Deep Learning from Private Training Data[J]. 2016.
-
Understanding Differential Privacy - Towards Data Science
-
Privacy and Machine Learning - cleverhans.io