推薦系統(Recommender systems)


推薦系統(Recommender systems)

​ 這里討論推薦系統有兩個深層原因或者說動機,第一個原因在於它是機器學習的一個重要應用,在過去的幾年中在參觀硅谷的各種科技類公司中,經常在那些公司里與開發機器學習應用的人交流,談及什么才是機器學習最重要的應用,或者什么樣的機器學習的應用是最想讓它的表現得到改進的,最常聽到的回答其中之一就是現在硅谷有好多個團隊正試圖建立更好的推薦系統。比如亞馬遜、Netflix、eBay或者蘋果公司的iTunes Genius做的事情,有很多網站或者很多系統試圖向用戶推薦新產品,比如說亞馬遜會推薦新書,Netflix推薦新電影等等。這些推薦系統可能會看看你以前購買過什么書或者以前你給哪些電影進行過評分,這些系統貢獻了現今亞馬遜收入的相當大一部分,而對像Netflix這樣的公司,他們向用戶推薦的電影占了用戶觀看的電影的相當大一部分,於是一個推薦系統其表現的一些改進就能帶來顯著且即刻產生的影響這種影響關系到許多公司的最終業績。

​ 第二個動機是我們已經在前面章節中看到對於機器學習來說特征量(features)的重要性,所選擇的特征對於學習算法的表現有很大影響,在機器學習領域有這么一個宏大的想法就是對於一些問題而言存在一些算法能自動地替代人類學習到一組優良的特征量,即有些情形下能夠采用一種算法來學習到使用什么特征量,而推薦系統就是這種情形的一個例子,還有其他很多例子但通過學習推薦系統我們將能夠對這種學習特征量的想法有一點理解。

1.預測電影評分

​ 假想有一個影評網站,比方說允許評分在0顆星至5顆星之間,這里有5部電影《愛到最后》、《浪漫永遠》、《小愛犬》、《無盡狂飆》還有《劍與空手道》,我們有4位用戶名叫Alice,Bob,Carol和Dave。或稱他們用戶1、2、3和4,比方說Alice她非常喜歡《愛到最后》把它評為5顆星,她還喜歡《浪漫永遠》也把它評為5顆星,她沒看過《小愛犬》也就沒評分這樣我們沒有這個評分數據,Alice很不喜歡《無盡狂飆》或是《劍與空手道》把它們評為0顆星。其他3位用戶的的評價如下:

![1.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fi15q6ccinj20h105vjry.jpg)
\(n_u\):表示用戶的數目
\(n_m\):表示電影的數目
\(r(i,j)=1\):表示用戶j對電影i做了評分(否則即為做評分時為零)
\(y^{(i,j)}\):用戶j對電影i的評分(前提做了評分)
​ 推薦系統問題就是給定這些數據r(i,j)和y(i,j)數值,然后瀏覽全部數據,關注所有沒有電影評分的地方,並試圖預測這些帶問號的地方應該是什么數值,在這個例子中電影數量很少用戶數量也很少,大多數用戶給大多數電影評過分,但在現實情況中網站的用戶他們每個人可能只給很少一部分電影評過分,於是我們開發一個推薦系統主要工作就是想出一種學習算法能夠幫我們自動地填上這些缺失的數值,這樣我們對於用戶還沒看過哪些電影,然后向用戶推薦新電影。

​ 首先介紹第一種構造推薦系統的方法,這種方法叫做“基於內容的推薦”(content-based recommendations)。應該如何預測這些缺少的問號評分值呢?假設對這些電影的每一部,都用一些特征來描述,具體來講,假設每部電影有兩種特征分別用x1和x2代表,x1表示這部電影屬於愛情電影的程度,x2表示這部電影是動作電影的程度,因此對於電影《愛到最后》那么這部電影是愛情電影的比率為0.9,但是它屬於動作電影的比率為0,《浪漫永遠》愛情比率1.0,動作比率0.01,等等如下所示:

