與傳統的淺層機器學習相比, 深度學習具有優秀的自動提取抽象特征的能力,並且隨着分布式計算平台的快速發展,大數據的處理能力得到極大的提升,使得近年來DL在工程界得到廣泛的應用,包括圖像識別,語音識別,自然語言處理等領域,並取得比傳統機器學習更好的效果提升。另一方面,智能推薦系統,本質上是從一堆看似雜亂無章的原始流水數據中,抽象出用戶的興趣因子,挖掘出用戶的偏好,因此把深度學習與推薦系統相結合成為近年來DL發展的一個新熱點,事實上,Spotify,Netflix,Facebook,Google等公司早已經對如何把深度學習應用到推薦系統中有了很多深入研究,並在實際應用中取得了很好的效果提升 [1]。
本文是深度學習在推薦系統實踐應用系列文章的第一篇,詳細介紹了如何把受限玻爾茲曼機(Restricted Boltzmann Machine, 下面統一簡稱RBM)應用到我們當前線上的推薦系統中,包括RBM的原理,在推薦系統的應用及其並行化實現的細節,后面兩篇會詳細介紹另外兩個我們目前正在研究使用的深度神經網絡,分別是遞歸神經網絡(Recurrent Neural Network, RNN)和卷積神經網絡(Convolutional Neural Network, CNN),詳細介紹它們的原理,如何與智能推薦相結合以及線上的模型效果。
之所以把RBM作為第一篇進行講解,一方面是因為它的結構相對比較簡單,是一個只有可視層和隱藏層兩層結構的網絡;另一方面,從嚴格意義上說,RBM並不屬於深層神經網絡,它只是一個兩層結構,並不“深”,但它同時也是構成其他深度神經網絡的常用層次組件,因此,理解如何把RBM應用到推薦系統上,將有助於理解后面幾個更復雜的深度學習算法的應用。
一:受限玻爾茲曼機與推薦系統
1.1 RBM網絡結構定義
我們首先給出RBM的網絡結構定義,RBM是由可視層和隱藏層相互連接的一個完全二分圖網絡結構,如下圖所示,每一個神經元是一個二值單元,也就是每一個神經元的取值只能等於0或1:
RBM的網絡結構具有這樣的特點: 可視層的每一個神經元與隱藏層的每一個神經元相互連接;可視層神經元之間,隱藏層神經元之間沒有連線,這為我們后面的訓練提供了一個很好的假設性條件:同一層的各神經元之間是相互獨立的。對上面的網絡結構,我們首先來定義下面的參數:
1.2 RBM與協同過濾
上一小節我們對RBM的結構定義進行了簡要的闡述,那么怎么把該模型應用到推薦系統中呢?RBM本質上是一個編碼解碼器,具體來說,通過RBM,我們可以把原始輸入數據從可視層映射到隱藏層,得到原始輸入數據的隱因子(latent factor)向量表示,這一過程也稱為編碼過程,然后利用得到的隱藏層向量重新映射回可視層,得到新的可視層數據,這個過程稱為解碼過程,我們的目標是讓解碼后的結果能和原始數據盡量接近,這樣,在解碼的過程中,我們不但能得到已評分物品的新的評分數據,還能對未評分的物品的得分進行預測,這些未評分物品的分數從高到低的排序形成推薦列表。
從上面的分析可以看出,我們將RBM應用到推薦中去要解決下面的兩個問題:
1. 如何用可視層來表示用戶的聽歌流水數據?
2. 如何處理missing數據?
正如上一段我們提到,用戶的原始輸入數據只對部分極少數的歌曲有評分,對沒有評分的歌曲對應的神經元,也就是上圖中的missing神經元,在訓練權重時我們並不考慮這部分數據,每一個用戶的數據將構成一個獨立的RBM子模型,每一個用戶的子模型只對其中關聯到的權重值調整做出貢獻,同理,每一個權重值的參數更新只由與該權重值相關聯的用戶數據來決定。
下面我們來看看修正的RBM模型對數據編碼和解碼的過程:
編碼過程:利用原始數據,我們求取隱藏層的隱向量表示,這個過程是由條件概率公式求得:
下圖是編碼過程的動態圖展示:
二:模型最優化 - 對比散度(contrastive divergence)
通過第一部分的敘述,我們已經知道了RBM的網絡結構以及如何與推薦系統相結合,那么現在我們的問題就是如何訓練模型,對於RBM來說,就是要訓練出三個權重參數: 連接可視層與隱藏層的權重W,可視層結點的偏移量visbias,隱藏層結點的偏移量hidbias。
對於機器學習模型來說,我們首先要確定我們的目標訓練函數是什么,對於RBM模型,它本質上是一個編碼解碼的過程,因此我們很自然的想法是:期望經過RBM編碼和解碼后的數據與原始的輸入數據盡量接近,這也是最大似然參數估計的思想,即我們的最優化目標函數為:
訓練RBM的最大困難在於負梯度的計算,Hinton教授於2002年提出了對比散度的算法,它有效解決了RBM訓練速度的難題,也是當前RBM的標准訓練算法,對比散度的思想是通過一種合理的采樣方法, 以較少的采樣樣本來近似負梯度的所有組合空間,具體實現過程就是:我們從原始的輸入數據出發,經過編碼解碼后得到新的可視層輸入,這一個過程稱為1步Gibbs采樣,然后利用經過相同的過程,得到,重復這個過程次,最后得到,這個值就是最后負梯度的近似,這個過程被稱為步Gibbs采樣過程,下圖就是步Gibbs采樣過程的動態圖展示:
三:對比散度的並行化實現
當前對RBM的並行化訓練已經有比較成熟的平台,如Theano,Caffe,TensorFlow等,我們在實現的過程沒有采用上面的平台架構,而是采用了spark集群來訓練,對比散度訓練RBM過程本質上是一個梯度下降的最優化過程,下圖是算法在spark的執行流程圖:
根據前面的描述,每一個用戶的數據構成一個RBM子網絡,集群首先是對數據和子模型進行切分,模型和數據在運行的過程中將被分配到不同的executor中執行,得到每一個子模型的正梯度以及k步Gibbs采樣后的負梯度,然后子結果傳送回driver端進行合並,一般來說為了防止全部數據返回造成driver端的網絡通訊壓力以及內存壓力,我們可以采用樹聚合的方式來優化,下圖是樹深度為2和樹深度為4的效果圖,注意不同線條的顏色代表數據在不同的單元中傳輸,從圖中可以看出,深度越大,計算的步驟會變長,但每一次傳輸到driver的數據會減少,可以防止driver端內存溢出的問題。
四:線上模型融合
經過前面三節的分析,我們已經對RBM如何作用於推薦系統,RBM模型的訓練等都有了比較深入的了解,最后我們需要利用訓練好的模型來生成推薦數據並與其他算法模型進行融合,對推薦結果數據的計算,是利用已經訓練完的權重參數,對輸入數據進行一次編解碼的過程,解碼后的新數據,不但能重新生成已經操作過的數據的得分,還能對未操作過的數據預測得分,也就是1.2節的missing數據,這些missing數據的得分幫助我們對推薦數據進行排序。
要實現這個過程,我們有下面兩種做法:一是直接離線批量生成所有用戶的數據,但這種做法的計算量非常巨大;二是把訓練好的權重單獨保存,推薦數據的生成放到在線層實時計算,如下圖所示:
在應用中,我們采用的是第二種方法,這種做法相比第一種方法的好處有兩個:一是結果不依賴於離線任務,防止了離線任務的失敗對線上數據的影響;二是線上實時計算的結果數據能夠與現有的算法模型數據的融合更加靈活,包括后續數據處理的規則過濾,重排序等。
五:小結
本文詳細分析了RBM在推薦系統中的應用,從文中分析可以看出,RBM對推薦系統的提升主要得益於它具有自動提取抽象特征的能力,這也是深度學習作用於推薦系統的基礎。后面的文章中,將繼續分析RNN和CNN如何在提取抽象特征的基礎上,進一步提升推薦系統的性能。