論文|AGREE-基於注意力機制的羣組推薦,含代碼(Attentive Group Recommendation)


這篇文章主要分享的論文是2018年被CCF收錄的一篇論文:Attentive Group Recommendation(基於注意力機制的羣組推薦),第一作者是湖南大學的曹達老師,二作是論文Neural Collaborative Filtering的作者何老師。當然也會結合小編的工作來進行一些補充說明,寫的不好,歡迎拍磚!

這篇文章結合了注意力機制和NCF框架,使得在羣組推薦中有良好的效果。

關於Neural Collaborative Filtering可以參考:點擊閱讀

關於注意力的解釋可以參考:點擊閱讀

1、聊一聊羣組推薦

羣組推薦在工業推薦系統中應用十分廣泛,其主要作用在新老用戶上。

對於新用戶來講, 則是冷啓動,常規的冷啓動解決辦法是,根據新用戶的註冊信息(性別、地域等,這個一般和產品設計進行結合)找到其所屬的羣組,將羣組下的Top信息返回推薦給當前來訪的新用戶。

對於老用戶來講,可以作爲一路召回使用。比如對所有用戶進行羣組劃分,再統計羣組下的Top內容作爲羣組下用戶的一路召回內容。當然也可以按照某種屬性進行羣組劃分。

所以羣組推薦的實際應用中是很廣泛和有效的,上面舉的例子只是冰山一角,實際中要比這個複雜和廣泛。但往往我們在得到羣組下Top內容的時候採用的方法簡單粗暴,這一點論文中也提到了羣組推薦中的一個基本問題是如何彙總小組成員的偏好以推斷小組的決定,因爲羣組中不同的成員扮演的角色是不一樣的, 常見的計算方法有:

  • 均值策略,即認爲羣組中每個人貢獻是等價的,計算羣組內top內容時,取對某內容貢獻的均值。
  • 最小化策略,即取羣組內對某內容的最低貢獻作爲該內容的排序值
  • 最大化策略,和最小化策略相反,即取羣組內對某內容的最高貢獻作爲該內容的排序值
  • 專家策略,根據用戶在項目上的專業知識爲其賦予了個性化的權重

但是,這些預定義的策略和數據無關,因爲這些策略很難靈活的捕獲羣組成員的動態權重。因此提出了self-Attention Mechanism + NCF的思路,即Attentive Group Recommendation(AGREE)。

AGREE的主要貢獻點有:

  • 第一次將神經網絡中的注意力機制用於羣組推薦,基於輸入數據動態地學習融合策略。
  • 引入用戶和內容之間的交互行爲,提升羣組推薦的效果,同時在一定程度上能夠緩解冷啓動問題(首先根據某種策略得到羣組,新用戶來訪時匹配其對應的羣組,根據羣組內其他成員選取的top內容作爲新用戶的冷啓動內容)。
  • 基於數據集(爬取的和公開的)進行了大量的實驗,並進行公開,促進學術研究。

2、模型介紹

AGREE模型包含兩部:

  • (1):基於小組成員聚集和偏好表示的羣組表示學習
  • (2):通過NCF進行交互學習,爲用戶和羣組推薦項目

2.1、符號表示含義和要解決的問題

符號表示的規則

  • 粗體大寫字母(eg:X\mathbf{X})表示矩陣
  • 粗體小寫字母(eg:x\mathbf{x})表示向量
  • 粗體小寫字母(eg:xx)表示標量
  • 花體字母(eg:calXcal {X})表示集合

如果未特別說明,所有的向量都是列向量。

下圖說明了羣組推薦任務中輸入數據形態:

羣組推薦任務中輸入數據形態

論文中給出的羣組推薦問題定義的是:對於給定的羣組,輸出爲該羣組推薦的 Top-K物品。

整個模型訓練的

  • 輸入是:用戶集合{u1,u2,....}\{u_1, u_2, ....\},羣組集合{g1,g2,g3,...}\{g_1, g_2, g_3, ...\},物品集合{v1,v2,v3,...}\{v_1, v_2, v_3, ...\},羣組和物品的交互矩陣YY,用戶和物品的交互矩陣RR
  • 輸出是:兩個個性化的排序函數,fgf_g(將一個物品映射給一個羣組的分值)、fuf_u(將一個物品映射給一個用戶的分值)

2.2、基於注意力的羣組表徵學習

論文建議基於表徵學習解決羣組推薦問題,在該框架下,每個實體都被表示爲一個向量,該向量對實體的固有屬性(eg:單詞的語義,用戶的興趣等)進行編碼,且可以從數據中學習。物品推薦中一個衆所周知的矩陣分解方法就是一個表徵學習模型,該模型將用戶和物品通過嵌入向量聯繫起來。

