本文是關於論文《LARA: Attribute-to-feature Adversarial Learning for New-item Recommendation》的閱讀筆記。
由於冷啓動問題的存在,在電商網站中爲用戶推薦新物品是一個極具挑戰的問題,爲了解決該問題,文本提出的 LARA 模型是 adversariaL neurAl netwoRk with multi-generAtors 的縮寫,它利用 GAN 從物品屬性的多個角度產生可能對該新物品感興趣的用戶,通過獲取用戶和物品之間隱含的屬性級的交互信息,並基於屬性級的相似度將新物品推薦給用戶。
一、相關工作
GAN 由生成器和判別器兩部分組成,生成器相當於是造假幣的,判別器相當於是驗鈔機,生成器的目的是讓自己造的假幣騙過驗鈔機,雙方通過不斷互相搏弈,互相提升。
已有的基於 GAN 的推薦模型是從用戶歷史行爲信息(如評分、購買、評論等)中產生一個用戶和物品之間的交互表示向量,向量的每一維表示該用戶可能會購買對應物品的可能性。但是這些模型都沒有試圖解決冷啓動的問題,並且都不能直接應用到新物品推薦上,這是因爲:
模型是根據用戶的歷史購買信息來構建向量的,但是新物品/新用戶沒有歷史信息;
此外由於電商網站的物品數以百萬計,所以用戶和物品的交互向量會非常的大,並且非常稀疏,而這對 GAN 來說是很難處理的。
二、冷啓動問題
冷啓動問題是指當新物品或新用戶進入推薦系統後,由於沒有該物品/用戶的歷史信息,推薦很難取得較好的效果的問題。主要可以分爲用戶冷啓動、物品冷啓動和系統冷啓動三類。
文章認爲解決冷啓動問題的關鍵在於在新物品和用戶之間建立關係,又考慮到新物品一般也有很多屬性(如價格、品牌等),而物品的一個屬性往往對應一個特定的用戶特徵(user profiles)。如上圖所示,物品是耐克鞋、運動鞋和正在打折,對應着用戶特徵中的喜歡的品牌、是否熱愛運動和是否偏愛促銷產品。所以我們可以從新物品的屬性中生成虛擬的用戶特徵,再計算該用戶特徵和已有用戶的匹配關係,然後向匹配程度最高的前幾個用戶推薦該新物品。物品的每個屬性可以是標量,也可以是向量。用戶特徵向量的每一維對應物品的一個屬性,其值表示兩者之間的關係。
然而從物品的屬性信息來反映用戶的偏好信息仍然存在很多困難:
物品屬性和用戶特徵之間的屬性的關係是隱含的,並不知道;
物品一般有多個屬性,模型需要推斷出每個屬性對應的用戶的特徵;
生成的用戶特徵不僅要跟真實的用戶特徵儘可能相似,而且應該和給定的物品儘可能的匹配。
三、記號
I = { I 1 , I 2 , . . . , I n } I=\{I_1,I_2,...,I_n\} I = { I 1 , I 2 , . . . , I n } :物品集
U = { U 1 , U 2 , . . . , U m } U=\{U_1,U_2,...,U_m\} U = { U 1 , U 2 , . . . , U m } :用戶集
A i = { a i 1 , a i 2 , . . . , a i k i } A_i=\{a_{i1},a_{i2},...,a_{ik_i}\} A i = { a i 1 , a i 2 , . . . , a i k i } :第 i i i 個屬性
n , m , k i n,m,k_i n , m , k i :物品數、用戶數和第 i i i 個屬性的維度
四、網絡結構
LARA 模型由生成器和判別器兩部分組成,生成器可以根據輸入的物品的屬性向量生成一個可能喜歡該物品的用戶特徵向量,然後從用戶集中選出若干個與該用戶特徵向量最相似的用戶,將該物品推薦給這些用戶。判別器可以根據輸入的用戶-物品對,判斷輸入的用戶特徵是真實的還是生成的。
LARA 模型總的目標函數爲:
L G ∗ , D ∗ = min θ max ϕ ∑ n = 1 N ( E u + ∼ p true ( u + ∣ I n ) [ log ( D ( u + ∣ I n ) ) ] + E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 − D ( u c ∣ I n ) ) ] + E u − ∼ p false ( u − ∣ I n ) [ log ( 1 − D ( u − ∣ I n ) ) ] )
\begin{aligned}
\mathcal{L}^{G^{*}, D^{*}}=\min _{\theta} \max _{\phi} \sum_{n=1}^{N}\left(\mathbb{E}_{\mathbf{u}^{+} \sim p_{\text {true}}\left(\mathbf{u}^{+} | I_{n}\right)}\left[\log \left(D\left(\mathbf{u}^{+} | I_{n}\right)\right)\right]\right.\\
+\mathbb{E}_{\mathbf{u}^{c} \sim p_{\theta}\left(\mathbf{u}^{c} | I_{n}\right)}\left[\log \left(1-D\left(\mathbf{u}^{c} | I_{n}\right)\right)\right] \\
\left.+\mathbb{E}_{\mathbf{u}^{-} \sim p_{\text {false}}\left(\mathbf{u}^{-} | I_{n}\right)}\left[\log \left(1-D\left(\mathbf{u}^{-} | I_{n}\right)\right)\right]\right)
\end{aligned}
L G ∗ , D ∗ = θ min ϕ max n = 1 ∑ N ( E u + ∼ p true ( u + ∣ I n ) [ log ( D ( u + ∣ I n ) ) ] + E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 − D ( u c ∣ I n ) ) ] + E u − ∼ p false ( u − ∣ I n ) [ log ( 1 − D ( u − ∣ I n ) ) ] )
其中生成器 G G G 被寫成了 p θ ( u c ∣ I n ) p_\theta(u^c|I_n) p θ ( u c ∣ I n ) ,θ \theta θ 表示生成器的參數,N N N 是訓練集中給定物品(conditional items)的個數。
1. 生成器
生成器採用了分別生成,然後再合併的結構,即生成器可以分爲兩個部分:條件物品的每個屬性 a i c a_i^c a i c 被送到特定的生成器 g i g_i g i 中,然後生成潛在用戶的特徵,然後神經網絡 G 合併所有的生成的用戶特徵向量,並輸出一個最終的用戶特徵向量,該過程可以表示爲下式:
u c = G ( g 1 ( a 1 c ) , g 2 ( a 2 c ) , … , g k ( a k c ) )
\mathbf{u}^{c}=G\left(g_{1}\left(\mathbf{a}_{1}^{c}\right), g_{2}\left(\mathbf{a}_{2}^{c}\right), \ldots, g_{k}\left(\mathbf{a}_{k}^{c}\right)\right)
u c = G ( g 1 ( a 1 c ) , g 2 ( a 2 c ) , … , g k ( a k c ) )
通過最小化目標函數來得到最優的生成器,並且當在訓練生成器的時候判別器的參數是固定的,所以只需要優化跟生成器相關的項:
θ ∗ = arg min θ ∑ n = 1 N E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 − σ ( d ϕ ( u c , I n ) ) ) ] = arg max θ ∑ n = 1 N E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 + exp ( d ϕ ( u c , I n ) ) ]
\begin{array}{l}
\theta^{*}=\underset{\theta}{\arg \min } \sum_{n=1}^{N} \mathbb{E}_{\mathbf{u}^{c} \sim p_{\theta}\left(\mathbf{u}^{c} | I_{n}\right)}\left[\log \left(1-\sigma\left(d_{\phi}\left(\mathbf{u}^{c}, I_{n}\right)\right)\right)\right] \\
=\underset{\theta}{\arg \max } \sum_{n=1}^{N} \mathbb{E}_{\mathbf{u}^{c} \sim p_{\theta}\left(\mathbf{u}^{c} | I_{n}\right)}\left[\log \left(1+\exp \left(d_{\phi}\left(\mathbf{u}^{c}, I_{n}\right)\right)\right]\right.
\end{array}
θ ∗ = θ arg min ∑ n = 1 N E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 − σ ( d ϕ ( u c , I n ) ) ) ] = θ arg max ∑ n = 1 N E u c ∼ p θ ( u c ∣ I n ) [ log ( 1 + exp ( d ϕ ( u c , I n ) ) ]
2. 判別器
判別器有三種訓練對:
( u c , I c ) (u^c,I^c) ( u c , I c ) :給定的物品 I c I^c I c 和生成的用戶 u c u^c u c
( u + , I c ) (u^+,I^c) ( u + , I c ) :給定的物品 I c I^c I c 和真實用戶 u + u^+ u + (ground-truth 數據中對 I c I^c I c 感興趣的用戶)
( u − , I c ) (u^-,I^c) ( u − , I c ) :給定的物品 I c I^c I c 和假用戶 u − u^- u − (ground-truth 數據中對 I c I^c I c 不感興趣的用戶)
通過以上三種樣本的訓練方式,可以使判別器產生的用戶特徵不僅像真實的用戶特徵,而且和給定的物品相關。
y ( T ) = { 1 , T = ( u + , I c ) 0 , T = ( u c , I c ) 0 , T = ( u − , I c )
y(\mathcal{T})=\left\{\begin{array}{ll}
1, & \mathcal{T}=\left(\mathbf{u}^{+}, I^{c}\right) \\
0, & \mathcal{T}=\left(\mathbf{u}^{c}, I^{c}\right) \\
0, & \mathcal{T}=\left(\mathbf{u}^{-}, I^{c}\right)
\end{array}\right.
y ( T ) = ⎩ ⎨ ⎧ 1 , 0 , 0 , T = ( u + , I c ) T = ( u c , I c ) T = ( u − , I c )
對於真實用戶 u + u^+ u + 的確定,先找到一個和物品 I c I^c I c 有交互的用戶 u u u ,並將其特徵向量初始化爲0,維度和物品的屬性個數相同,再遍歷數據集找到與 u u u 有交互的物品的集合,並得到它們的屬性集合,將屬性對應的維度設爲1。假用戶 u − u^- u − 是先找到一個和物品 I c I^c I c 沒有交互的用戶 u u u ,後續過程跟真實用戶的確定相同。
判別器的目的就是將 ( u + , I c ) (u^+,I^c) ( u + , I c ) 和其他兩個區分開來,所以 ( u + , I c ) (u^+,I^c) ( u + , I c ) 是正例,其標籤是1,其他兩個是負例,標籤是0。判別器輸出的是用戶和物品相關的概率,通過以下公式計算:
D ( u ∣ I n ) = σ ( d ϕ ( u , I n ) ) = exp ( d ϕ ( u , I n ) ) 1 + exp ( d ϕ ( u , I n ) )
D\left(\mathbf{u} | I_{n}\right)=\sigma\left(d_{\phi}\left(\mathbf{u}, I_{n}\right)\right)=\frac{\exp \left(d_{\phi}\left(\mathbf{u}, I_{n}\right)\right)}{1+\exp \left(d_{\phi}\left(\mathbf{u}, I_{n}\right)\right)}
D ( u ∣ I n ) = σ ( d ϕ ( u , I n ) ) = 1 + exp ( d ϕ ( u , I n ) ) exp ( d ϕ ( u , I n ) )
其中 ϕ \phi ϕ 是判別器的參數。
在訓練時通過最大化目標函數來得到最優的判別器:
ϕ ∗ = arg max ϕ ∑ n = 1 N ( E u + ∼ p true ( u + ∣ I n ) [ log ( σ ( d ϕ ( u + , I n ) ) ) ] + E u c ∼ p θ ∗ ( u c ∣ I n ) [ log ( 1 − σ ( d ϕ ( u c , I n ) ) ) ] + E u − ∼ p f a l s e ( u − ∣ I n ) [ log ( 1 − σ ( d ϕ ( u − , I n ) ) ) ] )
\begin{aligned}
\phi^{*}=\underset{\phi}{\arg\max} & \sum_{n=1}^{N}\left(\mathbb{E}_{\mathbf{u}^{+} \sim p_{\text {true}}\left(\mathbf{u}^{+} | I_{n}\right)}\left[\log \left(\sigma\left(d_{\phi}\left(\mathbf{u}^{+}, I_{n}\right)\right)\right)\right]\right.\\
&\left.+\mathbb{E}_{\mathbf{u}^{c} \sim p_{\theta^{*}}\left(\mathbf{u}^{c} | I_{n}\right)}
[\log \left(1-\sigma\left(d_{\phi}\left(\mathbf{u}^{c}, I_{n}\right)\right)\right)\right]\\
&\left.
+\mathbb{E}_{\mathbf{u}^{-} \sim p_{f a l s e}\left(\mathbf{u}^{-} | I_{n}\right)}
\left
[\log \left(1-\sigma\left(d_{\phi}\left(\mathbf{u}^{-}, I_{n}\right)\right)\right)\right]\right)
\end{aligned}
ϕ ∗ = ϕ arg max n = 1 ∑ N ( E u + ∼ p true ( u + ∣ I n ) [ log ( σ ( d ϕ ( u + , I n ) ) ) ] + E u c ∼ p θ ∗ ( u c ∣ I n ) [ log ( 1 − σ ( d ϕ ( u c , I n ) ) ) ] + E u − ∼ p f a l s e ( u − ∣ I n ) [ log ( 1 − σ ( d ϕ ( u − , I n ) ) ) ] )
3. 推薦生成
生成器生成了可能喜歡當前物品的用戶之後,就可以把當前的新物品推薦給與生成的用戶最相似的幾個用戶了。文章中用餘弦相似度計算的生成的用戶和用戶集中用戶之間的相似度。
五、實驗
實驗部分主要解答了三個問題:
LARA 的推薦效果是否比物品冷啓動的 baseline 要好
屬性級用戶表示是否有助於提高推薦性能
去除 ( u − , I c ) (u^-,I^c) ( u − , I c ) 對是否影響最終結果
實驗中使用了兩個真實的數據集:MovieLens 數據集和 Inzone 數據集,對於每個數據集,按照8:2的比例劃分成訓練集和測試集。上表是兩個數據集的情況。
我們採用精度(P@K)、平均精度(M@K)和歸一化折損累計增益(NDCG@K)作爲評估指標,其中 K 表示推薦列表的長度,指標 P@K 關注推薦列表中包含的正確用戶數。M@K 和 NDCG@K 用來評價排序的準確性。
爲了回答第一個問題,文章對比了 UserPop,BPR-kNN,LCE,NFM,DNN 幾個 baseline,驗證了利用屬性級用戶表示和利用屬性級項目用戶交互推薦項目的重要性。上表展示了多個模型在兩個數據集上的不同標準下的表現,可以發現文章提出的 LARA 模型在各個標準下都超過了已有的模型。
由於對抗性訓練被廣泛認爲是一種有效但不穩定的技術,我們進一步分析了上述方法的學習趨勢,由上圖可知,Movielens 數據集上大約120個epoches 之後,Inzone 數據集上的80個 epoches 之後,P@10 和 NDCG@10 都收斂了。
本文的另一個貢獻是使用屬性信息來表示用戶。爲了驗證屬性級用戶表示的有效性,我們提出了一種新的基線模型,輸入爲項目屬性信息,輸出爲交互級用戶表示,即用戶表示的維數等於項目數。爲了深入瞭解我們提出的屬性級表示,我們在兩個數據集上展示了這兩種方法的學習曲線,結果如上圖所示。
由上表中也可以看出屬性級的用戶表示比交互級的用戶表示的效果更好。
我們以判別模型中有兩類訓練樣本,即 ( u + , I c ) (u^+,I^c) ( u + , I c ) 和 ( u c , I c ) (u^c,I^c) ( u c , I c ) 的框架爲基線。從上表可以看出,在判別模型的訓練過程中加入負樣本後,我們的模型對兩個數據集的性能有了顯著的提高。其原因在於,通過增加新的對,在給定條件項時,判定者不僅能從生成的用戶中識別出真實用戶,而且還能從錯誤用戶中識別出真實用戶。
六、文章貢獻及不足
1. 貢獻
該模型有三個貢獻:
是第一個通過 GAN 來學習屬性級從物品到用戶映射的網絡
避免了稀疏問題,引進了表示用戶的新方式,判別器的訓練方式新穎
根據顧客的購買記錄建立了一個全新的大數據集,數據集中的每個物品有多個屬性,包括分類、品牌、價格等。
2. 不足
只解決了物品冷啓動的問題,沒解決用戶冷啓動的問題;
下面是github下載的代碼文件中的文件情況:
物品數是2536,其中507個是測試集,2029個是訓練集;用戶數是6040,物品的屬性數是18。
util/ui_matrix.csv 行是用戶,列是物品,每個元素表示用戶是否購買過該物品
util/train_ui_matrix.csv 行是用戶,列是物品,和util/ui_matrix.csv是完全相同的
util/user_attribute.csv 行是用戶,列是物品的屬性,每個元素是整數
util/user_emb.csv 行是用戶,列是物品的屬性,每個元素是根據util/user_attribute.csv歸一化得到的實數
data/test_data.csv 是測試數據
data/train_data.csv 是訓練數據
train_data 第一列是用戶,第二列是物品,第三列是屬性列表
test_attribute.csv 有477行,18列,列是物品屬性,行是什麼未知,每個元素是整數
test_item.cvs 只有一列,每一行是物品編號