
圖神經網路 (GNN):人員-機台-事故關聯圖譜 - 風險藏在「朋友的朋友」那一層
一位年資深、教育訓練滿分的作業員為什麼出事?因為答案不在他身上——黑心保養商偷工,機台變危險,操作它的人跟著遭殃:風險藏在關係網「隔兩層」的地方,就像「朋友的朋友」。本篇從零手刻 GCN(不用 PyG),在合成的「承攬商-機台-員工」三層圖譜上實測:只看員工自己的 MLP AUC 0.550、只看一層(機台)的手工特徵 0.596(貼死「只看一層」的理論天花板 0.599),而看得到兩層的 GCN 直接跳到 0.896——真相隔幾層,看不到那麼遠的模型就是找不到。
WRITTEN BY

- Name
- Harry Chang
核心貢獻者
Thomas Kipf 與 Max Welling(阿姆斯特丹大學)於 2017 年發表 GCN《Semi-Supervised Classification with Graph Convolutional Networks》,把原本繁複的圖譜卷積理論簡化成一行矩陣乘法——正規化的鄰接矩陣乘上特徵、再乘上權重,疊幾層就能往外看幾層關係。這篇論文把 GNN 從理論殿堂拉進工程日常,是引用數最高的圖學習論文。隔年 William Hamilton 等人(Stanford)的 GraphSAGE 進一步解決大圖的取樣訓練,兩者合力奠定了現代 GNN 在推薦系統、詐欺偵測、藥物發現的地位。
為什麼表格裝不下工廠?
Day 44 到 50 的模型有個共同假設:樣本彼此獨立——這張裂縫照片和那張無關、這位員工和那位無關。但工安的現實恰恰相反:
一位年資深、訓練時數滿分的作業員出事了。調查員的第一個問題從來不是「他自己有什麼問題」,而是——「這台機器誰保養的?還有誰在用?」
這就是在走關係:員工連著機台、機台連著保養承攬商、承攬商連著其他機台……事故的根因常常隔了兩層關係——就像「朋友的朋友」:員工操作的機台是第一層,機台背後的保養承攬商是第二層(黑心保養商 → 機台劣化 → 操作者出事),而當事人自己的資料一點異常都沒有。把這張關係網壓平成一張表格,連結資訊就死了。GNN 的主張:讓模型直接在關係網上學習。
一個名詞先講清楚:圖學裡把「隔一層關係」(走過一條連線)叫做走一「跳 (hop)」。朋友是一跳、朋友的朋友是兩跳;員工的機台是一跳、機台的承攬商是兩跳。後面會用到這個詞,記住「跳 = 隔幾層」就好。
1. 資料集來源
資料集:合成「承攬商-機台-員工」三層圖譜
備註:真實的人員-事故關聯資料涉及個資與工安敏感性,本篇用可控的合成圖譜重現核心現象。8 家保養承攬商、40 台機台、120 位員工;每台機台由一家承攬商保養,每位員工操作 1~2 台機台。

風險的生成邏輯(刻意藏在隔兩層的地方)
- 承攬商品質(隱藏真相):偷工的承攬商回覆天數長、報價低——可觀察特徵只間接洩露品質。
- 機台危險度 = 0.75 × 承攬商偷工程度 + 0.25 × 機齡——主要由隔了兩層的承攬商決定。
- 員工事故 = 所操作機台的平均危險度(主導)+ 少量加班/訓練效應 + 5% 標籤雜訊。
- 半監督設定:只有 48 位員工(40%)有標註,預測其餘 72 位——工安資料的常態:事故紀錄永遠是少數。
2. 原理
2.1 訊息傳遞:每疊一層,就多看一層關係
GCN 的核心動作叫訊息傳遞 (Message Passing):每一層,每個節點把鄰居的特徵加權平均進自己。Kipf 的公式簡潔到奢侈:
- 是鄰接矩陣(誰連著誰),加上單位矩陣 讓節點保留自己,再用度數 正規化(鄰居多的別吃太撐)。
- 一層 = 資訊往外傳一層關係(一跳)。GCN 疊 L 層,每個節點就能看到隔 L 層(L 跳)以內的鄰居——這是本篇實驗的主軸。
2.2 這個實驗真正要考的事
員工的風險由承攬商決定,但承攬商隔了**兩層關係(兩跳)**才到員工。所以理論預測是一道樓梯:
| 模型 | 看得到幾層 | 預期 |
|---|---|---|
| MLP(只看員工自己) | 0 層 | 幾乎抓瞎 |
| 手工特徵 + 邏輯回歸(「平均機齡」) | 1 層(機台) | 只能吃到機齡那 25% |
| GCN 2 層 | 2 層(摸到承攬商) | 看到承攬商,起飛 |
| GCN 3、4 層 | 3~4 層 | 訊號就在第 2 層,不會更好 |
3. 實戰
Python 程式碼實作(不用 PyG,從零手刻)
# 正規化鄰接矩陣:D^-1/2 (A+I) D^-1/2 —— GCN 的全部前置作業
A_hat = A + np.eye(N)
d = A_hat.sum(1)
A_norm = torch.tensor(A_hat / np.sqrt(d[:, None] * d[None, :]))
class GCN(nn.Module):
def __init__(self, layers=2, hid=32):
super().__init__()
dims = [9] + [hid] * (layers - 1) + [1]
self.Ws = nn.ModuleList([nn.Linear(a, b) for a, b in zip(dims[:-1], dims[1:])])
def forward(self, X, A):
H = X
for i, W in enumerate(self.Ws):
H = A @ W(H) # 一層 = 訊息走一跳
if i < len(self.Ws) - 1:
H = F.relu(H)
return H.squeeze(1)
# 半監督:全圖前向,損失只算「有標註的員工」那幾格
loss = F.binary_cross_entropy_with_logits(logits[W0 + train_w], ytr)
程式碼重點:
- GCN 本體就是
A @ W(H)一行——鄰接矩陣當「轉發器」,線性層當「翻譯器」。 - 全圖一起前向(transductive):沒標註的節點也參與訊息傳遞,只是不進損失——半監督的精髓。
- 節點特徵用「型別 one-hot + 各自屬性欄位」,承攬商/機台/員工共用同一張特徵表。
4. 模型評估
樓梯出現了:看得到幾層,分數就到哪(72 位無標註員工)
| 模型(能看幾層) | AUC | 準確率 |
|---|---|---|
| MLP(0 層,只看員工自己) | 0.550 | 0.606 |
| 手工特徵 + LR(1 層) | 0.596 | 0.597 |
| GCN 1 層(看 1 層) | 0.631 | 0.653 |
| GCN 2 層(看 2 層,摸到承攬商) | 0.896 | 0.831 |
| GCN 3 層(看 3 層) | 0.889 | 0.822 |
| GCN 4 層(看 4 層) | 0.895 | 0.733 |
| 上帝視角(直接給真實暴險值) | 0.952 | — |
| 只看一層的理論天花板(平均機齡) | 0.599 | — |

