1. 程式人生 > >ALS(alternating least squares)交替最小二乘

ALS(alternating least squares)交替最小二乘

  ALS演算法是2008年以來,用的比較多的協同過濾演算法。它已經整合到Spark的Mllib庫中,使用起來比較方便。

1 矩陣分解

  使用者對物品的打分行為可以表示成一個評分矩陣A(m*n),表示m個使用者對n各物品的打分情況。如下圖所示。

u\v v1 v2 v3
u1 5 4 3
u2 ? 5 ?
u3 4 ? 2

  其中,A(i,j)表示使用者useri對物品itemj的打分。但是,使用者不會對所有物品打分,圖中?表示使用者沒有打分的情況,所以這個矩陣A很多元素都是空的,我們稱其為“缺失值(missing value)”。在推薦系統中,我們希望得到使用者對所有物品的打分情況,如果使用者沒有對一個物品打分,那麼就需要預測使用者是否會對物品打分,以及會打多少分。這就是所謂的“矩陣補全(填空)”。一個m×n的打分矩陣,A 可以用兩個小矩陣U(m×k)和V(n×k)的乘積來近似:A≈U

VT,k≪m,n。這樣我們就把整個系統的自由度從O(mn)下降到O((m+n)∙k)。舉個例子,我喜歡看略帶黑色幽默的警匪電影,那麼大家根據這個描述就知道我大概會喜歡昆汀的《低俗小說》、《落水狗》和韋家輝的《一個字頭的誕生》。這些電影都符合我對自己喜好的描述,也就是說他們在這個抽象的低維空間的投影和我的喜好相似。再抽象一些,把人們的喜好和電影的特徵都投到這個低維空間,一個人的喜好對映到了一個低維向量ui,一個電影的特徵變成了緯度相同的向量vj,那麼這個人和這個電影的相似度就可以表述成這兩個向量之間的內積。我們把打分理解成相似度,那麼“打分矩陣A(m*n)”就可以由“使用者喜好特徵矩陣U(m*k)”和“產品特徵矩陣V(n*k)”

u\F f1 f2 f3
u1 ? ? ?
u2 ? ? ?
u3 ? ? ?
u\F f1 f2 f3
v1 ? ? ?
v2 ? ? ?
v3 ? ? ?
v4 ? ? ?
v5 ? ? ?

2 交替最小二乘(ALS)

  演算法的思想就是:對目標函式,先隨機生成然後固定它求解,再固定求解,這樣交替進行下去,直到取得最優解min(C)。因為每步迭代都會降低誤差,並且誤差是有下界的,所以 ALS 一定會收斂。但由於問題是非凸的,ALS 並不保證會收斂到全域性最優解。但在實際應用中,ALS 對初始點不是很敏感,是否全域性最優解造成的影響並不大。

  我們使用使用者喜好特徵矩陣U(m∗k)中的第i個使用者的特徵向量ui,和產品特徵矩陣V(n∗k)第j個產品的特徵向量vj來預測打分矩陣A(m∗n)中的a(ij)。我們可以得出一下的矩陣分解模型的損失函式為:

C=(i,jR)[(aijuivTj)2+λ(u2i+v2j)]

  有了損失函式之後,下面就開始介紹優化方法。通常的優化方法分為兩種:交叉最小二乘法(alternative least squares)和隨機梯度下降法(stochastic gradient descent)。Spark使用的是交叉最小二乘法(ALS)來最優化損失函式。
演算法執行步驟:
  • 先隨機生成一個。一般取全域性均值。
  • 固定,即認為是已知的常量,來求解:

c=(i,jR)(a(ij)u(0)ivTj)2]+λ((u2i)(0))+v2j)

  由於上式中只有vj一個未知變數,因此C的最優化問題轉化為最小二乘問題,用最小二乘法求解vj的最優解:

  固定j,j∈(1,2,…,n),則:等式兩邊關於為vj求導得:

d(c)d(vj)=dd(vj)((i=1)m[(a(ij)u(0)ivTj)2+λ((u2i)(0))+v2j])=(i=1)m[2(a(ij)u(0)ivTj)((uTi)(0))+2λvj]=2(i=1)m[(u(0)i(uTi)(0)+λ)vja(ij)(uTi)(0)]

  令上式等於0,得: