聯(lián)邦學(xué)習(xí)在視覺領(lǐng)域的應(yīng)用
好消息:本文文末贈送紙質(zhì)正版圖書!
聯(lián)邦學(xué)習(xí)是如何應(yīng)用在視覺領(lǐng)域的?
本文會通過一個(gè)獲得了2020年AAAI人工智能創(chuàng)新應(yīng)用獎(jiǎng)(也是第一個(gè)基于聯(lián)邦學(xué)習(xí)的人工智能工業(yè)級獎(jiǎng)項(xiàng))的案例來向大家介紹!
本案例是聯(lián)邦學(xué)習(xí)在視覺、物聯(lián)網(wǎng)、安防領(lǐng)域的實(shí)際應(yīng)用,對分散在各地的攝像頭數(shù)據(jù),通過聯(lián)邦學(xué)習(xí),構(gòu)建一個(gè)聯(lián)邦分布式的訓(xùn)練網(wǎng)絡(luò),使攝像頭數(shù)據(jù)不需要上傳,就可以協(xié)同訓(xùn)練目標(biāo)檢測模型,這樣一方面確保用戶的隱私數(shù)據(jù)不會泄露,另一方面充分利用各參與方的訓(xùn)練數(shù)據(jù),提升機(jī)器視覺模型的識別效果。
以下內(nèi)容節(jié)選自《聯(lián)邦學(xué)習(xí)實(shí)戰(zhàn)(全彩)》一書!

--正文--
在2012 年的ImageNet LSVRC 比賽中,AlexNet 憑借15.3% 的top-5 錯(cuò)誤率奪得冠軍后,以深度學(xué)習(xí)為代表的算法模型開始在視覺領(lǐng)域占據(jù)絕對的主導(dǎo)地位,并且在很多場景任務(wù)中達(dá)到、甚至超過人類的水平。
比如,2015 年,微軟宣布在圖像識別領(lǐng)域,以4.94% 的top-5 錯(cuò)誤率超過人類的5.1% 水平;Google 最近發(fā)表在Nature Medicine上的一項(xiàng)新研究表明,通過AI 視覺算法能夠根據(jù)患者的胸部CT 圖像診斷出早期肺癌,與六位放射科醫(yī)生相比,AI 的準(zhǔn)確度更高,檢測到的病例增加了5%,假陽性減少了11%,AUC(Area Under Curve,曲線下方的面積大小)達(dá)到94.4%。
除了算法上的不斷提升,大數(shù)據(jù)和硬件算力的發(fā)展也促使人工智能在視覺領(lǐng)域出現(xiàn)爆發(fā)性的增長,傳統(tǒng)的視覺算法處理流程如圖1 所示。

