(differential-privacy):一份面向新手的實(shí)戰(zhàn)指南)
如何讀懂 Google 差分隱私庫(kù)(differential-privacy)一份面向新手的實(shí)戰(zhàn)指南【免費(fèi)下載鏈接】differential-privacyGoogles differential privacy libraries.項(xiàng)目地址: https://gitcode.com/gh_mirrors/di/differential-privacyGoogle 開(kāi)源的差分隱私庫(kù) differential-privacy 提供 C、Go、Java、Python 四種語(yǔ)言的現(xiàn)成算法實(shí)現(xiàn)用可數(shù)學(xué)證明的噪聲解決發(fā)布聚合統(tǒng)計(jì)而不暴露個(gè)人的問(wèn)題適合需要從用戶數(shù)據(jù)中構(gòu)建統(tǒng)計(jì)報(bào)表的開(kāi)發(fā)者。刪掉名字救不了你傳統(tǒng)匿名化卡在哪 最直覺(jué)的做法是刪掉姓名、把 ID 哈希掉、聚合成組再發(fā)布看起來(lái)挺安全。但這條路在兩個(gè)地方會(huì)斷。一是聚合并不自動(dòng)隱藏個(gè)體。以發(fā)布應(yīng)用崩潰日志為例你想公布各版本的崩潰次數(shù)。一個(gè)知道自己曾在 2.3.1 版本崩潰過(guò)一次的用戶前后對(duì)照?qǐng)?bào)表發(fā)現(xiàn)數(shù)字從 17 變成 18就能確認(rèn)我在里面而且他崩潰了這件事本身也被泄露。更糟的是小計(jì)數(shù)會(huì)直接變成成員資格測(cè)試——某個(gè)版本只有 3 次崩潰時(shí)用戶很可能猜出自己是否就是其中之一。二是風(fēng)險(xiǎn)會(huì)累積每發(fā)布一份報(bào)表攻擊者的拼圖就多一塊把多份發(fā)布交叉對(duì)照或再配上外部公開(kāi)數(shù)據(jù)重識(shí)別就可能成功——早年就有研究者用公開(kāi)的選民登記信息定位到匿名電影租賃數(shù)據(jù)背后的真實(shí)身份。這些問(wèn)題的共同根源是傳統(tǒng)匿名化依賴攻擊者什么都不知道而差分隱私把它換成了數(shù)學(xué)契約——無(wú)論攻擊者已知什么、問(wèn)什么任何單個(gè)個(gè)體的存在與否都只能讓輸出發(fā)生有界的改變。這個(gè)有界是可以量化、可以累加核算的而把這套核算和加噪過(guò)程自動(dòng)化正是 Google 差分隱私庫(kù)做的事。什么是隱私預(yù)算 ε像錢(qián)包一樣花隱私 把上面的契約落到一個(gè)數(shù)字上就是隱私預(yù)算 ε。想象隱私是一本面額固定的錢(qián)包單位就是 ε。你每發(fā)布一份統(tǒng)計(jì)就是一次消費(fèi)庫(kù)會(huì)替你記賬。ε 度量的含義是多加入或刪除一個(gè)人的數(shù)據(jù)答案最多能變動(dòng)多少。ε 越小單個(gè)個(gè)體對(duì)結(jié)果的推動(dòng)力越弱他的存在就越徹底地埋在噪聲里。而每筆消費(fèi)的單價(jià)并不固定它取決于一個(gè)人能多大程度地改變答案也就是敏感度一個(gè)人的貢獻(xiàn)上限越高你需要撒的隨機(jī)噪聲就越多同一本錢(qián)包能撐的報(bào)告就越少。這個(gè)貢獻(xiàn)上限正是下一節(jié)的主角。形式上預(yù)算是一組 (ε, δ)ε 是主預(yù)算δ 是高斯機(jī)制允許的極小概率松弛大意是允許極小概率下偏差略大一點(diǎn)。這一對(duì)數(shù)你不必手算——倉(cāng)庫(kù)里有專門(mén)的隱私核算模塊支持 PLD隱私損失分布把噪聲機(jī)制的每一步損失建模成分布再卷積和 RDP 兩種核算方式原理見(jiàn) common_docs/Privacy_Loss_Distributions.pdf接口說(shuō)明在 python/dp_accounting/README.md。一句話概括ε 是錢(qián)包隱私核算就是賬本每筆消費(fèi)精確到分。上圖是倉(cāng)庫(kù) Go 示例的演示同一份數(shù)據(jù)算兩遍一遍原始計(jì)數(shù)、一遍走差分隱私機(jī)制整體趨勢(shì)保留單點(diǎn)的小波動(dòng)被噪聲抹平。這正是預(yù)算買(mǎi)到的東西——ε 越大加噪曲線越貼著原始曲線ε 越小曲線越被拉平。分區(qū)、隱私單元、貢獻(xiàn)邊界動(dòng)手前的三個(gè)前置清單在調(diào)任何 API 之前先回答三個(gè)問(wèn)題。它們看起來(lái)像數(shù)據(jù)建模其實(shí)直接決定噪聲大小概念一句話解釋為什么重要分區(qū) (Partition)按同一聚合標(biāo)準(zhǔn)歸到一起的數(shù)據(jù)比如某個(gè)版本的全部崩潰噪聲按分區(qū)加分區(qū)越多同一份預(yù)算被攤得越薄隱私單元 (Privacy Unit)被保護(hù)的最小粒度通常是一個(gè)用戶也可以是用戶設(shè)備這類(lèi)組合決定要藏住誰(shuí)庫(kù)按它去重并統(tǒng)計(jì)貢獻(xiàn)貢獻(xiàn)邊界 (Contribution Bounding)單個(gè)隱私單元對(duì)輸出的貢獻(xiàn)上限最多碰幾個(gè)分區(qū)、最大貢獻(xiàn)值、每分區(qū)最多貢獻(xiàn)幾次上限越大敏感度越大需要的噪聲越多設(shè)錯(cuò)了隱私保證直接作廢三者是一條很短的因果鏈先定隱私單元 → 庫(kù)按分區(qū)統(tǒng)計(jì)每個(gè)單元的貢獻(xiàn) → 貢獻(xiàn)邊界把值截?cái)?→ 截?cái)嗪蟮拿舾卸葲Q定剩余預(yù)算下要加多少噪聲。預(yù)算這條線貫穿了全程——貢獻(xiàn)邊界本質(zhì)上是降低查詢成本的折扣券若把每個(gè)用戶每分區(qū)的貢獻(xiàn)上限設(shè)為 10那么他崩再多次數(shù)對(duì)結(jié)果的推動(dòng)最多 10噪聲規(guī)模也因此有界。最常見(jiàn)的坑不是 ε 選錯(cuò)而是貢獻(xiàn)邊界設(shè)錯(cuò)用戶實(shí)際能貢獻(xiàn) 50 次你聲明 1 次加的噪聲就遠(yuǎn)遠(yuǎn)不夠擋住他的推動(dòng)力隱私保證被悄悄擊穿。所以原則是發(fā)布前按業(yè)務(wù)邏輯核對(duì)邊界拿不準(zhǔn)就寧大勿小多付一點(diǎn)噪聲的代價(jià)。C 側(cè)每個(gè)算法的參數(shù)說(shuō)明在 cc/docs/algorithms/cc/testing/ 里還有統(tǒng)計(jì)校驗(yàn)工具用來(lái)驗(yàn)證噪聲是否真的撒對(duì)了。差分隱私庫(kù)適用場(chǎng)景自查哪里能用、哪里別用適用不適用發(fā)布計(jì)數(shù)、求和、均值、分位數(shù)、標(biāo)準(zhǔn)差等聚合統(tǒng)計(jì)輸出可帶誤差但統(tǒng)計(jì)結(jié)論仍可用需要看到個(gè)體記錄的精確值或?qū)敵鲎鼍_相等比較需要反復(fù)組合多份報(bào)表且想精確控制整體隱私消耗庫(kù)自帶隱私核算個(gè)體級(jí)查詢查某個(gè)用戶那條記錄式的請(qǐng)求數(shù)據(jù)貢獻(xiàn)結(jié)構(gòu)清晰能給出有依據(jù)的貢獻(xiàn)邊界樣本量極小又要求高精度的場(chǎng)景噪聲會(huì)吞掉信號(hào)下游能接受結(jié)果是隨機(jī)估計(jì)每次運(yùn)行略有不同要求確定性可復(fù)現(xiàn)、同樣輸入必須同樣輸出的合規(guī)場(chǎng)景實(shí)操中你可以只問(wèn)自己三件事說(shuō)得清隱私單元是誰(shuí)嗎給得出有依據(jù)的貢獻(xiàn)邊界嗎接受輸出是每次都會(huì)變的隨機(jī)估計(jì)嗎三個(gè)都是是就值得引入第一個(gè)就卡住說(shuō)明業(yè)務(wù)還沒(méi)梳理出貢獻(xiàn)結(jié)構(gòu)該先回去補(bǔ)數(shù)據(jù)建模而不是換工具。差分隱私入門(mén)路線從零到跑通差分隱私庫(kù)推薦順序是先看效果 → 再碰 API → 然后記賬 → 最后驗(yàn)證。第一步跑通官方示例??寺}(cāng)庫(kù)git clone https://gitcode.com/gh_mirrors/di/differential-privacy進(jìn)入 examples/go/ 運(yùn)行 CountVisitsPerHour 場(chǎng)景同一份數(shù)據(jù)算兩遍一遍原始、一遍加噪各輸出一個(gè) CSV。對(duì)比這兩個(gè)文件你會(huì)對(duì)噪聲到底把結(jié)果改了多少形成直覺(jué)也就明白庫(kù)為什么反復(fù)強(qiáng)調(diào)貢獻(xiàn)邊界。Java 側(cè)在 examples/java/ 有一組對(duì)應(yīng)場(chǎng)景如果要接進(jìn)數(shù)據(jù)流處理框架可以看 privacy-on-beam/README.md 里的 Beam 集成。第二步切到核心 API親手寫(xiě)參數(shù)。庫(kù)的算法本質(zhì)是給 ε 和邊界還你一個(gè)噪聲規(guī)模調(diào)用形如BoundedSum.Builder .SetEpsilon(1.0) // 隱私預(yù)算 ε .SetLower(0) // 貢獻(xiàn)下界 .SetUpper(1000) // 貢獻(xiàn)上界 .Build() // 噪聲規(guī)模由庫(kù)自動(dòng)算出第三步記賬。多份報(bào)表時(shí)用 python/dp_accounting/ 把每步消耗合并成整體的 (ε, δ)它里面的校準(zhǔn)模塊還能反著做——給定預(yù)算替你搜出讓精度最大化的參數(shù)比如噪聲規(guī)模。最后一步驗(yàn)證。別信第一次跑出來(lái)的數(shù)字用倉(cāng)庫(kù)自帶的 python/dp_auditorium/ 等統(tǒng)計(jì)檢驗(yàn)工具把輸出分布和理論分布做對(duì)照或者像官方示例那樣直接和非隱私參考結(jié)果并排比較確認(rèn)趨勢(shì)還在、誤差在預(yù)期內(nèi)。到這里你就完成了一個(gè)完整閉環(huán)效果看得見(jiàn)、參數(shù)寫(xiě)得清、預(yù)算算得對(duì)、結(jié)果驗(yàn)得過(guò)。一句話收尾差分隱私把我愿意承擔(dān)多大風(fēng)險(xiǎn)變成了一本可以計(jì)算的賬而這個(gè)庫(kù)就是錢(qián)包、賬本和記賬工具的全套實(shí)現(xiàn)??梢灶A(yù)期隨著隱私監(jiān)管趨嚴(yán)先證明預(yù)算、再發(fā)布統(tǒng)計(jì)會(huì)成為數(shù)據(jù)團(tuán)隊(duì)的默認(rèn)動(dòng)作而不是加分項(xiàng)?!久赓M(fèi)下載鏈接】differential-privacyGoogles differential privacy libraries.項(xiàng)目地址: https://gitcode.com/gh_mirrors/di/differential-privacy創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考