聯邦學習 (Federated Learning):五個廠區共訓一個模型,影像一張都不出廠

聯邦學習 (Federated Learning):五個廠區共訓一個模型,影像一張都不出廠

集團五個廠區都想要更強的辨識模型,但監視器影像涉及個資與商業機密,誰都不能把資料交出去——資料孤島撞上模型品質,這是企業 AI 最現實的僵局。本篇從零手刻 FedAvg:影像全部留在廠內,只有模型權重旅行。實測結果:現實程度的資料偏斜下,聯邦模型 0.960 幾乎貼平集中式上限 0.990,而各廠自己練只有 0.835;但誠實打臉也很痛——極端偏斜(每廠只看得到兩種類別)時 FedAvg 崩到 0.363,客戶端漂移是它的著名死穴。


核心貢獻者

Brendan McMahan 領銜的 Google 團隊於 2017 年發表**《Communication-Efficient Learning of Deep Networks from Decentralized Data》**,提出 FedAvg(Federated Averaging)——「聯邦學習」這個詞就是他們創造的。動機非常務實:手機鍵盤 Gboard 想學會使用者的輸入習慣,但打字內容是最私密的資料,不可能上傳雲端。解法:模型下去、資料不動、只有權重回來。這套機制後來直接跑在數億支手機上,是隱私保護機器學習從論文走進產品的第一個大案例。


為什麼資料不能離廠,模型還想變強?

Day 51 結尾留了一個現實難題:集團有五個廠區,各自的監視器每天累積大量影像,大家都想要一個更強的共用模型。但——

  • 影像裡有員工的臉(個資法)、有產線佈局與製程(商業機密);
  • 集團內部各廠是獨立法人,資料跨廠傳輸要過法務;
  • 跨國廠區還有資料在地化法規(GDPR、中國網安法)。

於是每個廠只能抱著自己的資料孤島,各練各的弱模型。聯邦學習把問題反過來:資料不動,模型動。

Loading Diagram...

1. 資料集來源

資料集:Digits (scikit-learn)

備註:延續 Day 50 的「儀表數字判讀」代理情境。1,400 張訓練影像平分給 5 個廠區(各 280 張),397 張當全域測試集。玩具規模,但 FedAvg 的機制與陷阱在任何真實模型上一字不改。

實驗設計:三種「誰看到什麼」的世界

聯邦學習的成敗不在演算法,在各廠資料長得多不一樣(non-IID)。我們準備三種切分:

  • IID(理想):隨機均分,每廠都看得到所有類別——現實中幾乎不存在。
  • 溫和偏斜(現實):每廠 60% 集中在自己的 2 個主力類別,40% 混雜其他——像「每廠產品線不同,但也有共通場景」。
  • 極端偏斜(壓力測試):每廠只有 2 個類別——廠區 A 從沒看過 4 到 9。
資料切分

2. 原理

2.1 FedAvg:一輪四步,影像永遠不動

  1. 廣播:伺服器把當前全域權重發給各廠。
  2. 本地訓練:各廠用自己的影像在廠內訓練 E 個 epochs——資料從頭到尾沒離開機房。
  3. 上傳:各廠只回傳更新後的權重(幾百 KB 的數字,不是影像)。
  4. 加權平均:伺服器按資料量加權平均,得到新的全域權重:

wt+1=k=1Knknwt+1(k)w_{t+1} = \sum_{k=1}^{K} \frac{n_k}{n}\, w_{t+1}^{(k)}

重複幾十輪,全域模型就「吃過」所有廠的知識——卻沒看過任何一張影像

2.2 命門:non-IID 與客戶端漂移

每一輪,每個廠都把模型往自己資料的方向拉。如果各廠資料相似(IID),五個方向大致同向,平均起來很好;如果每廠只看得到自己那兩類(極端偏斜),五個模型各自朝五個方向狂奔,平均出來的可能誰都不是——這叫客戶端漂移 (Client Drift),是聯邦學習最著名的死穴。

2.3 一個工程陷阱:BatchNorm 在聯邦裡會壞

BatchNorm 的 running statistics 記錄的是各廠自己資料的分布——把五份互相矛盾的統計量平均,結果三不像。本篇模型改用 GroupNorm(不依賴 batch 統計),這是聯邦學習的標準修法。從 45 篇的「BN 是救命符」到本篇的「BN 是陷阱」——同一個元件,換個訓練架構就翻臉,值得記住。


3. 實戰

Python 程式碼實作(從零手刻,不用 FL 框架)

def fedavg(clients, rounds=60, local_epochs=2):
    server = Net()                                  # 全域模型(GroupNorm 版)
    w = sizes / sizes.sum()                         # 各廠資料量權重
    for r in range(rounds):
        states = []
        for c in clients:
            m = copy.deepcopy(server)               # ① 廣播:發權重下去
            states.append(local_train(m, c, local_epochs))  # ② 本地訓練,影像不動
        new_state = {}
        for key in states[0]:                       # ③④ 收權重,加權平均
            new_state[key] = sum(wi * s[key].float()
                                 for wi, s in zip(w, states))
        server.load_state_dict(new_state)
    return server

