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

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

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

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

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

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

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

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


▊《聯(lián)邦學習實戰(zhàn)》
楊強 黃安埠 劉洋 陳天健 著
經(jīng)典案例一手實踐
配套Python代碼和豐富線上教學資源(含視頻)
本書以實戰(zhàn)為主(包括對應用案例的深入講解和代碼分析),兼顧對理論知識的系統(tǒng)總結(jié)。
全書由五部分共19 章構(gòu)成。第一部分簡要介紹了聯(lián)邦學習的理論知識;第二部分介紹如何使用Python 和FATE 進行簡單的聯(lián)邦學習建模;第三部分是聯(lián)邦學習的案例分析,篩選了經(jīng)典案例進行講解,部分案例用Python 代碼實現(xiàn),部分案例采用FATE 實現(xiàn);第四部分主要介紹和聯(lián)邦學習相關(guān)的高級知識點,包括聯(lián)邦學習的架構(gòu)和訓練的加速方法等;第五部分是回顧與展望。本書適合對聯(lián)邦學習和隱私保護感興趣的高校研究者、企業(yè)研發(fā)人員閱讀。
(京東限時活動,快快掃碼搶購吧!)
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連 熱文推薦
▼點擊閱讀原文,查看本書詳情~

