您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么使用TensorFlow和Keras”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么使用TensorFlow和Keras”吧!
為了進行分析,我們將使用著名的數據集MovieLens 20M。
這個數據集包含了來自電影推薦服務MovieLens的2000多萬個評分。下面是dataframe的示例:
該數據集列出了138000個用戶和27000多部電影。經過清洗和過濾(我們只接受正面評價),我們有:
13.6萬用戶
2萬部電影
1000萬次互動
99.64%稀疏度
我們還可以從下面的直方圖中看到,大多數電影的收視率都在5000以下…
而且大多數用戶評價不超過500部電影。
這與大多數推薦系統問題是一致的:很少有用戶對很多電影進行評分,很少有電影有很多評分。
我們可以根據這些數據建立一個點擊矩陣。點擊矩陣的格式如下所示。如果用戶u與項i交互,則行u和列i上的單元格包含1,否則包含0。
我們還將點擊向量x?定義為點擊矩陣的第u行向量。
為了評估模型的質量,我們將數據集分成3個子集,一個子集用于訓練,一個子集用于驗證,一個子集用于測試。我們將使用第一個子集訓練模型,第二個子集在訓練期間選擇最佳模型,最后一個子集獲得度量。
如前所述,我們將使用兩個指標來評估我們的模型。第一個將是NDCG,它衡量質量和我們的推薦項目的順序。我們首先需要定義DCG。DCG越高越好。DCG@p定義為:
I是指示函數,elem_i代表推薦列表的第i個元素。為了說明這個抽象公式,這里有一個簡短的例子:
需要建議:{A,B,C}
建議1:[C、A、D]-DCG@3=1.63
建議2:[D、B、A]-DCG@3=1.13
注意,這些建議是有順序的。因此,我們有:DCG? > DCG?,因為預測1中的前兩個項目是我們的目標項目,而這些項目位于預測2的列表末尾。
NDCG是DCG的近親,將分數投影在0到1之間,以便它們在模型之間轉換。
Personalization=計算每對推薦之間的距離,然后計算平均值。為了比較不同的個性化指數,我們將其標準化(就像我們對NDCG所做的那樣,我們將分數投影在0到1之間)。為了說明這個指標,讓我們看看下面的示例:
建議1:
用戶1:[A,B,C]/用戶2:[D,E,F] 個性化=1
建議2:
用戶1:[A,B,C]/用戶2:[A,B,C] 個性化=0
推薦系統可以分為兩類:協同過濾和基于內容的過濾。
協同過濾是基于用戶相似度的RS子族。它通過分析與用戶u關系密切的其他用戶的口味來預測用戶u的興趣。它基于關系密切的用戶喜歡的東西是類似的。
基于內容的過濾是基于用戶偏好和內容相似性的另一類RS,這意味著它基于這樣一種想法:如果你喜歡item i,那么你更可能喜歡類似于i的項,而不是不同于它的項。
如上所述,基于內容的方法使用項目描述來查找與用戶看到的最接近的項目。我盡可能詳盡地實現了這個方法,但是一個幾乎沒有特征的數據集是這個方法的一個限制。MovieLens數據集只提供電影的類型。
但是,我們開發了一個簡單的方法,如下面的偽代碼所述:
reco = zero-vector of size number of items for i in items of user u: for j in the k closest items to i: reco[j] = max(reco[j]https://my.oschina.net/u/4253699/blog/,1 - dist(ihttps://my.oschina.net/u/4253699/blog/,j)) output recommendation reco
對于dist(i,j),使用類型向量之間的余弦距離。
NDCG@100: 0.011
Personalization: 0.958
NDCG非常低,這是因為每個樣本的特征數量非常有限。
無冷啟動:推薦系統(RS)中經常出現的問題之一是冷啟動。當添加新項目或用戶時,會出現此問題。由于沒有可供推斷的先前活動,推薦系統給的推薦就會有點生硬。在我們的場景中,一個項目的交互次數并不影響它最終被推薦的可能性,這意味著當涉及到新項目時,我們不存在冷啟動問題。
實現簡單:如上圖所示,使用幾行偽代碼,算法相當簡單。
查詢時間是O(#items×#features),#代表個數,我們必須小心數據的大小。在不進行預處理的情況下,每次要求系統向用戶推薦新內容時,它都必須找到與用戶交互的每個項目最接近的k個項目。因為有項目可以比較,而每一個距離都需要計算特征來衡量,所以整個過程都需要O(#items × #features)。通過預處理,我們可以終止這個查詢時間,但是我們需要在每個項中存儲k個最近的項,這意味著在內存中存儲k × #items 個項目。
僅當項目具有足夠的特征時才有效:如結果所示,如果項目沒有足夠的特征,則此操作不起作用。例如如果有電影情節的描述,我們會有更好的結果。
基于記憶的推薦是一種計算用戶和項目之間相似度的簡單方法。與基于模型的方法不同,基于記憶的推薦沒有要優化的參數。這是一個非常簡單的算法,可以概括為以下幾行偽代碼:
輸入用戶u: 使用dist函數查找與u最接近的k個用戶 在一個新向量v_u中聚集k個最近接近用戶的向量 輸出建議v_u
在我們的例子中,我們用以下方法實現了算法:
對于距離函數,我們使用了漢明距離:
我們使用的聚合函數為:
NDCG@100: 0.173
Personalization: 0.715
實現簡單:如上所示,使用少量偽代碼,算法相當簡單,易于實現。
可解釋性:這是一些算法的一個重要特性。這允許向用戶解釋為什么向他們推薦特定內容。這可以是:“我們推薦你看電影A是因為你看了電影B”。
復雜度:這種方法的主要問題是它會使獲得可縮放的對象變得更加困難。我們在這方面最好的朋友是本地敏感哈希(LSH)和最近鄰搜索算法。
查詢時間是O(#users×#items):沒有預處理的查詢時間對每個用戶來說都很高,因為你需要以O(#items)的成本計算用戶距離,以獲得到所有其他用戶的距離。然后我們需要找到k個最接近的用戶,即O(#items)。通過預處理,我們可以結束這個查詢時間,但是我們需要存儲離每個用戶最近的k個用戶,這意味著k × #users個用戶在內存中。
非負矩陣分解(Non-negative matrix factorization,NMF)是Netflix競賽期間出現的一種著名的推薦系統算法。
NMF的思想是將點擊矩陣分解為兩個低維矩形矩陣,一個用于用戶,一個用于項目,嵌入到可計算維度的向量中(我們稱之為潛在空間)。將這兩個矩陣相乘,得到一個新的矩陣,其值接近它們存在的原始點擊矩陣,所有的空白都用(希望)好的預測填補。
NDCG@100: 0.315
Personalization: 0.800
實現簡單:一些庫,如Surprise或sklearn可以實現矩陣分解!
潛在的可解釋性:使用一些聚類和對它們的一些分析(找到共同的演員、流派等);從技術上來說,獲得可解釋的結果是可能的。
查詢時間快:為了得到用戶的推薦,我們只需要乘以一個向量和一個矩陣。
線性模型:矩陣分解的一個主要限制是它是一個線性模型,因此它不能捕獲數據中更復雜的關系。盡管它是線性的,但我們看到它在NDCG方面給出了很好的結果。
神經矩陣因式分解(NeuMF)是一種嘗試推廣上述經典NMF的新方法。它是在本文中開發的。該模型采用兩個整數(兩個索引)作為表示項i和用戶u的輸入,并輸出一個介于0和1之間的數字。輸出表示用戶u對項目i感興趣的概率。
該神經網絡的結構可以分為兩部分:矩陣分解部分和全連接部分。然后連接起來傳遞到Sigmoid層。
NDCG@100: 0.173
Personalization: 0.017
下面,盡管我試圖用許多不同的參數來正則化,但過擬合是不可避免的。
神經網絡(非線性模型):NeuMF的主要優點之一是它是一個非線性模型,因此它可以捕獲數據中更復雜的模式。然而,我們可以看到我們的NDCG比常規NMF要低。
對大數據集的過擬合:在最初的論文中,NeuMF改進了NMF模型,但它適用于較小的數據集。我們可以推斷,對于較大的數據集,這種方法往往會過擬合。
查詢時間是O(#items):此方法的問題之一是,對于給定的用戶,我們需要解析所有項目。當項目數量增加時,這可能會成為一個可伸縮性問題。
受限玻爾茲曼機(RBM)是一種生成隨機神經網絡,具有非常簡單的結構(一個輸入層和一個隱藏層),可以用來學習輸入上的概率分布,在我們的例子中是點擊向量。
NDCG@100: 0.155
Personalization: 0.959
下圖是驗證集上隨著epochs增加的NDCG@100
神經網絡(非線性模型):由于RBM是一個神經網絡,它是一個非線性模型,所以它可以捕捉數據中更復雜的模式。
潛在的可解釋性:RBM從隱藏層表示的數據中學習復雜的特性。通過做一些分析(例如演員),有可能在技術上可以解釋結果。
長期訓練:這個模型的訓練圍繞著一種叫做吉布斯抽樣的方法。這種方法意味著大量的采樣,這是計算密集型的。
深度協同是一個直截了當的協同模型,旨在為用戶預測最有用的項目。輸入是用戶的點擊向量,原始輸出是我們的建議。為了訓練這個模型,我使用了用戶點擊向量的70%作為輸入,剩下的作為輸出。
架構很簡單。有一個相同大小的輸入和輸出(#items),以及多個相同大小的隱藏層(1000個神經元)。
NDCG@100: 0.353
Personalization: 0.087
下面,和往常一樣(驗證集上隨著epochs增加的NDCG@100):
神經網絡(非線性模型):深度協同是一個非線性模型,因此它可以捕獲數據中更復雜的模式。
查詢時間快:該模型的主要優點是,在一次正向傳遞中,我們可以獲得對給定用戶的推薦,從而縮短查詢時間。我們可以看到,模型的參數數量隨著項目數量的增加而增加,但即使如此,它仍然比NeuMF快。
沒有可解釋性:這種深度神經網絡使得無法解釋結果。
自動編碼器(AE)最初用于學習數據的表示(編碼)。它們被分解為兩部分:
編碼器,它減少了數據的維度大小;
解碼器,它將編碼轉換回其原始形式。由于存在降維,神經網絡需要學習輸入(潛在空間)的低維表示,以便能夠重構輸入。
在RS環境中,它們可以用來預測新的推薦。為了做到這一點,輸入和輸出都是點擊向量(通常AE的輸入和輸出是相同的),我們將在輸入層之后使用dropout。這意味著模型將不得不重構點擊向量,因為輸入中的某個元素將會丟失,因此要學會預測給定的點擊向量的推薦值。
NDCG@100: 0.382
Personalization: 0.154
下面慣例(驗證集上隨著epochs增加的NDCG@100)。盡管我們試圖用很多不同的參數來調整,但它很快就過擬合了。
神經網絡(非線性模型):該模型是一個非線性模型,這意味著它可以捕獲數據中更復雜的模式。
查詢時間快:一次向前傳遞就足以獲得給定用戶的推薦。這意味著查詢時間很快。
無可解釋性:這種深度神經網絡使得無法解釋結果。
變分自編碼器(VAE)是AE的擴展。它將有一個采樣層,而不是簡單的全連接層。這一層將使用從編碼器的最后一層的均值和方差得到一個高斯樣本,并使用它作為輸入的解碼器。跟AE一樣,我們在第一層使用dropout。
NDCG@100: 0.403
Personalization: 0.117
下面,和往常一樣(驗證集上隨著epochs增加的NDCG@100):
神經網絡(非線性模型):VAE是一個非線性模型,因此它可以捕獲數據中更復雜的模式。
查詢時間快:一次向前傳遞就足以獲得給定用戶的推薦。因此查詢時間很快。
更復雜的實現:采樣層使得用反向傳播計算梯度下降變得困難。重新參數化技巧使得利用方程z=ε×σ+μ,ε~N(0https://my.oschina.net/u/4253699/blog/,1)來解決這個問題成為可能。我們現在可以安全地計算梯度了。
不可解釋:這種深度神經網絡使得解釋結果不可行。
混合模型提供了兩個世界中最好的(基于記憶和基于模型的方法),因此在RS中非常流行。
為了實現混合方法,我選擇使用VAE,然后將其結果與基于記憶的結果進行平均。
NDCG@100: 0.334
Personalization: 0.561
它的一部分是NN:作為VAE方法的一部分,它可以捕獲數據中更復雜的模式。
可解釋性:作為基于記憶的方法的一部分,我們得到了一個有趣的屬性,我們可以向用戶解釋為什么我們推薦他們一個特定的項目。
查詢時間是O(#users × #items):計算時間的瓶頸是基于記憶的部分。如上所示,它的查詢時間是O(#users×#items),無需預處理。
我們現在可以比較我們所有的模型。NDCG@100最好的模型看是VAE。對于個性化索引,它是RBM。
感謝各位的閱讀,以上就是“怎么使用TensorFlow和Keras”的內容了,經過本文的學習后,相信大家對怎么使用TensorFlow和Keras這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。