差分隐私代码实现系列(七)
- 写在前面的话
- 回顾
- 松弛差分隐私(Approximate Differential Privacy)
- 高斯机制(The Gaussian Mechanism)
- 矢量值函数及其灵敏度(Vector-Valued Functions and their Sensitivities)
- L1 和 L2 规范(L1 and L2 Norms)
- L1 和 L2 灵敏度(L1 and L2 Sensitivities)
- 在 L1 和 L2 之间进行选择(Choosing Between L1 and L2)
- 灾难机制(The Catastrophe Mechanism)
- 高级组合(Advanced Composition)
- 用于松弛差分隐私的高级组合(Advanced Composition for Approximate Differential Privacy)
- 总结
写在前面的话
书上学来终觉浅,绝知此事要躬行。
回顾
1、函数的灵敏度反映了函数的输出在其输入更改时将更改的量。
2、这种敏感度度称为"全局",因为它独立于所查询的实际数据集(它适用于相邻 x x x 和 x ′ x' x′的任何选择)。
3、这个想法在某些情况下很容易形式化(例如,在美国人口普查中,每个人都提交包含其数据的单个响应),但在其他上下文中(例如位置轨迹,社交网络和时间序列数据)极具挑战性。
4、根据经验,当被求和属性的值不存在下限和上限时,求和查询具有无限的敏感度。
5、具有无限敏感度的查询无法使用拉普拉斯机制使用差分隐私直接回答。
6、裁剪的基本思想是对属性值强制实施上限和下限。
7、此外,在裁剪中丢失的信息量与确保差分隐私所需的噪声量之间存在权衡。当上下裁剪边界靠得更近时,灵敏度较低,需要的噪声更小,以确保差分隐私。但是,激进的剪切通常会从数据中删除大量信息。这种信息丢失往往会导致准确性的损失,这超过了灵敏度降低导致的噪声改善的程度。根据经验,请尝试将剪切边界设置为包含 100% 的数据集,或尽可能接近。在某些领域(例如,图查询,我们稍后将研究)比其他领域更难。
8、请注意,对于最大的裁剪参数,总和会剧烈波动!关键是要寻找图形中相对平滑(意味着低噪声)且不增加(意味着裁剪边界足够)的区域。
松弛差分隐私(Approximate Differential Privacy)
松弛差分隐私,也称为 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)-差分隐私,具有以下定义:
P
r
[
F
(
x
)
=
S
]
≤
e
ϵ
P
r
[
F
(
x
′
)
=
s
]
+
δ
\mathsf{Pr}[F(x) = S] \leq e^\epsilon \mathsf{Pr}[F(x') = s] + \delta
Pr[F(x)=S]≤eϵPr[F(x′)=s]+δ
新的隐私参数
δ
\delta
δ表示定义的"失败概率"。
有了概率 1 − δ 1-\delta 1−δ,我们将得到与纯差分隐私相同的保证;对于概率 δ \delta δ,我们得不到保证。
换句话说:概率 1 − δ 1-\delta 1−δ下, P r [ F ( x ) = S ] P r [ F ( x ′ ) = s ] ≤ e ϵ \frac{\mathsf{Pr}[F(x) = S]}{\mathsf{Pr}[F(x') = s]} \leq e^\epsilon Pr[F(x′)=s]Pr[F(x)=S]≤eϵ。
对于概率 δ \delta δ,我们根本得不到保证。
这个定义应该看起来有点吓人!有了概率 δ \delta δ,任何事情都可能发生。包括整个敏感数据集的发布!
因此,我们通常要求 δ \delta δ非常小,通常为 1 n 2 \frac{1}{n^2} n21或更小,其中 n n n是数据集的大小。
此外,我们还将看到,实践使用中的 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)差分私有机制不会像定义所允许的那样灾难性地失败。相反,它们会优雅地失败,并且不会执行诸如释放整个数据集之类的可怕事情。
那么满足松弛差分隐私的机制存在吗?高斯来了~
高斯机制(The Gaussian Mechanism)
高斯机制是拉普拉斯机制的替代方案,不同在于加的是高斯噪声而不是拉普拉斯噪声。
高斯机制不满足纯 ϵ \epsilon ϵ-差分隐私,但满足 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)-差分隐私。
根据高斯机制,对于返回数字的函数
f
(
x
)
f(x)
f(x),以下
F
(
x
)
F(x)
F(x)定义满足
(
ϵ
,
δ
)
(\epsilon, \delta)
(ϵ,δ)-差分隐私:
F
(
x
)
=
f
(
x
)
+
N
(
σ
2
)
where
σ
2
=
2
s
2
log
(
1.25
/
δ
)
ϵ
2
F(x) = f(x) + \mathcal{N}(\sigma^2)\\ \text{where } \sigma^2 = \frac{2s^2 \log(1.25/\delta)}{\epsilon^2}
F(x)=f(x)+N(σ2)where σ2=ϵ22s2log(1.25/δ)
其中
s
s
s是
f
f
f的敏感度,而
N
(
σ
2
)
\mathcal{N}(\sigma^2)
N(σ2)表示从中心为 0 且方差
σ
2
\sigma^2
σ2的高斯(正态)分布抽样。
请注意,对于实值函数 f : D → R f : D \rightarrow \mathbb{R} f:D→R,我们可以与拉普拉斯机制完全相同的方式使用高斯机制,并且很容易比较在给定值 ϵ \epsilon ϵ的两种机制下发生的情况。
说起来可能不直观,直接上代码!
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import pandas as pd
import numpy as np
epsilon = 1
vals_laplace = [np.random.laplace(loc=0, scale=1/epsilon) for x in range(100000)]
delta = 10e-5
sigma = np.sqrt(2 * np.log(1.25 / delta)) * 1 / epsilon
vals_gauss = [np.random.normal(loc=0, scale=sigma) for x in range(100000)]
plt.hist(vals_laplace, bins=50, label='Laplace')
plt.hist(vals_gauss, bins=50, alpha=.7, label='Gaussian');
plt.legend();
在这里,我们绘制了
ϵ
=
1
\epsilon = 1
ϵ=1的拉普拉斯和高斯机制的经验概率密度函数,以及高斯机制的
δ
=
1
0
−
5
\delta = 10^{-5}
δ=10−5。
与拉普拉斯机制相比,高斯机制的图看起来"被挤压"了。与拉普拉斯机制相比,使用高斯机制得到其他答案的可能性要大得多,而拉普拉斯机制则更贴近真实答案的差分私有输出(相比之下,拉普拉斯机制看起来非常"尖锐")。
因此,高斯机制有两个主要缺点,它需要使用宽松的 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)差分隐私定义,并且它不如拉普拉斯机制准确。我们为什么要使用它?
矢量值函数及其灵敏度(Vector-Valued Functions and their Sensitivities)
到目前为止,我们只考虑了实值函数(即函数的输出始终是单个实数)。这些函数的形式为 f : D → R f : D \rightarrow \mathbb{R} f:D→R。
然而,拉普拉斯和高斯机制都可以扩展到 f : D → R k f : D \rightarrow \mathbb{R}^k f:D→Rk形式的向量值函数,它们返回实数的向量。
我们可以将直方图视为矢量值函数,它返回一个向量,其元素由直方图条柱计数组成。
我们之前看到函数的灵敏度是:
G
S
(
f
)
=
max
d
(
x
,
x
′
)
≤
1
∣
f
(
x
)
−
f
(
x
′
)
∣
GS(f) = \max_{d(x,x') \leq 1} \lvert f(x) - f(x') \rvert
GS(f)=d(x,x′)≤1max∣f(x)−f(x′)∣
我们如何定义向量值函数的灵敏度?
考虑表达式 f ( x ) − f ( x ′ ) f(x) - f(x') f(x)−f(x′)。如果 f f f是一个向量值函数,则此表达式表示两个向量之间的差异,这可以计算为它们对应元素之间的差异(因此,两个长度 - k k k向量的差值是一个新的长度 - k k k向量)。这个新向量是 f ( x ) f(x) f(x) 和 f ( x ′ ) f(x') f(x′)之间的距离,表示为向量。
此向量的大小是 f f f的灵敏度。有几种方法可以计算矢量的大小;我们将使用其中两个: L 1 L1 L1范数和 L 2 L2 L2范数。
L1 和 L2 规范(L1 and L2 Norms)
长度为 k k k的向量 V V V的 L 1 L1 L1范数定义为 ∥ V ∥ 1 = ∑ i = 1 k ∣ V i ∣ \lVert V \rVert_1 = \sum_{i=1}^k \lvert V_i \rvert ∥V∥1=∑i=1k∣Vi∣(即它是向量元素的总和)。在二维空间中,两个向量之间差的 L 1 L1 L1范数产生它们之间的"曼哈顿距离"。
长度为 k k k的向量 V V V的 L 2 L2 L2范数定义为 ∥ V ∥ 2 = ∑ i = 1 k V i 2 \lVert V \rVert_2 = \sqrt{\sum_{i=1}^k V_i^2} ∥V∥2=∑i=1kVi2(即平方和的平方根)。在二维空间中,这是"欧氏距离",并且它总是小于或等于 L 1 L1 L1距离。
L1 和 L2 灵敏度(L1 and L2 Sensitivities)
向量值函数
f
f
f 的
L
1
L1
L1灵敏度为:
G
S
(
f
)
=
max
d
(
x
,
x
′
)
≤
1
∥
f
(
x
)
−
f
(
x
′
)
∥
1
GS(f) = \max_{d(x,x') \leq 1} \lVert f(x) - f(x') \rVert_1
GS(f)=d(x,x′)≤1max∥f(x)−f(x′)∥1
这等于按元素灵敏度的总和。例如,如果我们定义一个向量值函数
f
f
f返回 1 个敏感结果的长度
k
k
k向量,则
f
f
f 的
L
1
L1
L1敏感度为
k
k
k。
类似地,向量值函数
f
f
f 的
L
2
L2
L2灵敏度为:
G
S
2
(
f
)
=
max
d
(
x
,
x
′
)
≤
1
∥
f
(
x
)
−
f
(
x
′
)
∥
2
GS_2(f) = \max_{d(x,x') \leq 1} \lVert f(x) - f(x') \rVert_2
GS2(f)=d(x,x′)≤1max∥f(x)−f(x′)∥2
使用与上面相同的示例,返回长度
k
k
k向量的 1 个敏感结果的向量值函数
f
f
f的敏感度为
L
2
L2
L2 。 对于长矢量,
L
2
L2
L2灵敏度显然会远低于
L
1
L1
L1灵敏度!对于某些应用程序,如机器学习算法(有时返回具有数千个元素的向量),
L
2
L2
L2灵敏度明显低于
L
1
L1
L1灵敏度。
在 L1 和 L2 之间进行选择(Choosing Between L1 and L2)
如前所述,拉普拉斯和高斯机制都可以扩展到向量值函数。但是,这两个扩展之间存在一个关键区别:向量值拉普拉斯机制需要使用 L 1 L1 L1灵敏度,而向量值高斯机制允许使用 L 1 L1 L1或 L 2 L2 L2灵敏度。这是高斯机制的一个主要优势。对于 L 2 L2 L2灵敏度远低于 L 1 L1 L1灵敏度的应用,高斯机制允许添加更少的噪声。
向量值拉普拉斯机制释放 f ( x ) + ( Y 1 , … , Y k ) f(x) + (Y_1, \dots, Y_k) f(x)+(Y1,…,Yk),其中 Y i Y_i Yi是从拉普拉斯分布中得出的 i.i.d,其尺度为 s ϵ \frac{s}{\epsilon} ϵs和 s s s是 f f f 的 L 1 L1 L1敏感性。
向量值高斯机制释放 f ( x ) + ( Y 1 , … , Y k ) f(x) + (Y_1, \dots, Y_k) f(x)+(Y1,…,Yk),其中 Y i Y_i Yi从高斯分布中得出 i.i.d. 与 σ 2 = 2 s 2 log ( 1.25 / δ ) ϵ 2 \sigma^2 = \frac{2s^2 \log(1.25/\delta)}{\epsilon^2} σ2=ϵ22s2log(1.25/δ)和 s s s是 f f f的 L 2 L2 L2敏感性。
灾难机制(The Catastrophe Mechanism)
( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)-差分隐私的定义表明,满足定义的机制必须"表现良好",概率为 1 − δ 1-\delta 1−δ。这意味着对于概率 δ \delta δ,该机制可以做任何事情。这种"失败概率"令人担忧,因为满足宽松定义的机制可能(概率较低)导致非常糟糕的结果。
考虑以下机制,我们称之为灾难机制:
对于概率 1 − δ 1-\delta 1−δ,灾难机制满足 ϵ \epsilon ϵ-差分隐私。对于概率 δ \delta δ,它会释放整个数据集,没有噪声。
这种机制满足了松弛差分隐私的定义,但我们可能不希望在实践中使用它。
幸运的是,大多数 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)差分私有机制都没有这种灾难性的故障模式。
例如,高斯机制永远不会释放整个数据集。
相反,对于概率 δ \delta δ,高斯机制不能完全满足 ϵ \epsilon ϵ-差分隐私,它满足 c ϵ c\epsilon cϵ-差分隐私,而是对于某个值 c c c。
因此,高斯机制优雅地失败了,而不是灾难性的,所以对高斯机制比对灾难机制更有信心是合理的。
稍后,我们将看到对差分隐私定义的替代放宽,这些放宽区分了优雅失败的机制(如高斯机制)和灾难性失败的机制(如灾难机制)。
高级组合(Advanced Composition)
我们已经看到了两种结合差分私有机制的方法:顺序组合和平行组合。事实证明,差分隐私引入了一种分析差分私有机制顺序组成的新方法,这可以降低隐私成本。
高级组合定理通常用机制来表示,这些机制是 k k k-fold 自适应组合的实例。 k k k-fold 自适应组合是一系列机制 m 1 , … , m k m_1, \dots, m_k m1,…,mk,使得:
每个机制 m i m_i mi都可以根据所有先前机制的输出来选择 m 1 , … , m i − 1 m_1, \dots, m_{i-1} m1,…,mi−1 (因此自适应)。
每个机制 m i m_i mi的输入既是私有数据集,也是以前机制的所有输出(因此组成)。
迭代程序(即循环或递归函数)几乎总是
k
k
k-fold自适应组合的实例。例如,运行 1000 次迭代的for
循环是 1000 倍的自适应合成。作为更具体的例子,平均攻击是
k
k
k-fold自适应组合。
# works for sensitivity-1 queries
def avg_attack(query, epsilon, k):
results = [query + np.random.laplace(loc=0, scale=1/epsilon) for i in range(k)]
return np.mean(results)
avg_attack(10, 1, 500)
在此示例中,机制序列是预先固定的(我们每次都使用相同的机制),并且
k
=
500
k = 500
k=500。
标准顺序组合定理说:
该机制的总隐私成本为 k ϵ k\epsilon kϵ(在本例中为 500 ϵ 500 \epsilon 500ϵ)。
高级组合定理说:
如果 k k k-fold自适应组合 m 1 , … , m k m_1, \dots, m_k m1,…,mk中的每个机制 m i m_i mi 都满足 ϵ \epsilon ϵ-差分隐私
然后对于任何
δ
≥
0
\delta \geq 0
δ≥0,整个
k
k
k-fold 自适应组合满足
(
ϵ
′
,
δ
′
)
(\epsilon', \delta')
(ϵ′,δ′)-差分隐私,其中:
ϵ
′
=
2
ϵ
2
k
log
(
1
/
δ
′
)
\epsilon' = 2\epsilon \sqrt{2k \log(1/\delta')}
ϵ′=2ϵ2klog(1/δ′)
从上面的示例中插入
ϵ
=
1
\epsilon = 1
ϵ=1,并设置
δ
′
=
1
0
−
5
\delta' = 10^{-5}
δ′=10−5,我们得到:
ϵ
′
=
2
1000
log
(
100000
)
≈
214.59
\epsilon' =2 \sqrt{1000 \log(100000)}\\ \approx 214.59
ϵ′=21000log(100000)≈214.59
因此,对于相同的机制,高级组合在
ϵ
′
\epsilon'
ϵ′上派生出比顺序组合低得多的界。
这是什么意思?
这意味着顺序组合给出的边界是松散的 ,它们不会严格约束计算的实际隐私成本。
事实上,高级组合也给出了松散的边界,它们只是比顺序合成给出的边界稍微紧致一些。
请务必注意,这两个边界在技术上是无法比较的,因为高级组合引入了 δ \delta δ。但是,当 δ \delta δ较小时,我们通常会比较这两种方法给出的 ϵ \epsilon ϵ。
那么,我们应该总是使用高级组合吗?事实证明,我们不应该。让我们尝试上面的实验,了解 k k k的不同值,并绘制顺序组合和高级组合下的总隐私成本图。
epsilon = 1
delta = 10e-5
def adv_comp(k):
return 2*epsilon*np.sqrt(2*k*np.log(1/delta))
def seq_comp(k):
return k*epsilon
plt.plot([seq_comp(k) for k in range(100)], label='Sequential Composition')
plt.plot([adv_comp(k) for k in range(100)], label='Advanced Composition')
plt.legend();
事实证明,标准的顺序合成击败了小于约70的
k
k
k的高级合成。因此,高级组合只有在
k
k
k较大(例如超过 100)时才真正有用。但是,当
k
k
k非常大时,高级组合可以产生很大的不同。
plt.plot([seq_comp(k) for k in range(10000)], label='Sequential Composition')
plt.plot([adv_comp(k) for k in range(10000)], label='Advanced Composition')
plt.legend();
用于松弛差分隐私的高级组合(Advanced Composition for Approximate Differential Privacy)
上面对高级组合的描述要求组合的各个机制满足纯 ϵ \epsilon ϵ-差分隐私。
但是,如果它们满足 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)-差分隐私,则该定理也适用。高级组合定理的更一般的陈述如下:
如果 k k k-fold自适应组合 m 1 , … , m k m_1, \dots, m_k m1,…,mk中的每个机制 m i m_i mi满足 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)-差分隐私
然后对于任何 δ ′ ≥ 0 \delta' \geq 0 δ′≥0,整个 k k k-fold 自适应组合满足 ( ϵ ′ , k δ + δ ′ ) (\epsilon', k\delta + \delta') (ϵ′,kδ+δ′)-差分隐私,其中:
ϵ
′
=
2
ϵ
2
k
log
(
1
/
δ
′
)
\epsilon' = 2\epsilon \sqrt{2k \log(1/\delta')}
ϵ′=2ϵ2klog(1/δ′)
唯一的区别在于组合机制的失败参数
δ
\delta
δ,其中我们有一个额外的
k
δ
k\delta
kδ项。当正在组成的机制满足纯
ϵ
\epsilon
ϵ-差分隐私时,则
δ
=
k
δ
=
0
\delta = k\delta = 0
δ=kδ=0,我们得到与上述语句相同的结果。
总结
1、通常要求 δ \delta δ非常小,通常为 1 n 2 \frac{1}{n^2} n21或更小,其中 n n n是数据集的大小。
2、高斯机制有两个主要缺点,它需要使用宽松的 ( ϵ , δ ) (\epsilon, \delta) (ϵ,δ)差分隐私定义,并且它不如拉普拉斯机制准确。
3、在二维空间中, L 2 L2 L2距离总是小于或等于 L 1 L1 L1距离。
4、 L 2 L2 L2灵敏度明显低于 L 1 L1 L1灵敏度。
5、向量值拉普拉斯机制需要使用 L 1 L1 L1灵敏度,而向量值高斯机制允许使用 L 1 L1 L1或 L 2 L2 L2灵敏度。这是高斯机制的一个主要优势。对于 L 2 L2 L2灵敏度远低于 L 1 L1 L1灵敏度的应用,高斯机制允许添加更少的噪声。
6、高级组合也给出了松散的边界,它们只是比顺序合成给出的边界稍微紧致一些。
7、事实证明,标准的顺序合成击败了小于约70的 k k k的高级合成。因此,高级组合只有在 k k k较大(例如超过 100)时才真正有用。但是,当 k k k非常大时,高级组合可以产生很大的不同。