當前位置:
首頁 > 知識 > 用神經網路打造專屬於你的豆瓣電影推薦系統

用神經網路打造專屬於你的豆瓣電影推薦系統

本文為 AI 研習社編譯的技術博客,原標題 How to Implement a Recommendation System with Deep Learning and PyTorch。

翻譯 | 楓葉5b81 整理 | 凡江

最近我開始觀看fast.ai講座 ,這是一個關於深度學習及其應用的較好在線課程。在他的一個講座中,作者討論了構建一個基於推薦系統的簡單神經網路,並應用於MovieLens數據集。雖然講座是關於該主題的主要信息來源,但它主要依賴於作者開發的用於運行訓練過程的庫。該庫非常靈活,可提供多個抽象級別。

但是,我想了解更多關於作者代碼下的PyTorch框架的信息。在這篇文章中,我將描述使用PyTorch,Pandas和Scikit-Learn實現和訓練一個簡單的基於協同過濾推薦系統的嵌入式的過程。我們將在不使用上述庫的情況下按照講座中描述的步驟進行操作。

簡述:請使用此鏈接直接導航到本文中討論的PyTorch實現的Jupyter筆記本。

照片來自:Tommy van KesselonUnsplash


協同過濾

每當你訪問線上商店、視頻或音頻流媒體伺服器或其他內容形式的交接平台時,您一定會收到大量的基於您興趣、之前購買記錄及所瀏覽過網頁的推薦信息。協同過濾技術是能夠實現一種基於先前的記錄給出推薦的系統的最直觀的演算法之一。其主要思想是基於「相似」用戶的反應來預測用戶對特定項目的反應,其中「相似性」是使用這些用戶留下的評級或評論計算而來的。

從概念上來說,我們構建一個矩陣(表),其中行代表用戶和列 -代表他們的評級。注意,對於真實數據集,該矩陣將非常稀疏,也就是說,其大多數單元格是空的,因為通常與購買/瀏覽它們的用戶數量相比,我們有更多的項目。之後我們使用訓練演算法來得出用戶評級模式之間的相似性以「填補空白」,來預測缺失的評級。

電影評級的表格表示

例如,讓我們假設我們有一群人對一組電影進行評級,如上圖所示。 請注意,他們中的一些人對所有電影(Alice和Danny)進行了評分,而其他人則沒有(Bob和Carol)。 考慮一個新客戶Eve,他已經看過除Star Track以外的所有電影。 我們如何預測她對這個特定項目的評分? 為此,我們將使用具有相似偏好的鄰居的平均意見。 夏娃喜歡權力的遊戲和泰坦尼克號,但不是指環王和星球大戰的粉絲。 愛麗絲和丹尼的評級模式類似於夏娃的排名。 因此,我們可以假設夏娃應該或多或少對「星際迷航」有正面看法。

在下一節中,我們將看一下具有電影評級的真實數據集,並討論如何準備它以訓練神經網路。


MovieLens數據集

兩個數據幀代表我們要分析的數據集:

(a)每部電影的用戶評分

(b)有關電影的元信息,特別是其標題和類型。

為了訓練模型,我們只需要數據框(a),而第二個我們將僅用於訓練模型解釋。

機器學習演算法是要有數值的數組。從技術上講,只要所有列都是數字的,我們的數據集就符合這些要求。但是,我們不應將用戶和電影ID直接傳遞給演算法,因為它會嘗試推斷不存在的值之間的依賴關係。這些數字彼此無關,僅用於識別目的。

緩解該問題的傳統方法是使用單熱編碼,這意味著用「虛擬」0/1列替換分類列。當只有幾個類別,卻有成千上萬的電影和用戶時,這是一種很好的工作技術。

這時嵌入式發揮作用。我們不是為每個類別分配單獨的列,而是將它們表示為N維空間中的向量。換句話說,我們使用查找那個根據給定用戶或電影ID返回N個數組的矩陣:

embedding= [ [0.25,0.51,0.73,0.49], [0.81,0.11,0.32,0.09], [0.15,0.66,0.82,0.91] ] movie_id =1movie_vector = embedding[movie_id -1]

