《現(xiàn)代推薦算法》矩陣分解系列(SVD,F(xiàn)unkSVD,BiasSVD)原理

/關(guān)注公眾號(hào) 長(zhǎng)歌大腿,發(fā)送“機(jī)器學(xué)習(xí)”關(guān)鍵字,可獲取包含機(jī)器學(xué)習(xí)(包含深度學(xué)習(xí)),統(tǒng)計(jì)概率,優(yōu)化算法等系列文本與視頻經(jīng)典資料,如《ESL》《PRML》《MLAPP》等。/
文章來(lái)源《現(xiàn)代推薦算法》矩陣分解系列(SVD,F(xiàn)unkSVD,BiasSVD)原理 .

奇異值分解(SVD)

奇異值分解(SVD)原理與主要應(yīng)用在數(shù)據(jù)降維中,可以將這個(gè)用戶(hù)物品對(duì)應(yīng)的m×n矩陣M進(jìn)行SVD分解,并通過(guò)選擇部分較大的一些奇異值來(lái)同時(shí)進(jìn)行降維,也就是說(shuō)矩陣M此時(shí)分解為:

M_{m \times n} = U_{m \times k}^{T}D_{k \times k}V_{k \times n}

其中k是矩陣M中較大的部分奇異值的個(gè)數(shù),一般會(huì)遠(yuǎn)遠(yuǎn)的小于用戶(hù)數(shù)和物品樹(shù)。如果我們要預(yù)測(cè)第i個(gè)用戶(hù)對(duì)第j個(gè)物品的評(píng)分,則只需要計(jì)算,通過(guò)這種方法,可以將評(píng)分表里面所有沒(méi)有評(píng)分的位置得到一個(gè)預(yù)測(cè)評(píng)分。通過(guò)找到最高的若干個(gè)評(píng)分對(duì)應(yīng)的物品推薦給用戶(hù)。

通過(guò)上面的簡(jiǎn)單原理講解,大家可以看出這種方法簡(jiǎn)單直接。但是基于SVD的矩陣分解要求矩陣是稠密的,整個(gè)矩陣的所有位置不能有空白。有空白時(shí)M是沒(méi)法直接去SVD分解的。所以,這就到了是為什么SVD主要應(yīng)用的途徑是“數(shù)據(jù)降維”,因?yàn)樗岢龅乃季S就是用來(lái)數(shù)據(jù)降維的。那么這種數(shù)學(xué)理論知識(shí)又扎實(shí)的算法,又想用在了推薦系統(tǒng)中,但是數(shù)據(jù)又要求稠密怎么辦,第一個(gè)思路就是開(kāi)頭說(shuō)的方法是對(duì)評(píng)分矩陣中的缺失值進(jìn)行簡(jiǎn)單的補(bǔ)全,比如用全局平均值或者用用戶(hù)物品平均值補(bǔ)全,得到補(bǔ)全后的矩陣。接著可以用SVD分解并降維。

有了上面的補(bǔ)全策略,傳統(tǒng)SVD在推薦算法上依舊不太容易工業(yè)化應(yīng)用。因?yàn)橛脩?hù)數(shù)和物品一般目前都是海量數(shù)據(jù),任何一個(gè)平臺(tái)一個(gè)數(shù)據(jù)庫(kù)都是千萬(wàn)級(jí)數(shù)據(jù),這也就是為什么分布式存儲(chǔ)和云計(jì)算能夠大面積應(yīng)用的根本原因,。針對(duì)于海量數(shù)據(jù)的一個(gè)矩陣做SVD分解是非常耗時(shí)的。能夠在數(shù)學(xué)理論完善的基礎(chǔ)上加之更難,使數(shù)據(jù)要求不是稠密的,計(jì)算復(fù)雜度降低是一個(gè)可行的思路,針對(duì)于這兩點(diǎn),各位機(jī)器學(xué)習(xí)界大神做了各種優(yōu)化,下面來(lái)看看實(shí)際可以用于推薦系統(tǒng)的矩陣分解。

FUNKSVD又稱(chēng)為L(zhǎng)FM算法。