![2.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fi15q6p781j20kt05q3ze.jpg)
​ 所以如果每部電影我們可以用一個特征矩陣表示,對於電影1《愛到最后》,兩個特征值分別是0.9和0,這就是特征變量x\_1和x\_2分別對應於0.9和0,這里還是像以前一樣加一個額外的特征變量截距x\_0其值為1。把三個特征變量放在一起,這樣就有了特征$x^{(1)}$,這個上標括號(1)表示這是第一部電影的特征向量。對電影2《浪漫永遠》我們有另外一個特征向量$x^{(2)}$等等,

​ 我們可以把對每個觀眾打分的預測當成一個獨立的線性回歸問題,具體來說,比如每一個用戶j,我們都學習出一個參數\(\theta^{(j)}\)(這里是一個三維向量),然后要根據參數向量θ與特征\(x^{(i)}\)的內積來預測用戶j對電影i的評分即\((\theta^{(j)})^Tx^{(i)}\)

​ 看一個具體的例子,對於用戶1即Alice對應的參數向量就應該是\(\theta^{(1)}\),現在假如我們想預測Alice對電影《小愛犬》是如何評價的那么這部電影,有一個參數向量\(x^{(3)}\)等於[1,0.99,0],其中1是截距項,另外兩個是特征0.99和0。假如說對於這個例子,已經知道Alice的參數向量\(\theta^{(1)}\)(后面會詳細講到如何獲得這個參數)等於[0,5,0]。因此這兩個向量的內積就等於5×0.99結果為4.95,故我們預測Alice得評分結果將為4.95。

​ 現在可以把這個問題寫成如下更正式一些,用r(i,j)=1來表示用戶j對電影i進行了評分,y(i,j)則表示用戶j對電影i的評分值,\(\theta^{(j)}\)表示用戶j對應的參數向量,\(x^{(i)}\)是某部電影i的特征向量,那么某個用戶對某部電影的評分就是\((\theta^{(j)})^Tx^{(i)}\)

​ 現在臨時介紹一個額外的表示符號\(m^{(j)}\),用來表示用戶j評價過的電影數量,預測評分是一個基本的線性回歸問題,因此我們要做的就是選擇一個參數向量\(\theta^{(j)}\),使得預測的結果盡可能接近我們在訓練集中的觀測值。因此我們要關於\(\theta^{(j)}\)最小化下面這個求和值:\(min_{\theta^{(j)}}\left[\frac{1}{2m^{(j)}}\Sigma_{i:r(i,j)=1}((\theta^{(j)})^T(x^{(i)})-y^{(i,j)})^2+\frac{\lambda}{2m^{(j)}}\Sigma_{k=1}^n(\theta_k^{(j)})^2\right]\)

​ 對於推薦系統,這里把符號稍微簡化一下,去掉常數項\(m^(j)\),去掉這一項不改變θ(j)的最優化結果,\(min_{\theta^{(j)}}\left[\frac{1}{2}\Sigma_{i:r(i,j)=1}((\theta^{(j)})^T(x^{(i)})-y^{(i,j)})^2+\frac{\lambda}{2}\Sigma_{k=1}^n(\theta_k^{(j)})^2\right]\)

​ 在構建推薦系統的時候我們也不想只對某一個用戶學習出參數向量,我們想對所有的用戶都學習出θ,因為有\(n_u\)個用戶,所以希望學習出所有的參數,那么要做的是將上面這個最優化目標再加上一個求和:\(min_{\theta^{(j)}}\left[\frac{1}{2}\Sigma_{j=1}^{n_u}\Sigma_{i:r(i,j)=1}((\theta^{(j)})^T(x^{(i)})-y^{(i,j)})^2+\frac{\lambda}{2}\Sigma_{j=1}^{n_u}\Sigma_{k=1}^n(\theta_k^{(j)})^2\right]\) ,這里把想要最優化的項稱為:\(J(\theta^{(1)},..., \theta^{(n_u)})\),同樣地J還是我們要最小化的最優化目標函數。

3.jpg

​ 如果想要用梯度下降來求出這個J的最小值,可能會用到這些式子:

![4.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fi15q7nqw9j20f9052q3e.jpg)
​ 事實上這里介紹的算法是線性回歸的一個變體,用來預測不同用戶對不同電影的評分值,這種具體的算法叫“基於內容的推薦”或者“基於內容的方法”。因為我們假設我們有不同電影的特征,比如電影的愛情成分有多少,動作成分有多少等等,我們就是用電影的這些特征來進行預測。

