推薦系統(tǒng)遇上深度學(xué)習(xí)(二十九)--協(xié)同記憶網(wǎng)絡(luò)理論及實(shí)踐

協(xié)同過(guò)濾(collaborative filtering)是推薦系統(tǒng)中經(jīng)典的一類方法。協(xié)同過(guò)濾中比較經(jīng)典的解法有基于鄰域方法、矩陣分解等,這些方法都有各自的優(yōu)點(diǎn)和缺點(diǎn),本文介紹的方法-協(xié)同記憶網(wǎng)絡(luò)(Collaborative Memory Network,簡(jiǎn)稱CMN)融合了不同協(xié)同過(guò)濾方法的優(yōu)點(diǎn)。我們來(lái)一探究竟!

協(xié)同記憶網(wǎng)絡(luò)CMN論文:https://arxiv.org/pdf/1804.10862.pdf

代碼地址:https://github.com/tebesu/CollaborativeMemoryNetwork

1、協(xié)同過(guò)濾介紹

在信息過(guò)載的時(shí)代,推薦系統(tǒng)顯得十分重要。而在推薦系統(tǒng)中,協(xié)同過(guò)濾是一種非常受歡迎且有效的方法。協(xié)同過(guò)濾基于用戶和物品的過(guò)去交互行為,同時(shí)認(rèn)為相似的用戶會(huì)消費(fèi)相似的物品,從而進(jìn)行推薦。

協(xié)同過(guò)濾是一類推薦方法,大體上可以分為三個(gè)分支:

  1. 基于鄰域的方法。這也是我們常說(shuō)的基于物品的協(xié)同過(guò)濾和基于用戶的協(xié)同過(guò)濾方法。我們首先需要計(jì)算用戶之間、物品之間的相似度,隨后基于計(jì)算的相似度進(jìn)行推薦。這種方法的一個(gè)主要缺陷就是只使用了局部的結(jié)構(gòu),而忽略了很多全局的信息,因?yàn)槲覀冎皇褂肒個(gè)相似用戶或者相似物品進(jìn)行相關(guān)的推薦。

  2. 基于隱向量的方法。這一分支中最具代表性的是矩陣分解及后面的各種改進(jìn)方法。通常的做法是將每一個(gè)用戶和物品表示稱一個(gè)n維的向量,通過(guò)用戶矩陣和物品矩陣的相乘,希望能夠盡可能還原評(píng)分矩陣。這種做法雖然考慮了全局的信息,但是忽略了一些比較強(qiáng)的局部聯(lián)系。

  3. 基于混合模型的方法。由于上述兩種方法都有各自的缺陷,因此混合方法開(kāi)始出現(xiàn)。最具代表性的是因子分解機(jī)和SVD++方法。

也就是說(shuō),在使用協(xié)同過(guò)濾這些方法時(shí),我們通常需要關(guān)注兩點(diǎn):
1、需要考慮全局的信息,充分利用整個(gè)評(píng)分矩陣。
2、需要考慮局部的信息,考慮用戶或者物品之間的相似性。相似性高的用戶或者物品給予更高的權(quán)重。

本文將要介紹的協(xié)同記憶網(wǎng)絡(luò),便是充分利用了上述兩方面的信息。協(xié)同過(guò)濾我們已經(jīng)介紹了,那么什么是記憶網(wǎng)絡(luò)呢?我們接下來(lái)進(jìn)行介紹。

2、記憶網(wǎng)絡(luò)Memory Network簡(jiǎn)介

Memory Network是深度學(xué)習(xí)的一個(gè)小分支,從2014年被提出到現(xiàn)在也逐漸發(fā)展出了幾個(gè)成熟的模型。我們這里只介紹其中兩個(gè)比較基礎(chǔ)的模型。一個(gè)是 Basic Memory Network,另一個(gè)是End to End Memory Network。

