1.概念解釋
1.1 矩陣分解和svd
就是講一個大矩陣分解爲若干個小矩陣的點積,這樣做的一個典型邏輯是降低參數量,相當於 Rm*n = Rm*k.dot( Rk*n ),將m*n個參數縮減爲 (m + n) *k個參數,起到的效果幾乎一致,深度(機器)學習中降低參數量,矩陣分解是很常用的技巧。這裏k是超參,極端情況1的話,相當於m*n變爲了m+n
大學矩陣分解常用的情況是方陣的特徵值和特徵向量,所謂Av=λv, A.dot[(v1, v2, ...)] = (λ1v1, λ2v2, ...), 則 A = (λ1v1, λ2v2, ...).dot[(v1, v2, ...) ^-1],再分開寫就是 A = (v1, v2, ...).dot[(λ1,λ2,... 對角線矩陣)].dot[(v1, v2, ...)]
上面的寫法和奇異值分解(svd)就比較像了,實際上上面的特徵向量和特徵值矩陣點積的形式就是奇異值分解的特例。對於非方陣(當然也包括方針)的情況 Rm*n = Am*m.dot(Bm*n).dot(Cn*n),其中中間的m*n就是奇異值在對角線構成的矩陣
奇異值和特徵值是有含義的代表的是特徵向量,注意不要大學線代口頭禪說多了,忘了‘特徵’向量的含義,這個‘特徵’向量可以正好用於機器學習‘特徵’這個概念。而且奇異值(特徵值)代表了這個特徵向量的權重,所以如果降維的話,很自然的一個考慮就是把主要特徵向量留下來,其他的權重低的扔掉即可。
做法就是奇異值只取前k行k列,A特徵向量矩陣只取前k列,C特徵向量矩陣只取前k行,這樣就變爲了Rm*n = Am*k.dot(Bk*k).dot(Ck*n),爲了減少一個矩陣,比如AB矩陣點積合併,得到 Rm*n = Um*k.dot(Dk*n),這就是svd用於協同過濾推薦場景邏輯推演過程。其中Um*k可以理解爲所有用戶信息表示矩陣,Dk*n表示商品的矩陣。
順帶說一下svd奇異值分解本身降維的用法和這裏的區別,svd用於訓練樣本特徵矩陣降維的話,處理思路是 Rm*k=Am*m.dot(Bm*k).dot(Ck*k), 會直接處理特徵(商品)代表的矩陣,這樣才能將特徵數量降下來嘛。
綜上矩陣分解是一個很寬泛的概念,其實可以任意定義分解的子矩陣個數和連接關係(點擊還是啥),但是常用的還是svd邏輯的矩陣分解形式
1.2 biasSVD
上面的矩陣分解在推薦系統的場景就是對用戶商品評分矩陣進行處理。biasSVD的意思是不同用戶的評分習慣是不一樣的,有的人就是比較嚴苛,啥都打的分比較低,有人相反,比如豆瓣和貓眼電影評分差距就知道了,貓眼是人是鬼分都不低(較之於豆瓣)。所以模型公式要本身把這種情況表徵出來,設計參數代表這個含義,讓模型可以自發去學習該參數。如何表徵呢?
對於矩陣分解後的U矩陣和D矩陣,Sij = Ui * Dj,Sij含義是用戶i對於商品j的評分。考慮偏好(bias)不一樣之後, Sij = Ui * Dj + b + bi + bj,其中b代表平均分,bi代表用戶i對平均分偏離度,bj代表商品本身內涵評分對於平均分的偏離度。損失函數沒有變化,還是乘積後矩陣和本身矩陣的mse,用梯度下降法來求。
爲何用梯度下降法來求兩個矩陣?因爲生產環境中,矩陣非常稀疏,不適合svd分解,且梯度下降法可以用本身的一些平均分等來初始化矩陣,效果效率沒有那麼差。
1.3 svd++
svd++考慮了這個情況。用戶本身的對於哪些商品評分(往往是購買後的情況)本身就是一個隱語義信息,這個信息也可以表徵到我的模型中。Sij = b + bi + bj + (Ui + 1/根號|N(u)| * Σt∈N(i) yt) * Dj . 其中 N(i)代表用戶i評價的商品列表,|N(u)| 代表列表長度,1/根號|N(u)| 是用來縮放的,Σt∈N(i) yt 是將y向量中所有屬於用戶i評分過的商品隱語義值求和。說一下參數量,對於模型的細節理解和實現脫不開對於模型參數量的理解。Um*k, Dk*n, b就一個,bi一共m個數,bj一共n個數,yt也是n個數,所以參數總量爲 (m+n)*(k+1) + n + 1
2.其他學習博客鏈接