圖1 中心化訓(xùn)練流程圖
我們以目標(biāo)檢測任務(wù)為例,它由下面幾個(gè)主要步驟構(gòu)成:
首先,將收集來的數(shù)據(jù)集都集中存放在中心數(shù)據(jù)庫中,并進(jìn)行集中的圖片數(shù)據(jù)預(yù)處理,包括圖片數(shù)據(jù)清理、標(biāo)注等。
然后,利用這些預(yù)處理的數(shù)據(jù)進(jìn)行中心化的模型訓(xùn)練。
最后,將訓(xùn)練的模型部署到客戶。
但當(dāng)前的中心化訓(xùn)練模式使得視覺的落地和部署面臨許多困難和挑戰(zhàn),具體來說,主要是受下面因素的影響:
? 數(shù)據(jù)隱私:在安防、醫(yī)療等領(lǐng)域,每一個(gè)客戶采集的數(shù)據(jù)都具有高度的隱私性,這些敏感數(shù)據(jù)在用戶沒有授權(quán)的前提下,通常是被禁止上傳的,因此,每一個(gè)客戶端的數(shù)據(jù)都無法有效進(jìn)行共享。另外,機(jī)器學(xué)習(xí)模型的效果非常依賴數(shù)據(jù)的數(shù)量和質(zhì)量,數(shù)據(jù)的割裂導(dǎo)致我們只能利用本地的數(shù)據(jù)進(jìn)行單點(diǎn)建模,也就是每一個(gè)設(shè)備單獨(dú)利用本地?cái)?shù)據(jù)進(jìn)行訓(xùn)練,這種單點(diǎn)訓(xùn)練的模型效果也將明顯下降。
? 模型更新:傳統(tǒng)的處理方式需要將數(shù)據(jù)集中上傳到中心數(shù)據(jù)庫,進(jìn)行統(tǒng)一的數(shù)據(jù)處理和模型訓(xùn)練,然后進(jìn)行模型的評估和部署。在這個(gè)過程中,各個(gè)數(shù)據(jù)源之間,由于網(wǎng)絡(luò)性能和設(shè)備性能的差異,導(dǎo)致數(shù)據(jù)的同步不一致,整個(gè)流程會持續(xù)較長的時(shí)間,因此對于具有實(shí)時(shí)響應(yīng)的場景,這種中心化的訓(xùn)練模式無法滿足當(dāng)前的需求。
? 數(shù)據(jù)的不均勻:這種數(shù)據(jù)的不均勻性體現(xiàn)在每一個(gè)數(shù)據(jù)源得到的數(shù)據(jù),它們的數(shù)據(jù)分布、數(shù)據(jù)質(zhì)量和數(shù)據(jù)大小各不相同。
▊ 動機(jī)
上面說到了在傳統(tǒng)的集中式目標(biāo)檢測訓(xùn)練中的幾處不足,對模型提供方和數(shù)據(jù)提供方來說,安全(數(shù)據(jù)隱私)威脅是當(dāng)前最為頭疼和亟待解決的問題。
安全的威脅主要來自數(shù)據(jù)層面,包括:
? 數(shù)據(jù)提供方的數(shù)據(jù)源離開本地后,數(shù)據(jù)提供方就沒辦法跟蹤這部分?jǐn)?shù)據(jù)的用途了,也無法保證數(shù)據(jù)離開本地后不被其他人竊取。
? 一般來說,數(shù)據(jù)從離開數(shù)據(jù)提供方,到上傳至中心數(shù)據(jù)庫,會經(jīng)過多個(gè)中轉(zhuǎn)地,這就進(jìn)一步增加了數(shù)據(jù)泄露的風(fēng)險(xiǎn)和問題排查的難度。
受此影響,當(dāng)前的模型服務(wù)供應(yīng)商和數(shù)據(jù)提供方,都急需一種新的模型訓(xùn)練方法:
一方面,保證數(shù)據(jù)不離開本地,這樣能夠使數(shù)據(jù)提供方確信數(shù)據(jù)的安全;另一方面,模型的訓(xùn)練和性能不會受到影響。
這兩點(diǎn)都非常適合用聯(lián)邦學(xué)習(xí)來解決,聯(lián)邦學(xué)習(xí)的定義和提出的初衷,就是保證數(shù)據(jù)在不出本地的前提下,聯(lián)合各參與方數(shù)據(jù)進(jìn)行協(xié)同訓(xùn)練。
▊ Fedision-聯(lián)邦視覺產(chǎn)品
前面介紹了利用聯(lián)邦學(xué)習(xí)進(jìn)行目標(biāo)檢測模型訓(xùn)練的動機(jī),一個(gè)完整的聯(lián)邦視覺(目標(biāo)檢測)產(chǎn)品的流程圖如圖2 所示。本節(jié)將對該產(chǎn)品進(jìn)行概括的描述。

