MindSpore差分隱私原理+代碼解析
隨著互聯網的迅猛發展,網絡早已融進人們日常生活的方方面面,我們的個人隱私在互聯網時代幾乎已經不是秘密。在數據時代,如何保護自己的隱私呢?差分隱私又是什么?小編用一篇文章帶領大家了解什么是差分隱私,背后技術原理以及如何在MindSpore中實現差分隱私。
差分隱私背景
20 世紀90 年代,美國馬薩諸塞州發生了著名的隱私泄露事件。該州集團保險委員會(GIC)發布“經過匿名化處理的”醫療數據,用于公共醫學研究。在數據發布之前,為了防止隱私泄露問題,特地刪除了數據中所有的個人敏感信息,例如身份證號、姓名、住址。
然而在1997 年,卡內基梅隆大學的博士Latanya Sweeney將匿名化的GIC數據庫(包含了每位患者生日、性別、郵編)與選民登記記錄相連后,成功破解了這份匿名數據,并找到了當時的馬薩諸塞州州長William Weld的醫療記錄。
2018年就發生多起隱私數據泄露事件。Facebook用戶隱私數據泄露被罰款16億美元,圓通10億快遞信息泄露,萬豪酒店5億用戶開房信息泄露,華住酒店5億條用戶數據疑似泄露,國泰航空940萬乘客數據等等,隱私泄露問題層出不窮,隱私保護當是重中之重。
隱私保護目的
我們希望,數據使用隱私保護技術后,可以安全發布,攻擊者難以去匿名化,同時又最大限度的保留原始數據的整體信息,保持其研究價值。當前的研究熱點主要在兩個方面:
隱私保護技術能提供何種強度的保護,或者說能夠抵御何種強度的攻擊;
如何在保護隱私的同時,最大限度地保留原數據中的有用信息。
差分隱私基本概念
差分隱私是Dwork在2006年針對統計數據庫的隱私泄露問題提出的一種新的隱私定義,目的是使得數據庫查詢結果對于數據集中單個記錄的變化不敏感。簡單來說,就是單個記錄在或者不在數據集中,對于查詢結果的影響微乎其微。那么攻擊者就無法通過加入或減少一個記錄,觀察查詢結果的變化來推測個體的具體信息。
舉個例子,當不使用差分隱私技術時,我們查詢A醫院數據庫,查詢今日就診的100個病人患病情況,返回10人患肺癌,同時查詢99個病人患病情況,返回9個人患肺癌,那就可以推測剩下1個人張三患有肺癌,這個就暴露了張三的個人隱私了。使用差分隱私技術后,查詢A醫院的數據庫,查詢今日就診的100個病人患病情況,返回肺癌得病率9.80%,查詢今日就診的99個病人患病情況,返回肺癌得病率9.81%,因此無法推測剩下1個人張三是否患有肺癌。
在機器學習中,機器學習算法一般是用大量數據并更新模型參數,學習數據特征。理想情況下,這些算法學習到一些泛化性較好的模型。然而,機器學習算法并不會區分通用特征還是個體特征。當我們用機器學習來完成某個重要的任務,例如肺癌診斷,發布的機器學習模型可能在無意中透露訓練集中的個體特征,惡意攻擊者可能從發布的模型獲得關于張三的隱私信息,因此使用差分隱私技術來防止機器學習模型泄露個人隱私數據是十分必要的。
差分隱私定義
差分隱私定義為[1]假設有隨機算法 , 為 所有可能輸出結果構成的集合, 表示概率,對于任意兩個相鄰數據集 ,兩個數據集的差別只有1條記錄,如果滿足:
則稱算法 提供 差分隱私保護,其中 為差分隱私預算,用來保證數據集中增加或者減少一條記錄,隨機算法 的輸出結果一致的概率。如下圖所示
圖1:隨機算法在鄰近數據集上的輸出概率
越接近0, 在 上輸出的數據分布越接近,輸出結果越不可區分,隱私保護程度越高。當 時,輸出分布重合,輸出結果不可分,但是此時原始數據的可用性也喪失了,因此需要在隱私保護程度和可用性之間權衡。
是用于限制模型行為任意改變的概率,通常設置為一個小的常數,推薦設置小于訓練數據集大小的倒數。
差分隱私有兩個重要的優點:
差分隱私假設攻擊者能夠獲得除目標記錄以外的所有其他記錄信息,這些信息的總和可以理解為攻擊者能夠掌握的最大背景知識,在這個強大的假設下,差分隱私保護無需考慮攻擊者所擁有的任何可能的背景知識。
差分隱私建立在嚴格的數學定義上,提供了可量化評估的方法。因此差分隱私保護技術是一種公認的較為嚴格和健壯的隱私保護機制。
如何實現差分隱私
差分隱私如此優秀,那具體怎么實現呢? 一個很自然而然的想法是“加噪聲”。差分隱私可以通過加適量的干擾噪聲來實現,目前常用的添加噪音的機制有拉普拉斯機制和指數機制。其中拉普拉斯機制用于保護數值型的結果,指數機制用于保護離散型的結果。
那什么叫適量的噪聲,多少才是合適的,怎么衡量呢?加入噪聲的量和數據集是有關系的,年齡數據集的數據間差異就沒有工資數據集的數據差異大,要添加的噪聲的量就不一致。敏感度是決定該加多少噪聲的重要因素。
敏感度
敏感度指數據集中刪除任意一條記錄對查詢結果產生的最大影響。在差分隱私中有兩種敏感度,全局敏感度和局部敏感度。
全局敏感度[2]
設有函數 , 對于任意相鄰數據集 ,全局敏感度為: ,因為是任意相鄰數據集,所以本質上全局敏感度是由函數本身決定的。
局部敏感度
設有函數 , 對于給定數據集 和 的相鄰數據集 ,局部敏感度為: ,因為數據集
是給定的,所以局部敏感度是由數據集 的值決定的,也能在一定程度上體現數據集的數據分布特征,局部敏感度通常比全局敏感度小很多,因此添加的噪聲量會小很多,數據的可用性相對高很多。
有了敏感度之后,自然而然的思路是敏感度越大,添加的噪聲就越大,敏感度小,添加的噪聲小。那怎么加噪聲,加的噪聲才能夠滿足差分隱私條件呢?拉普拉斯分布的數學性質與差分隱私定義完美契合,是差分隱私最常用的噪聲機制。
拉普拉斯機制
拉普拉斯機制,通過向查詢結果中加入服從拉普拉斯分布的噪聲來實現差分隱私保護。拉普拉斯分布 的概率密度函數為:,
其中 是位置參數, 是尺度參數。
圖2 拉普拉斯概率密度函數
拉普拉斯機制的差分隱私保護定義為:對于給定數據集 ,假設有函數 ,敏感度為 ,隨機算法 提供
隱私保護,其中, 服從拉普拉斯分布:
越小,b越大,噪聲越大,隱私保護程度越高。
該拉普拉斯機制滿足差分隱私定義,可以簡單證明:對于數據集 ?中的任意值 輸出為 的概率 ,則有:
公式沒看懂也不要緊,記住拉普拉斯機制是滿足差分隱私要求的就可以了。
指數機制
拉普拉斯機制是在數值型結果上加上一定的噪聲,那如果需要在離散型結果上加噪聲要怎么處理呢,怎么加噪聲能夠滿足差分隱私特性呢?指數機制應運而生。
指數機制定義: 設有隨機算法M,輸入為數據集 ,輸出值域為 ,輸出值為實體對象 , 為可用性函數, 為可用性函數
的敏感度,如果算法 以正比于 的概率從 中選擇并輸出 ,那么算法 提供 差分隱私保護。
舉個例子,現在要舉辦一場體育比賽,可選的體育項目有{足球、排球、籃球、網球},觀眾對選擇舉辦哪個體育項目進行了投票,最后根據投票結果確定一個體育項目,我們要保證用戶投票的隱私性,即不可區分哪個觀眾具體投了哪個項目,此時我們可以用指數機制的差分隱私來滿足 隱私保護要求。
用數學的方式表示,投票觀眾為數據集 ,輸出域 ,以用戶得票數作為可用性函數 ,下圖中
,敏感度 ?,在給定的 下可以計算 的值,最后歸一化,求出用戶選擇各個項目的概率。
當加了 差分隱私預算后,查詢用戶給足球投票的情況,返回的是用戶有92.4%的概率選擇足球。
的值越小,隱私保護程度越高,數據可用性越差,當 時,用戶投票情況不可區分,隱私保護程度最高,同時數據可用性喪失。
圖3 指數機制應用示例
差分隱私特性
一個復雜的差分隱私保護問題通常需要應用多次差分隱私技術,在這種情況下差分隱私能否保證隱私保護,隱私保護的程度又如何度量?類似于電壓電流的串并聯原理,差分隱私也存在串并聯原理。
差分隱私串聯原理:
給定數據集 ,假設有隨機算法 ,其差分隱私預算分別為 ,組合算法 提供 差分隱私保護。也就是說對于同一個數據集,使用了一系列的組合差分隱私保護算法,提供的差分隱私保護水平為差分隱私預算的總和。
差分隱私并聯原理:
對于不相交的數據集 ,假設有隨機算法 ,其差分隱私預算分別為 ,組合算法 提供 差分隱私預算。也就是說對于不相交數據集,分別使用不同的隨機算法構成的組合差分隱私保護,提供的差分隱私保護水平為組合算法里差分隱私預算最大的。
差分隱私應用
看了以上的數學推到是不是頭昏眼花了呢,其實簡單來說,差分隱私的本質是"加噪",任何需要隱私保護的算法都可以使用差分隱私,由于差分隱私的串并聯原理,只要算法中的每一個步驟都滿足差分隱私要求,那么這個算法的最終結果將滿足差分隱私特性。因此,差分隱私可以在算法流程中的任意步驟。
其實差分隱私在1977年就提出了,但是真正讓它聲名大噪的是2016年蘋果軟件工程副總裁克雷格?費德里希(Craig Federighi)在WWDC大會上宣布蘋果使用本地化差分隱私技術來保護IOS、MAC用戶隱私。在多個場景中成功部署差分隱私,在保護用戶隱私的同時,提升用戶體驗。
例如,使用差分隱私技術收集用戶統計用戶在不同語言環境中的表情符號使用情況,改進QuickType對表情符號的預測能力。根據用戶鍵盤輸入學習新單詞、外來詞,更新設備內字典改善用戶鍵盤輸入體驗。又例如,根據使用差分隱私技術收集用戶在Safari應用使用中高頻的高內存占用型、高耗能型域名,在IOS和macOS High Sieera系統里在這些網站加載時提供更多資源,以提升用戶瀏覽體驗。另外,谷歌也利用本地化差分隱私保護技術從Chrome瀏覽器每天采集超過1400萬用戶行為統計數據。
除了工業界的工程應用,差分隱私的學術研究更為廣泛。目前推薦系統、社交網絡分析、知識遷移、聯邦學習等場景下都有差分隱私的蹤跡。
MindSpore中的差分隱私實現
在MindArmour的差分隱私模塊Differential-Privacy中,實現了差分隱私優化器。目前支持基于高斯機制的差分隱私SGD、Momentum優化器,同時還提供RDP(R'enyi Differential Privacy)用于監測差分隱私預算。
這里以LeNet模型為例,說明如何在MindSpore上使用差分隱私優化器訓練神經網絡模型。
本例面向CPU、GPU、Ascend?910?AI處理器 你可以在這里下載完整的樣例代碼 導入需要的庫文件 下列是我們需要的公共模塊及MindSpore的模塊。 import?osimport?argparseimport?mindspore.nn?as?nnfrom?mindspore?import?contextfrom?mindspore.train.callback?import?ModelCheckpointfrom?mindspore.train.callback?import?CheckpointConfigfrom?mindspore.train.callback?import?LossMonitorfrom?mindspore.nn.metrics?import?Accuracyfrom?mindspore.train.serialization?import?load_checkpoint,?load_param_into_netimport?mindspore.dataset?as?dsimport?mindspore.dataset.transforms.vision.c_transforms?as?CVimport?mindspore.dataset.transforms.c_transforms?as?Cfrom?mindspore.dataset.transforms.vision?import?Interimport?mindspore.common.dtype?as?mstypefrom?mindarmour.diff_privacy?import?DPModelfrom?mindarmour.diff_privacy?import?DPOptimizerClassFactoryfrom?mindarmour.diff_privacy?import?PrivacyMonitorFactoryfrom?mindarmour.utils.logger?import?LogUtilfrom?lenet5_net?import?LeNet5from?lenet5_config?import?mnist_cfg?as?cfg 配置環境信息 1.使用parser模塊,傳入運行必要的信息,如運行環境設置、數據集存放路徑等,這樣的好處是,對于經常變化的配置,可以在運行代碼時輸入,使用更加靈活。 parser?=?argparse.ArgumentParser(description='MindSpore?MNIST?Example') parser.add_argument('--device_target',?type=str,?default="Ascend",?choices=['Ascend',?'GPU',?'CPU'], ????????????????????help='device?where?the?code?will?be?implemented?(default:?Ascend)') parser.add_argument('--data_path',?type=str,?default="./MNIST_unzip", ????????????????????help='path?where?the?dataset?is?saved') parser.add_argument('--dataset_sink_mode',?type=bool,?default=False,?help='dataset_sink_mode?is?False?or?True') parser.add_argument('--micro_batches',?type=float,?default=None, ????????????????????help='optional,?if?use?differential?privacy,?need?to?set?micro_batches') parser.add_argument('--l2_norm_bound',?type=float,?default=1, ????????????????????help='optional,?if?use?differential?privacy,?need?to?set?l2_norm_bound') parser.add_argument('--initial_noise_multiplier',?type=float,?default=0.001, ????????????????????help='optional,?if?use?differential?privacy,?need?to?set?initial_noise_multiplier') args?=?parser.parse_args() 2.配置必要的信息,包括環境信息、執行的模式、后端信息及硬件信息。 context.set_context(mode=context.PYNATIVE_MODE, ??device_target=args.device_target,?enable_mem_reuse=False) 預處理數據集 加載數據集并處理成MindSpore數據格式。def generate_mnist_dataset(data_path, batch_size=32, repeat_size=1,num_parallel_workers=1, sparse=True): """ create dataset for training or testing """ # define dataset ds1 = ds.MnistDataset(data_path) # define operation parameters resize_height, resize_width = 32, 32 rescale = 1.0 / 255.0 shift = 0.0 # define map operations resize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR) rescale_op = CV.Rescale(rescale, shift) hwc2chw_op = CV.HWC2CHW() type_cast_op = C.TypeCast(mstype.int32) # apply map operations on images if not sparse: one_hot_enco = C.OneHot(10) ds1 = ds1.map(input_columns="label", operations=one_hot_enco, num_parallel_workers=num_parallel_workers) type_cast_op = C.TypeCast(mstype.float32) ds1 = ds1.map(input_columns="label", operations=type_cast_op, num_parallel_workers=num_parallel_workers) ds1 = ds1.map(input_columns="image", operations=resize_op, num_parallel_workers=num_parallel_workers) ds1 = ds1.map(input_columns="image", operations=rescale_op, num_parallel_workers=num_parallel_workers) ds1 = ds1.map(input_columns="image", operations=hwc2chw_op, num_parallel_workers=num_parallel_workers) # apply DatasetOps buffer_size = 10000 ds1 = ds1.shuffle(buffer_size=buffer_size) ds1 = ds1.batch(batch_size, drop_remainder=True) ds1 = ds1.repeat(repeat_size) return ds1 建立模型 這里以LeNet模型為例,你也可以根據需求建立訓練自己的模型。 from?mindspore?import?nnfrom?mindspore.common.initializer?import?TruncatedNormaldef?conv(in_channels,?out_channels,?kernel_size,?stride=1,?padding=0): ????weight?=?weight_variable() ????return?nn.Conv2d(in_channels,?out_channels, ?????????????????????kernel_size=kernel_size,?stride=stride,?padding=padding, ?????????????????????weight_init=weight,?has_bias=False,?pad_mode="valid")def?fc_with_initialize(input_channels,?out_channels): ????weight?=?weight_variable() ????bias?=?weight_variable() ????return?nn.Dense(input_channels,?out_channels,?weight,?bias)def?weight_variable(): ????return?TruncatedNormal(0.02)class?LeNet5(nn.Cell): ????"""????Lenet?network????""" ????def?__init__(self): ????????super(LeNet5,?self).__init__() ????????self.conv1?=?conv(1,?6,?5) ????????self.conv2?=?conv(6,?16,?5) ????????self.fc1?=?fc_with_initialize(16*5*5,?120) ????????self.fc2?=?fc_with_initialize(120,?84) ????????self.fc3?=?fc_with_initialize(84,?10) ????????self.relu?=?nn.ReLU() ????????self.max_pool2d?=?nn.MaxPool2d(kernel_size=2,?stride=2) ????????self.flatten?=?nn.Flatten() ????def?construct(self,?x): ????????x?=?self.conv1(x) ????????x?=?self.relu(x) ????????x?=?self.max_pool2d(x) ????????x?=?self.conv2(x) ????????x?=?self.relu(x) ????????x?=?self.max_pool2d(x) ????????x?=?self.flatten(x) ????????x?=?self.fc1(x) ????????x?=?self.relu(x) ????????x?=?self.fc2(x) ????????x?=?self.relu(x) ????????x?=?self.fc3(x) ????????return?x 加載LeNet網絡,定義損失函數、配置checkpoint、用上述定義的數據加載函數generate_mnist_dataset載入數據。 network?=?LeNet5()net_loss?=?nn.SoftmaxCrossEntropyWithLogits(is_grad=False,?sparse=True,?reduction="mean")config_ck?=?CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps, ?????????????????????????????keep_checkpoint_max=cfg.keep_checkpoint_max)ckpoint_cb?=?ModelCheckpoint(prefix="checkpoint_lenet", ?????????????????????????????directory='./trained_ckpt_file/', ?????????????????????????????config=config_ck)ds_train?=?generate_mnist_dataset(os.path.join(args.data_path,?"train"), ??????????????????????????????????cfg.batch_size, ??????????????????????????????????cfg.epoch_size) 引入差分隱私 1.配置差分隱私優化器的參數。 設置數據集batch size。 實例化差分隱私工廠類。 設置差分隱私的噪聲機制,目前支持固定標準差的高斯噪聲機制:Gaussian和自適應調整標準差的自適應高斯噪聲機制:AdaGaussian。 設置優化器類型,目前支持SGD和Momentum。 設置差分隱私預算監測器RDP,用于觀測每個step中的差分隱私預算 ?的變化。 gaussian_mech?=?DPOptimizerClassFactory(args.micro_batches) gaussian_mech.set_mechanisms('Gaussian', ?????????????????????????????norm_bound=args.l2_norm_bound, ?????????????????????????????initial_noise_multiplier=args.initial_noise_multiplier) net_opt?=?gaussian_mech.create('Momentum')(params=network.trainable_params(), ???????????????????????????????????????????learning_rate=cfg.lr, ???????????????????????????????????????????momentum=cfg.momentum) rdp_monitor?=?PrivacyMonitorFactory.create('rdp', ???????????????????????????????????????????num_samples=60000, ???????????????????????????????????????????batch_size=16, ???????????????????????????????????????????initial_noise_multiplier=5, ???????????????????????????????????????????target_delta=0.5, ???????????????????????????????????????????per_print_times=10) 2.將LeNet模型包裝成差分隱私模型,只需要將網絡傳入DPModel即可。 model?=?DPModel(micro_batches=args.micro_batches, ????????????????norm_clip=args.l2_norm_bound, ????????????????dp_mech=gaussian_mech.mech, ????????????????network=network, ????????????????loss_fn=net_loss, ????????????????optimizer=net_opt, ????????????????metrics={"Accuracy":?Accuracy()}) 3.模型訓練與測試。 LOGGER.info(TAG,?"==============?Starting?Training?==============") model.train(cfg['epoch_size'],?ds_train,?callbacks=[ckpoint_cb,?LossMonitor(),?rdp_monitor], dataset_sink_mode=args.dataset_sink_mode) LOGGER.info(TAG,?"==============?Starting?Testing?==============") ckpt_file_name?=?'trained_ckpt_file/checkpoint_lenet-10_1875.ckpt' param_dict?=?load_checkpoint(ckpt_file_name) load_param_into_net(network,?param_dict) ds_eval?=?generate_mnist_dataset(os.path.join(args.data_path,?'test'),?batch_size=cfg.batch_size) acc?=?model.eval(ds_eval,?dataset_sink_mode=False) LOGGER.info(TAG,?"==============?Accuracy:?%s??==============",?acc) 4.結果展示 不加差分隱私的Lenet模型精度穩定在99%,加了自適應差分隱私AdaDP的Lenet模型收斂,精度穩定在96%,加了非自適應差分隱私DP的LeNet模型收斂,精度穩定在94%左右。 圖4 訓練結果對比展示 引用 [1] C. Dwork and J. Lei. Differential privacy and robust statistics. In STOC, pages 371–380. ACM, 2009. [2] Dwork, Cynthia, et al. "Calibrating noise to sensitivity in private data analysis." Theory of cryptography conference. Springer, Berlin, Heidelberg, 2006. [3] 熊平, 朱天清, and 王曉峰. "差分隱私保護及其應用." 計算機學報 37.1 (2014): 101-122. [4] McSherry, Frank D. "Privacy integrated queries: an extensible platform for privacy-preserving data analysis." Proceedings of the 2009 ACM SIGMOD International Conference on Management of data. 2009. [5] Dwork C. (2006) Differential Privacy. In: Bugliesi M., Preneel B., Sassone V., Wegener I. (eds) Automata, Languages and Programming. ICALP 2006. Lecture Notes in Computer Science, vol 4052. Springer, Berlin, Heidelberg [6] Nissim, Kobbi, Sofya Raskhodnikova, and Adam Smith. "Smooth sensitivity and sampling in private data analysis." Proceedings of the thirty-ninth annual ACM symposium on Theory of computing. 2007. [7] Dwork, Cynthia, et al. "Our data, ourselves: Privacy via distributed noise generation." Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2006. [8] McSherry, Frank, and Ilya Mironov. "Differentially private recommender systems: Building privacy into the netflix prize contenders." Proceedings of the 15th ACM SIGKDD international conference on Knowledge discovery and data mining. 2009. [9] Machanavajjhala, Ashwin, Aleksandra Korolova, and Atish Das Sarma. "Personalized social recommendations-accurate or private?." arXiv preprint arXiv:1105.4254 (2011). [10] Papernot, Nicolas, et al. "Semi-supervised knowledge transfer for deep learning from private training data." arXiv preprint arXiv:1610.05755 (2016). [11] Li, Qinbin, Zeyi Wen, and Bingsheng He. "Federated learning systems: Vision, hype and reality for data privacy and protection." arXiv preprint arXiv:1907.09693 (2019). [12] Phan, NhatHai, et al. "Preserving differential privacy in adversarial learning with provable robustness." arXiv preprint arXiv:1903.09822 (2019). [14] https://zh.wikipedia.org/wiki/拉普拉斯分布 參考 ^[1] C. Dwork and J. Lei. Differential privacy and robust statistics. In STOC, pages 371–380. ACM, 2009. ^[5] Dwork C. (2006) Differential Privacy. In: Bugliesi M., Preneel B., Sassone V., Wegener I. (eds) Automata, Languages and Programming. ICALP 2006. Lecture Notes in Computer Science, vol 4052. Springer, Berlin, Heidelberg 昇騰 EI智能體
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。