程式碼重點:

  • FedAvg 核心就是「深拷貝發下去、state_dict 加權平均收回來」,不到 15 行——概念的簡潔和它工程上的難搞(通訊、掉線、安全)是兩回事。
  • local_train 是普通的 SGD 訓練迴圈,唯一的特別之處:它只碰得到自己廠的資料
  • 每輪傳輸的是權重(本模型約 26 KB),不是 280 張影像——頻寬和隱私一起省

4. 模型評估

總成績單(397 張全域測試集)

方案影像出廠?準確率
集中式(全部資料上雲)出了0.990
各廠自己練(IID)沒出0.835
各廠自己練(極端偏斜)沒出0.197
FedAvg(IID)沒出0.970
FedAvg(溫和偏斜,現實情境)沒出0.960
FedAvg(極端偏斜)沒出0.363

主戰場:零影像共享,貼平集中式

收斂曲線
  • 現實情境的答案是「可以」:溫和偏斜下 FedAvg 收在 0.960,離犧牲全部隱私的集中式(0.990)只差 3 個百分點,而且輾壓各廠自己練的 0.835——加入聯邦,每個廠都是淨賺。
  • 單打獨鬥的下限很殘酷:極端偏斜下各廠自己練只有 0.197——廠區 A 根本沒看過 4 到 9,考全域測試當然當掉。這就是資料孤島的真實代價。
  • 橘色線是下一節的主角。

誠實的打臉:極端偏斜是 FedAvg 的死穴

每廠只看得到 2 個類別時,FedAvg 崩到 0.363,曲線劇烈震盪——五個廠各自把模型拉向自己的兩類,加權平均後互相抵銷,這就是客戶端漂移的教科書現場。

漂移掃描

再掃描「每輪本地訓練量 E」:固定 60 輪之下,E=1(0.229)、E=2(0.340)、E=10(0.620)——本地多練有幫助(總運算量大),但連最好的 E=10 都卡在 0.620,離 0.990 的天花板遙遙無期。漂移不是調參能救的,這正是 FedProx、SCAFFOLD 這些改良演算法存在的理由:在本地損失裡加「別跑太遠」的約束項。

誠實補充:聯邦學習不等於絕對隱私

  • 權重也會洩密:梯度反演攻擊 (Gradient Inversion) 已證明能從權重更新中部分重建訓練影像。生產環境要疊上安全聚合 (Secure Aggregation)差分隱私 (DP)——聯邦學習是隱私的必要條件,不是充分條件
  • 通訊是真實成本:每輪全員傳權重,模型一大(YOLO 幾十 MB × 幾十輪)頻寬帳單很可觀。
  • 本篇跳過的工程現實:廠區掉線、算力不均、有人惡意上傳毒權重(拜占庭攻擊)——真實框架(Flower、NVIDIA FLARE)一半的程式碼在處理這些。

工安視角的解讀

  • 集團多廠區是天然的聯邦:各廠監視器場景不同(正是溫和偏斜),FedAvg 讓「安全帽偵測」這種共通任務全集團共享進步,個資與製程機密留在各廠。
  • 供應鏈聯盟更誘人:品牌商 + 各代工廠共訓品檢模型——彼此是商業競爭對手、絕不可能交換影像,聯邦學習是唯一可行的合作形式。
  • 先評估你的 non-IID 程度:上聯邦之前,先問「各廠資料差多少」——像本篇的熱力圖一樣把各廠類別分布攤開來看;溫和偏斜放心上,極端偏斜先上 FedProx 或先共享少量公版資料墊底。
  • 法遵的語言:「資料未離開廠區、僅傳輸模型參數」——這句話對 DPO(資料保護長)和稽核的說服力,就是聯邦學習的商業價值。

5. 總結

我們學習了聯邦學習:

  • 資料不動,模型動:FedAvg 一輪四步(廣播 → 本地訓練 → 上傳權重 → 加權平均),影像從頭到尾不出廠。
  • 實驗結論:現實程度的資料偏斜下,聯邦模型 0.960 貼平集中式 0.990、輾壓單廠自練 0.835——隱私和模型品質可以兼得
  • 誠實結論:極端偏斜是死穴(0.363,客戶端漂移),調 E 只能緩解(0.620 天花板);且聯邦不等於絕對隱私,生產環境要疊安全聚合與差分隱私。
  • 踩坑備忘:BatchNorm 的統計量在聯邦平均下會壞,換 GroupNorm——Day 45 的救命符,到了聯邦就是陷阱。

到這裡,進階視覺與部署篇(Day 44~52)的九塊拼圖收攏了:ViT 看懂影像、度量學習認人、自監督吃下無標註畫面、CLIP 用文字搜、SAM 精準描邊、壓縮塞進邊緣盒子、Conformal 知道何時該問人、GNN 看穿關係網、聯邦學習讓多廠共享而不交出資料。工具都在桌上了——資料不動,知識在動;下一階段,把它們組裝成真正跑在廠區裡的系統。