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》(地址:)的做法,其實就是一個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、總結
本文使用圖網路進行基於會話的推薦,效果還是不錯的,而且圖網路逐漸成為現在人工智慧領域的一大研究熱點。感興趣的小夥伴們,我們們又有好多知識要學習啦,你行動起來了麼?