安全|数值型差分隐私

138 阅读3分钟

在查询结果里加入符合拉普拉斯分布的噪声(也可以在输入或中间值加噪声),用于保护数值型敏感结果;

当 u=0,b=1 时,结果大部分都在 0 附近,也就是 ε 如果符合拉普拉斯的函数,那么数据集的偏移量大部分在 0 范围之间活动。如下图所示:

image.png

已知区间 (-1/2, 1/2] 中均匀分布上的随机变量 U,随机变量

image.png

为参数 μ 与 b 的拉普拉斯分布。

也就是将数值结果加上对应的随机变量 X 就可以得到对应的噪声数据。

一维

我们假设某个查询(例如select sum (privacy_num) from table where ...)正常应该返回3000,全部临近数据集的全局敏感度GS=1(可理解为:增减一条记录,原始的查询结果在2999~3001之间变动),隐私保护预算ε=1,GSf/ε作为尺度参数b.具体的代码如下所示:

# -*- coding: utf-8 -*- #指定字符集
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 生成噪声数据
def get_noisy_digit(GSf, epsilon):
    beta = GSf/epsilon
    u = np.random.random()-0.5
    noisy_digit = 0.0-beta*np.sign(u)*np.log(1.0-2*np.abs(u))
    return np.rint(noisy_digit)


if __name__ =='__main__':
    GSf = 1
    epsilon = 1
    # 统计误差在 5 之内出现的次数
    count_err=0
    output=[]
    for i in range(100):
        result = 3000
        noisy = get_noisy_digit(GSf, epsilon)
        if np.abs(noisy)<=5.0:
            count_err+=1
        result+=noisy
        output.append(result)
    print(count_err,"time error <5.0")
    sns.set(style="white",palette="muted",color_codes=True)
    sns.distplot(output)
    plt.show()

执行之后的结果如下所示: (99, 'time error <5.0')

image.png

总共 100 次,99 次的误差范围是在 5 之内,如上图所示大部分数据是在原数据值附近,只是有一些偏差,但是不影响后续的数据计算结果。

所以在查询结果里加入符合拉普拉斯分布的噪声(也可以在输入或中间值加噪声),用于保护数值型敏感结果。

二维

在上面的例子中,我们只用了一个维度,但实际查询往往是多维的(返回结果包含多个值),这里我们增加一个维度,假设某次查询的结果是(3000, 10),全局敏感度增加为5,我们看看第二个维度的输出干扰情况,具体代码如下所示:

# -*- coding: utf-8 -*- #指定字符集
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 生成噪声数据
def get_noisy_digit(GSf, epsilon):
    beta = GSf/epsilon
    u = np.random.random()-0.5
    noisy_digit = 0.0-beta*np.sign(u)*np.log(1.0-2*np.abs(u))
    return np.rint(noisy_digit)


if __name__ =='__main__':
    GSf = 5
    epsilon = 1
    # 统计误差在 5 之内出现的次数
    output=[]
    for i in range(1000):
        result = [3000,10]
        noisy1 = get_noisy_digit(GSf, epsilon)
        result[0]+=noisy1
        noisy2 = get_noisy_digit(GSf, epsilon)
        result[1]+=noisy2
        output.append(result[0])
    sns.set(style="white",palette="muted",color_codes=True)
    sns.distplot(output)
    plt.show()

一维的结果如下所示:

image.png

二维的结果如下所示:

image.png

二维的范围从 2 到 16,相对于10 来说已经发生较大的变化,噪声过大可能就偏离原来的数值。

表明差分隐私的全局敏感度对于单个返回值的场景表现较好,但不太适合复杂的具有多个返回值的复杂查询场景,特别是多个返回值不在同一量级时;如果使用局部敏感度,可能会造成隐私泄露;这时可能需要引入新的敏感度或算法。