這篇文章主要介紹基於GCN的有監督人臉聚類算法——L-GCN《Linkage Based Face Clustering via Graph Convolution Network》,github codes
L-GCN
L-GCN將人臉聚類轉換成linkage prediction問題進行處理,即給定若干個節點及節點信息,判斷哪些節點間存在連邊。其中,每個節點表示一張人臉圖像,節點特征即為該人臉圖像的feature embedding。我們期望得到節點間存在連邊的概率,然后基於這些概率,采取一定的處理手段,將整個圖划分成一些連通分量,每個連通分量就是聚類結果的一個簇。L-GCN可以分成構造子圖、GCN推理和link merging三個部分。
構造子圖
假如有\(N\)個節點(人臉圖像),理論上需要對\(N\times (N-1)/2\)條邊計算概率。由於我們有所有節點的特征,可以只計算某個節點(中心節點)和它的\(KNN\)的連邊概率,從而減小計算量。那么,構造一個包含\(1+K\)個節點的子圖,並利用GCN判斷這\(K\)個點和中心點的連邊概率就好了嗎?這個方案還需改進,由於判斷節點\(a\)和節點\(b\)是否存在連邊時,\(a\)和\(b\)的context information(它們各自鄰居節點的信息)能夠提供豐富的信息,所以我們將\(K\)個鄰居各自的鄰居(2-hop nodes)也包含進來。目前,我們的子圖包含以下三種類型的節點:1)中心點;2)1-hop nodes;3)2-hop nodes。
由於我們要判斷的是1-hop點和中心點存在連邊的概率,為了編碼它們與中心點的關系,我們用每個節點的特征減去中心點特征來重新表示該節點的特征,並把中心點移除子圖(歸一化后的中心點特征為0)。這樣,我們最終的子圖只包含中心點的1-hop nodes和2-hop nodes。
確定了構成子圖的節點及節點特征后,下一步需要確認添加哪些邊。L-GCN的策略是:對子圖的任意一點,計算它在所有\(N\)個節點的\(\mu NN\),如果它的某個\(\mu NN\)恰好也在子圖中,那么將在這兩個節點添加一條連邊。
完整的構圖過程可以參考論文中的圖2進行理解。
GCN推理
構造好子圖,我們可以得到以下數據:
- \(X \in R^{N*d}\):對中心點歸一化后的節點特征,這里的\(N\)表示子圖中的節點個數,\(d\)表示人臉特征的維數;
- \(A \in R^{N*N}\):子圖的鄰接矩陣(是實對稱陣),如果節點\(a\)和節點\(b\)存在連邊,則\(A[a,b]=1\),否則\(A[a,b]=0\)。(將\(A[a,b]=1\)改動為\(A[a,b]= similarity\)也是一種合理的改動)
GCN有很多GCN layer堆疊得到,每層GCN layer都會對各節點做特征變換,我們以第一層GCN layer為例,看看它是如何做特征變換的。根據論文公式,變換后的節點特征矩陣\(Y \in R^{N*d}\)可以表示為:
\(\boldsymbol{Y}=\sigma([\boldsymbol{X} \| \boldsymbol{G} \boldsymbol{X}] \boldsymbol{W})\)
其中\(W\)是GCN layer的可學習參數,\(G=g(X,A) \in R^{N*N}\)是聚合矩陣,它的每行加起來為1,作用在\(X\)上就是對其它節點的特征做加權。常見的聚合函數\(g\)有以下一些,本文使用的是weighted aggregation。
- Mean Aggregation: \(\Lambda^{-\frac{1}{2}} A \Lambda^{-\frac{1}{2}}\),其中\(\Lambda\)是對角矩陣,\(\boldsymbol{\Lambda}_{i i}=\sum_{j} \boldsymbol{A}_{i j}\)
- Weighted Aggregation:\(A\)中的非零值為對應兩個節點的相似度,然后對\(A\)的每行做softmax得到\(G\)
- Attention Aggregation: \(G\)中的參數通過兩層MLP學習得到
訓練階段,我們對每個節點進行分類(該節點和中心點存在連邊or不存在連邊),但在計算loss時只考慮1-hop nodes,即只對1-hop nodes的誤差進行反向傳播,因為我們最初的目標是判斷1-hop nodes和中心點是否存在連邊。同理,推理階段也只關注1-hop nodes和中心點存在連邊的概率。
GCN模型代碼實現:
link merging
對一個包含\(N\)個節點的圖,L-GCN會以每個節點為中心點構建一個子圖,然后進行GCN推理。處理完所有子圖后,可以在所有\(N\)個節點和它的1-hop nodes間建立一條連邊(如果兩個節點互為1-hop nodes,節點間可能存在兩條無向邊),邊的權重為GCN的預測值(如果有兩個,可以取最大值,也可以取均值)。
link merging是一個迭代進行的過程。每輪迭代都有一個截斷閾值\(t\),權重小於該閾值的邊會被擦除。這樣一張連通的大圖會划分成若干個連通分量,這里每個連通分量就形成了一個簇,過大的簇會進入下一輪迭代。迭代每往下進行一輪,階段閾值\(t\)就會增大一些,重復執行這一過程,直到沒有過大的簇或截斷閾值已經非常大。
計算連通分量代碼實現:
記錄一下平時用得較少的幾個操作