使用圖神經網路做基於會話的推薦

dicksonjyl560101發表於2019-05-21


https://www.toutiao.com/a6692923714587066893/


  2019-05-20 10:02:16

1、背景介紹

現有基於會話的推薦,方法主要集中於迴圈神經網路和馬爾可夫鏈,論文提出了現有方法的兩個缺陷:

1)當一個會話中使用者的行為數量十分有限時,這些方法難以獲取準確的使用者行為表示。如當使用RNN模型時,使用者行為的表示即最後一個單元的輸出,作者認為只有這樣並非十分準確。

2)根據先前的工作發現,物品之間的轉移模式在會話推薦中是十分重要的特徵,但RNN和馬爾可夫過程只對相鄰的兩個物品的單向轉移關係進行建模,而忽略了會話中其他的物品。

針對上面的問題,作者提出使用圖網路來做基於會話的推薦,其整個模型的框架如下圖所示:

使用圖神經網路做基於會話的推薦

接下來,我們就來介紹一下這個流程吧。

2、模型介紹

2.1 符號定義

V={v1,v2,...,vm} 代表所有的物品。s=[vs,1,vs,2,...,vs,n]代表一個session中按照時間先後排序的使用者點選序列,我們的目標是預測使用者下一個要點選的物品vs,n+1

2.2 子圖構建

我們為每一個Session構建一個子圖,並獲得它對應的出度和入度矩陣。

假設一個點選序列是v1->v2->v4->v3,那麼它得到的子圖如下圖中紅色部分所示:

使用圖神經網路做基於會話的推薦

再假設一個點選序列是v1->v2->v3->v2->v4,那麼它得到的子圖如下:

使用圖神經網路做基於會話的推薦

同時,我們會為每一個子圖構建一個出度和入度矩陣,並對出度和入度矩陣的每一行進行歸一化,如我們序列v1->v2->v3->v2->v4對應的矩陣如下:

使用圖神經網路做基於會話的推薦

上圖中,左邊的矩陣是出度矩陣,右邊的矩陣是入度矩陣,如果同時考慮出度和入度,模型學習的就不是簡單的單向轉移關係了,而是更加豐富的雙向關係。

2.3 基於Graph學習物品嵌入向量

基於Graph學習物品的嵌入向量,作者借鑑的下面這篇文章《GATED GRAPH SEQUENCE NEURAL NETWORKS》(地址:https://arxiv.org/pdf/1511.05493v3.pdf)的做法,其實就是一個GRU單元,不過在輸入時,模型做了一定的改進。

模型的輸入計算公式如下:

使用圖神經網路做基於會話的推薦

我們還是使用剛才的序列v1->v2->v3->v2->v4來一點點分析輸入的過程。

1)ats,i是t時刻,會話s中第i個點選對應的輸入

2)As,i:代表的是一個分塊矩陣,它是1*2n的,n代表序列中不同物品的數量,而非序列的長度,此處是4,而非5。舉例來說,假設我們當前的i=2,那麼其對應的As,2:=[0,0,1/2,1/2 | 1/2,0,1/2,0]。我們可以把As,i:拆解為[As,i:,in,As,i:,out]

3)vt-1i可以理解為序列中第i個物品,在訓練過程中對應的嵌入向量,這個向量隨著模型的訓練不斷變化,可以理解為隱藏層的狀態,是一個d維向量。

4)H是d*2d的權重向量,也可以看作是一個分塊的矩陣,可以理解為H=[Hin|Hout],每一塊都是d*d的向量。

那麼我們來看看計算過程:

1)[vt-11,...,vt-1n] ,結果是d * n的矩陣,轉置之後是n*d的矩陣,計作vt-1

2)As,i:vt-1H相當於[As,i:,invt-1Hin , As,i:,outvt-1Hout],即拆開之後相乘再拼接,因此結果是一個1 * 2d的向量。

上面的過程,相當於分別對一個節點的出度和入度進行處理,再進行合併。該過程是我通過程式碼慢慢理解的,程式碼如下:


fin_state = tf.reshape(fin_state, [self.batch_size, -1, self.out_size])

fin_state_in = tf.reshape(tf.matmul(tf.reshape(fin_state, [-1, self.out_size]),
self.W_in) + self.b_in, [self.batch_size, -1, self.out_size])
fin_state_out = tf.reshape(tf.matmul(tf.reshape(fin_state, [-1, self.out_size]),
self.W_out) + self.b_out, [self.batch_size, -1, self.out_size])
av = tf.concat([tf.matmul(self.adj_in, fin_state_in),
tf.matmul(self.adj_out, fin_state_out)], axis=-1)

上面的程式碼中,fin_state相當於儲存的是我們的vt-1,self.W_in相當於我們的Hin, self.W_out相當於我們的Hout,self.adj_in相當於As,i:,in,self.adj_out相當於As,i:,out。

有一丟丟的複雜,上面是我個人的理解的計算過程,大家可以作為參考。

上面的輸入,我們充分考慮了圖的資訊,接下來,就是GRU單元了,這裡的GRU單元沒有太多變化,公式如下:

使用圖神經網路做基於會話的推薦

由上面的公式,整個學習的過程就是每個物品的向量獨自進行迴圈,但是在每次輸入的時候,會充分考慮圖中的資訊,簡單化一下示意圖如下:

使用圖神經網路做基於會話的推薦

圖中我省略了一些不必要的線,不過我想你能夠理解。

2.4 生成Session對應的嵌入向量

好了,經過T輪的圖網路,我們得到了一個session中每個點選物品的向量,分別為[v1,v2,...,vn],即下圖中紅色的部分我們已經獲得了:

使用圖神經網路做基於會話的推薦

接下來,我們要講解的是下圖中紅色的部分:

使用圖神經網路做基於會話的推薦

我們認為,當前序列中最後一個物品是十分關鍵的,所以把這個資訊單獨拎出來,令s1 = vn。但是,我們已不能捨棄其他的資訊,所以,模型中使用了一個attention的策略,分別計算前面的物品和最後一個點選物品的相關性,並進行加權,得到sg:

使用圖神經網路做基於會話的推薦

最後,將兩部分進行橫向拼接,並進行線性變換,得到sh:

使用圖神經網路做基於會話的推薦

2.5 給出推薦結果及模型訓練

在最後的輸出層,使用sh和每個物品的embedding進行內積計算:

使用圖神經網路做基於會話的推薦

並通過一個softmax得到最終每個物品的點選概率:

使用圖神經網路做基於會話的推薦

損失函式是交叉熵損失函式:

使用圖神經網路做基於會話的推薦

3、一點小疑問

在上面進行內積計算的過程中,所使用的vi,應該不是經過GNN中間輸出的vi,而是每個物品的初始embedding,這個初始的embedding,即我們GNN的初始的輸入v0,如下圖:

使用圖神經網路做基於會話的推薦

這個embedding在訓練過程中不斷的被更新。

個人感覺論文這裡符號有點混亂。

4、總結

本文使用圖網路進行基於會話的推薦,效果還是不錯的,而且圖網路逐漸成為現在人工智慧領域的一大研究熱點。感興趣的小夥伴們,我們們又有好多知識要學習啦,你行動起來了麼?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2645017/,如需轉載,請註明出處,否則將追究法律責任。

相關文章