胡益龍
摘 要:本系統(tǒng)是一個(gè)功能較為完備的資源分享平臺(tái),實(shí)現(xiàn)了資源分享、資源搜索、資源推薦等功能。其中網(wǎng)站的主體通過經(jīng)典的JavaEE框架構(gòu)建,通過Lucene技術(shù)與Solr技術(shù)提供資源搜索服務(wù),并且實(shí)現(xiàn)了以機(jī)器學(xué)習(xí)ALS算法為核心的資源推薦系統(tǒng),使得用戶可以更為方便地找到想要的資源。
關(guān)鍵詞:資源分享;全文檢索;智能推薦
文章編號(hào):2095-2163(2019)04-0216-05 中圖分類號(hào):TP311.13 文獻(xiàn)標(biāo)志碼:A
0 引 言
信息過載已經(jīng)成為當(dāng)前互聯(lián)網(wǎng)迅猛發(fā)展中不容忽視的一個(gè)重要問題,由此則導(dǎo)致用戶想要精準(zhǔn)獲取資源就顯得尤為困難。在此背景下,本系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了搜索與推薦兩種資源相關(guān)的服務(wù)。在算法方面,常見的推薦算法主要有基于內(nèi)容的推薦與基于協(xié)同過濾的推薦。而對(duì)于協(xié)同過濾推薦算法,又可將其分為3種,即:基于用戶的協(xié)同過濾、基于物品的協(xié)同過濾、基于模型的協(xié)同過濾。其中,協(xié)同過濾的推薦算法無需考慮物品與用戶標(biāo)簽和屬性就能夠做出推薦,但是在大數(shù)據(jù)量的情況下基于用戶與物品的協(xié)同過濾算法將會(huì)面臨稀疏矩陣與計(jì)算復(fù)雜的問題。綜合上述分析后可知,本次研發(fā)系統(tǒng)將使用基于模型的推薦算法ALS,為了實(shí)現(xiàn)分布式計(jì)算采用了大數(shù)據(jù)lambda架構(gòu)作為整個(gè)推薦系統(tǒng)基礎(chǔ)架構(gòu)。這里,研究中用到的計(jì)算框架為Spark,通過將離線計(jì)算、實(shí)時(shí)計(jì)算、機(jī)器學(xué)習(xí)三者融為一體,可以在搜索與推薦的雙重服務(wù)下使用戶能夠更加快速地找到自己想要的資源。
1 推薦系統(tǒng)算法研究
1.1 特征向量與線性相似度
本系統(tǒng)推薦算法使用交叉線性回歸(ALS)與余弦聚類。ALS主要是基于評(píng)分矩陣(同現(xiàn)矩陣)來實(shí)現(xiàn)推薦,而評(píng)分矩陣的計(jì)算在底層則依賴于2個(gè)向量的線性相似度的計(jì)算。在該模型中,假設(shè)每一個(gè)用戶都對(duì)應(yīng)著一個(gè)特征向量,每一個(gè)資源對(duì)應(yīng)著一個(gè)特征向量。模型通過計(jì)算資源的特征向量與用戶特征向量的相似度來估算某一個(gè)用戶對(duì)某一個(gè)資源的好感度。好感度將直接體現(xiàn)在用戶對(duì)某一個(gè)資源的評(píng)分上,好感度越高,評(píng)分就越高。機(jī)器學(xué)習(xí)中,有很多方法可用來估算2個(gè)向量的相似度,本模型假設(shè)用戶向量與資源向量的相似度為用戶的特征向量U和資源的特征項(xiàng)向量R的線性相似性。也就是評(píng)分Pscore≈UR+λ?;谶@一假設(shè),只要有一個(gè)用戶的特征向量與一個(gè)資源的特征向量就能夠預(yù)測(cè)該用戶對(duì)此資源的評(píng)分,進(jìn)而做出推薦。
1.2 損失函數(shù)的定義
本次研究模型的最終目標(biāo)就是使模型的預(yù)測(cè)與用戶真實(shí)的評(píng)分相近。對(duì)于公式Pscore≈UR+λ,令Pscore為預(yù)測(cè)分?jǐn)?shù),Tscore為真正的評(píng)分。模型希望|Pscore - Tscore|≈ 0,但是絕對(duì)值函數(shù)是一個(gè)不平滑的函數(shù),在進(jìn)行模型優(yōu)化時(shí)不易計(jì)算,同時(shí)也不利于L2的正則化。通常選擇平方錯(cuò)誤函數(shù)(Pscore - Tscore)2 ≈ 0來作為損失函數(shù)。
1.3 模型降維與矩陣分解
遵循上述原理,模型可以根據(jù)已有的數(shù)據(jù)來計(jì)算出用戶的特征向量與資源的特征向量。在原始的模型中,用戶特征向量的維度為資源的個(gè)數(shù),資源的特征向量的維度為用戶的個(gè)數(shù)。研究中,n個(gè)用戶m個(gè)資源就會(huì)構(gòu)成一個(gè)n行m列的矩陣,這樣就可以同時(shí)計(jì)算出n個(gè)用戶與m個(gè)資源的特征向量。其中,每一行是一個(gè)用戶對(duì)各個(gè)資源的評(píng)分,每一列是多個(gè)用戶對(duì)一個(gè)資源的評(píng)分。當(dāng)數(shù)據(jù)量十分龐大時(shí),用戶與資源向量的維度都會(huì)變得很大,整個(gè)模型的自由度會(huì)升至很高。VC維度證明了高復(fù)雜度的模型會(huì)形成一種系統(tǒng)性的噪音,會(huì)干擾模型的實(shí)際準(zhǔn)確度,如此即會(huì)出現(xiàn)過擬合的現(xiàn)象。過擬合的含義就是:在訓(xùn)練集上模型表現(xiàn)得很好,但是在實(shí)際的測(cè)試集上會(huì)出現(xiàn)很大的誤差。
為了降低模型復(fù)雜度、減小過擬合的風(fēng)險(xiǎn),模型采用了矩陣分解的方式降低了用戶與資源的維度。具體來說,將n個(gè)用戶m個(gè)資源所構(gòu)成的n行m列的矩陣分解為n*d的矩陣與d*m的矩陣的乘積,矩陣分解示例則如圖1所示。其中,d為用戶可以手動(dòng)調(diào)節(jié)的參數(shù),減少d的數(shù)值就可以降低模型的維度,從而削弱了過擬合對(duì)模型的干擾。這樣一來,模型通過降維就可獲得主要的隱含因子,忽略掉次要的特征。實(shí)際上,原始的n行m列的矩陣是一個(gè)稀疏矩陣,通過矩陣分解的降維處理可以將模型計(jì)算的復(fù)雜度從O(nm)降到了O((m + n) * d)。
1.4 模型訓(xùn)練
經(jīng)過損失函數(shù)的定義與矩陣分解的降維處理,下面擬進(jìn)行模型的訓(xùn)練研究。ALS損失函數(shù)的計(jì)算公式可表示為:
其中,m表示資源的個(gè)數(shù);n表示用戶的個(gè)數(shù);W與V分別表示模型訓(xùn)練后的資源權(quán)重的向量與用戶權(quán)重的向量。
對(duì)于一組數(shù)據(jù)來說,模型在n號(hào)用戶對(duì)m號(hào)資源的預(yù)測(cè)值與真實(shí)值的差值平方就是模型在一個(gè)資源向量上的損失,對(duì)于所有單一資源的誤差的和就是模型的整體損失。ALS的目標(biāo)就是要根據(jù)已知的數(shù)據(jù)找到損失函數(shù)值最小的誤差。為了減少運(yùn)算量,一般采用隨機(jī)梯度下降法(SGD)去優(yōu)化模型。
分析可知,在公式(1)中有2個(gè)需要優(yōu)化的變量W與V,首先讓其中一個(gè)變量的值固定,這可以得到一個(gè)變量的公式,此時(shí)就能直接采用單個(gè)變量的梯度下降法計(jì)算出誤差的最小值,進(jìn)而計(jì)算出另一個(gè)向量的值。在此基礎(chǔ)上,再固定剛剛計(jì)算好的向量使用線性回歸計(jì)算出另一方的特征向量。如此這般輪流地進(jìn)行線性回歸計(jì)算,最終模型就可輸出所有用戶與資源的特征向量??梢酝ㄟ^用戶的特征向量與每個(gè)資源進(jìn)行線性組合,得到預(yù)測(cè)的分?jǐn)?shù),選擇評(píng)分最高的k個(gè)資源推薦給該用戶。
1.5 模型校驗(yàn)
在模型訓(xùn)練時(shí),通常會(huì)設(shè)置多組參數(shù),不同參數(shù)組合下的模型會(huì)有不同的準(zhǔn)確度。通過對(duì)參數(shù)組合的優(yōu)化選擇,就可以得到準(zhǔn)確率更高的模型。本系統(tǒng)中涉及到的參數(shù)有:模型維度、正則化參數(shù)、迭代次數(shù)。考慮到若對(duì)模型進(jìn)行校驗(yàn)就需要準(zhǔn)備校驗(yàn)數(shù)據(jù)集來評(píng)判在特定參數(shù)組合下模型的準(zhǔn)確度,所以在劃分訓(xùn)練集時(shí)通常會(huì)再細(xì)分為訓(xùn)練集與校驗(yàn)集。同時(shí),為了達(dá)到訓(xùn)練集與校驗(yàn)集的獨(dú)立同分布,則多會(huì)選用隨機(jī)分割。至此,為了充分利用數(shù)據(jù)集、以及減少訓(xùn)練迭代次數(shù),本系統(tǒng)直接使用了交叉驗(yàn)證(Cross Validation)作為模型校驗(yàn)的方法。事實(shí)上,本系統(tǒng)共將訓(xùn)練集隨機(jī)平均分為10部分,每一輪訓(xùn)練時(shí)都將其中的9份作為實(shí)際的訓(xùn)練集,剩下的1份作為校驗(yàn)集,經(jīng)過對(duì)校驗(yàn)集的更替,最后選出最優(yōu)的參數(shù)組合。交叉驗(yàn)證示例如圖2所示。
1.6 余弦相似度計(jì)算
在實(shí)時(shí)推薦時(shí),本系統(tǒng)將著重研究資源之間相似度的計(jì)算。在計(jì)算資源之間的相似度時(shí)用到了余弦聚類,使用向量空間中2個(gè)向量夾角的余弦值衡量2個(gè)個(gè)體間差異的大小。如果2個(gè)向量的余弦相似度越接近1,就說明這2個(gè)向量越相似。反之,越接近0,就越不相似。余弦相似度的數(shù)學(xué)定義可表示為:
1.7 模型的評(píng)估
在成功構(gòu)建這一推薦模型的同時(shí),必須要保證模型的可用性與準(zhǔn)確性,否則整個(gè)模型就幾乎相當(dāng)于在做隨機(jī)猜測(cè)。為簡(jiǎn)單起見,本系統(tǒng)沒有使用AUC作為模型的評(píng)價(jià)方案,而是直接計(jì)算模型的預(yù)測(cè)評(píng)分與實(shí)際標(biāo)簽的均方根誤差RMSE1。均方差越小,就表明模型預(yù)測(cè)得越準(zhǔn)確。此外,還要計(jì)算得出平均評(píng)分值與實(shí)際評(píng)分的RMSE2。當(dāng)RMSE1 -RMSE2為正數(shù)時(shí),就證明模型有正向的預(yù)測(cè)效果。
1.8 推薦系統(tǒng)冷啟動(dòng)問題
當(dāng)面對(duì)一個(gè)全新系統(tǒng)、全新用戶或者全新資源時(shí),由于沒有歷史數(shù)據(jù)的鋪墊可能會(huì)出現(xiàn)推薦算法的冷啟動(dòng)問題。既然推薦算法在此時(shí)的表現(xiàn)欠佳,就決定了需在此處設(shè)置一個(gè)替補(bǔ)的策略,也就是榜單系統(tǒng)。新來的用戶可以從榜單開始尋找自己的喜好,同時(shí)也會(huì)有更新的榜單來避免新的資源的冷啟動(dòng)。
2 系統(tǒng)設(shè)計(jì)
2.1 總體功能模塊設(shè)計(jì)
系統(tǒng)設(shè)計(jì)包括Web端的設(shè)計(jì)和推薦系統(tǒng)的設(shè)計(jì)。與此相對(duì)應(yīng),功能模塊包括用戶登錄、注冊(cè)、創(chuàng)建資源、瀏覽資源、搜索資源、收藏資源、刪除資源、離線榜單、在線榜單、離線推薦、在線推薦等。總體模塊結(jié)構(gòu)如圖3所示。
2.2 推薦系統(tǒng)架構(gòu)的設(shè)計(jì)
推薦系統(tǒng)在功能上可解析為推薦功能與榜單計(jì)算兩部分。而對(duì)數(shù)據(jù)處理而言,又分為離線與實(shí)時(shí)兩大類。文中將對(duì)此展開研究分述如下。
(1)功能設(shè)計(jì)分析。服務(wù)集群由多個(gè)子集群組成,對(duì)其中各主要集群的功能設(shè)計(jì)可做出如下闡釋及論述。
① Hadoop/Hive集群。對(duì)其功能可表述為:一方面為數(shù)據(jù)存儲(chǔ),系統(tǒng)會(huì)將MySQL中的數(shù)據(jù)同步到集群上。另一方面提供資源調(diào)度,系統(tǒng)將會(huì)使用Spark on Yarn的調(diào)度模式,這里的Yarn組件來自于該集群。
② Spark集群。該集群的功能定制為整個(gè)推薦系統(tǒng)的全部計(jì)算。其中,SparkML負(fù)責(zé)推薦算法的執(zhí)行,SparkStreaming負(fù)責(zé)在線數(shù)據(jù)的計(jì)算處理,同時(shí)這兩者都可以使用SparkSQL的API來給出更加便捷的實(shí)現(xiàn)。
③ Zookeeper集群。主要負(fù)責(zé)分布式協(xié)調(diào)工作,并由其配合KafKa集群共同完成分布式消息隊(duì)列的功能。KafKa集群是一個(gè)分布式消息隊(duì)列,可通過Log4j來消費(fèi)發(fā)送自Web服務(wù)器的數(shù)據(jù),分布式地存儲(chǔ)在各個(gè)節(jié)點(diǎn)上,不僅具備高容錯(cuò)、高吞吐的特點(diǎn),而且也促進(jìn)了Web端與數(shù)據(jù)計(jì)算端的有效解耦。系統(tǒng)拓?fù)浣Y(jié)構(gòu)如圖4所示。
(2)數(shù)據(jù)處理分析。整個(gè)數(shù)據(jù)流的處理可以分為離線與在線兩個(gè)部分。其中,離線部分首先將MySQL中的用戶評(píng)分表中的數(shù)據(jù)使用Spark導(dǎo)入Hive中;使用SparkSQL連接Hive讀取數(shù)據(jù),并且處理數(shù)據(jù),計(jì)算離線榜單與推薦矩陣。進(jìn)一步地,推薦矩陣中給每個(gè)用戶提供了10條推薦資源,同時(shí)也計(jì)算出了對(duì)于某一個(gè)資源與其相似的10條資源,為后續(xù)的在線推薦做好準(zhǔn)備;將計(jì)算過的數(shù)據(jù)使用SparkSQL寫入MySQL中,方便在Web端做出展示。在線部分中,用戶點(diǎn)擊Web界面會(huì)產(chǎn)生日志信息;這些日志信息會(huì)被KafKa消費(fèi)到自己的隊(duì)列中;而SparkStreaming則會(huì)消費(fèi)KafKa中的數(shù)據(jù),將數(shù)據(jù)按照一定的時(shí)間間隔進(jìn)行微批處理,在此過程中還會(huì)提取MySQL中的數(shù)據(jù)進(jìn)行連接計(jì)算;將計(jì)算好的數(shù)據(jù)送入MySQL中進(jìn)行Web端的展示。
2.3 算法參數(shù)調(diào)優(yōu)
系統(tǒng)使用Spark提供的ParamMap進(jìn)行參數(shù)設(shè)計(jì),根據(jù)不同的維度設(shè)置不同的參數(shù),這樣模型在訓(xùn)練時(shí)將會(huì)考慮到所有參數(shù)的組合(笛卡爾積),最終得到一個(gè)更好的模型。本系統(tǒng)中設(shè)置的參數(shù)組合見表1。
2.4 系統(tǒng)數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì)
由于本文設(shè)計(jì)的系統(tǒng)選用了關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。研究推得的系統(tǒng)數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)如圖5所示。
3 系統(tǒng)實(shí)現(xiàn)
3.1 資源搜索的實(shí)現(xiàn)
當(dāng)用戶在搜索框輸入關(guān)鍵詞之后,搜索引擎將會(huì)根據(jù)提前構(gòu)建好的倒排索引去搜索相關(guān)的資源。資源搜索的主界面如圖6所示。
3.2 離線推薦計(jì)算的實(shí)現(xiàn)
Spark ML中封裝了ALS的完整實(shí)現(xiàn)并且提供了非常簡(jiǎn)單的接口方便調(diào)用。ALS算法在訓(xùn)練時(shí)會(huì)調(diào)取較多的迭代式計(jì)算。ALS計(jì)算時(shí)SparkUI中的DAG圖見圖7。
3.3 實(shí)時(shí)榜單計(jì)算的實(shí)現(xiàn)
實(shí)時(shí)榜單的計(jì)算主要使用了SparkStreaming的reduceByKeyAndWindow算子,每隔一個(gè)時(shí)間段系統(tǒng)就會(huì)將規(guī)定窗口內(nèi)的數(shù)據(jù)進(jìn)行匯總計(jì)算。其中,圖8展示的DAG就是經(jīng)過一段時(shí)間對(duì)窗口內(nèi)所有的微批進(jìn)行處理。
4 結(jié)束語(yǔ)
本系統(tǒng)實(shí)現(xiàn)了資源分享、資源搜索、資源推薦等基本功能,但系統(tǒng)的整個(gè)集群都是在一臺(tái)電腦的虛擬機(jī)上搭建而成的,無法完全模擬生產(chǎn)環(huán)境,這樣就難于處理某些在實(shí)際生產(chǎn)環(huán)境中遇到的問題。同時(shí)
推薦算法的選取也偏于單一化,因而還未能在多模型融合的推薦排序方面取得突破。今后擬在深度學(xué)習(xí)與語(yǔ)義推薦方面做出優(yōu)化與改進(jìn)。
參考文獻(xiàn)
[1]周志華. 機(jī)器學(xué)習(xí)[M]. 北京: 清華大學(xué)出版社,2016.
[2]林軒田.機(jī)器學(xué)習(xí)基石[EB/OL]. [2013]. https://www.coursera.org/learn/ntumlone-mathematicalfoundations/2017-10.
[3] 林軒田. 機(jī)器學(xué)習(xí)技法[EB/OL]. [2013]. https://www.coursera.org/learn/ntumlone-algorithmic techniques/2018-02.
[4] 王家林, 段志華, 夏陽(yáng). Spark大數(shù)據(jù)商業(yè)實(shí)戰(zhàn)三部曲:內(nèi)核解密|商業(yè)案例|性能調(diào)優(yōu)[M]. 北京:清華大學(xué)出版社, 2018.
[5] 郭景瞻. 圖解Spark:內(nèi)核技術(shù)與案例實(shí)戰(zhàn)[M]. 北京:電子工業(yè)出版社,2017.
[6] 唐亙. 精通數(shù)據(jù)科學(xué):從線性回歸到深度學(xué)習(xí)[M]. 北京:人民郵電出版社,2018.
[7] 楊海霞. 數(shù)據(jù)庫(kù)原理與設(shè)計(jì)[M]. 2版. 北京:人民郵電出版社, 2013.
[8] KALUA B. Java機(jī)器學(xué)習(xí)[M]. 武傳海,譯. 北京:人民郵電出版社,2017.
[9] 楊冠寶. 阿里巴巴Java開發(fā)手冊(cè)[M]. 北京:電子工業(yè)出版社,2018.
[10]MINER D,SHOOK A. MapReduce設(shè)計(jì)模式[M]. 徐釗,趙重慶,譯. 北京:人民郵電出版社, 2014.