我們首先要搞清楚的是,為什么要有記憶網(wǎng)絡(luò)?在翻譯、問(wèn)答等領(lǐng)域的任務(wù)中,我們通常使用的是Seq2Seq結(jié)構(gòu),由兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)組成。循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN,LSTM,GRU等)使用hidden states或者Attention機(jī)制作為他們的記憶功能,但是這種方法產(chǎn)生的記憶太小了,無(wú)法精確記錄一段話中所表達(dá)的全部?jī)?nèi)容,也就是在將輸入編碼成dense vectors的時(shí)候丟失了很多信息。因此,在模型中加入一系列的記憶單元,增強(qiáng)模型的記憶能力,便有了Memory Network。

2.1 Basic Memory Network

基本的Memory Network由Facebook在2014年的“Memory Networks”一文中提出。該模型主要由一個(gè)記憶數(shù)組m和I,G,O,R四個(gè)模塊。結(jié)構(gòu)圖如下所示:

簡(jiǎn)單來(lái)說(shuō),就是輸入的文本經(jīng)過(guò)Input模塊編碼成向量,然后將其作為Generalization模塊的輸入,該模塊根據(jù)輸入的向量對(duì)memory進(jìn)行讀寫操作,即對(duì)記憶進(jìn)行更新。然后Output模塊會(huì)根據(jù)Question(也會(huì)進(jìn)過(guò)Input模塊進(jìn)行編碼)對(duì)memory的內(nèi)容進(jìn)行權(quán)重處理,將記憶按照與Question的相關(guān)程度進(jìn)行組合得到輸出向量,最終Response模塊根據(jù)輸出向量編碼生成一個(gè)自然語(yǔ)言的答案出來(lái)。各模塊作用如下:

有關(guān)記憶網(wǎng)絡(luò)的詳細(xì)原理,參考文章:https://zhuanlan.zhihu.com/p/29590286或者原論文:https://arxiv.org/pdf/1410.3916.pdf

2.2 End to End Memory Network

End to End Memory Network是Memory Network的一個(gè)改進(jìn)版本,可以進(jìn)行端對(duì)端的學(xué)習(xí)。原文中介紹的網(wǎng)絡(luò)模型應(yīng)用于QA任務(wù)。單層網(wǎng)絡(luò)的結(jié)構(gòu)如下圖所示:

模型主要的參數(shù)包括A,B,C,W四個(gè)矩陣,其中A,B,C三個(gè)矩陣就是embedding矩陣,主要是將輸入文本和Question編碼成詞向量,W是最終的輸出矩陣。從上圖可以看出,對(duì)于輸入的句子s分別會(huì)使用A和C進(jìn)行編碼得到Input和Output的記憶模塊,Input用來(lái)跟Question編碼得到的向量相乘得到每句話跟q的相關(guān)性,Output則與該相關(guān)性進(jìn)行加權(quán)求和得到輸出向量。然后再加上q并傳入最終的輸出層。

進(jìn)一步,我們可以使用多層的結(jié)構(gòu):

有關(guān)End2End Memory Network的詳細(xì)原理,可以參考文章:https://zhuanlan.zhihu.com/p/29679742和原論文:http://10.3.200.202/cache/11/03/papers.nips.cc/82b8c2ad3e5cde7cad659be2d37c251e/5846-end-to-end-memory-networks.pdf。

當(dāng)然,也可以動(dòng)手實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)結(jié)構(gòu),參考代碼:https://github.com/princewen/tensorflow_practice/tree/master/nlp/Basic-EEMN-Demo

3、協(xié)同記憶網(wǎng)絡(luò)原理

我們的協(xié)同記憶網(wǎng)絡(luò)CMN其實(shí)借鑒了End2End Memory Network的思路,我們先來(lái)看一下完整的網(wǎng)絡(luò)結(jié)構(gòu),隨后一步步進(jìn)行介紹:

這里明確一點(diǎn),我們的任務(wù)是預(yù)測(cè)用戶u對(duì)于物品i的評(píng)分。

3.1 User Embedding

