本地差分隐私 VS 全局差分隐私
本文是本地差分隐私和全局差分隐私的基础介绍。文中给出了代码示例,以方便读者理解。英文原文作者是Shaistha Fathima 与 Rohith Pudari。
什么是差分隐私
Differential Privacy describes a promise, made by a data holder, or curator, to a data subject (owner), and the promise is like this: "You will not be affected adversely or otherwise, by allowing your data to be used in any study or analysis, no matter what other studies, datasets or information sources are available".
本地差分隐私
假设我们想统计一个班级的平均零花钱,但有一部分人不想公布自己持有的零花钱数目。这时候该怎么办?
这里可以用到本地差分隐私。我们让班级的同学在真实数目的基础上,加上一个范围在[-10,10]的随机数。比如,假设X有30元,加上一个随机数-5,那么他就告知统计者他有[(30+(-5))=25]元。由此,我们保护了个人隐私。
这里,如上图所示,噪声可以直接添加到数据库,或者添加到用户本地数据中。
数据管理者或者说中央聚合器并不知道个体的真实数据,因此隐私受到保护。个体不必担心自己的数据被非法使用。但是,因为每个个人添加了噪声数据,总的噪声会变得非常大,使得统计数据偏差变得很大。为了解决这个问题,实际使用中会偏向使用较大的隐私预算 (ε).
代码示例
第一步:掷硬币 2 次。
第二步:如果第一次抛硬币是正面,那么诚实地回答(是/否)。
第三步:如果第一次抛硬币是反面,则按照第二次抛的硬币回答。如果它是正面,则必须回答“是”,如果它是反面,则必须回答“否”。在这里,我们并没有给回答者做选择。这也是我们添加“随机性”的地方。
第一次抛硬币,回答“是”人数:(1/2)πN
第二次抛硬币,回答Yes人数:(1/2)(1/2)N
所以,N=(1/2)πN+(1/2)(1/2)N
π=2N*/N-(1/4)
db = torch.rand(num_entries) > 0.5
return db, pdbs
def query(db):
true_result = torch.mean(db.float())
first_coin_flip = (torch.rand(len(db)) > 0.5).float()
second_coin_flip = (torch.rand(len(db)) > 0.5).float()
augmented_database = db.float() * first_coin_flip + (1 - first_coin_flip) * second_coin_flip
db_result = torch.mean(augmented_database.float()) * 2 - 0.5
return db_result, true_result
# Adding noise to each datapoint individually
db = create_db(10)
private_result, true_result = query(db)
print("With Noise:" + str(private_result)) # With Noise:tensor(0.7000)
print("Without Noise:" + str(true_result)) # Without Noise:tensor(0.5000)
本地差分隐私的一些应用
RAPPOR[2]. 谷歌在Chrome浏览器中使用本地差分隐私技术收集用户数据。
Privacy-preserving aggregation of personal health data streams[4]. 开发了一种保护隐私的个人健康数据流收集机制,其特点是利用本地差分隐私(Local DP)以固定间隔收集数据。
全局差分隐私
优势:噪声添加更可控,可使用更小的隐私预算 (ε).但是,每个用户都必须足够信任数据管理员或中央聚合服务器才能与其共享数据。这可能很难做到:聚合服务器有可能是不受信任的公司。此外,使用全局模型,所有数据都收集在一个位置。这也增加了灾难性故障的风险,例如,中央聚合服务器有可能被黑客入侵并泄露数据。
如果数据管理员或中央聚合服务器是可信的,那么本地 DP 和全局 DP 的唯一区别是全局 DP 在相同的隐私保护级别下会有更准确的结果。
代码示例
db = torch.rand(num_entries) > 0.5
return db, pdbs
def query(db):
true_result = torch.sum(db.float())
return true_result
# Data curator or aggregator adds noise
# before sending the result for the query i.e., adding noise to the output.
def curator(db):
noise = 0.2 # curator desides how much noise to add
db_result = query(db) + noise # curator adding noise.
db, pdbs = create_db_and_parallels(10)
global_DP_result = curator(db)
true_result = query(db)
print("With Noise:" + str(global_DP_result)) # With Noise:tensor(8.2)
print("Without Noise:" + str(true_result)) # Without Noise:tensor(8.)
全局差分隐私的应用
总结
[2] https://research.google/pubs/pub42852/
[3] https://machinelearning.apple.com/2017/12/06/learning-with-privacy-at-scale.html
[4] https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0207639
[5] https://www.census.gov/newsroom/blogs/randomsamplings/2019/02/census_bureau_adopts.html
庄智廉,重庆大学大数据与软件学院研究生在读,主要研究兴趣包括隐私保护机器学习、差分隐私、联邦学习。知乎:acai。
往期推荐