1. 程式人生 > 實用技巧 >論文筆記+模型實現TransNets: Learning to Transform for Recommendation

論文筆記+模型實現TransNets: Learning to Transform for Recommendation

文章目錄

摘要

最近,一些深度學習方法相對於傳統方法提高了推薦系統的效能,尤其是當評論文字可用時。舉個例子,最近的一個模型DeepCoNN,使用神經網路,根據目標使用者所有評論學得一個潛在向量,根據目標專案的所有評論學得第二個潛在向量,然後把它們結合起來,在推薦任務中獲得了最先進的效能。

我們證明了(不足為奇)來自目標使用者對目標專案的評論具有很高的預測價值。然後我們介紹瞭如何在推薦系統中使用這些資訊,甚至是當目標使用者對目標專案的評論不可用時。我們的模型叫作TransNets,由DeepCoNN模型拓展而來,通過引入額外的潛在向量表達<目標使用者-目標專案>對。然後我們調整這個層,與其他層的表示類似。我們證實了TransNets及其拓展版本比以前最先進的方法有極大的提升。

1. 介紹

用評論文字來預測評分已經被證實大大改進了推薦系統的效能[4,22,24],相對於協同過濾(CF)只用歷史評分來說。近來,深度學習研究的進步使得 在眾多領域使用包括推薦系統 這件事變得有可能。大多數神經網路推薦模型[3,10,16,21,40]都關注了與使用者和專案有關聯的內容,常常用來構建他們的潛在表示。與使用者有關聯的資訊包含他們的人口資訊、社會經濟特徵、他們的產品喜好。與專案相關聯的內容包含產品中的價格、外觀、可用性、相似屬性,或者飯店的食物質量、格調、服務和等待時間,或者電影裡的演員、導演、型別和相似元素。這些表示形式喂入一個CF風格的模型或迴歸模型去做評分預測。

評論文字不像上面所說的“內容”,不是使用者僅有的或商品僅有的屬性;而是與他們的聯合互動有關係的屬性。目前只有少數神經網路模型[2,34,44]提出使用評論文字來預測評分。

基於此,最近一個模型DeepCoNN使用神經網路,從使用者寫的所有評論文字中為使用者學得一個潛在表示,同理從專案的所有評論文字中為專案本身學得一個潛在表示;然後用一個迴歸層把這兩個潛在表示合併起來,從而在評分預測中獲得最先進的效果。

然而,正如我們將要證明的,很大的預測價值來自目標使用者對目標專案的評論,這些評論應當只在訓練中生效而在測試時不可用。在本文,我們介紹了一種方法:把這種(預測價值)資訊用到推薦系統的訓練中。

2. 提出的方法

2.1 CNN處理文字 & 2.2 DeepCoNN模型

該部分介紹了DeepCoNN的基本模型,上一篇筆記已經詳細記錄:論文學習(DeepCoNN):Joint Deep Modeling of Users and Items Using Reviews for Recommendation

DeepCoNN模型實現(pytorch 1.60):zhaojinglong/DeepCoNN

2.3 DeepCoNN的一下侷限性

DeepCoNN超越以往最先進使用評論文字的方法,得出了令人印象深刻的均方誤差值。

比如這些模型:

  • Hidden Factors as Topics (HFT) model [24]
  • Collabora-tive Topic Regression (CTR) [39]
  • Collaborative Deep Learning(CDL)[40]

更不用說僅使用評分資訊的協同過濾方法:

  • Matrix Factorization (MF) [18]
  • Probabilistic Matrix Factorization (PMF) [33]。

然而,在DeepCoNN實驗中我們發現,只有當測試的時候樣本中包含目標使用者對目標專案的評論時,才能獲得最好的表現效果。而在現實世界中,我們的推薦常識是應當在一個使用者購買一個商品之前把這個商品推薦給他,而他此時還沒有對該商品進行過評論。因此,我們怎麼能在預測時,使用這個“還沒出生”的評論作為輸入呢?