uiu_i表示用戶向量,vjv_j表示物品向量,我們的目標是通過羣組成員的興趣偏好爲每個羣組學習到一個向量,要從數據中動態學習聚合策略,可以將羣組向量定義成依賴用戶和物品的向量,抽象表示爲:
gl(j)=fa(vj,{ut}) g_l(j) = f_a(v_j, \{u_t\})
utu_t 表示 ll羣組中的用戶。gl(j)g_l(j)表示羣組glg_l對物品vjv_j的偏好向量。在AGREE模型中,gl(j)g_l(j)包括兩部分:用戶向量聚合和羣組偏好向量。形式化表示爲:
gl(j)=utgla(j,t)ut+ql g_l(j) = \sum_{u_t \in g_l } a(j,t)u_t + q_l
上面公式中加號左側爲用戶向量,加號右側爲羣組偏好向量。

用戶向量聚合

對羣組中的成員進行加權求和,係數a(j,t)a(j,t)是一個可學習的參數,表示用戶utu_t選擇物品vjv_j的影響力,很顯然,如果一個用戶在一個物品上的影響力比較大,則其對應的a(j,t)a(j,t)也會比較大。例如在決定一個羣組該去哪裏旅行的決定中,如果一個用戶去過中國很多次,那麼這個用戶對是否去中國旅行的決定權就會更大一些,這也比較符合人的期望。

在表徵學習框架下,utu_t表示用戶的歷史偏好,vjv_j表示物品的屬性,我們將a(j,t)a(j, t)設置爲注意力神經網絡,輸入爲utu_tvjv_j
o(j,t)=hTReLU(Pvvt+Puut+b) o(j,t) = h^T ReLU(P_v v_t + P_u u_t +b)
a(j,t)=softmax(o(j,t))=exp(o(j,t))tglexp(o(j,t)) a(j,t) = softmax(o(j,t)) = \frac{exp(o(j,t))}{ \sum_{t \in g_l} exp(o(j,t)) }
其中:

  • tglt \in g_l表示羣組glg_l 中用戶的下標
  • PvP_vPuP_u表示物品vjv_j和用戶utu_t對應的權重矩陣
  • bb 表示偏置
  • ReLU(.)ReLU(.) 表示激活函數
  • hTh^T 表示將結果映射爲o(j,t)o(j,t)的權重向量
  • softmax(.)softmax(.) 表示將結果歸一化的概率函數

下圖說明了用戶向量聚合部分的模型設計。
用戶向量聚合部分的模型設計

羣組偏好向量

除了對用戶向量進行聚合,還對羣組偏好向量進行了表示,目的是考慮羣組的整體偏好。這裏需要考慮的是當用戶匯聚成一個小組時,他們追求的目標可能會與每個小組成員的偏好不同。例如:一個三口之家去看電影,小朋友喜歡看動畫片,父母喜歡看浪漫電影,那麼他們最終可能會考慮看一部教育電影。因此用一個通用的向量表示羣組的普遍偏好是很必要的。這裏直接使用羣組成員的向量求和作爲羣組的向量表示,在後續的實驗中也證明這是有效的。

2.3、基於NCF的交互學習

NCF是一個關於物品推薦的多層神經網絡框架,可以參見之前的文章:Neural Collaborative Filtering。其主要思路是將用戶和物品的向量,輸入到一個定製的神經網絡中,基於歷史數據學校用戶和物品之間的交互,由於神經網絡具有很強的表達能力,NCF比傳統的矩陣分解模型效果要好很多。因此我們選擇了NCF框架對用戶、物品的表達向量和用戶-物品之間的交互進行端到端的學習。

NCF框架的解決方案

上圖展示了論文使用的NCF解決方案,因爲需要同時爲羣組和用戶進行推薦,所以在輸入的時候既有用戶-物品對(ui,vj)(u_i, v_j),還有羣組項對(gl,vj)(g_l, v_j),經過 Representation Layer 返回每個實體的表徵向量(具體的生成方法參考:2.2、參考基於注意力的羣組表徵學習),然後輸入到Pooling Layer(池化層)和Hidden Layer
(隱藏層),(hidden layer被兩個任務進行共享),最後獲得預測分數。

pooling layer