2.協同過濾(collaborative filtering)

​ 協同濾波算法能夠自行學習所要使用的特征,在上一小節中的基於內容的推薦中,每一部電影都有明確的浪漫指數是多少,動作指數是多少,但細想可以知道這樣做難度很大,花費時間很多,要讓每個人看完每一部電影后說出每一部電影有多浪漫多動作是一件不容易的事情,而且通常除這兩個特征之外的其他指數有很多。

​ 所以讓我們轉移一下問題,假如我們有一個數據集,但並不知道特征的值是多少,當我們得到一些不同用戶對電影的評分,我們並不知道每部電影到底有多少浪漫的成分,或動作成分,於是把所有的特征都打上問號,如下圖所示:

![5.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fi15q8bwmtj20kt05qwf6.jpg)
​ 假設我們采訪了每一位觀影觀眾,而且每一位觀眾都告訴我們他們是否喜歡愛情電影以及他們是否喜歡動作電影,假如Alice告訴我們她十分喜歡愛情電影,於是Alice的特征x1對應的值就是5,而且她非常不喜歡動作電影,於是這一個特征就是0,類似的我們就是有和關於每個人的觀影喜好參數θ如下:
![6.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fi15q8ss90j20fs0350t4.jpg)
​ 那么現在我們在理論上就能推測出每部電影的特征值x1和x2,具體的,我們來看電影1《愛到最后》,我們已經知道的就是Alice喜歡這部電影,Bob喜歡這部電影,而Carol和Dave不喜歡它,我們從特征向量已經知道了Alice和Bob喜歡愛情電影,因為他們的θ參數說明了他們的愛好,相反Carol和Dave他們不喜歡愛情電影,而喜歡動作電影。考慮截距項部分,則第1部電影的特征向量為:$x^{(1)}=\begin{bmatrix}1\\ ?\\ ?\end{bmatrix}$。我們真正需要的是特征向量$x^{(1)}$應該是什么才能滿足:$(\theta^{(1)})^Tx^{(1)}\approx5, (\theta^{(2)})^Tx^{(1)}\approx5, (\theta^{(3)})^Tx^{(1)}\approx0, (\theta^{(4)})^Tx^{(1)}\approx0$,由此可知$x^{(1)}$應該用[1,1.0,0.0]這個向量表示。

​ 更一般的,假設用戶告訴了我們的偏好,即已經給我們提供了\(\theta^{(1)}\)\(\theta^{(n_u)}\)的值,而我們想知道電影i的特征向量\(x^{(i)}\),我們可以列出以下的最優化的問題:

![7.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fi15q8xe2pj20ba01mjrc.jpg)
​ 所以現在要最小化上式(畫拉線部分)得平方誤差,通過選擇特征$x^{(i)}$使我們預測的用戶j對該電影i評分的預測值,跟我們從用戶j處實際得到的評分值差值不要太大。和之前一樣我們可以加上一個正則化項來防止特征的數值變得過大。

​ 我們要做的是學習出所有電影的所有特征,所以現在要做的是在此加上另外的一個求和,即對所有的電影n_m求和,然后最小化整個這個目標函數,針對所有的電影這樣就會得到如下的最優化的問題:

![8.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fi15q9ckzmj20ex01qdfs.jpg)
​ 如果將上式最小化的話就能得到所有電影的一系列合理的特征。

​ 上一小節“基於內容的推薦”算法講的是,若有對一系列電影的評分,那么根據不同電影的特征\(x^{(1)},..., x^{(n_m)}\),我們可以得到參數θ。本節中我們主要講的是如果用戶願意提供參數θ,那么可以為不同的電影估計特征。

​ 有點像先有雞還是先有蛋的問題,如果我們能知道θ就能學習到x,相對的如果我們知道x也會學出θ,所以實際上應該隨機猜θ的值,接着基於一開始隨機猜測出的θ的值繼而學習出不同電影的特征,給出已有的一些電影的原始特征,再運用上一個小節中討論過的方法,得到對參數θ的更好估計,為用戶提供更好的參數θ集,接着繼續迭代,不停重復優化θ、x、θ、x、θ。算法將會收斂到一組合理的特征以及一組合理的用戶參數的估計。

