简述推荐系统中的矩阵分解
一個有情懷的公眾號
1
Linear Network Hypothesis
回顧一下,我們在機器學(xué)習(xí)基石課程的第一節(jié)課就提到過,機器學(xué)習(xí)的目的就是讓機器從數(shù)據(jù)data中學(xué)習(xí)到某種能力skill。我們之前舉過一個典型的推薦系統(tǒng)的例子。就是說,假如我們手上有許多不同用戶對不同電影的排名rank,通過機器學(xué)習(xí),訓(xùn)練一個模型,能夠?qū)τ脩魶]有看過的某部電影進行排名預(yù)測。
一個典型的電影推薦系統(tǒng)的例子是2006年Netflix舉辦的一次比賽。數(shù)據(jù)包含了480189個用戶和17770部電影,總共1億多個排名信息。該推薦系統(tǒng)模型中,我們用x?n=(n)表示第n個用戶,這是一個抽象的特征,常常使用數(shù)字編號來代替具體哪個用戶。輸出方面,我們使用ym=rnm表示第n個用戶對第m部電影的排名數(shù)值。
下面我們來進一步看看這些抽象的特征,x?n=(n)是用戶的ID,通常用數(shù)字表示。例如1126,5566,6211等。這些編號并沒有數(shù)值大小上的意義,只是一種ID標識而已。這類特征被稱為類別特征(categorical features)。常見的categorical features包括:IDs,blood type,programming languages等等。而許多機器學(xué)習(xí)模型中使用的大部分都是數(shù)值特征(numerical features)。例如linear models,NNet模型等。但決策樹(decision tree)是個例外,它可以使用categorical features。所以說,如果要建立一個類似推薦系統(tǒng)的機器學(xué)習(xí)模型,就要把用戶ID這種categorical features轉(zhuǎn)換為numerical features。這種特征轉(zhuǎn)換其實就是訓(xùn)練模型之前一個編碼(encoding)的過程。
一種最簡單的encoding方式就是binary vector encoding。也就是說,如果輸入樣本有N個,就構(gòu)造一個維度為N的向量。第n個樣本對應(yīng)向量上第n個元素為1,其它元素都是0。下圖就是一個binary vector encoding的例子。
經(jīng)過encoding之后,輸入xnxn是N維的binary vector,表示第n個用戶。輸出ynyn是M維的向量,表示該用戶對M部電影的排名數(shù)值大小。注意,用戶不一定對所有M部電影都作過評價,未評價的恰恰是我們要預(yù)測的(下圖中問號?表示未評價的電影)。
總共有N個用戶,M部電影。對于這樣的數(shù)據(jù),我們需要掌握每個用戶對不同電影的喜愛程度及排名。這其實就是一個特征提取(feature extraction)的過程,提取出每個用戶喜愛的電影風(fēng)格及每部電影屬于哪種風(fēng)格,從而建立這樣的推薦系統(tǒng)模型。可供選擇使用的方法和模型很多,這里,我們使用的是NNet模型。NNet模型中的網(wǎng)絡(luò)結(jié)構(gòu)是N?d??M型,其中N是輸入層樣本個數(shù),d?是隱藏層神經(jīng)元個數(shù),M是輸出層電影個數(shù)。該NNet為了簡化計算,忽略了常數(shù)項。當然可以選擇加上常數(shù)項,得到較復(fù)雜一些的模型。順便提一下,這個結(jié)構(gòu)跟我們之前介紹的autoencoder非常類似,都是只有一個隱藏層。
說到這里,有一個問題,就是上圖NNet中隱藏層的tanh函數(shù)是否一定需要呢?答案是不需要。因為輸入向量x是經(jīng)過encoding得到的,其中大部分元素為0,只有一個元素為1。那么,只有一個元素xn與相應(yīng)權(quán)重的乘積進入到隱藏層。由于xn=1,則相當于只有一個權(quán)重值進入到tanh函數(shù)進行運算。從效果上來說,tanh(x)與x是無差別的,只是單純經(jīng)過一個函數(shù)的計算,并不影響最終的結(jié)果,修改權(quán)重值即可得到同樣的效果。因此,我們把隱藏層的tanh函數(shù)替換成一個線性函數(shù)y=x,得到下圖所示的結(jié)構(gòu)。
由于中間隱藏層的轉(zhuǎn)換函數(shù)是線性的,我們把這種結(jié)構(gòu)稱為Linear Network(與linear autoencoder比較相似)。看一下上圖這個網(wǎng)絡(luò)結(jié)構(gòu),輸入層到隱藏層的權(quán)重W1維度是Nxd?,用向量V表示。隱藏層到輸出層的權(quán)重W2維度是d?xM,用矩陣W表示。把權(quán)重由矩陣表示之后,Linear Network的hypothesis 可表示為:
如果是單個用戶xn,由于X向量中只有元素xn為1,其它均為0,則對應(yīng)矩陣V只有第n列向量是有效的,其輸出hypothesis為:
2
Basic Matrix Factorization
剛剛我們已經(jīng)介紹了linear network的模型和hypothesis。其中Vx可以看作是對用戶x的一種特征轉(zhuǎn)換Φ(x)。對于單部電影,其預(yù)測的排名可表示為:
推導(dǎo)完linear network模型之后,對于每組樣本數(shù)據(jù)(即第n個用戶第m部電影),我們希望預(yù)測的排名與實際樣本排名yn盡可能接近。所有樣本綜合起來,我們使用squared error measure的方式來定義Ein,Ein的表達式如下所示:
上式中,灰色的部分是常數(shù),并不影響最小化求解,所以可以忽略。接下來,我們就要求出Ein最小化時對應(yīng)的V和W解。
上面的表格說明了我們希望將實際排名情況R分解成兩個矩陣(V和W)的乘積形式。V的維度是d?x N的,N是用戶個數(shù),d?可以是影片類型,例如(喜劇片,愛情片,懸疑片,動作片,…)。根據(jù)用戶喜歡的類型不同,賦予不同的權(quán)重。W的維度是d?x M,M是電影數(shù)目,d?同樣是影片類型,該部電影屬于哪一類型就在那個類型上占比較大的權(quán)重。當然,d?維特征不一定就是影片類型,還可以是其它特征,例如明顯陣容、年代等等。
那么,Matrix Factorization的目標就是最小化Ein函數(shù)。Ein表達式如下所示:
Ein中包含了兩組待優(yōu)化的參數(shù),分別是vn和wm。我們可以借鑒上節(jié)課中k-Means的做法,將其中第一個參數(shù)固定,優(yōu)化第二個參數(shù),然后再固定第二個參數(shù),優(yōu)化第一個參數(shù),一步一步進行優(yōu)化。
當vn固定的時候,只需要對每部電影做linear regression即可,優(yōu)化得到每部電影的d?維特征值wm。
當wm固定的時候,因為V和W結(jié)構(gòu)上是對稱的,同樣只需要對每個用戶做linear regression即可,優(yōu)化得到每個用戶對d?維電影特征的喜愛程度vn。
這種算法叫做alternating least squares algorithm。它的處理思想與k-Means算法相同,其算法流程圖如下所示:
alternating least squares algorithm有兩點需要注意。第一是initialize問題,通常會隨機選取vn和wm。第二是converge問題,由于每次迭代更新都能減小Ein,Ein會趨向于0,則保證了算法的收斂性。
在上面的分析中,我們提過Matrix Factorization與Linear Autoencoder的相似性,下圖列出了二者之間的比較。
Matrix Factorization與Linear Autoencoder有很強的相似性,都可以從原始資料匯總提取有用的特征。其實,linear autoencoder可以看成是matrix factorization的一種特殊形式。
3
Stochastic Gradient Descent
我們剛剛介紹了alternating least squares algorithm來解決Matrix Factorization的問題。這部分我們將討論使用Stochastic Gradient Descent方法來進行求解。之前的alternating least squares algorithm中,我們考慮了所有用戶、所有電影。現(xiàn)在使用SGD,隨機選取一筆資料,然后只在與這筆資料有關(guān)的error function上使用梯度下降算法。使用SGD的好處是每次迭代只要處理一筆資料,效率很高;而且程序簡單,容易實現(xiàn);最后,很容易擴展到其它的error function來實現(xiàn)。
對于每筆資料,它的error function可表示為:
上式中的err是squared error function,僅與第n個用戶vn,第m部電影wm有關(guān)。其對vn和wm的偏微分結(jié)果為:
計算完任意一個樣本點的SGD后,就可以構(gòu)建Matrix Factorization的算法流程。SGD for Matrix Factorization的算法流程如下所示:
在實際應(yīng)用中,由于SGD算法簡單高效,Matrix Factorization大多采用這種算法。
介紹完SGD for Matrix Factorization之后,我們來看一個實際的應(yīng)用例子。問題大致是這樣的:根據(jù)現(xiàn)在有的樣本資料,預(yù)測未來的趨勢和結(jié)果。顯然,這是一個與時間先后有關(guān)的預(yù)測模型。比如說一個用戶三年前喜歡的電影可能現(xiàn)在就不喜歡了。所以在使用SGD選取樣本點的時候有一個技巧,就是最后T次迭代,盡量選擇時間上靠后的樣本放入到SGD算法中。這樣最后的模型受這些時間上靠后的樣本點影響比較大,也相對來說比較準確,對未來的預(yù)測會比較準。
所以,在實際應(yīng)用中,我們除了使用常規(guī)的機器學(xué)習(xí)算法外,還需要根據(jù)樣本數(shù)據(jù)和問題的實際情況來修改我們的算法,讓模型更加切合實際,更加準確。我們要學(xué)會靈活運用各種機器學(xué)習(xí)算法,而不能只是照搬。
4
Summary of Extraction Models
從第12節(jié)課開始到現(xiàn)在,我們總共用了四節(jié)課的時間來介紹Extraction Models。雖然我們沒有給出Extraction Models明確的定義,但是它主要的功能就是特征提取和特征轉(zhuǎn)換,將原始數(shù)據(jù)更好地用隱藏層的一些節(jié)點表征出來,最后使用線性模型將所有節(jié)點aggregation。這種方法使我們能夠更清晰地抓住數(shù)據(jù)的本質(zhì),從而建立最佳的機器學(xué)習(xí)模型。
下圖所示的就是我們介紹過的所有Extraction Models,除了這四節(jié)課講的內(nèi)容之外,還包括之前介紹的Adaptive/Gradient Boosting模型。因為之前筆記中都詳細介紹過,這里就不再一一總結(jié)了。
除了各種Extraction Models之外,我們這四節(jié)課還介紹了不同的Extraction Techniques。下圖所示的是對應(yīng)于不同的Extraction Models的Extraction Techniques。
最后,總結(jié)一下這些Extraction Models有什么樣的優(yōu)點和缺點。從優(yōu)點上來說:
easy:機器自己完成特征提取,減少人類工作量
powerful:能夠處理非常復(fù)雜的問題和特征提取
另一方面,從缺點上來說:
hard:通常遇到non-convex的優(yōu)化問題,求解較困難,容易得到局部最優(yōu)解而非全局最優(yōu)解
overfitting:模型復(fù)雜,容易造成過擬合,需要進行正則化處理
所以說,Extraction Models是一個非常強大的機器學(xué)習(xí)工具,但是使用的時候也要小心處理各種可能存在的問題。
5
Summary
本文主要介紹了Matrix Factorization。從電影推薦系統(tǒng)模型出發(fā),首先,我們介紹了Linear Network。它從用戶ID編碼后的向量中提取出有用的特征,這是典型的feature extraction。然后,我們介紹了基本的Matrix Factorization算法,即alternating least squares,不斷地在用戶和電影之間交互地做linear regression進行優(yōu)化。為了簡化計算,提高運算速度,也可以使用SGD來實現(xiàn)。事實證明,SGD更加高效和簡單。同時,我們可以根據(jù)具體的問題和需求,對固有算法進行一些簡單的調(diào)整,來獲得更好的效果。最后,我們對已經(jīng)介紹的所有Extraction Models做個簡單的總結(jié)。Extraction Models在實際應(yīng)用中是個非常強大的工具,但是也要避免出現(xiàn)過擬合等問題。
往期回顧
【1】線性支持向量機(LSVM)
【2】深度學(xué)習(xí)概述
【3】
【4】
【5】卷積神經(jīng)網(wǎng)絡(luò)CNN基礎(chǔ)
【6】循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
【7】干貨 | 吳恩達deeplearning.ai專項課程歷史文章匯總
【8】簡單的梯度下降算法,你真的懂了嗎?
【9】力薦 | 臺大林軒田《機器學(xué)習(xí)基石》資源匯總
長按二維碼
掃描關(guān)注
如果喜歡我的文章,就點贊或分享吧!
總結(jié)
以上是生活随笔為你收集整理的简述推荐系统中的矩阵分解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【完结】林轩田机器学习技法终章
- 下一篇: 如何改变对话或窗体视窗的背景颜色