- 手工特徵輸得心服口服:工程師能想到的一層特徵(平均機齡)拿 0.596——和「只看一層」的理論天花板 0.599 貼死。不是特徵沒做好,是只看一層的資訊量就只有這麼多。
- 第 2 層是質變:0.631 → 0.896,GCN 摸到承攬商的那一刻起飛,回收了上帝視角(0.952)的絕大部分。
- 3、4 層不再進步:真相就住在第 2 層,看更遠沒有新資訊;4 層的準確率反而掉到 0.733——過平滑 (over-smoothing) 的前兆:疊太多層,所有節點被平均得越來越像。
兩座山:同樣的員工,只差「看多遠」

左邊 MLP 只看員工自身特徵,紅(出事)綠(沒事)糊成一團——這就是「他明明資歷很好為什麼出事」的統計長相。右邊 GCN 往外傳了兩層關係,兩座山乾淨分開:出事的人,是因為他站在危險的位置上。
誠實的打臉:訊號稀釋踩坑實錄
這個實驗不是一次成功的。第一版每台機台平均連 8 位員工,GCN-2 只拿到 0.68——因為訊息傳遞是加權平均:承攬商在機台的鄰居裡只佔 1/9,黑心訊號被八個員工的特徵回流稀釋掉了。把圖變稀疏(每台機台約 4 位員工)後才起飛到 0.896。教訓:GNN 不是接上圖就贏,樞紐節點(高度數)會稀釋關鍵訊號——真實世界的解法是注意力加權(GAT)或分型別聚合,樸素 GCN 對圖的形狀很敏感。
工安視角的解讀
- 事故調查的直覺,終於有了模型:「這台機器誰保養的、還有誰在用」——調查員走的圖,GCN 用訊息傳遞自動走完,而且能對還沒出事的人提前打分。
- 承攬商評鑑的新證據:GCN 學到的風險傳播路徑,反過來就是「哪家承攬商的下游事故率異常」——比單看承攬商自評表誠實得多。
- 資料早就是圖了:ERP 裡的員工-工單-機台-保養商本來就是關聯表,關聯表 join 起來就是圖——圖不是新資料,是資料本來的形狀。
- 誠實提醒:本篇是合成圖譜 + 手刻 GCN 的教學規模;真實落地用 PyTorch Geometric/DGL,並且要面對真實圖的臟:節點型別更多、邊有時間性、標籤更稀疏。但「風險隔幾層、模型就要能看幾層」這個核心判斷,規模不變。
5. 總結
我們學習了圖神經網路:
- 換一種資料形狀:表格假設樣本獨立,工廠是一張關係網——員工、機台、承攬商靠邊相連,風險沿邊傳播。
- 訊息傳遞一行公式:,鄰接矩陣轉發、線性層翻譯;疊幾層 = 能看幾層關係。
- 實驗結論:真相隔了兩層時,只看 0~1 層的模型全數卡在 0.6 以下(手工特徵貼死理論天花板),看得到兩層的 GCN 直上 0.896;更深沒有更好,還有過平滑風險。
- 踩坑實錄:一台機台連太多員工(高度數節點)會稀釋關鍵訊號,第一版 0.68 → 圖變稀疏才 0.896——GNN 對圖的形狀很敏感。
- 工安啟示:事故調查的「走關係」直覺可以模型化,對沒出事的人提前打分;ERP 的關聯表本來就是圖。
下一篇處理一個更現實的限制:集團有五個廠區,各自的監視器影像因為個資與商業機密不能離廠,但大家都想要一個更強的模型。能不能只交換模型、不交換資料?聯邦學習 (Federated Learning)——多廠區共訓模型,影像不出門。