圖2 橫向聯(lián)邦視覺產(chǎn)品流程圖
圖中描述了基于橫向聯(lián)邦學(xué)習(xí)實(shí)現(xiàn)的目標(biāo)檢測模型的工作流程,我們對本案例的基本設(shè)置進(jìn)行如下綜述:
? 不失一般性,本案例的聯(lián)邦網(wǎng)絡(luò)中的客戶參與方共有三個(gè):分別是公司A、B、C。服務(wù)端由微眾的云服務(wù)器提供。
? 為了簡化問題,本案例中的三個(gè)客戶參與方提供的數(shù)據(jù)分布都比較均衡。
? 每一個(gè)客戶方部署聯(lián)邦學(xué)習(xí)框架后,其主要工作包括:對本地?cái)?shù)據(jù)進(jìn)行預(yù)處理;發(fā)起聯(lián)邦學(xué)習(xí)訓(xùn)練任務(wù);參與聯(lián)邦學(xué)習(xí)任務(wù);部署聯(lián)邦學(xué)習(xí)模型在本地進(jìn)行預(yù)測和推斷。
? 服務(wù)端由微眾的云服務(wù)器提供,其主要工作包括:實(shí)時(shí)監(jiān)控客戶端參與方的連接情況;對上傳的客戶端模型進(jìn)行聚合;挑選客戶端參與客戶端本地訓(xùn)練;上傳全局模型。
? 經(jīng)過聯(lián)邦學(xué)習(xí)更新后的全局模型,有兩個(gè)用途:
第一, 可以分發(fā)到當(dāng)前聯(lián)邦網(wǎng)絡(luò)的客戶端參與方(即圖中的公司A、B、C),進(jìn)行本地部署預(yù)測,使得聯(lián)邦學(xué)習(xí)的參與方受益;
第二, 如果新的全局模型效果能達(dá)到SOTA 水平,在經(jīng)過參與方的協(xié)商同意后,還可以將新的聯(lián)邦全局模型以開源或者商業(yè)售賣的形式,提供給其他廠商進(jìn)行部署。
基于聯(lián)邦學(xué)習(xí)構(gòu)建的目標(biāo)檢測視覺模型,相比于集中式的目標(biāo)檢測模型,有下面的優(yōu)勢和好處:
? 隱私性:從隱私角度,聯(lián)邦學(xué)習(xí)確保數(shù)據(jù)的產(chǎn)生、數(shù)據(jù)的處理都在本地進(jìn)行。相比集中式訓(xùn)練,數(shù)據(jù)的隱私安全大為提高。
? 效率:從效率上來說,傳統(tǒng)的集中式訓(xùn)練,需要等待所有數(shù)據(jù)提供方的數(shù)據(jù)上傳后,才進(jìn)行統(tǒng)一的數(shù)據(jù)處理,再進(jìn)行集中式的模型訓(xùn)練和模型評估,最后部署新模型,這個(gè)流程的等待時(shí)間比較長。而聯(lián)邦學(xué)習(xí)的訓(xùn)練,由于每一個(gè)客戶參與方從數(shù)據(jù)收集到數(shù)據(jù)處理都獨(dú)立完成,且都有發(fā)起聯(lián)邦學(xué)習(xí)的權(quán)力,只要發(fā)起聯(lián)邦學(xué)習(xí)請求,就能進(jìn)行模型訓(xùn)練,因此每一個(gè)客戶方部署新模型的速度都加快了許多。
? 費(fèi)用:在集中式訓(xùn)練中,將原始數(shù)據(jù)(圖像、視頻)上傳到服務(wù)端會消耗非常多的網(wǎng)絡(luò)帶寬資源。而聯(lián)邦視覺模型上傳的是模型參數(shù),模型參數(shù)的傳輸量要比數(shù)據(jù)傳輸量小得多,從而能有效節(jié)省網(wǎng)絡(luò)帶寬,節(jié)約費(fèi)用。
基于聯(lián)邦學(xué)習(xí)實(shí)現(xiàn)目標(biāo)檢測產(chǎn)品是橫向聯(lián)邦的一個(gè)經(jīng)典應(yīng)用。本節(jié)我們將給出其詳細(xì)的實(shí)現(xiàn)過程。本案例有基于Flask-SocketIO的Python 實(shí)現(xiàn),也有基于FATE 的實(shí)現(xiàn)。最后,我們討論基于Flask-SocketIO 的Python 實(shí)現(xiàn)。讀者可以自行查閱基于FATE 的實(shí)現(xiàn)。
▊ Flask-SocketIO 基礎(chǔ)
在本案例的實(shí)現(xiàn)中,我們將使用Python 語言和PyTorch 機(jī)器學(xué)習(xí)模型庫,與書中第3章的實(shí)現(xiàn)不同,第3章使用普通函數(shù)調(diào)用的方式模擬服務(wù)端與客戶端之間的通信,這里使用Flask-SocketIO 作為服務(wù)端和客戶端之間的通信框架。此外,書中第16 章會具體介紹聯(lián)邦學(xué)習(xí)中的通信機(jī)制和常用的Python 網(wǎng)絡(luò)通信包。
通過Flask-SocketIO,我們可以輕松實(shí)現(xiàn)服務(wù)端與客戶端的雙向通信,F(xiàn)lask-SocketIO 庫的安裝非常方便,只需要在命令行中輸入下面的命令即可:
![]()
? 服務(wù)端創(chuàng)建:先來初始化服務(wù)端,下面是初始化服務(wù)端的一段簡短代碼。