FunkSVD就是在SVD的技術(shù)上優(yōu)化“數(shù)據(jù)稠密”+“計(jì)算復(fù)雜度告”+“只可以用來(lái)數(shù)據(jù)降維”難題的。一個(gè)矩陣做SVD分解成3個(gè)矩陣很耗時(shí),同時(shí)還面臨稀疏的問(wèn)題,那么解決稀疏問(wèn)題,同時(shí)只分解成兩個(gè)矩陣呢?期望矩陣M這樣進(jìn)行分解成以下這個(gè)形式:

M_{m \times n} = P_{m \times k}^{T}Q_{k \times n}

SVD理論知識(shí)完善,在數(shù)據(jù)降維應(yīng)用成熟,F(xiàn)unkSVD如何將矩陣M分解兩個(gè)特征維度為P和Q再繼續(xù)優(yōu)化計(jì)算成了難題,這里各位機(jī)器學(xué)習(xí)大神提出了更久遠(yuǎn)更理論知識(shí)豐富的線(xiàn)性回歸的思想。主要目標(biāo)是讓用戶(hù)的評(píng)分和用矩陣乘積得到的評(píng)分殘差盡可能的小,他們給出的思路就是用均方差作為損失函數(shù),來(lái)學(xué)習(xí)出的P和Q的參數(shù)。線(xiàn)性回歸思維理論的好處是優(yōu)化策略完善,梯度下降,理論知識(shí)成熟,計(jì)算難度低。

對(duì)于某一個(gè)用戶(hù)評(píng)分,采用FunkSVD進(jìn)行矩陣分解,則擬合函數(shù)表示為q_{i}^{T}p_{i},采用均方差做為損失函數(shù),則期望盡可能的?。〒p失函數(shù)極小值),如果考慮所有的物品和樣本的組合,則我們期望最小化下式

\sum_{i,j}(m_{i,j}-q_{j}^{T}p_{i})^{2}

只要能夠最小化損失上面的式子,并求出極值所對(duì)應(yīng)的,就可以得到矩陣P和Q,那么對(duì)于任意矩陣M任意一個(gè)空白評(píng)分的位置,可以通過(guò)計(jì)算q_{j}^{T}p_{i}預(yù)測(cè)評(píng)分。

當(dāng)然,在實(shí)際應(yīng)用中,我們?yōu)榱朔乐惯^(guò)擬合,會(huì)加入一個(gè)L2的正則化項(xiàng),因此正式的FunkSVD的優(yōu)化目標(biāo)函數(shù)J(p,q)是這樣的

argmin_{p_{i},q_{j}} \sum_{i,j}(m_{i,j}-q_{j}^{T}p_{i})^{2} + \lambda (\left \| p_{i} \right \|_{2}^{2}+\left \| q_{j} \right \|_{2}^{2})

\lambda為正則化系數(shù)。

對(duì)于這個(gè)優(yōu)化問(wèn)題,我們一般通過(guò)梯度下降法來(lái)進(jìn)行優(yōu)化得到結(jié)果。

將上式分別對(duì)求導(dǎo)得到:

\frac{\partial J}{\partial p_{i}} = -2(m_{ij}-q_{j}^{T}p_{i})q_{j}+2 \lambda p_{i}
\frac{\partial J}{\partial q_{j}} = -2(m_{ij}-q_{j}^{T}p_{i})p_{i}+2 \lambda q_{j}

則在梯度下降法迭代時(shí)的迭代公式為:

p_{i} = p_{i}+\alpha((m_{i,j}-q_{j}^{T}p_{i})q_{j}-\lambda p_{i})
q_{j} = q_{j}+\alpha((m_{i,j}-q_{j}^{T}p_{i})p_{i}-\lambda q_{j})

通過(guò)迭代我們最終可以得到P和Q,進(jìn)而用于推薦。FunkSVD算法雖然思想很簡(jiǎn)單,但是在實(shí)際應(yīng)用中效果非常好,這真是驗(yàn)證了大道至簡(jiǎn)。

BiasSVD的推薦算法