具體來說,假設一個輸入樣本使用者為A,專案為B, t e x t A text_A textA表示A所有寫過的評論(包括對B),同理 t e x t B text_B textB表示專案B所有收到過的評論(包括A寫的), r e v A B rev_{AB} revAB表示使用者A對專案B寫過的評論,即 t e x t A text_A textA t e x t B text_B textB的交集。上一段所講的“目標使用者對目標專案的評論”就是指 r e v A B rev_{AB} revAB

經過對DeepCoNN的實驗我們發現,當測試集樣本中包含 r e v A B rev_{AB} revAB時,EMS=1.21,反之不包含 r e v A B rev_{AB} revAB時,EMS=1.89,顯然後者才是真實世界的情況,而後者資料集在矩陣分解MF模型上MSE=1.86。 再者,如果我們在訓練集和測試上都去除 r e v A B rev_{AB} revAB,實驗結果EMS=1.70,仍然比訓練集和測試集都包含 r e v A B rev_{AB} revAB的實驗結果要高。實驗資料如圖:

情景訓練集測試集EMS
1 r e v A B rev_{AB} revAB r e v A B rev_{AB} revAB1.21
2 r e v A B rev_{AB} revAB不含 r e v A B rev_{AB} revAB1.89
3不含 r e v A B rev_{AB} revAB不含 r e v A B rev_{AB} revAB1.70

很顯然,情景2才是我們真實世界的情況,但DeepCoNN的表現卻不盡人意。

2.4 TransNets模型

通過上文我們瞭解到,在DeepCoNN模型的學習中,在訓練集中保留 r e v A B rev_{AB} revAB將無意間導致模型在測試時依賴於測試集中的 r e v A B rev_{AB} revAB(由前一節表格的情景1與情景2對比得出),這種情況是不切實際的。雖然 r e v A B rev_{AB} revAB出現在測試集中是不合理的,但 r e v A B rev_{AB} revAB出現在訓練集中是合乎現實的。

TransNets模型

如Figure 3所示,TransNets包含兩個神經網路。一個目標網路(Target Network)用來單獨處理 r e v A B rev_{AB} revAB樣本;一個源網路(Source Network)用來處理不含 r e v A B rev_{AB} revAB的樣本( t e x t A , t e x t B text_A,text_B textA,textB)。

目標網路 使用一個CNN文字處理層 Γ T \Gamma_T ΓT(與DeepCoNN相同)和一個分解機 F M T FM_T FMT(FM)去預測評分:

x T = Γ T ( r e v A B ) (1) x_T = \Gamma_T(rev_{AB}) \tag{1} xT=ΓT(revAB)(1)
x ‾ T = δ ( x T ) (2) \overline{x}_T = \delta(x_T) \tag{2} xT=δ(xT)(2)
r ^ T = F M T ( x ‾ T ) (3) \hat{r}_T = FM_T(\overline{x}_T) \tag{3} r^T=FMT(xT)(3)

其中 δ \delta δ表示dropout層。由於目標網路使用了實際評論,所以類似於情感分析[19,35]。

源網路和DeepCoNN模型一樣:兩個CNN文字處理層, Γ A \Gamma_A ΓA處理使用者文字( t e x t A − r e v A B text_A-rev_{AB} textArevAB); Γ B \Gamma_B ΓB處理專案文字( t e x t B − r e v A B text_B-rev_{AB} textBrevAB);一個分解機 F M S FM_S FMS;另外有一個額外的 T r a n s f o r m Transform Transform層。 T r a n s f o r m Transform Transform層的目標是把使用者文字和專案文字轉換成一個 r e v A B rev_{AB} revAB的近似值 r e v ^ A B \hat{rev}_{AB} rev^AB,用於後面的評分預測。

首先是CNN層的處理,得到潛在向量 z 0 z_0 z0

x A = Γ A ( t e x t A − r e v A B ) (4) x_A = \Gamma_A(text_A - rev_{AB}) \tag{4} xA=ΓA(textArevAB)(4)
x B = Γ B ( t e x t B − r e v A B ) (5) x_B = \Gamma_B(text_B - rev_{AB}) \tag{5} xB=ΓB(textBrevAB)(5)
z 0 = [ x A x B ] (6) z_0 = [x_A x_B] \tag{6} z0=[xAxB](6)
公式(6)是將向量 x A x_A xA x B x_B xB直接連線。