首先,我們會(huì)有兩組用戶的Memory(其實(shí)就是Embedding),分別是M和C,M用于計(jì)算用戶之間關(guān)于某件物品i的相關(guān)性,C用于最終的輸出向量。我們還有一組物品的Memory(其實(shí)就是Embedding),我們稱作E。

對(duì)于預(yù)測(cè)用戶u對(duì)于物品i的評(píng)分。我們首先會(huì)得到歷史上所有跟物品i有反饋的用戶集合,我們稱作N(i)。接下來(lái),我們要計(jì)算目標(biāo)用戶u和N(i)中每個(gè)用戶的相關(guān)性,基于下面的公式:

其中,mu,mv分別是用戶u和用戶v在M中的相關(guān)記憶。ei代表物品i在E中的相關(guān)記憶。

3.2 Neighborhood Attention

對(duì)于上一步計(jì)算出的相關(guān)性,我們需要通過(guò)一個(gè)softmax操作轉(zhuǎn)換為和為1的權(quán)重向量:

同時(shí),根據(jù)得到的權(quán)重向量,我們根據(jù)下面的式子得到輸出向量:

其中,cv代表用戶v在C中的相關(guān)記憶。

3.3 Output Module

最終的預(yù)測(cè)輸出為:

可以看到,在上面的式子中,括號(hào)中的第一項(xiàng)是用戶的記憶mu和物品的記憶ei進(jìn)行的element-wise 相乘操作,這相當(dāng)于矩陣分解的思想,即考慮了全局的信息。第二項(xiàng)相當(dāng)于是按照基于鄰域的思路得到的一個(gè)輸出向量,即考慮了局部的相關(guān)用戶的信息。最終經(jīng)過(guò)激活函數(shù)φ和輸出層得到最終的預(yù)測(cè)評(píng)分。因此,CMN不僅考慮了全局的結(jié)構(gòu)信息,還考慮了局部的相關(guān)用戶的信息。

3.4 Multiple Hops

CMN模型可以擴(kuò)展為多層。在每一層,我們的記憶是不變的,變化的主要是權(quán)重向量。每一層的權(quán)重向量計(jì)算公式如下:

這里冒出了一個(gè)zhui,初始的z為:

那么這就跟我們單層的CMN網(wǎng)絡(luò)中的計(jì)算方式是一樣的,因?yàn)閮?nèi)積的計(jì)算是符合乘法分配律的。

接下來(lái)每一層的z,計(jì)算公式如下:

3.5 Parameter Estimation

論文中CMN網(wǎng)絡(luò)采取的是一個(gè)pair-wise的方式,訓(xùn)練時(shí)每次輸入一個(gè)正樣本得到一個(gè)評(píng)分,輸入一個(gè)負(fù)樣本得到一個(gè)評(píng)分,我們希望正樣本的得分遠(yuǎn)大于負(fù)樣本的得分。這種形式我們稱為Bayesian Personalized Ranking (BPR) optimization criterion

好了,模型的原理我們就介紹到這里了,接下來(lái)我們看一下代碼實(shí)現(xiàn)吧。

4、CMN模型的tensorflow實(shí)現(xiàn)

本文的代碼參考地址為:https://github.com/tebesu/CollaborativeMemoryNetwork

代碼文件結(jié)構(gòu)為:

該Demo中的部分神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)由dm-sonnet進(jìn)行了封裝,可以通過(guò) pip install dm-sonnet進(jìn)行安裝,默認(rèn)進(jìn)行安裝的話,tensorflow的版本應(yīng)該至少在1.8以上。

有關(guān)代碼的實(shí)現(xiàn)細(xì)節(jié),本文就不再介紹了,感興趣的話,大家可以看一下這個(gè)Demo。

參考文獻(xiàn)

1、《End-To-End Memory Networks》:http://10.3.200.202/cache/11/03/papers.nips.cc/82b8c2ad3e5cde7cad659be2d37c251e/5846-end-to-end-memory-networks.pdf
2、《MEMORY NETWORKS》:https://arxiv.org/pdf/1410.3916.pdf
3、https://zhuanlan.zhihu.com/c_129532277

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容