
聯邦學習 (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、中國網安法)。
於是每個廠只能抱著自己的資料孤島,各練各的弱模型。聯邦學習把問題反過來:資料不動,模型動。
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:一輪四步,影像永遠不動
- 廣播:伺服器把當前全域權重發給各廠。
- 本地訓練:各廠用自己的影像在廠內訓練 E 個 epochs——資料從頭到尾沒離開機房。
- 上傳:各廠只回傳更新後的權重(幾百 KB 的數字,不是影像)。
- 加權平均:伺服器按資料量加權平均,得到新的全域權重:
重複幾十輪,全域模型就「吃過」所有廠的知識——卻沒看過任何一張影像。
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 看穿關係網、聯邦學習讓多廠共享而不交出資料。工具都在桌上了——資料不動,知識在動;下一階段,把它們組裝成真正跑在廠區裡的系統。