具體算法實現

​ 如果給出電影的幾個特征,我們可以使用這些資料去獲得用戶的參數數據,如果給出用戶的參數數據,那么可以使用這些資料去獲得電影的特征,我們將它們合並成協同過濾算法(Collaborative Filtering Algorithm)。即不停地重復下面的式子的計算,隨機地初始化這些參數,然后解出θ,解出x,解出θ,解出x...實際上存在一個更有效率的算法,不再需要像這樣不停地計算x和θ,而是能夠將x和θ同時計算出來。

![9.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fi15q9xzs7j20kn04qabw.jpg)
​ 我們所要做的是將上式這兩個優化目標函數給合為一個。因此,首先要定義新的優化目標函數J,它應該依然是一個代價函數,是關於特征x和參數θ的函數,上式中的第一個求和運算(藍色圈住內容)是關於所有用戶J的總和,意思是對每個用戶關於該用戶評分的電影的求和,而下面的求和運算(紅色圈住內容)只是用相反的順序來計算關於每部電影i,所有曾經對它評分過的用戶j的評分求和,因此這兩個式子其實下面黑色方框所圈內容。
![10.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fi15qay4u6j20qb03tdhb.jpg)
​ 然后這個新的優化目標函數里關於θ的正則化,它有一個很有趣的特性,假設x為常數並關於θ優化的話,反過來也一樣,如果把θ作為常量,然后關於x求J的最小值的話那就與第二個式子相等,所以這里是一個將x和θ合並起來的代價函數。

​ 此外,當我們以這樣的方法學習特征量時,之前的前提是我們所使用的特征x0(即截距量)等於1,當我們以這種形式去學習特征量時,我們必須要去掉這個截距量,我們這里移除的理由是:我們沒有必要去將這個等於一的特征值固定,因為如果算法想要的話,可以將特征值x1設為1,所以沒有必要去將1這個特征定死,這樣算法有了靈活性去自行學習。

​ 總結一下,首先我們會把\(x^{(1)},...,x^{(n_m)}\)\(\theta^{(1)},...,\theta^{(n_u)}\)初始為小的隨機值,接下來我們要用梯度下降或者某些其他的高級優化算法把這個代價函數\(J(x^{(1)},...,x^{(n_m)}, \theta^{(1)},...,\theta^{(n_u)})\)最小化,梯度下降法寫出來的更新公式如下:

![11.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fi15qcncuhj20b803aglr.jpg)
​ 最后,若給你一個用戶如果這個用戶具有一些參數θ,以及給你一部電影帶有已知的特征x,我們可以預測這部電影會被給出怎樣的評分:$\theta^Tx$。

3.協同過濾算法的向量化實現

​ 我們有五部電影的數據集(如下圖),首先將要做的是將這些用戶的電影評分進行分組並存到一個矩陣中,我們共有五部電影以及四位用戶,那么這個矩陣Y就是一個5行4列的矩陣,它將這些電影的用戶評分數據都存在矩陣里,包括問號標注出的。

![1.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fi1t8h3zibj20hs051q39.jpg)
​ 具體地,某位用戶預測某部電影的評分可以按下面這個公式計算,就是用戶j對電影i的預測評分對應(i,j)位置的數據,准確說來其值等於$(\theta^{(j)})^Tx^{(i)}$,故矩陣中的第一個元素是第一位用戶對第一部電影的預測分數,第一行第二列的元素的預測評分是第二位用戶對第一部電影的打分等等。
![2.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fi1t8hjzgyj20f104ft9z.jpg)
​ 這里給出一個更簡化的向量化的方法,具體來說,定義矩陣X等於$x^{(1)}$轉置$x^{(2)}$轉置一直到$x^{(n_m)}$的轉置,即每一部電影的特征按行堆疊起來,我們要做的是再定義一個大寫的Θ矩陣,將每一位用戶的參數向量$\theta^{(j)}$也按行堆疊起來,為了能有一個向量化的方法以計算這些矩陣的預測值,我們可以計算X矩陣乘Θ矩陣的轉置(即$X\Theta^T$),這就給出了一種更簡化的向量化的方法。協同過濾算法還有另外一個名字:**低秩矩陣分解**(Low Rank Matrix Factorization)
![3.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fi1t8i0gd1j20ep03o3yn.jpg)
​ 協同過濾算法有個很好的應用,假如有一部電影i,你想找到與電影i類似的某部電影j,我么利用協同過濾算法到對特征參數向量進行學習,就會有一個很方便的方法來度量兩部電影之間的相似性,例如說電影i有一個特征向量$x^{(i)}$,這時問題關鍵在於否能找到一部不同的電影j保證兩部電影的特征向量之間的距離$x^{(i)}$和$x^{(j)}$很小,即($small||x^{(i)}-x^{(j)}||$),距離越小那就越有力表明電影i和電影j的相似性,至少在某種意義上某些人喜歡電影i或許更有可能也對電影j感興趣。

