編者按:Dave Smith使用Excel電子表格深入淺出地講解了SVD++(基于協(xié)同過(guò)濾的推薦算法)的原理。
網(wǎng)絡(luò)貨架無(wú)窮無(wú)盡,尋找想看的影視劇可能讓你筋疲力竭。幸運(yùn)的是,對(duì)抗選擇疲憊是Netflix的工作……它干得不錯(cuò)。干得太好了。
Netflix魔法般地向你推薦完美的電影,讓你的眼睛緊緊地粘在屏幕上,將你的拖延變?yōu)樯嘲l(fā)上的放縱。
該死的Netflix。你有什么秘密?你怎么能如此了解我們?
Netflix又勝利了……
其實(shí)這“魔法”驚人地簡(jiǎn)單,這篇教程將通過(guò)循序漸進(jìn)的電子表格揭示這一秘密。你可以下載Excel格式的電子表格(推薦),或者使用Google Sheets(運(yùn)算較慢,由于兼容性問(wèn)題,缺了一張圖):
https://drive.google.com/open?id=1y4X8H56TS6M7AXAU7yIm0EyxhqNUy1sz
如果無(wú)法訪問(wèn)Google網(wǎng)盤,可以在論智公眾號(hào)(ID: jqr_AI)后臺(tái)留言excel獲取替代下載地址。
盡管自從Netflix Prize competition競(jìng)賽之后,出現(xiàn)了一大堆關(guān)于推薦系統(tǒng)的論文和視頻,但其中的大部分要么對(duì)初學(xué)者而言技術(shù)性過(guò)強(qiáng),要么過(guò)于抽象,難以實(shí)踐。
在本文中,我們將從頭創(chuàng)建一個(gè)電影推薦系統(tǒng),僅僅使用直白的英語(yǔ)解釋和你可以在Excel中操作的公式。所有梯度下降通過(guò)手工推導(dǎo)得到,你可以使用Excel微調(diào)模型的超參數(shù),加深你的直觀理解。
你將學(xué)習(xí):
實(shí)現(xiàn)SVD++的一個(gè)版本的精確步驟,SVD++曾贏得一百萬(wàn)美元的Netflix大獎(jiǎng)。
機(jī)器到底是如何學(xué)習(xí)的(梯度下降)??纯碞etflix是如何在你沒有明確告知的情況下學(xué)習(xí)你的電影品味的。
超參數(shù)調(diào)整??纯慈绾握{(diào)整模型超參數(shù)(學(xué)習(xí)率、L2正則化、epoch數(shù)、權(quán)重初始化)得到更好的預(yù)測(cè)。
模型評(píng)估和可視化。學(xué)習(xí)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的不同,如何預(yù)防過(guò)擬合,如何可視化模型特征。
在簡(jiǎn)短地介紹推薦系統(tǒng)之后,我將帶領(lǐng)你創(chuàng)建一個(gè)預(yù)測(cè)一些好萊塢明星的電影評(píng)分的模型,整個(gè)過(guò)程共分為四部分:
模型概覽
觀看魔法秀(權(quán)重初始化、訓(xùn)練)
魔法揭秘(梯度下降、導(dǎo)數(shù))
我將逐步講解機(jī)器學(xué)習(xí)魔法背后的數(shù)學(xué),我將使用實(shí)數(shù)作為例子代入批量梯度下降的公式(不會(huì)使用“宏”或者Excel求解器之類的東西隱藏細(xì)節(jié))。
模型評(píng)估和可視化
本文適合哪些人?
想要入門推薦系統(tǒng)的人。
Fast.AI的深度學(xué)習(xí)課程的學(xué)生。
充滿好奇心,對(duì)機(jī)器學(xué)習(xí)感興趣的人。
特別感謝Fast.AI的Jeremy Howard和Rachel Thomas。這里的電子表格受到了他們的協(xié)同過(guò)濾課程的啟發(fā)(相關(guān)代碼見git.io/fNVW9)。他們呈現(xiàn)的電子表格依賴Excel內(nèi)置的求解器進(jìn)行幕后的優(yōu)化計(jì)算;而我這里的電子表格展示了梯度下降計(jì)算的每一步,并允許你微調(diào)模型的超參數(shù)。
如果這份電子表格對(duì)你有幫助,請(qǐng)注冊(cè)我創(chuàng)建的郵件列表,注冊(cè)后可以收到更多后續(xù)的電子表格,幫助你入門機(jī)器學(xué)習(xí)和創(chuàng)建神經(jīng)網(wǎng)絡(luò)。
excelwithml.com
推薦系統(tǒng)簡(jiǎn)介
電影推薦系統(tǒng)可以簡(jiǎn)化為兩大類:
協(xié)同過(guò)濾(詢問(wèn)密友)
和
基于內(nèi)容的過(guò)濾(標(biāo)簽匹配)
協(xié)同過(guò)濾
協(xié)同過(guò)濾基于類似行為進(jìn)行推薦。
如果Ross和Rachel過(guò)去喜歡類似的東西,那么我們將Rachel喜歡而Ross沒看過(guò)的電影向Ross推薦。你可以將他們看成是“協(xié)同”過(guò)濾網(wǎng)絡(luò)貨架上的噪音的“品味分身”。如果兩個(gè)用戶的評(píng)分有強(qiáng)相關(guān)性,那么我們就認(rèn)定這兩個(gè)用戶“相似”。評(píng)分可以是隱式的,也可以是顯示的:
隱式(沉溺)—— 整個(gè)周末,Ross和Rachel都沉溺于老劇《老友記》。盡管他們沒人點(diǎn)贊,但我們相當(dāng)確定他們喜歡《老友記》(以及他們可能有點(diǎn)自戀)。
顯式(喜歡)—— Ross和Rachel都點(diǎn)了贊。
協(xié)同過(guò)濾有兩種:近鄰方法和潛因子模型(矩陣分解的一種形式)。本文將聚焦一種稱為SVD++的潛因子模型。
基于內(nèi)容的過(guò)濾
基于你過(guò)去喜歡的內(nèi)容的明確標(biāo)簽(類型、演員,等等),Netflix向你推薦具有類似標(biāo)簽的新內(nèi)容。
一萬(wàn)美元大獎(jiǎng)得主是……
在電影推薦的場(chǎng)景下,當(dāng)數(shù)據(jù)集足夠大的時(shí)候,協(xié)同過(guò)濾(CF)輕而易舉就能擊敗基于內(nèi)容的過(guò)濾。
雖然有無(wú)數(shù)混合這兩大類的變體,但出人意料的是,當(dāng)CF模型足夠好時(shí),加上元數(shù)據(jù)并沒有幫助。
為什么會(huì)這樣?
人會(huì)說(shuō)謊,行動(dòng)不會(huì)。讓數(shù)據(jù)自己說(shuō)話
人們聲稱自己喜歡什么(用戶設(shè)置,調(diào)查,等等)和他們的行為之間有一道巨大的鴻溝。最好讓人們的觀看行為自己說(shuō)話。(竅門:想要改善Netflix推薦?訪問(wèn)/WiViewingActivity清理你的觀看記錄,移除你不喜歡的項(xiàng)。)
2009年,Netflix獎(jiǎng)勵(lì)了一隊(duì)研究人員一百萬(wàn)美元,這個(gè)團(tuán)隊(duì)開發(fā)了一個(gè)算法,將Netflix的預(yù)測(cè)精確度提升了10%. 盡管獲勝算法實(shí)際上是超過(guò)100種算法的集成,SVD++(一種協(xié)同過(guò)濾算法)是其中最關(guān)鍵的算法之一,貢獻(xiàn)了大多數(shù)收益,目前仍在生產(chǎn)環(huán)境中使用。
我們將創(chuàng)建的SVD++模型(奇異值分解逼近)和Simon Funk的博客文章Netflix Update: Try This at Home中提到差不多。這篇不出名的文章是2006年Simon在Netflix競(jìng)賽開始時(shí)寫的,首次提出了SVD++模型。在SVD++模型成功之后,幾乎所有的Netflix競(jìng)賽參加者都用它。
SVD++關(guān)鍵想法:
奇異值(電影評(píng)價(jià))可以被“分解”,也就是由一組潛因子(用戶偏好和電影特征)決定,直覺上,潛因子表示類型、演員之類的特征。
可以通過(guò)梯度下降和已知電影評(píng)價(jià)迭代學(xué)習(xí)潛因子。
影響某人評(píng)價(jià)的用戶/電影偏置同樣可以學(xué)習(xí)。
簡(jiǎn)單而強(qiáng)大。讓我們深入一點(diǎn)。
1.1 數(shù)據(jù)
出于簡(jiǎn)單性,本文的模型使用了30項(xiàng)虛假的評(píng)價(jià)(5用戶 x 6電影)。
1.2 分割數(shù)據(jù)——訓(xùn)練集和測(cè)試集
我們將使用25項(xiàng)評(píng)價(jià)來(lái)訓(xùn)練模型,剩下5項(xiàng)評(píng)價(jià)測(cè)試模型的精確度。
我們的目標(biāo)是創(chuàng)建一個(gè)在25項(xiàng)已知評(píng)價(jià)(訓(xùn)練數(shù)據(jù))上表現(xiàn)良好的系統(tǒng),并希望它在5項(xiàng)隱藏(但已知)評(píng)價(jià)(測(cè)試數(shù)據(jù))上做出良好的預(yù)測(cè)。
如果我們有更多數(shù)據(jù),我們本可以將數(shù)據(jù)分為3組——訓(xùn)練集(約70%)、驗(yàn)證集(約20%)、測(cè)試集(約10%)。
1.3 評(píng)價(jià)預(yù)測(cè)公式
評(píng)價(jià)預(yù)測(cè)是用戶/電影特征的矩陣乘法(“點(diǎn)積”)加上用戶偏置,再加上電影偏置。
形式化定義:
上式中,等式左側(cè)表示用戶i對(duì)電影j的預(yù)測(cè)評(píng)價(jià)。u1、u2、u3為用戶潛因子,m1、m2、m3為電影潛因子,ubias為用戶偏置,mbias為電影偏置。
1.3.1 用戶/電影特征
直覺上說(shuō),這些特征表示類型、演員、片長(zhǎng)、導(dǎo)演、年代等因素。盡管我們并不清楚每項(xiàng)特征代表什么,但是當(dāng)我們將其可視化后(見第四部分)我們可以憑直覺猜測(cè)它們可能代表什么。
出于簡(jiǎn)單性,我使用了3項(xiàng)特征,但實(shí)際的模型可能有50、100乃至更多特征。特征過(guò)多時(shí),模型將“過(guò)擬合/記憶”你的訓(xùn)練數(shù)據(jù),難以很好地推廣到測(cè)試數(shù)據(jù)的預(yù)測(cè)上。
如果用戶的第1項(xiàng)特征(讓我們假定它表示“喜劇”)值較高,同時(shí)電影的“喜劇”特征的值也很高,那么電影的評(píng)價(jià)會(huì)比較高。
1.3.2 用戶/電影偏置
用戶偏置取決于評(píng)價(jià)標(biāo)準(zhǔn)的寬嚴(yán)程度。如果Netflix上所有的平均評(píng)分是3.5,而你的所有評(píng)分的均值是4.0,那么你的偏置是0.5. 電影偏置同理。如果《泰坦尼克號(hào)》的所有用戶的評(píng)分均值為4.25,那么它的偏置是0.75(= 4.25 - 3.50)。
1.4 RMSE —— 評(píng)估預(yù)測(cè)精確度
RMSE = Root Mean Squared Error (均方根誤差)
RMSE是一個(gè)數(shù)字,嘗試回答以下問(wèn)題“平均而言,預(yù)測(cè)評(píng)價(jià)和實(shí)際平均差了幾顆星(1-5)?”
RMSE越低,意味著預(yù)測(cè)越準(zhǔn)……
上圖為RMSE計(jì)算過(guò)程示意圖。左側(cè)為三個(gè)用戶,“Actual Ratings”為用戶的實(shí)際評(píng)分,“Predictions”為預(yù)測(cè)評(píng)分。計(jì)算共分4步:
計(jì)算誤差(預(yù)測(cè) - 實(shí)際)
對(duì)誤差取平方
計(jì)算平方誤差的均值
取均值的平方根
觀察:
我們只在意絕對(duì)值差異。相比實(shí)際評(píng)分高估了1分的預(yù)測(cè),和相比實(shí)際評(píng)分低估了1分的預(yù)測(cè),誤差相等,均為1。
RMSE是誤差同數(shù)量級(jí)的平均,而不是誤差絕對(duì)值的平均。在我們上面的例子中,誤差絕對(duì)值的平均是0.75(1 + 1 + 0.25 = 2.25,2.25 / 3 = 0.75),但RMSE是0.8292. RMSE給較大的誤差更高的權(quán)重,這很有用,因?yàn)槲覀兏幌M休^大的誤差。
RMSE形式化定義:
同樣,上式中i表示用戶,j表示電影。戴帽的r表示預(yù)測(cè)評(píng)價(jià),r表示實(shí)際評(píng)價(jià)。
1.5 超參數(shù)調(diào)整
通過(guò)電子表格的下拉過(guò)濾器,可以調(diào)整模型的3個(gè)超參數(shù)。你應(yīng)該測(cè)試下每種超參數(shù),看看它們對(duì)誤差的影響。
訓(xùn)練epoch數(shù)—— 1個(gè)epoch意味著整個(gè)訓(xùn)練集都過(guò)了一遍
學(xué)習(xí)率—— 控制調(diào)整權(quán)重/偏置的速度
L2(lambda)懲罰因子—— 幫助模型預(yù)防過(guò)擬合訓(xùn)練數(shù)據(jù),以更好地概括未見測(cè)試數(shù)據(jù)
模型超參數(shù)
現(xiàn)在,讓我們看一場(chǎng)魔法秀,看看模型是如何從隨機(jī)權(quán)重開始,學(xué)習(xí)最優(yōu)權(quán)重的。
觀看梯度下降如何運(yùn)作感覺就像看了一場(chǎng)大衛(wèi)·布萊恩的魔術(shù)秀。
他到底是怎么知道我會(huì)在52張牌中選這張的呢?
等等,他剛剛是不是浮空了?
最后你深感敬畏,想要知道魔術(shù)是如何變的。我會(huì)分兩步演示,接著揭露魔法背后的數(shù)學(xué)。
2.1 “抽一張卡,隨便抽一張”(權(quán)重初始化)
在訓(xùn)練開始,用戶/電影特征的權(quán)重是隨機(jī)分配的,接著算法在訓(xùn)練中學(xué)習(xí)最佳的權(quán)重。
為了揭示這看起來(lái)有多么“瘋狂”,我們可以隨機(jī)猜測(cè)數(shù)字,然后讓計(jì)算機(jī)學(xué)習(xí)最佳數(shù)字。下面是兩種權(quán)重初始化方案的比較:
簡(jiǎn)單—— 用戶特征我隨機(jī)選擇了0.1、0.2、0.3,剩下的特征都分配0.1.
Kaiming He—— 更正式、更好的初始化方法,從高斯分布(“鐘形曲線”)中隨機(jī)抽樣作為權(quán)重,高斯分布的均值為零,標(biāo)準(zhǔn)差由特征個(gè)數(shù)決定(細(xì)節(jié)見后)。
2.2 “觀賞魔術(shù)”(查看訓(xùn)練誤差)
看看使用以上兩種方案學(xué)習(xí)權(quán)重最佳值的效果,從開始(epoch 0)到結(jié)束(epoch 50),RMSE訓(xùn)練誤差是如何變化的:
如你所見,兩種權(quán)重初始化方案在訓(xùn)練結(jié)束后都收斂到相似的“誤差”(0.12和0.17),但Kaiming He方法收斂得更快。
關(guān)鍵點(diǎn):無(wú)論我們開始的權(quán)重是什么樣的,機(jī)器將隨著時(shí)間推移學(xué)到良好的值。
注意:如果你想要試驗(yàn)其他初始化權(quán)重,可以在電子表格的“hyperparametersandinitial_wts”表的G3-J7、N3-Q8單元格中輸入你自己的值。權(quán)重取值范圍為-1到1.
想要了解更多關(guān)于Kaiming He初始化的內(nèi)容,請(qǐng)接著讀下去;否則,可以直接跳到第3部分學(xué)習(xí)算法的數(shù)學(xué)。
Kaiming He權(quán)重初始化
權(quán)重 = 正態(tài)分布隨機(jī)抽樣,分布均值為0,標(biāo)準(zhǔn)差為(=SquareRoot(2/特征數(shù)))
電子表格中的值由以下公式得到:=NORMINV(RAND(),0,SQRT(2/3))
現(xiàn)在,是時(shí)候書呆一點(diǎn),一步一步地了解梯度下降的數(shù)學(xué)了。
如果你不是真想知道魔法是如何起效的,那么可以跳過(guò)這一部分,直接看第4部分。
梯度下降是在訓(xùn)練時(shí)使用的迭代算法,通過(guò)梯度下降更新電影特征、用戶偏好的權(quán)重和偏置,以做出更好的預(yù)測(cè)。
梯度下降的一般周期為:
定義一個(gè)最小化權(quán)重的代價(jià)/損失函數(shù)
計(jì)算預(yù)測(cè)
計(jì)算梯度(每個(gè)權(quán)重的代價(jià)變動(dòng))
在最小化代價(jià)的方向上“一點(diǎn)點(diǎn)地”(學(xué)習(xí)率)更新每個(gè)權(quán)重
重復(fù)第2-4步
你可以訪問(wèn)電子表格的“training”(訓(xùn)練)表,其中第11-16行是更新Tina Fey的第一項(xiàng)用戶特征的過(guò)程。
由于數(shù)據(jù)集很小,我們將使用批量梯度下降。這意味著我們?cè)谟?xùn)練時(shí)將使用整個(gè)數(shù)據(jù)集(在我們的例子中,一個(gè)用戶的所有電影),而不是像隨機(jī)梯度下降之類的算法一樣每次迭代一個(gè)樣本(在我們的例子中,一個(gè)用戶的一部電影),當(dāng)數(shù)據(jù)集較大時(shí),隨機(jī)梯度下降更快。
3.1 定義最小化的代價(jià)函數(shù)
我們將使用下面的公式,我們的目標(biāo)是找到合適的潛因子(矩陣U、M)的值,以最小化SSE(平方誤差之和)加上一個(gè)幫助模型提升概括性的L2權(quán)重懲罰項(xiàng)。
下面是Excel中的代價(jià)函數(shù)計(jì)算。計(jì)算過(guò)程忽略了1/2系數(shù),因?yàn)樗鼈儍H用于梯度下降以簡(jiǎn)化數(shù)學(xué)。
L2正則化和過(guò)擬合
我們加入了權(quán)重懲罰(L2正則化或“嶺回歸”)以防止?jié)撘蜃又颠^(guò)高。這確保模型沒有“過(guò)擬合”(也就是記憶)訓(xùn)練數(shù)據(jù),否則模型在未見的測(cè)試電影上表現(xiàn)不會(huì)好。
之前,我們沒有使用L2正則化懲罰(系數(shù)為0)的情況下訓(xùn)練模型,50個(gè)epoch后,RMSE訓(xùn)練誤差為0.12.
但是模型在測(cè)試數(shù)據(jù)上的表現(xiàn)如何呢?
在上圖中,我們看到,測(cè)試集上的RMSE為2.54,顯然我們的模型過(guò)擬合了訓(xùn)練數(shù)據(jù)。
我們將L2懲罰系數(shù)從0.000改為0.300后,模型在未見測(cè)試數(shù)據(jù)上的表現(xiàn)好一點(diǎn)了:
3.2 計(jì)算預(yù)測(cè)
我們將計(jì)算Tina的電影預(yù)測(cè)。我們將忽略《泰坦尼克號(hào)》,因?yàn)樗跍y(cè)試數(shù)據(jù)集中,不在訓(xùn)練數(shù)據(jù)集中。
我們之前給出過(guò)預(yù)測(cè)的計(jì)算公式(1.3節(jié)),為了便于查看,這里再重復(fù)一遍:
3.3 計(jì)算梯度
目標(biāo)是找到誤差對(duì)應(yīng)于將更新的權(quán)重的梯度(“坡度”)。
得出梯度之后,稍微將權(quán)重“移動(dòng)一點(diǎn)點(diǎn)”,沿著梯度的反方向“下降”,在對(duì)每個(gè)權(quán)重進(jìn)行這一操作后,下一epoch的代價(jià)應(yīng)該會(huì)低一些。
“移動(dòng)一點(diǎn)點(diǎn)”具體移動(dòng)多少,取決于學(xué)習(xí)率。在得到梯度(3.3)之后,會(huì)用到學(xué)習(xí)率。
梯度下降法則:將權(quán)重往梯度的反方向移動(dòng),以減少誤差
第1步:計(jì)算Tina Fey的第一個(gè)潛因子的代價(jià)梯度(u1)。
1.1 整理代價(jià)目標(biāo)函數(shù),取代價(jià)在Tina Fey的第一個(gè)潛因子(u1)上的偏導(dǎo)數(shù)。
1.3 將公式每部分中的u1視為常數(shù),取u1在公式每部分的代價(jià)上的偏導(dǎo)數(shù)。
1.3.2 應(yīng)用“冪法則”以得到偏導(dǎo)數(shù)。根據(jù)冪法則,指數(shù)為2,所以將指數(shù)降1,并乘上系數(shù)1/2. u2和u3視作常數(shù),變?yōu)?.
1.3.3 應(yīng)用“常數(shù)法則”以得到偏導(dǎo)數(shù)。
由于u1對(duì)這些項(xiàng)毫無(wú)影響,結(jié)果是0.1.3.3 = 01.4 結(jié)合1.3.1、1.3.2、1.3.3得到代價(jià)在u1上的偏導(dǎo)數(shù)。
第2步:對(duì)訓(xùn)練集中Tina看過(guò)的每部電影,利用前面的公式計(jì)算梯度,接著計(jì)算Tina看過(guò)的所有電影的平均梯度。
3.4 更新權(quán)重
“training”(訓(xùn)練)表的X11-X16單元格對(duì)應(yīng)上面的計(jì)算過(guò)程。
你可以看到,電影特征和用戶/電影偏置以類似的方式更新。
每一個(gè)訓(xùn)練epoch更新所有的電影/用戶特征及偏置。
現(xiàn)在我們已經(jīng)訓(xùn)練好了模型,讓我們可視化電影的2個(gè)潛因子。
如果我們的模型更復(fù)雜,包括10、20、50+潛因子,我們可以使用一種稱為“主成分分析(PCA)”的技術(shù)提取出最重要的特征,接著將其可視化。
相反,我們的模型僅僅包括3項(xiàng)特征,所以我們將可視化其中的2項(xiàng)特征,基于學(xué)習(xí)到的特征將每部電影繪制在圖像上。繪制圖像之后,我們可以解釋每項(xiàng)特征“可能代表什么”。
從直覺出發(fā),電影特征1可能解釋為悲劇與喜劇,而電影特征3可能解釋為男性向與女性向。
這不是完美的解釋,但還算一種合理的解釋?!队率俊罚╳arrior)一般歸為劇情片,而不是喜劇片。不過(guò)其他電影基本符合以上解釋。
總結(jié)
電影評(píng)價(jià)由一個(gè)電影向量和一個(gè)用戶向量組成。在你評(píng)價(jià)了一些電影之后(顯式或隱式),推薦系統(tǒng)將利用群體的智慧和你的評(píng)價(jià)預(yù)測(cè)你可能喜歡的其他電影。向量(或“潛因子”)的維度取決于數(shù)據(jù)集的大小,可以通過(guò)試錯(cuò)法確定。
我鼓勵(lì)你實(shí)際操作下電子表格,看看改變模型的超參數(shù)會(huì)帶來(lái)什么改變。
-
Excel
+關(guān)注
關(guān)注
4文章
216瀏覽量
55398 -
SVD
+關(guān)注
關(guān)注
0文章
21瀏覽量
12146 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8323瀏覽量
132171
原文標(biāo)題:使用Excel實(shí)現(xiàn)推薦系統(tǒng)
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論