Transform層是一個L層非線性全連線層網路,將 z 0 z_0 z0作為其輸入,第 l l l層到第 l + 1 l+1 l+1層傳遞公式為:
z l = σ ( z l − 1 G l + g l ) (7) z_l = \sigma(z_{l-1}G_l+g_l) \tag{7} zl=σ(zl1Gl+gl)(7)

其中 σ \sigma σ是非線性啟用函式;權重矩陣 G l ∈ { R 2 n × n , l = 1 R n × n , e l s e G_l \in \begin{cases} \R^{2n\times n}, & l=1 \\ \R^{n\times n},&else\end{cases} Gl{R2n×n,Rn×n,l=1else;偏置 g l ∈ R n g_l \in \R^n glRn。 我們使用TransNet模型得到了 r e v A B rev_{AB} revAB的近似值 r e v ^ A B \hat{rev}_{AB} rev^AB,也就是 z l z_l zl。最後源網路用下面的表示式預測評分:

z ‾ L = δ ( z l ) (8) \overline z_L = \delta(z_l) \tag{8} zL=δ(zl)(8)
r ^ S = F M S ( z ‾ L ) (9) \hat r_S = FM_S(\overline z_L) \tag{9} r^S=FMS(zL)(9)

在訓練中,我們會讓源網路輸出的 z ‾ l \overline z_l zl逼近目標網路輸出的 x T x_T xT,下節詳述。

2.5 TransNets模型的訓練

TransNets 的訓練分為3個子步驟,見演算法1。

  • 第一步,訓練目標網路,其所有可訓練引數記為 θ T \theta_T θT,損失函式為真實評分 r A B r_{AB} rAB與預測評分 r ^ T \hat r_T r^T之間的L1範數;
  • 第二步,訓練源網路,其 F M S FM_S FMS層之前(不含)可訓練引數記為 θ t r a n s \theta_{trans} θtrans,損失函式為dropout層輸出的表達 z ‾ l \overline z_l zl和目標網路CNN層輸出的評論表達 x T x_T xT之間的L2範數;
  • 第三步,源網路剩餘可訓練引數記為 θ S \theta_S θS,損失函式為 r A B r_{AB} rAB與預測評分 r ^ S \hat r_S r^S之間的L1範數;

模型訓練虛擬碼:

TransNets 的測試只使用源網路,見演算法3:

2.6 設計決策和一些其他結構的選擇

本節主要是說本模型在設計時考慮過的不同方案,但這些方案最終都被淘汰了,下面詳述了沒有采用它們的原因。

2.6.1 分步訓練 VS. 合併訓練

演算法1提出的方案分3步來訓練各個子網。然而,如果採用在每次迭代中把所有引數一次性更新訓練,即 l o s s t o t a l = l o s s T + l o s s t r a n s + l o s s S loss_{total}=loss_T+loss_{trans}+loss_S losstotal=lossT+losstrans+lossS,將會導致源網路的損失傳播給目標網路,從而導致模型效果大大降低。因此,分別反向傳播是非常重要的。

2.6.2 單獨訓練目標網路直至收斂

我們可以選擇先把目標網路訓練到收斂,然後再訓練源網路直到收斂到跟目標網路看齊。然而,目標網路的輸入是實際評論(即u對i的真實評論),是不能用在測試中的。換句話說,我們使用實際評論把目標網路訓練好了,再用目標網路的結果去矯正源網路,不就間接地用實際評論訓練源網路了嗎?這正是2.3節提出的DeepCoNN的侷限性。源網路不應當知道目標網路在良好泛化的情況下何時收斂,以及何時過擬合。

測試模型的唯一方法就是評估源網路的輸出。

因此,我們同時訓練源網路和目標網路,並在源網路驗證效能最好時停止訓練。

2.6.3 在源網路和目標網路使用同一個CNN層進行文字處理

我們可以直接用目標網路中的CNN層在源網路進行文字處理,也就是兩個子網共用一個CNN層。畢竟,我們在學習將源網路的輸出向目標網路的輸出靠攏。然而,這將迫使TransNet模型生成通用的特徵(源網路和目標網路通用),這是不合理的。舉個例子,某使用者“喜歡印度烹飪,但不喜歡等”,某飯店被評為“差勁的服務,糟糕的咖哩雞”,那麼在源網路中該使用者對該飯店的預測評價應當是“失望的”,從而評分很低。讓源網路擁有獨立CNN層來處理文字,可以讓它擁有更強的表達能力和效果。

2.6.4 訓練Transform時不使用dropout

在演算法1的步驟2中,不使用dropout來訓練transform層,也就是說 l o s s t r a n s = ∣ ∣ z l − x T ∣ ∣ 2 loss_{trans}=||z_l - x_T||_2 losstrans=zlxT2而不是 l o s s t r a n s = ∣ ∣ z ‾ l − x T ∣ ∣ 2 loss_{trans}=||\overline z_l - x_T||_2 losstrans=zlxT2。(其實這也是我看完模型後的一個疑惑)。然而,這將導致Tranform層欠正則化,即很容易過擬合,從而模型效果變差。

2.7 拓展的TransNets模型

針對上文提出的TransNets模型存在一個問題:輸入只有評論文字,而沒有考慮使用者或專案的身份(標識資訊)。換句話說,TransNets並沒有考慮輸入的評論來自哪個使用者或專案,而使用者或專案應當由一定的個性。這一點在傳統的協同過濾方法中是有考慮的(如矩陣分解)。

如圖Figure 4,在源網路中增加兩個嵌入矩陣: Ω A \Omega_A ΩA, Ω B \Omega_B ΩB,分別為使用者和專案的嵌入矩陣; Ω : i d → R n \Omega: id \rightarrow \R^n Ω:idRn。該對映把一個使用者的唯一標識(可以是編號)對映為一個n維向量。

將使用者和專案的編號經過嵌入後,進行dropout,然後與源網路Transform層的輸出連線起來,最後送入FM(分解機)。給定 u s e r A user_A userA i t e m B item_B itemB,TransNet-Ext的評分計算方法為:
ω A = Ω ( u s e r A ) (10) \omega_A = \Omega(user_A) \tag{10} ωA=Ω(userA)(10)
ω B = Ω ( i t e m B ) (11) \omega_B = \Omega(item_B) \tag{11} ωB=Ω(itemB)(11)
z ‾ = [ δ ( ω A ) δ ( ω B ) z ‾ l ] (12) \overline z = [\delta(\omega_A) \delta(\omega_B) \overline z_l] \tag{12} z=[δ(ωA)δ(ωB)zl](12)
r ^ S E = F M S E ( z ‾ ) (13) \hat{r}_{SE} = FM_{SE}(\overline z) \tag{13} r^SE=FMSE(z)(13)

同時,在演算法1的步驟3需要做一些修改。 l o s s S loss_S lossS替換為 l o s s S E = ∣ r A B − r ^ S E ∣ loss_{SE}=|r_{AB}-\hat{r}_{SE}| lossSE=rABr^SE,引數集合 θ S \theta_S θS將增加兩個引數: Ω A \Omega_A ΩA Ω B \Omega_B ΩB

3. 實驗和結果分析

3.1 資料集

本文選用了4個大型資料集:

資料集型別使用者數目專案數目評論/評分數目
Yelp1720194321440724153150
AZ-Elec數碼類42005204759107820765
(7,824,482)
AZ-CSJ服裝鞋珠寶311694411359485748260
(5,748,920)
AZ-Mov影視類20884282009154606671
(4,607,047)

實際使用時進行了去重和去除空評論,括號中是原始數目。

3.2 評估方案和引數設定

將資料集亂序後,按照8:1:1的比例劃分為訓練集、驗證集、測試集。在訓練中每500個batches以及每個epoch之後再驗證集上計算一次MSE(均方誤差),只要發現更小的MSE,就儲存當前的模型。

3.2.1 文字的預處理和詞嵌入

所有的評論文字通過Stanford Core NLP Tokenizer[24]獲得全部小寫的字詞。停用詞(the,and,is等)和標點符號被考慮為隔離字元,並被保留。使用Skip-gram模型在語料庫中50000個詞頻最高的詞上預訓練出來的64維詞嵌入向量。

3.2.2 CNN文字處理器

本文的模型相較於DeepCoNN,在CNN文字處理上沒有明顯改進,所以沿用DeepCoNN的引數設定。
三個CNN文字處理器 Γ A , Γ B , Γ T \Gamma_A,\Gamma_B,\Gamma_T ΓA,ΓB,ΓT的引數一致,卷積核數目為100寬度為3,CNN輸出維度是50,輸入文字最大長度1000,當評論很多時,隨機亂序抽取前1000個單詞。

在本文的實驗中,詞嵌入維度為64,字典大小50000。非線性啟用函式為tanh

3.2.3 dropout層和FM分解機

dropout的保留概率設為0.5, F M T , F M S , F M S E FM_T,FM_S,FM_{SE} FMT,FMS,FMSE中特徵組合矩陣的向量維度是k=8。所有分解機的權重引數w初始化為0.001,特徵組合矩陣初始化服從均值為0標準差0.001的正態分佈。所有分解機的訓練都是通過最小化L1範數。

3.2.4 Transform層

預設全連線層數為2。所有權重矩陣初始服從均值為0,標準差為0.1的截斷正態分佈,所有偏置 g l g_l gl初始為0.1。非線性啟用函式為tanh

3.2.5 TransNet-Ext(拓展TransNets)

使用者/專案嵌入矩陣 Ω \Omega Ω服從(-1,1)上的均勻分佈,且每個使用者/專案的嵌入維度為n=50。驗證集或測試集中的使用者取隨機值。

3.2.6 訓練

優化器使用Adam[17],學習率0.002。

3.3 與之相競爭的其他模型

  1. DeepCoNN:[44]. 在訓練時,每個樣本中user和item的公共評論 r e v A B revAB revAB分別被保留在使用者評論和專案評論中。在測試中,公共評論不被保留。

  2. DeepCoNN-revAB:在訓練時,每個樣本中user和item的公共評論 r e v A B revAB revAB不保留。在測試中,公共評論也不保留

  3. MF:神經網路實現的矩陣分解,隱層維度為50,該模型只使用評分(沒用評論文字)。

  4. DeepCoNN + Test Reviews:在訓練時,每個樣本中user和item的公共評論 r e v A B revAB revAB保留。在測試中,公共評論也保留

3.4 評估與分值預測

使用MSE(均方誤差)評估模型效果:
M S E = 1 N ∑ i = 1 N ( r i − r ^ i ) 2 (14) MSE = \frac{1}{N} \sum_{i=1}^{N}(r_i - \hat r_i)^2 \tag{14} MSE=N1i=1N(rir^i)2(14)
其中, N N N是資料點個數, r i r_i ri是真實分值, r ^ i \hat r_i r^i是預測分值。MSE值越小,模型效果越好。

Table 2給出了每個方法對應每個資料集的MSE,最優值被標記為藍色。

3.5 選取Transform層的全連線層數

Transform有L層全連線層,Figure 5展示了層數L對模型效果的影響,使用的資料集是Yelp。L=2是個合理的選擇。

3.6 尋找最相似的(有用的)評論

這一小節討論的是TransNets如何為使用者找到最像其本人寫的評論,從而做出更有根據的預測。舉例說明,對一個關心服務質量和等待時間的使用者最有幫助的評論,和對一個關心價格的使用者最有用的評論,是不一樣的。

設一個訓練樣本中,專案的所有評論中的一個評論為 r e v C Q revCQ revCQ,如果該評論非常接近使用者A寫給該專案的評論,那麼其在目標網路的隱性表達(即 x C Q = Γ T ( r e v C Q ) x_{CQ}=\Gamma_T(revCQ) xCQ=ΓT(revCQ))跟源網路的 z L z_L zL應當是極為相似的(即歐幾里得距離很近)。

使用pytorch實現TransNets模型

https://github.com/zhaojinglong/TransNets