​ 本節最后談一談均值歸一化(Mean Normalization),它可以讓協同濾波算法算法運行得更好。

​ 首先我們了解均值歸一化這個想法的動機,還是之前的電影評分的例子,考慮一下有一個用戶沒有給任何電影評分,即第五個用戶Eve她沒有給任何電影評分,我們來看看協同過濾算法會對這個用戶做什么。

![4.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fi1t8ig1ezj20n004w75l.jpg)

5.jpg

​ 假如n等於2,即我們要學習兩個特征變量還要學習出一個參數向量\(\theta^{(5)}​\),任然提醒一下,這個向量是n維的而不是n+1維的,根據優化函數,用戶Eve沒給任何電影打過分,所以對用戶Eve來說沒有電影滿足r(i,j)=1這個條件,所以優化函數中的第一項(與實際評分差)完全不影響\(\theta^{(5)}​\)的值,所以影響\(\theta^{(5)}​\)值的唯一一項是最后的正則化項,優化的目的是盡可能地讓正則化項小,換句話說我們想要最小化\(\frac{\lambda}{2}[(\theta_1^{(5)})^2+(\theta_2^{(5)})^2]​\),所以最終得到的就會是\(\theta^{(5)}​\)=[0;0]。

​ 因為正則化項會讓你的參數接近0,如果沒有數據能夠使得參數遠離0,那么就會得到\(\theta^{(5)}\)等於零向量。所以當我們要預測用戶5給電影打分結果,有\((\theta^{(5)})^Tx^{(i)}\),易見對任意i結果都會等於0,因此我們根據結果會預測Eve給所有電影的評分都是零星,這個結果我們還是沒有任何好方法來把電影推薦給她,因為預測結果是所有這些電影都會被Eve給出一樣的評分,沒有一部電影擁有高一點兒的預測評分讓我們能推薦給她。

​ 均值歸一化的想法可以讓我們解決這個問題,把所有這些評分全部整合到矩陣Y中,全部是問號的這列對應着Eve沒有給任何電影評分。為了實現均值歸一化,首先計算每個電影所得評分的均值,把它們存在一個向量µ中,接着重新定義Y矩陣,將Y的每一列減去向量µ重新更新每一列,這樣把每個電影都歸一化為平均評分為零,當然未打分的這些問號沒變。

![6.jpg](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fi1t8jjzgrj20kx03mwfx.jpg)
​ 接下來對這個評分數據集使用協同過濾算法,做電影評分預測,由於預測結果的計算為:$(\theta^{(j)})^Tx^{(i)}$,但是有一點不同,因為之前已經對數據集減去了均值,所以為了給電影i預測評分要把這個均值加回來,即實際預測值應為:$(\theta^{(j)})^Tx^{(i)}+\mu_i$。

​ 因為Eve從來沒有給任何電影打分,所以學習到的用戶5的參數仍然還是零向量,這樣我們預測Eve的評分是\((\theta^{(5)})^Tx^{(i)}+\mu_i\),所以如果學習的等於0的話,對電影i的評分我們最終會預測為µi,即對於電影1我們會預測Eve對它的評分是2.5,對於電影2我們會預測Eve給它2.5星,對於電影3我們會預測Eve給它2星等等。我們就對這個新的觀影用戶Eve一無所知,我們預測她對每個電影的評分就是這些電影所得的平均評分,就是這些電影所得的平均評分。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM