唯品會安全圖卷積算法簡介及應用

1、基本介紹

近幾年來,深度學習取得了突破式的進展,特別是在圖像處理和機器翻譯領域。在這裏面扮演關鍵角色的是卷積神經網絡。

卷積神經網絡可以非常有效地處理網格狀結構類數據,即數據有規律的分佈在一定區域。比如對於彩色照片,由R,G,B三基色矩陣構成,每個矩陣的尺寸爲照片尺寸,矩陣元描述該像素點紅(綠、藍)的程度,矩陣元的取值範圍爲0-255的整數;對於機器翻譯,輸入的數據結構爲詞向量組成的序列。

圖1:CNN卷積過程

對於這類網格狀的數據,通過訓練尺寸統一的局部過濾器(filter),將過濾器作用在輸入數據的各個區域,從而爲後續的計算提取出需要的特徵。如圖1所示。

1.1 圖類型數據和神經網絡

然而在工程生產的過程中,存在大量的無法表示爲網格拓撲結構的數據,比如,社會網絡,生物網絡,蛋白質結構等,這類數據的特點在於:數據結構上沒有固定的拓撲結構,不像照片那樣爲固定的網狀結構,即每個頂點周圍的頂點不具有明確的順序性,比如對於照片中的每個像素點,其周圍的像素點可按照一定的空間位置順序排序(從左到右,從上到下);而圖類數據不具有這類特點,比如在社會關係網絡中,每個頂點(node)的鄰接頂點無法通過空間位置信息進行排序。同時,每個頂點周圍的鄰接點的數目也不固定,這導致無法像處理照片那樣建立卷積神經網絡–通過訓練通用的同一尺寸的過濾器來自動提取特徵。

圖卷積神經網絡便被用來處理這類數據,這類問題中,有一類爲半監督學習,對圖上的每個頂點進行分類:圖上的頂點只有少部分具有標籤(label),其餘的無標籤數據都是待分類數據;頂點之間由無向邊(edge)互相連接,表明頂點和頂點之間具有某種聯繫。圖2即爲圖(graph)的直觀表示。

傳統的神經網絡(NN)分類往往將每個數據樣本本身的高維特徵輸入到多層神經網絡內,通過逐層向前傳播不斷提取信息,最後進行分類,然而其不足在於無法利用關聯數據。對於圖卷積神經網絡(GNN),在每一次向前傳播的過程中,隱藏層的特徵還與其臨界點有關。

圖2

2、常用的算法

如今已有大量算法處理圖類數據。本文將介紹兩篇近期比較流行的文章:Tomas N.Kipf的 Semi-supervised Classification with Graph Convolutional Network和 Peter Velickovic的Graph Attention Network。

我們首先簡單介紹GCN和GAT算法,瞭解二者之間的關係。隨後,我們介紹一下在唯品會安全場景下我們對GCN算法的應用,以及程序和訓練參數設置。最後是我們的總結和展望。

2.1 圖的數學表示

爲了簡單考慮,只考慮無向圖。對於無向圖,其爲頂點和邊的集合,每個圖有N個頂點 $v_i\in V$,以及一系列的邊 $(v_i,V_j)\in E$。通過圖上的關聯關係,可以得到N*N的鄰接矩陣A,同時通過鄰接矩陣還可以得到對角矩陣度矩陣 $D_{ii}=\sum_j A_{ij}$。對於鄰接矩陣當頂點和頂點相連時,$A_{ij}=1$,否則 $A_{ij}=0$,所以鄰接矩陣描述了圖中頂點之間的連接情況。度矩陣則描述了對於每個頂點有多少個頂點在它周圍。這些是非常直觀的數學解釋。

通常情況下會對鄰接矩陣考慮自連接,所以使用 ${~A}=A+I_N$,其中 $I_N$ 爲N*N的單位矩陣,表示每個點都和自己連接;同時度矩陣可以重新定義爲 ${~D}{ii}=\sum_j{~A}{ij}$。

2.2 圖卷積

圖卷積可以表示爲:

參考Kipf的文章,文章中計算得出瞭如下近似:

其中 $D^{-\frac{1}{2}}AD^{\frac{1}{2}}$ 爲歸一化的鄰接矩陣。可以發現,數據的特徵矩陣 $x\in R^{N\times C}$(N個頂點,每個頂點有C維特徵),卷積後得到了如下新的特徵矩陣:

這裏Z爲N*F的矩陣,卷積核W爲C*F的矩陣。上式等號右邊可以看作三個矩陣的相乘,$XW=X_{tmp}$ 項和前饋神經網絡的特徵提取一樣;不同之處在於 ${~D}^{-^{\frac{1}{2}}}{~A}{~D}^{-\frac{1}{2}}$,展開後表示爲:

由於 ${~A}{ij}$ 只在頂點 $V_i$ 的鄰接點和自身處取值爲1,其餘爲0,所以求和只對鄰接點以及自身進行,最後的特徵 $z_i$ 爲鄰接點(包括自身)臨時特徵 $x^j{tmp}$ 的算術平均。

2.3 半監督頂點分類學習