socketio.run() 是服務(wù)器的啟動接口,它通過封裝app.run() 標(biāo)準(zhǔn)實(shí)現(xiàn)。這段代碼是創(chuàng)建socket 服務(wù)端最簡短的代碼,服務(wù)器啟動后沒有實(shí)現(xiàn)任何功能,為了能響應(yīng)連接的客戶端請求,我們在服務(wù)端中定義必要的處理函數(shù)。socketIO 的通信基于事件,不同名稱的事件對應(yīng)不同的處理函數(shù),在處理函數(shù)的定義前,用on 裝飾器指定接收事件的名稱,這樣事件就與處理函數(shù)一一對應(yīng),如下我們創(chuàng)建了一個(gè)“my event”事件,該事件對應(yīng)的處理函數(shù)是“test_message”。

事件創(chuàng)建后,服務(wù)器處在監(jiān)聽狀態(tài),等待客戶端發(fā)送“my event”的請求。由于socketIO 實(shí)現(xiàn)的是雙向通信,除了能添加事件等待客戶端響應(yīng),服務(wù)端也可以向客戶端發(fā)送請求,服務(wù)端向客戶端發(fā)送消息使用send 函數(shù)或是emit 函數(shù)(對于未命名的事件使用send,已經(jīng)命名的事件用emit),如上面的代碼中,當(dāng)服務(wù)端接收到客戶端的“my event”事件請求后,向客戶端反向發(fā)送“my response”的請求。
? 客戶端:客戶端的應(yīng)用程序設(shè)計(jì)相對服務(wù)端要靈活很多,我們可以使用JavaScript、C++、Java 和Swift 中的任意socketIO 官方客戶端庫或與之兼容的客戶端,來與上面的服務(wù)端建立連接。這里,我們使用socketIO-client 庫來創(chuàng)建一個(gè)client。

先利用socketIO 函數(shù)構(gòu)造一個(gè)客戶端,構(gòu)造函數(shù)需要提供連接的服務(wù)端的IP 和端口信息。然后利用on 連接事件“my response”和處理函數(shù)“test_response”,發(fā)送“my event”事件,等待服務(wù)端的事件響應(yīng)。
鑒于本書的篇幅限制,我們不在此對Flask-SocketIO 做更多的講述,讀者如果想深入了解Flask-SocketIO 的實(shí)現(xiàn)和使用,可以參見Flask-SocketIO 的官方文檔。聯(lián)邦學(xué)習(xí)的過程是聯(lián)邦服務(wù)端與聯(lián)邦客戶端之間不斷進(jìn)行參數(shù)通信的過程,圖3 展示了聯(lián)邦客戶端與聯(lián)邦服務(wù)端的詳細(xì)通信過程。

圖3 聯(lián)邦客戶端與聯(lián)邦服務(wù)端的通信過程
接下來,書中會分別從服務(wù)端角度和客戶端角度簡要分析其構(gòu)建和實(shí)現(xiàn)過程,如果想要了解后面的完整案例,推薦閱讀《聯(lián)邦學(xué)習(xí)實(shí)戰(zhàn)(全彩)》一書。


▊《聯(lián)邦學(xué)習(xí)實(shí)戰(zhàn)》
楊強(qiáng) 黃安埠 劉洋 陳天健 著
經(jīng)典案例一手實(shí)踐
配套Python代碼和豐富線上教學(xué)資源(含視頻)
本書以實(shí)戰(zhàn)為主(包括對應(yīng)用案例的深入講解和代碼分析),兼顧對理論知識的系統(tǒng)總結(jié)。
全書由五部分共19 章構(gòu)成。第一部分簡要介紹了聯(lián)邦學(xué)習(xí)的理論知識;第二部分介紹如何使用Python 和FATE 進(jìn)行簡單的聯(lián)邦學(xué)習(xí)建模;第三部分是聯(lián)邦學(xué)習(xí)的案例分析,篩選了經(jīng)典案例進(jìn)行講解,部分案例用Python 代碼實(shí)現(xiàn),部分案例采用FATE 實(shí)現(xiàn);第四部分主要介紹和聯(lián)邦學(xué)習(xí)相關(guān)的高級知識點(diǎn),包括聯(lián)邦學(xué)習(xí)的架構(gòu)和訓(xùn)練的加速方法等;第五部分是回顧與展望。本書適合對聯(lián)邦學(xué)習(xí)和隱私保護(hù)感興趣的高校研究者、企業(yè)研發(fā)人員閱讀。
(京東限時(shí)活動,快快掃碼搶購吧!)
6月2日22點(diǎn) 結(jié)束并開獎(jiǎng)。中獎(jiǎng)讀者將被免費(fèi)寄送!
參與方法:
公眾號后臺、或者掃以下碼,回復(fù) 168 ,參與抽獎(jiǎng)!
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連

