[ML] 機器學習技法:第十五講 Matrix Factorization

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第十五講 Matrix Factorization

Basic Matrix Factorization

常數項 x0(l) 被移除
  1. 初始化 d~×1 維度的 {wm},{vm}
    通常為隨機產生,以免陷入 Local optimum
  2. alternating optimization Ein 直到收斂
    1. 最佳化 w1,w2,,wM
      更新 wm,利用 m-th-movie 的 {(vn,rnm)} 做 linear regression
    2. 最佳化 v1,v2,,vN
      更新 vn,利用 n-th-user 的 {(wm,rnm)} 做 linear regression
首先,先說明例子
共有 100,480,507 ratings,裡面有 480,189 users 對於 17,770 movies 進行評分
定義資料為 {(x~n=(n),yn=rnm)}:第 n 個使用者對於第 m 部電影給予評分 r
在這比較特別的是 x~n=(n) 是抽象的
只知道編號,不會知道其他任何資料,像是男女、高矮、胖瘦等
這種 feature 也叫做 categorical features
無任何數值的意義,只是種類,像是 ID, 血型, 喜好語言等,皆是此特性
目前學過的方法,可以直接處理的,只有 decision trees,其餘皆需要再轉換為 numerical
可以使用 binary vector encoding,像是血型
A=[1 0 0 0]TB=[0 1 0 0]TAB=[0 0 1 0]TO=[0 0 0 1]T 所以將評分資料重新編碼,並且整合在一起,稱作
D={(x~n=BinaryVectorEncoding(n),yn=[rn1 ?  ? rn4 rn5  rnM]T)} 因為不見得使用者能對每部電影都有評分,所以 yn 會有缺,也就是 ? 項
考慮利用 Nd~M 類神經網路莘取出特徵
將常數項 x0(l) 移掉,比較簡單分析,也可以加入,模型略有變化而已
然而,tanh 是必要的嗎?
事實上因為 x 只會在一個維度上為 1,其他皆為 0
所以再多經過一次轉換並不是必須的,所以可改為線性
而且 yn 可缺項,並將前後的權值重新命名為 VTW,推導時會比較簡潔
h(x)=(Wd~×M)TVd~×NxN×1h(xn)=(Wd~×M)TVd~×NxnN×1Φ(xn)=(Wd~×M)TVd~×N[010]=(Wd~×M)Tvnhm(x)=wmTΦ(x)hm(xn)=wmTΦ(xn)=wmTvn vnV 的 n-th column
從式子可看到 vn 代表的是使用者的喜好
hm(x) 則是對於 m-th 電影的評分
wmTvn 則為第 n 個使用者對於第 m 個電影的預測評分
所以事實上如下,是在將 R 矩陣,拆分為兩個矩陣 VW
V 為使用者對電影特性的喜好度,搞笑/恐怖/愛情....
W 為電影具備的特性,搞笑/恐怖/愛情....
這也是 Matrix Factorization 的由來
並由以上,可定義
Ein({wm},{vn})=1m=1M|Dm|user n rated movie m(rnmwmTvn)2user n rated movie m(rnmwmTvn)2=m=1M((xn,rnm)Dm(rnmwmTvn)2)(1)=n=1N((m,rnm)Dn(rnmwmTvn)2) (2) Dm 表示第 m 部電影的所有使用者評價
Dn 表示第 n 個使用者的所有電影評價
該如何 minW,V Ein({wm},{vn}) 呢?
利用 alternating minimization 不就好了
固定 vn,求 wm,不就是求 EinDm 的 linear regresson,同 (1) 式
固定 wm,求 vn,不就是求 EinDn 的 linear regresson,同 (2) 式
交叉反覆求其 linear regression 的解,直到收斂,會收斂的原因來自 Ein 的下限為 0
此做法也叫作 alternating least squares algorithm
記住,這邊並無常數項 x0(l)

Linear Autoencoder vs. Matrix Factorization

Linear Autoencoder ≡ 特別的 Matrix Factorization 其 X 為 complete
比較如下圖
Linear autoencoder 可參考 [ML] 機器學習技法:第十三講 Deep Learning

Stochastic Gradient Descent Matrix Factorization

較適用於龐大的資料
  1. 初始化 d~×1 維度的 {wm},{vm}
    通常為隨機產生,以免陷入 Local optimum 
  2. for t=0,1,,T
    1. 隨機從 rnm 挑出一個
    2. 計算 residual r~nm=(rnmwmTvn)
    3. SGD-update
      vnnewvnold+ηr~nmwmoldwmnewwmold+ηr~nmvnold
SGD 可參考 [ML] 機器學習基石:第十一講 Linear Models for Classification
單個的錯誤如下式
err(user n,movie m,rating rnm)=(rnmwmTvn)2 因為是針對 n,m 隨機抽取,所以除 n,m 以外的 gradient 是為 0,無需 update
故對 n,m 取 gradient
vnerr=2(rnmwmTvn)(wm)=2(rnmwmTvn)wm(residual)wmwmerr=2(rnmwmTvn)(vn)=2(rnmwmTvn)vn(residual)vnr~nm=(rnmwmTvn)
vnnewvnoldη~(2r~nmwmold)=vnold+2η~r~nmwmold=vnold+ηr~nmwmoldwmnewwmoldη~(2r~nmvnold)=wmold+2η~r~nmvnold=wmold+ηr~nmvnold 但注意,wmvn 初始值皆為 0,則無法有任何更新的行為
若對演算法有足夠的了解,可依其實際做出改善
針對電影的例子,因理論上越接近現在的時間,越接近使用者的喜好
依 SGD 設計出改進方案,最後 T 次的更新限定在從最近的資料挑選,不再是從全部挑選

總結


程式碼

BinaryVectorEncoding
  1. from sklearn import preprocessing
  2.  
  3.  
  4. lb = preprocessing.LabelBinarizer()
  5.  
  6. lb.fit(['A', 'B', 'A', 'AB', 'O'])
  7.  
  8. print(lb.classes_)
  9. # array(['A' 'AB' 'B' 'O'])
  10.  
  11. print(lb.transform(['A', 'B']))
  12. # [[1 0 0 0]
  13. # [0 0 1 0]]

參考

sklearn.preprocessing.LabelBinarizer
sklearn.preprocessing.OneHotEncoder

留言