頂點的分類問題是半監督學習任務:只知道圖中部分頂點的標籤,需要將無標籤的頂點進行分類。

圖卷積神經網絡的每一層卷積結束後使用ReLU激活函數:

最後一層使用softmax函數進行分類:

其中 $x^{l-1}$ 爲倒數第二層的輸出結果。

進行模型訓練,損失函數(loss function)爲交叉熵函數,由於在圖中只有部頂點帶有標籤,所以最後的求和只對有標籤的數據進行求和:

2.4 自注意力機制改進:GAT

通過上面的介紹可以看出,以上的方法有改進的空間。GCN算法在計算隱藏層特徵時,鄰接頂點對該頂點有等權重的影響,但實際情況中並非如此,可以利用兩兩頂點的特徵計算關聯的重要性。

在Velickovic的文章中,作者引入了自注意力機制(self-attention),用於優化隱藏層的特徵的計算,該算法爲GAT算法。任意頂點的不同鄰接點,其對隱藏層的特徵計算的權重是不一樣的。比如,單個頂點的輸入特徵向量爲 $x_i\in R^F$ 時,進行一次卷積計算後,可以初步得到特徵:$W~x_i\in R^{F’}$,隨後進行卷積計算。在上面的GCN算法中最後確定的特徵爲:

這裏n表示該頂點的鄰接點個數,求和的對象包括該頂點本身。而在GAT算法中,隱藏層特徵表示爲:

不同鄰接點對該頂點的影響是不一樣的,我們可以構建通用的神經網絡,用於計算自注意力係數 $\alpha_{ij}$。接下來我們計算自注意力係數,該係數的求取使用的是單層的向前傳播神經網絡,激活函數爲LeakyReLU,其輸入爲頂點和鄰接點的特徵:

該公式計算了頂點j對頂點i的重要程度。對所有鄰接點(包括自身)計算完該係數後,我們可以利用softmax函數對所有的注意力係數進行歸一化:

在得到歸一化的注意力係數之後,我們便可以簡單得到維數爲k’的隱藏層的新特徵。

爲了能夠讓學習的過程具有較好的穩定性,文章中使用了多頭注意力機制:即使用K個注意力機制的神經網絡,它們得到的結果合併起來形成隱藏層的特徵向量,從而進一步修正上面的公式,我們可以得到:

這樣,我們新得到的隱藏層的特徵維數爲KF’。這裏,(公式)爲連接算符,將兩個高維向量連接爲一個更高維的向量。這個多頭計算過程有點類似於CNN中,每層卷積都使用了多個卷積核,多個卷積核的作用就是爲了提升模型的穩定性以及提取儘可能多的特徵。

而對於輸出層,如果我們採用和隱藏層一樣的多頭注意力機制,則不能簡單的將每個頭的輸出進行拼接,文章中採用了輸出特徵平均的方法,隨後使用softmax函數來作爲激活函數,用於分類。

圖3:注意力機制下的注意力係數計算和隱藏層特徵計算

2.5 算法總結

常規的神經網絡算法中,我們通過輸入樣本實例的特徵,逐層向前傳播提取有用信息,最後給出分類結果,這類方法已經取得了很大的成功。但是許多數據,實例和實例之間還有各種關聯,常規的神經網絡無法利用這部分信息。

GCN算法改進了常規的神經網絡算法,將實例之間的關係利用起來,每個樣本在隱藏層的特徵不僅僅和自己的特徵有關,還和其關聯樣本的特徵有關,每個樣本點在隱藏層的特徵是其自身新特徵和鄰接點新特徵的算術平均。但由於關聯信息在算法中的利用只是關聯點特徵的算術平均,這點值得優化。

在GAT算法中,使用了自注意力機制,樣本點的隱藏層特徵是自身新特徵和鄰接點新特徵的加權平均,其權值由每層通用的神經網絡決定,該神經網絡的輸入爲相關聯的兩個頂點的特徵,爲單層神經網絡,這樣可以很好的反映不同鄰接點對頂點的影響程度,同時,每層使用了多頭的自注意力神經網絡,這種多頭設計非常類似於CNN中,每層卷積使用多個卷積核,這樣可以進一步增強模型的穩定性。

可見GCN和GAT都極大的利用了數據樣本之間的關聯信息,相比常規的NN算法而言,更有效的挖掘了數據所的信息。同時GAT相比於GCN,使用了多頭的自注意力機制,進一步優化了隱藏層的特徵更新。

3、我們的應用

3.1 應用場景

在唯品會購物平臺上,大多數用戶都是正常用戶,少部分爲非正常用戶,有的往往註冊多個小號,成爲馬甲用戶;有的代客下單;有的直接使用機器行爲搶購商品。這些非正常用戶影響了我們公司的運營,更重要的是影響了其他正常用戶的購物體驗,許多優惠商品和高價值的商品都被這些非正常用戶一掃而空。

對於所有的註冊用戶,我們根據他們的不同種類的行爲進行不同評分,一般有幾類,比如註冊評分,登陸評分等等,評分過高的用戶普遍爲可疑用戶。同時,用戶之間可以通過各種方式關聯起來,比如使用的設備,電話號碼,收貨地址等。

在這個由用戶組成的關係圖中,一些較新的用戶暫時沒有太多評分,一些很老的用戶得分也不是很全,還有一些用戶有評分但是介於正常和非正常得分之間。爲了挖掘這部分用戶的性質,我們可以使用他們的關聯數據進一步地判斷。

3.2 模型構建

爲了進一步挖掘惡意用戶,我們嘗試利用這些關聯數據。作爲簡單嘗試,我們使用GCN算法,其包含:四個輸入單元,爲四類評分方式的得分;包含了三個隱藏層,每層隱藏層包含32,8,4個激活單元,使用ReLU激活函數;由於是二分類問題,輸出層包含兩個輸出單元,最後的分類使用softmax進行分類。學習效率 $lr=1\times10^{-3}$,爲了防止過擬合,我們使用dropoup = 0.15。同時我們設置epoch = 2000。

我們首先挑選近期活躍用戶,以及和他們有一度關聯的用戶,將他們四類用戶評分作爲輸入,對於評分只要存在非常高得分的(大於等於90分以上)的用戶作爲馬甲用戶,評分都低於30分的用戶作爲正常用戶,介於這二者之間的、以及沒有得分的爲待評估用戶。

3.3 程序

使用的程序爲kipf在github上的代碼,下載地址爲https://github.com/tkipf/gcn,該代碼需要tensorflow和networkx兩個庫。

我們的模型輸入包含三個pickle文件:1)表明用戶之間關係的文件,爲字典格式,字典的鍵爲用戶UID,字典的值爲與其相關聯用戶組成的集合;2)用戶得分文件,爲numpy array格式,記錄了每個用戶的三種評分;3)用戶標籤文件,爲numpy array格式,記錄每個用戶的標籤,爲one-hot表示,負樣本爲[1, 0],正樣本爲[0, 1],對於那些缺乏標籤的用戶設定爲[0, 0]。

首先導入數據,我們首先利用networkx處理第一個pickle文件,得到鄰接矩陣。由於可使用數據充足,我們將全量數據分成三等分:training,validation,testing。原程序中使用的數據爲sparse matrix,我們的輸入數據和處理後得到的數據均爲sparse matrix類型。

在特徵預處理過程中,由於各種得分的跨度較大,爲了均衡處理每種得分在損失函數中的權重,我們使用了sk-learn中的StandardScaler類,利用該類的transform方法讓每個特徵分佈在0到1這樣一個區間裏面:

對於模型部分,Layer的定義至關重要,可參考原程序GraphConvolution 類的定義:

圖卷積類中最重要的是私有方法_call(最後被特殊方法__call__調用,這樣該類可以像函數那樣調用),首先實現的是dropout;隨後根據GCN中卷積計算公式,分別進行sparse矩陣相乘:權重和輸入相乘得到初步隱藏層特徵,隨後支持度矩陣和初步隱藏層特徵相乘,得到輸出;最後,如果需要加入偏執,則最後在output中加入偏執。

由於原代碼中只實現了兩層圖卷積,我們重新實現了多層圖卷積神經網絡,從而方便實現任意層數的卷積神經網絡:

進行訓練,最重要的是定義損失函數:

損失函數分成兩部分,第一部分使用weight decay,確保權重都是較小的值,第二部分則是模型預測結果的交叉熵,由於我們只關心打了標籤的數據,所以最後的交叉熵關注的是有標籤實例。

在預處理完成數據之後,我們的便可以開始常規的tensorflow模型訓練過程。

3.4 訓練結果

訓練後我們發現,該模型的正確率爲0.959,準確率爲0.979,召回率爲0.940。同時我們輸出那些被“誤判”的正常用戶,發現,他們普遍存在問題,比如和上百個用戶關聯,或者其關聯的十多個用戶中一半以上是非正常用戶等等。

4、展望和總結

本文介紹了最近比較流行的GCN和GAT算法,相比於傳統的DNN算法,GCN和GAT考慮了樣本點之間的關係,提取出了更多的信息。而GAT相比於GCN,使用了注意力機制,從而可以量化樣本點之間的關聯強弱,優化了隱藏層的特徵提取,可以有效的提升模型的健壯性。

在這兩類模型中,都只是考慮了頂點的特徵,在GAT中,注意力權重也只是和兩兩頂點的特徵相關,而沒有考慮邊(關聯方式)的特徵。而在關聯方式中,依舊存在大量的信息值得我們去挖掘和提取。

本文暫時只是使用了GCN 算法,在後期,我們也將嘗試GAT算法,以及嘗試其他圖卷積算法,比如考慮邊的性質。

本文轉載自公衆號唯技術(ID:VIP-Tech)。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MjM5NjM5MzQ1MQ==&mid=2651040096&idx=1&sn=7357626a70cc5a0702291f82417a6c57&chksm=bd1ef1e48a6978f22b98fa84fe6ccc4507c0136d8fc7184631d78304c853f09448d798a586d2&scene=27#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章