假設輸入的是羣組-項目對(gl,vj)(g_l, v_j),pooling layer(池化層)首先對輸入的向量進行gl,vjg_l, v_j進行逐元素乘積,然後再與gj,vjg_j,v_j進行連接,表示如下:
e0=φpooling(gl(j),v(j))=[gl(j)v(j)gl(j)v(j)] e_0 = \varphi _{pooling}(g_l(j), v(j)) = \begin{bmatrix} g_l(j) \odot v(j) \\ g_l(j) \\ v(j) \end{bmatrix}

之所以用這種方式表示,是因爲內積能夠有效的捕獲到羣組和物品之間的交互,同時連接羣組和物品本身的信息能夠避免信息丟失。同樣用戶-物品項之間的池化也採用這種方式。

hidden layer

池化層之上這是一個多層的隱藏層結構,能夠捕獲羣組、用戶、物品之間的非線性、高維的交互。
{e1=ReLU(W1e0+b1)e2=ReLU(W2e1+b2)...eh=ReLU(Wheh1+bh) \left\{\begin{matrix} e_1 = ReLU(W_1 e_0 + b_1) \\ e_2 = ReLU(W_2 e_1 + b_2) \\ ... \\ e_h = ReLU(W_h e_{h-1} + b_h) \end{matrix}\right.
其中:

  • WhW_h 表示第hh層的權重矩陣
  • bhb_h 表示第hh層的偏置
  • ehe_h 表示第hh層的輸出
  • ReLUReLU 表示激活函數

最後一層輸出ehe_h可以經過下面的公式轉化爲預測分:
{r^ij=wTeh,ife0=φpooling(ui,vj)y^ij=wTeh,ife0=φpooling(gl(j),vj) \left\{\begin{matrix} \hat{r}_{ij} = w^T e_h, if e_0 = \varphi _{pooling} (u_i, v_j) \\ \hat{y}_{ij} = w^T e_h, if e_0 = \varphi _{pooling} (g_l(j), v_j) \end{matrix}\right.
其中

  • ww 表示預測層的權重
  • r^ij\hat{r}_{ij} 表示 用戶對物品的預測分
  • y^ij\hat{y}_{ij} 表示 羣組對物品的預測分

這裏需要強調的是,我們針對用戶-物品和羣組-物品兩個預測任務共享了隱藏層,因爲羣組的embedding向量是通過用戶的embedding向量匯聚而成的,他們在同一個向量空間中,且有利於兩個任務的相互補充。

2.4、模型優化

目標函數

羣組推薦本質也是做排序,所以這裏使用的pairwise方法(關於pairwise、pointwise、listwise的區別可以參考:怎麼理解基於機器學習“四大支柱”劃分的學習排序方法)。

用戶-物品:
Luser=(i,j,s)O(ri,j,sr^i,j,s)2=(i,j,s)O(r^i,jr^i,s1)2 L_{user} = \sum_{ (i,j,s) \in O} (r_{i,j,s} - \hat{r}_{i,j,s}) ^2 = \sum_{ (i,j,s) \in O} ( \hat{r}_{i,j} - \hat{r}_{i,s} -1) ^2
其中:

  • OO 表示訓練集
  • (i,j,s)(i,j,s) 表示用戶uiu_i 對物品vjv_j有行爲,但對物品vsv_s沒有行爲 (vsv_s 是負採樣產生)
  • r^i,j,s=r^i,jr^i,s\hat{r}_{i,j,s} = \hat{r}_{i,j} - \hat{r}_{i,s} 表示觀察到的交互(ui,vj)(u_i, v_j)和爲觀察到的交互(ui,vs)(u_i, v_s)之間的差值分數

這裏認爲有行爲交互分值爲1,沒有交互分值爲0,所以ri,j,s=ri,jri,s=1r_{i,j,s} = r_{i,j} - r_{i,s} = 1,又因爲用戶-物品的損失函數中爲平方和,所以最後形式轉爲了(r^i,jr^i,s1)( \hat{r}_{i,j} - \hat{r}_{i,s} -1)

同樣,羣組-物品的損失函數爲:
Lgroup=(l,j,s)O(yl,j,sy^l,j,s)2=(l,j,s)O(y^l,jy^l,s1)2 L_{group} = \sum_{ (l,j,s) \in O'} (y_{l,j,s} - \hat{y}_{l,j,s}) ^2 = \sum_{ (l,j,s) \in O'} ( \hat{y}_{l,j} - \hat{y}_{l,s} -1) ^2

優化技巧

主要是在模型設計和訓練上,有以下幾點:

1、mini-batch。需要注意的首先需要將訓練集進行shuffle,即混洗,保證數據之間是無序的。

2、pre-training。神經網絡對於相關的初始化值是比較敏感的,因此在AGREE模型中,對網絡的初始值進行了初始化,初始化的方法是去除了AGREE中的Attention機制,將得到的相關參數複用在AGREE中,而且在預訓練模型中使用的是Adma優化方法,因爲速度較快,而在AGREE模型中使用的則是SGD(關於SGD可參考:梯度算法之批量梯度下降,隨機梯度下降和小批量梯度下降)。

3、droupout。由於神經網絡的擬合能力強,爲了提升模型的泛化能力,這裏採用了深度學習中比較常見的Droupout機制,不僅在第一層中去除了pp %,而且隱藏層也進行了剔除。另外需要注意的是在訓練的時候需要進行dropout,但是在預測的時候不需要dropout。

3、實驗效果

實驗採用的數據集有兩個:

  • 自己爬取和整理的馬蜂窩數據
  • CAMAa2011

這兩個數據集都只有正樣本,因此從缺失的數據中進行隨機負採樣構建負樣本。而且適當的調整正負樣本的比例能夠增強實驗的效果,所以論文中選擇的負樣本的採樣率在4~6之間。

實驗採用的方法是:留一法(即交叉驗證法),爲了評估算法的效果,使用了兩種指標來進行評估:

  • Hit Ratio(HR)
  • Normalized Discounted Cumulative Gain (NDCG)

實驗中超參數的設置:

  • 負採樣率:4
  • 嵌入層使用Glorot初始化權重
  • 隱藏層使用均值爲0,標準差爲0.1的高斯分佈初始化權重
  • 基於梯度優化的算法使用Adma優化,mini-batch設置爲[128, 256, 512, 1024],學習率設置爲[0.001, 0.005, 0.01, 0.05, 0.1]
  • 隱藏成第一層的維度和嵌入層維度相同,爲32
  • 激活函數:ReLU
  • 每組實驗參數進行5次實驗,選取平均值

爲了驗證算法的效果,和以下幾種方法進行了對比:

  • NCF
  • Popularity(根據物品的流行度進行推薦)
  • COM(基於概率的方法生成羣組推薦)
  • GREE(AGREE去除注意力機制)

AGREE和GREE的實驗效果對比結果如下:
AGREE和GREE的實驗效果對比

同時爲了證明從數據集中學習聚合策略的有效性,和以下實驗做了對比:

  • NCF+avg
  • NCF+ the least misery strategy
  • NCF + The maximum satisfaction strategy
  • NCF + The expertise strategy

AGREE算法的有效性實驗對比結果如下:
AGREE算法的有效性實驗對比

同時也拿AGREE和其變體(AGREE-U、AGREE-G)做了實驗對比:

  • AGREE-U:AGREE算法中只利用了用戶的embedding向量
  • AGREE-G:AGREE算法中只利用了羣組的embedding向量

AGREE算法和其變體的實驗效果對比結果如下:
AGREE算法和其變體的實驗效果對比結果

同時也拿AGREE和冷啓動的中一些算法進行了結果對比,這裏冷啓動的前提是用戶已經加入了某羣組,但是沒有產生行爲,實驗結果如下:

AGREE和冷啓動的中一些算法的結果對比

綜合來看,AGREE算法的效果是要比其他羣組推薦算法好很多的。

4、代碼解析

論文中也給出了代碼的github 地址:https://github.com/LianHaiMiao/Attentive-Group-Recommendation

代碼的環境是:

pytorch version: '0.3.0'
python version: '3.5'

由於目前pytorch已經更新到1.4版本了,所以對代碼進行了更新,更新後的repo庫爲:https://github.com/Thinkgamer/Attentive-Group-Recommendation

運行代碼,輸出爲:

num_group is: 290
num_users is: 602
num_items is: 7710
AGREE 的Embedding 維度爲: 32, 迭代次數爲: 30, NDCG、HR評估選擇topK: 5
Iteration 0, loss is [1.0019 ]
Iteration 0, loss is [0.9933 ]
user and group training time is: [1201.2 s]
User Iteration 0 [1203.3 s]: HR = 0.2133, NDCG = 0.1389, [2.2 s]
Group Iteration 0 [1246.6 s]: HR = 0.1897, NDCG = 0.1229, [45.5 s]
Iteration 1, loss is [0.9112 ]
...

【技術服務】,詳情點擊查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

掃一掃 關注微信公衆號!號主 專注於搜索和推薦系統,嘗試使用算法去更好的服務於用戶,包括但不侷限於機器學習,深度學習,強化學習,自然語言理解,知識圖譜,還不定時分享技術,資料,思考等文章!

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