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