我們首先用隨機值初始化矩陣,然後在訓練過程中調整它們。例如,如果我們只有五部電影和五個用戶,並選擇N等於四,那麼我們隨機初始化的嵌入矩陣可能如下圖所示。

隨機初始化嵌入向量的表格數據

這個技巧使得我們可以在神經網路中輸入高緯度的分類變數,在下一節中,我們會向你展示,使用PyTorch框架來構建這個模型的方法。


嵌入網路

PyTorch是一個框架,允許構建各種計算圖形(不僅是神經網路)並在GPU上運行它們。 矢量,神經網路和計算圖的概念超出了本文的範圍,但簡而言之,可以將庫視為一組工具來創建高度計算效率和靈活的機器學習模型。 在我們的案例中,我們希望創建一個神經網路,能夠幫助我們推斷用戶之間的相似性,並根據可用數據預測他們的評級。

上圖大體顯示了我們要構建的模型。 一開始,我們放入可以將整數ID轉換為浮點數的嵌入矩陣或查找陣。 接下來,我們構造一些具有輸出值的全連接的層。 最後,我們需要返回預測評級列表。 為此,我們使用sigmoid激活函數層並將其重新縮放到原始值範圍(對於MovieLens數據集,通常為1到5)。 該片段展示了如何使用PyTorch框架編寫一個類,這個類可以創建一個具有嵌入結構、幾個隱藏全連接層和輸出的神經網路。例如,要創建一個包含3個隱藏層的網路,其中包含100,200和300個單元之間的輸出結果,請使用:

net = EmbeddingNet( n_users, n_movies, n_factors=150, hidden=[100, 200, 300], dropouts=[0.25, 0.5]) print(net) EmbeddingNet( (u): Embedding(6040, 150) (m): Embedding(3706, 150) (drop): Dropout(p=0.02) (hidden):Sequential( (): Linear(in_features=300, out_features=100, bias=True) (1): ReLU() (2): Dropout(p=0.25) (3): Linear(in_features=100, out_features=200, bias=True) (4): ReLU() (5): Dropout(p=0.5) (6): Linear(in_features=200, out_features=300, bias=True) (7): ReLU() ) (fc): Linear(in_features=300, out_features=1, bias=True) )

訓練循環

最後,我們「等式」中的最後一個變數是訓練過程。我們選擇均方誤差損失作為我們網路質量的度量標準。誤差越大,我們的評級預測就越不準確。我們還使用學習率餘弦退火技術來匹配fastai庫中現有的默認配置。

獎勵

嵌入可視化當模型經過培訓和驗證後,我們可以提出一個問題:我們如何解釋結果因為神經網路通常被認為是黑箱演算法,如果不應用特定的可視化技術,很難以有意義的方式來解釋它們的權重。

但是,在我們的例子中,我們可以嘗試使用嵌入矩陣來解釋訓練結果。訓練完成後,這些矩陣不再包含隨機值,並且一定程度上反映了我們數據集的特徵。如果我們想嘗試可視化這些嵌入結果檢查是否可能出現任何模式,該怎麼辦?

為此,我們應用主成分分析法來降低維度,並從電影嵌入結構中選取一些樣本。然後畫出用第一個主成分的高正值樣本圖,低值樣本圖如下圖所示。

從上面的可視化中,我們可以猜測「紅色」部分主要反映了電影中的「嚴重程度」。 喜劇,動畫和冒險都有這個部分的負面值,而更多「戲劇性」的電影具有較高的正面值。


結論

學習了幾個小時PyTorch後,我可以強烈建議任何想要構建機器學習模型的人使用這個庫。 如果您已經熟悉Python,那麼這個庫更值得您關注。 它非常直觀且易於擴展,允許您利用Python語言的最佳功能來構建各種複雜程度的模型。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

手把手教你十分鐘搞定人物檢測
如何從數據挖掘比賽中脫穎而出?快來 get 阿里媽媽廣告演算法賽亞軍套路吧!

TAG:AI研習社 |