好了,我們知道一種了矩陣分解的FunkSVD算法,但是針對(duì)于這種打分,而且多半是以這種社交媒體或者網(wǎng)站平臺(tái)為主,那么久會(huì)導(dǎo)致了很多商業(yè)問(wèn)題和難點(diǎn),很難做到合理化、公平化,因?yàn)橛腥说膮⑴c是最難的,經(jīng)過(guò)了各種網(wǎng)站實(shí)時(shí)反饋,打開(kāi)有以下幾個(gè)問(wèn)題:

  • 人員問(wèn)題(或者水軍問(wèn)題),就是參與人員的問(wèn)題,比如有的人就是比較好說(shuō)話(huà),他對(duì)每一部看過(guò)的電影或者物品,都覺(jué)得很好,都給了很高的評(píng)分;也有一部分人藝術(shù)審美很高,比較嚴(yán)格,他對(duì)絕大部分都給了比大眾水平低的分,當(dāng)然這兩部分人都有可能是水軍,都是利益關(guān)聯(lián)方,但是他們的數(shù)據(jù)是不準(zhǔn)確的,不能反映真實(shí)大眾的想法,怎么降低這部分誤差成了關(guān)鍵。

  • 作品問(wèn)題,如說(shuō)山寨電影,比如山寨物品,這部分本身就具有問(wèn)題,而靠貼流量貼標(biāo)簽貼熱點(diǎn)等狀態(tài),聚集了很多的評(píng)分,也反映不出真實(shí)大眾的水平,所以降低這部分物品的誤差也是關(guān)鍵。

  • 全局問(wèn)題,簡(jiǎn)單以電影為例,也許趕上了某一個(gè)時(shí)間段的大眾審美熱度,大家都去拍這個(gè)題材,而這個(gè)題材分?jǐn)?shù)整體偏高了,如何降低這種全局偏差也成了關(guān)鍵。

解決上面三種問(wèn)題的思維是上面機(jī)器學(xué)習(xí)流程里的優(yōu)化問(wèn)題,因?yàn)槭菍儆谔嵘龁?wèn)題,那么針對(duì)于機(jī)器學(xué)習(xí)最常用的優(yōu)化就是“正則化”+“偏置項(xiàng)”,正則化是為了防止整個(gè)模型的過(guò)分?jǐn)M合,偏置項(xiàng)是我既然知道參與的部分?jǐn)?shù)據(jù)本身具有誤差,那我人工手動(dòng)提前去在損失函數(shù)里增加這部分偏差考慮,在計(jì)算求解中求出這個(gè)參數(shù),然后應(yīng)用在新的數(shù)據(jù)里就應(yīng)該是更符合大眾,更準(zhǔn)確地?cái)?shù)據(jù)了。

假設(shè)評(píng)分系統(tǒng)平均分為u,第i個(gè)用戶(hù)的用戶(hù)偏置項(xiàng)為bi,而第j個(gè)物品的物品偏置項(xiàng)為bj,則加入了偏置項(xiàng)以后的優(yōu)化目標(biāo)函數(shù)J(p,q)是這樣的

argmin_{p_{i},q_{j}} \sum_{i,j}(m_{i,j}-\mu -b_{i}-b_{j}-q_{j}^{T}p_{i})^{2} + \lambda (\left \| p_{i} \right \|_{2}^{2}+\left \| q_{j} \right \|_{2}^{2}+\left \| b_{i} \right \|_{2}^{2}+\left \| b_{j} \right \|_{2}^{2})

優(yōu)化目標(biāo)也可以采用梯度下降法求解。和FunkSVD不同的是,此時(shí)我們多了兩個(gè)偏執(zhí)項(xiàng)的迭代公式和FunkSVD類(lèi)似,只是每一步的梯度導(dǎo)數(shù)稍有不同而已,這里就不給出了。而一般可以初始設(shè)置為0,然后參與迭代。這里給出b_{i} b_{j}的迭代方法

b_{i} = b_{i}+\alpha(m_{i,j}-b_{i}-b_{j}-\mu-q_{j}^{T}p_{i}-\lambda b_{i})
b_{j} = b_{j}+\alpha(m_{i,j}-b_{i}-b_{j}-\mu-q_{j}^{T}p_{i}-\lambda b_{j})

通過(guò)迭代最終可以得到P和Q,進(jìn)而用于推薦。BiasSVD增加了一些額外因素的考慮,因此在某些場(chǎng)景會(huì)比FunkSVD表現(xiàn)好。

?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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