初識聯(lián)邦學(xué)習(xí)
最早知道聯(lián)邦學(xué)習(xí)是在今年6月參加的O‘Reilly AI大會上,谷歌的session介紹了他們用聯(lián)邦學(xué)習(xí)改善輸入法預(yù)測的最新成果巴比,令人耳目一新术奖。它的過程是這樣的:每個手機接受云端分發(fā)的初始模型,用本地的數(shù)據(jù)進行訓(xùn)練轻绞,之后把更新的模型傳回云端采记,云端對來自各個手機端的數(shù)據(jù)進行聚合,形成新的模型再下發(fā)政勃,重復(fù)這一過程挺庞。它期望達到的效果是在保護本地數(shù)據(jù)隱私的情況下實現(xiàn)傳統(tǒng)方式中收集所有客戶端數(shù)據(jù)進行統(tǒng)一訓(xùn)練的效果,同時節(jié)省上傳本地數(shù)據(jù)的網(wǎng)絡(luò)消耗稼病。這一方法已經(jīng)被用于谷歌輸入法中选侨,提高預(yù)測下個詞語的準確率,那是我第一次知道聯(lián)邦學(xué)習(xí)然走。
后來援制,GDPR的風(fēng)越吹越大,對數(shù)據(jù)所有權(quán)和隱私性的關(guān)注越來越多芍瑞,拿不到賴以生存的數(shù)據(jù)集晨仑,AI該怎么辦?于是拆檬,聯(lián)邦學(xué)習(xí)又一次出現(xiàn)在我的視野里洪己。
這次,我決定好好看看它竟贯。于是答捕,在經(jīng)過了不到一周的短暫研究,我終于理解了政策與對策之間的巧妙關(guān)系以及一個新方向出來后研究員們的腦回路屑那。雖然AI領(lǐng)域很多方法都停留在研究領(lǐng)域無法落地拱镐,但我相信艘款,由于隱私保護的迫切性,聯(lián)邦學(xué)習(xí)是一定會落地開花且成為未來的基礎(chǔ)方法的沃琅。
TO C:谷歌GBoard應(yīng)用
聯(lián)邦學(xué)習(xí)哗咆,英文名叫Federated Learning,谷歌給他的定義是這樣:
Build?machine?learning?models?based?on?data?sets?that?are?distributed?across?multiple?devices?while?preventing?data?leakage.
也就是說益眉,它是分布在不同設(shè)備的數(shù)據(jù)擁有者在不暴露自己數(shù)據(jù)的基礎(chǔ)上聯(lián)合訓(xùn)練出模型的方法晌柬。
從上面的定義可以看出,谷歌關(guān)注的是C端的應(yīng)用郭脂,當然有C端的應(yīng)用就一定能擴展到B端年碘,這個我們下篇再看。
回到應(yīng)用朱庆,谷歌TO C 最出名的應(yīng)用就是剛剛介紹的輸入法下個單詞預(yù)測問題(GBoard next-word prediction)。他們發(fā)了這樣一篇論文:
文中介紹了他們做聯(lián)邦訓(xùn)練的算法FederatedAveraging闷祥,過程很好理解:每一輪訓(xùn)練娱颊,服務(wù)端首先下發(fā)一個全局模型給該輪參與者,參與者拿到這個模型后凯砍,根據(jù)自己的本地數(shù)據(jù)(比如箱硕,用戶用輸入法的敲字記錄)進行模型訓(xùn)練,SGD計算梯度悟衩,更新模型參數(shù)剧罩,待模型收斂后傳回服務(wù)端。服務(wù)端拿到參與者的模型更新后座泳,對參數(shù)求平均生成一個新模型惠昔。
在這個過程中,不同于傳統(tǒng)方式上傳log挑势,聯(lián)邦訓(xùn)練使用Gboard設(shè)備中本地緩存的輸入文本镇防,也就意味著在本地訓(xùn)練時用到的訓(xùn)練數(shù)據(jù),不僅僅局限于你在谷歌系產(chǎn)品中輸入的內(nèi)容潮饱,而是你輸入的所有內(nèi)容来氧,因此更能反映真實的輸入分布。同時香拉,訓(xùn)練對于參與者也加入了要求啦扬,就硬件要求而言,設(shè)備必須至少具有2GB的可用內(nèi)存凫碌。此外扑毡,僅當客戶端正在充電,連接到wifi且處于空閑狀態(tài)時盛险,(可能也就是你睡覺的時候吧)僚楞,才允許客戶端參與勤晚,這樣有效保證了訓(xùn)練對于手機端是無感知的。
比起傳統(tǒng)方式來說泉褐,這種方式有幾點好處:
首先赐写,在整個過程中,參與者只會上傳模型的更新膜赃,而不用把本地所有的輸入記錄都上傳了挺邀,這樣一來,你之前用谷歌輸入法敲的“張三李四王麻子“統(tǒng)統(tǒng)不會被谷歌拿走跳座,從物理上保護了你的隱私端铛,同時也巧妙了繞過了GDPR關(guān)于數(shù)據(jù)隱私性的規(guī)定。你的數(shù)據(jù)就在你的手機里疲眷,我只是用它而已禾蚕。
其次,由于聯(lián)邦學(xué)習(xí)使用的本地數(shù)據(jù)源來自于緩存狂丝。緩存沒有長度限制换淆,且數(shù)據(jù)質(zhì)量更高,因此召回和CTR更好几颜。
基于此倍试,谷歌得出來這樣的結(jié)論:
Federated?learning?has?proved?to?be?a?useful?extension?of?server-based?distributed?training?to?client?device-based?training?using?locally?stored?data.
之后,谷歌奠定了在聯(lián)邦學(xué)習(xí)TO C方向大佬的地位蛋哭,開始研究一些細節(jié)問題县习,比如各個設(shè)備配置不一樣,訓(xùn)練速度不同步怎么辦谆趾,如何保證更新上傳的安全性等等躁愿。
值得一提的是,在這篇文章中也寫到了一個我非常關(guān)心的問題——對隱私數(shù)據(jù)的界定沪蓬。直白一點說攘已,本地數(shù)據(jù)算隱私,本地模型就不算了么怜跑?你不存儲我的原始數(shù)據(jù)了样勃,那我傳給你的模型更新安全么?對此性芬,文章是這么說的:
第一點峡眶,傳給服務(wù)器的模型更新是臨時的,集中的和匯總的(Model updates communicated to the server are ephemeral, focused and aggregated)植锉。也就是說辫樱,我并不在意你這個單個客戶端訓(xùn)練出的更新,我想要的是所有模型匯總起來的結(jié)果,感受到了一絲絲自作多情的感覺喘垂。
第二點,客戶端更新永遠不會存儲在服務(wù)器上懈贺,他們在內(nèi)存中進行處理搬男,并在匯總成權(quán)重向量后立即丟棄(Client updates are never stored on the server and are processed in memory and immediately discarded after accumulation in a weight vector)拣展,這個很明確了吧,你的更新是一次性的缔逛,我也不稀罕存下來备埃。
這就是谷歌對于我安全性擔憂的回應(yīng),聽上去有理有據(jù)褐奴,聽完還有點被降維打擊的感覺按脚。
總之,通過這種方式敦冬,原始的數(shù)據(jù)受到了保護辅搬,雖然每個手機累點兒,再也沒有閑下來的時候了脖旱,能省了數(shù)據(jù)傳輸也是好的堪遂。如果你想讓各個客戶端的模型更個性化一點,你可以在下發(fā)的共享模型中增加一些改進夯缺,形成千人千面的本地模型蚤氏。
TO C:FL應(yīng)用在推薦系統(tǒng)
看完了預(yù)測問題甘耿,之后來看看華為如何將聯(lián)邦學(xué)習(xí)應(yīng)用在推薦系統(tǒng)領(lǐng)域踊兜,看完論文發(fā)現(xiàn),他們不僅用了聯(lián)邦學(xué)習(xí)佳恬,還把元學(xué)習(xí)的理念揉進來捏境,提出了聯(lián)邦元學(xué)習(xí)模型。
元學(xué)習(xí)(meta-learning)毁葱,也叫Learning to learn垫言,是在增強學(xué)習(xí)之后的又一分支,其目的在于通過以往的經(jīng)驗來學(xué)習(xí)倾剿,也就是讓機器自己學(xué)習(xí)如何訓(xùn)練筷频。
這篇文章就用到了元學(xué)習(xí)的概念,一層一層優(yōu)化的腦回路是這樣的:在推薦領(lǐng)域前痘,用的很多的是協(xié)同過濾(CF)凛捏,但要實現(xiàn)CF,服務(wù)器需要收集大量的用戶數(shù)據(jù)和物品數(shù)據(jù)來集中訓(xùn)練芹缔。應(yīng)用聯(lián)邦學(xué)習(xí)FL后解決了數(shù)據(jù)隱私問題坯癣,于是華為把關(guān)注點放在了優(yōu)化客戶端與服務(wù)器傳輸內(nèi)容方面,在聯(lián)邦學(xué)習(xí)的框架中最欠,服務(wù)器與用戶設(shè)備傳輸?shù)氖悄P褪韭蓿P吞笄沂峭ㄓ玫某兔āS谑撬麄円朐獙W(xué)習(xí),升級成聯(lián)邦元學(xué)習(xí)(Federated Meta-learning)蚜点,讓服務(wù)器與設(shè)備間只傳輸能夠訓(xùn)練模型的算法轧房,這樣一來,既精簡了傳輸內(nèi)容禽额,又可以使每個客戶端的模型與眾不同锯厢,也就是說,在這個新的框架中脯倒,任務(wù)從聯(lián)合訓(xùn)練模型升級到了聯(lián)合優(yōu)化訓(xùn)練模型的算法实辑。
具體的實現(xiàn)分為兩個階段:
第一階段,模型訓(xùn)練藻丢,在各個用戶設(shè)備上進行剪撬,首先在當前算法的支持集上訓(xùn)練模型,然后在單獨的查詢集上評估模型悠反,反饋測試結(jié)果残黑,用以提高算法訓(xùn)練模型的能力。
第二階段斋否,算法更新梨水,在服務(wù)器上進行,根據(jù)反饋的測試結(jié)果更新算法茵臭,進行元訓(xùn)練疫诽。
為了不引入復(fù)雜的公式,我畫了兩張圖表明這個過程旦委。
首先來看看奇徒,單純的元學(xué)習(xí)應(yīng)用在推薦系統(tǒng)是如何做的:
大量用戶的歷史數(shù)據(jù)會被采樣分為支持集和查詢集,他們相互獨立且都已打好標簽缨硝。用支持集訓(xùn)練模型摩钙,用查詢集預(yù)測,計算損失查辩,進行優(yōu)化胖笛。當訓(xùn)練好的算法應(yīng)用到新用戶時,首先要用支持集根據(jù)這個算法生成模型宜岛,之后才能用這個模型進行預(yù)測长踊。為了評估算法的性能,我們會將算法應(yīng)用到各個測試任務(wù)中來進行元測試(meta testing)谬返。
之后再看看加了元學(xué)習(xí)的聯(lián)邦學(xué)習(xí)是怎么做的之斯,相比上個圖來說,是增加了各個客戶端并行處理的過程:
服務(wù)器先分發(fā)帶有參數(shù)的算法給各個客戶端,每個用戶收到算法后用本地數(shù)據(jù)生成佑刷、訓(xùn)練并評估模型莉擒,最后,服務(wù)器從用戶那里收集損失的梯度來更新算法的參數(shù)瘫絮。在整個過程中涨冀,用戶上傳的只是算法和損失梯度,而不是模型或原始數(shù)據(jù)麦萤。
至于模型和算法有什么區(qū)別鹿鳖,為什么傳算法就比傳算法更優(yōu)秀?
從理論上講壮莹,授之以魚不如授之以漁翅帜,傳輸整個模型當然不如傳輸生成模型的技能更優(yōu)秀,這也是元學(xué)習(xí)的理念命满。
從論文的實驗中也可以略窺一二涝滴,文章介紹了他們進行服務(wù)預(yù)測的一個實驗,總共有2400種服務(wù)胶台,由于聯(lián)邦學(xué)習(xí)需要訓(xùn)練一個統(tǒng)一的模型,因此需要處理全部2400種類別诈唬,而聯(lián)邦元學(xué)習(xí)是在本地訓(xùn)練本地使用的韩脏,因此只需要訓(xùn)練40個類別。同理铸磅,聯(lián)邦學(xué)習(xí)的特征向量需要揉合用戶特征和服務(wù)特征赡矢,因此需要11892維,而聯(lián)邦元學(xué)習(xí)只需要服務(wù)特征愚屁,共103維济竹,這樣看來痕檬,是不是優(yōu)秀了很多霎槐。
聯(lián)邦學(xué)習(xí)應(yīng)用在B端
當然C端的應(yīng)用還有很多,因為現(xiàn)在這個領(lǐng)域真的很火梦谜,不過要再講我也講不出來了丘跌,因為我看到的文章中這兩個應(yīng)用方向已經(jīng)足夠有代表性了(其實是也并沒有看那么多了)。下面唁桩,我們再看看B端的應(yīng)用闭树,在這方面,以楊強教授帶領(lǐng)的微眾銀行AI團隊走在最前沿荒澡,看完了他們的研究报辱,突然細思恐極,等B端的聯(lián)邦學(xué)習(xí)真正都落地单山,各個公司都打破信息孤島后碍现,我們可能真的就沒有什么隱私了幅疼,莫名覺得有點有趣。
什么意思呢昼接,微眾銀行對于B端FL是這樣說的:
所謂“聯(lián)邦學(xué)習(xí)”爽篷,顧名思義,就是搭建一個虛擬的“聯(lián)邦國家”慢睡,把大大小小的“數(shù)據(jù)孤島”聯(lián)合統(tǒng)一進來逐工。他們就像這個“聯(lián)邦國家”里的一個州,既保持一定的獨立自主(比如商業(yè)機密漂辐,用戶隱私)泪喊,又能在數(shù)據(jù)不共享出去的情況下,共同建模髓涯,提升AI模型效果窘俺。?
本質(zhì)上,它是一種加密的分布式機器學(xué)習(xí)技術(shù)复凳,參與各方可以在不披露底層數(shù)據(jù)和底層數(shù)據(jù)的加密(混淆)形態(tài)的前提下共建模型瘤泪。這也是一種共贏的機器學(xué)習(xí)方式,它打破了山頭林立的數(shù)據(jù)次元壁育八,盤活了大大小小的“數(shù)據(jù)孤島”对途,連成一片共贏的AI大陸。
什么意思呢髓棋?現(xiàn)在各個公司都有數(shù)據(jù)隔離性实檀,銀行有你資產(chǎn)狀況的數(shù)據(jù),京東淘寶有你購買記錄的數(shù)據(jù)按声,攜程途牛有你出去玩的數(shù)據(jù)膳犹,他們誰都不共享自己的數(shù)據(jù)跟其他的公司,都是各訓(xùn)練各的模型签则,是一個個“數(shù)據(jù)孤島”须床。B端的聯(lián)邦學(xué)習(xí)就是要把這些公司聯(lián)合起來,在不暴露數(shù)據(jù)的情況共同建模渐裂,最后打通你生活的方方面面豺旬,比如根據(jù)你的購買力推薦商品,根據(jù)你的出行情況推薦分期等等柒凉。至于是不是共贏呢族阅,對于各個公司來說看起來是的,但對于用戶來說也是這樣的么膝捞?就仁者見仁智者見智了坦刀。
回到技術(shù)上,微眾對于B端的FL也分了幾種類別來研究:
第一種,橫向聯(lián)邦學(xué)習(xí)鲤遥,A與B的數(shù)據(jù)集有些特征重疊央渣,但樣本不同,重點解決樣本缺的問題渴频。比如工行和建行的數(shù)據(jù)芽丹,特征都差不多,但樣本不同卜朗。
第二種拔第,縱向聯(lián)邦學(xué)習(xí),A與B的數(shù)據(jù)集有些樣本重疊场钉,但特征不同蚊俺,重點解決特征缺的問題。比如你攜程的數(shù)據(jù)和你滴滴的數(shù)據(jù)逛万,樣本都是你泳猬,但特征肯定不同。
第三種宇植,聯(lián)邦遷移學(xué)習(xí)得封,A與B的數(shù)據(jù)集樣本也不同,特征也不同指郁,這個就是對模型更高的追求了忙上。比如國內(nèi)滴滴的數(shù)據(jù)和國外google的數(shù)據(jù),他們特征也不同闲坎,樣本也不同疫粥。
那么,類分好了腰懂,參照谷歌的聯(lián)邦學(xué)習(xí)步驟梗逮,對于這三類也總結(jié)了不同的訓(xùn)練方式,由于聯(lián)邦遷移學(xué)習(xí)我還沒學(xué)懂绣溜,就不介紹啦慷彤。在介紹的時候,我會一并介紹橫向和縱向FL的激勵機制涮毫,也是我之前很關(guān)心的問題瞬欧,當各個公司貢獻量不均時贷屎,如何合理評估他們的貢獻罢防。方法來源于微眾的下面這篇文章:
B端:橫向聯(lián)邦學(xué)習(xí)
剛剛說了,橫向聯(lián)邦學(xué)習(xí)是解決樣本缺的問題唉侄,當各個公司一起參加訓(xùn)練咒吐,貢獻樣本后,訓(xùn)練就這樣展開:
第一步:參與方用本地數(shù)據(jù)計算,訓(xùn)練梯度恬叹,使用加密候生,差分隱私(differntial privacy, DP)或秘密共享技術(shù)掩蓋梯度,并將掩蔽的結(jié)果發(fā)送到服務(wù)器绽昼;
第二步:中心服務(wù)器執(zhí)行安全聚合唯鸭,而無需學(xué)習(xí)有關(guān)任何參與者的信息;
第三步:中心服務(wù)器向參與者下發(fā)聚合結(jié)果硅确;
第四步:參與者解密梯度目溉,更新各自的模型。
不斷迭代上述過程直至損失收斂菱农,所有參與者共享最終模型參數(shù)缭付。
由于各個參與方貢獻的是數(shù)據(jù)的樣本,因此對參與方貢獻評估的思路就是看看它提供的樣本對于訓(xùn)練有沒有用循未,采用的方法是——刪除法陷猫。
每次刪掉一個參與方提供的樣本,重新訓(xùn)練模型的妖,計算刪前刪后兩個模型預(yù)測能力的變化绣檬,記為影響度(Infuence Measure),用該指標衡量各個參與方的貢獻嫂粟。像這樣:
道理很淺顯易懂河咽,但是評估過程的開銷應(yīng)該不小吧。
B端:縱向聯(lián)邦學(xué)習(xí)
比起橫向來說赋元,縱向復(fù)雜一些忘蟹,是特征層面的共享,以A和B的合作為例搁凸,為了保證A和B的數(shù)據(jù)的隱私性媚值,我們需要引入一個具有公信力的第三方C,訓(xùn)練過程是這樣的:
首先需要進行的是加密樣本對齊护糖,利用基于加密的用戶樣本對齊技術(shù)褥芒,找到A和B的共有樣本。之后開始迭代:
第一步:C創(chuàng)建加密對嫡良,將公鑰發(fā)送給A和B锰扶,用來對訓(xùn)練過程中需要交換的數(shù)據(jù)進行加密;
第二步:A和B以加密的形式交換用于計算梯度的中間結(jié)果;
第三步:A和B分別基于加密的中間結(jié)果計算梯度和損失寝受,向C發(fā)送加密的值坷牛,C匯總計算總梯度,并將其解密很澄。
第四步:C將解密的梯度和損失發(fā)送回A和B京闰,A和B更新相應(yīng)的模型參數(shù)颜及。
在這里,微眾用的是同態(tài)加密的方式來加密傳輸?shù)臄?shù)據(jù)蹂楣。說到同態(tài)加密俏站,知乎里的高贊回答說的很形象生動,有興趣的寶寶可以看一下痊土。
同態(tài)加密方案最有趣的地方在于肄扎,其關(guān)注的是數(shù)據(jù)處理安全。同態(tài)加密提供了一種對加密數(shù)據(jù)進行處理的功能赁酝。也就是說反浓,其他人可以對加密數(shù)據(jù)進行處理,但是處理過程不會泄露任何原始內(nèi)容赞哗。同時雷则,擁有密鑰的用戶對處理過的數(shù)據(jù)進行解密后,得到的正好是處理后的結(jié)果肪笋。
同態(tài)加密的實現(xiàn)原理是什么月劈?在實際中有何應(yīng)用?
簡單來說藤乙,就是我加密傳給你我的數(shù)據(jù)給你處理猜揪,你雖然處理的是密文,但結(jié)果傳給我坛梁,我解碼后拿到的結(jié)果而姐,跟你直接處理明文后給我的結(jié)果是相同的。這樣特性的函數(shù)就能滿足我們的要求划咐。
對于縱向聯(lián)邦學(xué)習(xí)的貢獻評估是同樣的思路拴念,評估你貢獻的特征到底值不值錢,這里用到了一個新的指標——Shapley值褐缠,它可以計算特征的重要性政鼠。
在測試中,每次打包一個組織的所有特征作為一個聯(lián)合特征队魏,其他特征作為單獨特征公般,一起參與評分,分越高表明貢獻越大胡桨。像這樣:
當然官帘,之后學(xué)者就開始研究如何不帶C一起玩,只有A和B如何完成這個過程昧谊,這篇論文引入?yún)^(qū)塊鏈的方式來做刽虹,就不具體介紹了。
怎么樣揽浙,看了B端聯(lián)邦學(xué)習(xí)的思路状婶,是不是覺得我們的生活即將不再是一個孤島意敛,當各個公司一起聯(lián)合訓(xùn)練時馅巷,我們的本地數(shù)據(jù)共享不共享膛虫,真的還是保護我們隱私的核心問題么?但與此同時钓猬,我們即將面對一個更便利更精準的生活環(huán)境稍刀,目前微眾已經(jīng)推出了一些應(yīng)用,有興趣的可以了解一下敞曹。
一些細節(jié)
最后账月,介紹幾個我讀論文時的一些細節(jié)問題,有助于更好的理解整個體系:
1) 什么是非IID數(shù)據(jù)澳迫?
在讀論文時局齿,經(jīng)常可以看到說聯(lián)邦學(xué)習(xí)面對的數(shù)據(jù)是non-IID橄登,對此專門學(xué)習(xí)了一下抓歼,其實很簡單,縮寫很唬人拢锹,展開就是non idependently and identically distributed data谣妻,也就是數(shù)據(jù)不遵循獨立同分布。
現(xiàn)有的機器學(xué)習(xí)任務(wù)默認訓(xùn)練數(shù)據(jù)遵循獨立同分布卒稳,神經(jīng)網(wǎng)絡(luò)蹋半、深度學(xué)習(xí)等常見算法一般都將數(shù)據(jù)遵循IID的假設(shè)作為其推導(dǎo)的一部分。但在聯(lián)邦學(xué)習(xí)中充坑,各個設(shè)備上的數(shù)據(jù)是由設(shè)備/用戶獨立產(chǎn)生的减江,不同設(shè)備/用戶的非同源數(shù)據(jù)具有不同的分布特征,任何特定用戶的本地數(shù)據(jù)集都不能代表總體分布捻爷。因此研究提升Non-IID數(shù)據(jù)的學(xué)習(xí)效率您市,對于聯(lián)邦學(xué)習(xí)具有重要意義。
2) 聯(lián)邦學(xué)習(xí)與分布式學(xué)習(xí)有什么不同役衡?
分布式學(xué)習(xí)茵休,參數(shù)服務(wù)器將數(shù)據(jù)存儲在分布式工作節(jié)點上,通過中央調(diào)度節(jié)點分配數(shù)據(jù)和計算資源手蝎。一切都由中央節(jié)點控制榕莺,工作節(jié)點沒有決策權(quán)。但是對于聯(lián)合學(xué)習(xí)棵介,工作節(jié)點代表數(shù)據(jù)所有者钉鸯。它具有本地數(shù)據(jù)的完全自治權(quán),并且可以決定何時以及如何加入聯(lián)合學(xué)習(xí)邮辽。
3) 聯(lián)邦學(xué)習(xí)的激勵機制唠雕?
剛剛說了兩種聯(lián)邦學(xué)習(xí)如何評估參與方貢獻贸营,微眾在這個基礎(chǔ)上提到可以用區(qū)塊鏈技術(shù)建立一個讓參與各方都滿意的一個共識機制來記錄大家的貢獻,以此獎勵對聯(lián)盟有作用的機構(gòu)岩睁。具體的實現(xiàn)還不是很清楚钞脂,期待之后的論文。
如果看到這里你還在捕儒,那么我真的很感動了冰啃,說明你對于新技術(shù)有極大的熱情,當然也說明我寫的形象生動刘莹。希望我的介紹能讓你對聯(lián)邦學(xué)習(xí)有一個大概的了解阎毅,如果你有什么新的想法,歡迎一起探討点弯。