天天看點

DW FM打卡

(SVD)

1. 隐語義模型與矩陣分解

協同過濾算法的特點就是完全沒有利用到物品本身或者是使用者自身的屬性, 僅僅利用了使用者與物品的互動資訊就可以實作推薦,是一個可解釋性很強, 非常直覺的模型, 但是也存在一些問題, 第一個就是處理稀疏矩陣的能力比較弱, 是以為了使得協同過濾更好處理稀疏矩陣問題, 增強泛化能力, 從協同過濾中衍生出矩陣分解模型(Matrix Factorization,MF)或者叫隐語義模型, 兩者差不多說的一個意思, 就是在協同過濾共現矩陣的基礎上, 使用更稠密的隐向量表示使用者和物品, 挖掘使用者和物品的隐含興趣和隐含特征, 在一定程度上彌補協同過濾模型處理稀疏矩陣能力不足的問題。

2. 隐語義模型

隐語義模型最早在文本領域被提出,用于找到文本的隐含語義。在2006年, 被用于推薦中, 它的核心思想是通過隐含特征(latent factor)聯系使用者興趣和物品(item), 基于使用者的行為找出潛在的主題和分類, 然後對item進行自動聚類,劃分到不同類别/主題(使用者的興趣)。

這麼說可能有點抽象,是以下面拿項亮老師《推薦系統實踐》裡面的那個例子看一下:

如果我們知道了使用者A和使用者B兩個使用者在豆瓣的讀書清單, 從他們的閱讀清單可以看出,使用者A的興趣涉及偵探小說、科普圖書以及一些計算機技術書, 而使用者B的興趣比較集中在數學和機器學習方面。 那麼如何給A和B推薦圖書呢?

先說說協同過濾算法, 這樣好對比不同:

  • 對于UserCF,首先需要找到和他們看了同樣書的其他使用者(興趣相似的使用者),然後給他們推薦那些使用者喜歡的其他書。
  • 對于ItemCF,需要給他們推薦和他們已經看的書相似的書,比如作者B看了很多關于資料挖掘的書,可以給他推薦機器學習或者模式識别方面的書。
而如果是隐語義模型的話, 它會先通過一些角度把使用者興趣和這些書歸一下類, 當來了使用者之後, 首先得到他的興趣分類, 然後從這個分類中挑選他可能喜歡的書籍。

這裡就看到了隐語義模型和協同過濾的不同, 這裡說的角度其實就是這個隐含特征, 比如書籍的話它的内容, 作者, 年份, 主題等都可以算隐含特征,如果這個例子還不是很清晰的話, 那麼下面再舉個更為具體的例子, 看看是如何通過隐含特征來劃分開使用者興趣和物品的。但是在這之前, 相信通過上面這個例子, 我們已經隐隐約約感受到了協同過濾和隐語義模型的差別了, 下面放上王喆老師《深度學習推薦系統》的一個原理圖作為對比, 差別簡直一目了然:

DW FM打卡

我們下面拿一個音樂評分的例子來具體看一下隐特征矩陣的含義。

假設每個使用者都有自己的聽歌偏好, 比如A喜歡帶有小清新的, 吉他伴奏的, 王菲的歌曲,如果一首歌正好是王菲唱的, 并且是吉他伴奏的小清新, 那麼就可以将這首歌推薦給這個使用者。 也就是說是小清新, 吉他伴奏, 王菲這些元素連接配接起了使用者和歌曲。 當然每個使用者對不同的元素偏好不同, 每首歌包含的元素也不一樣, 是以我們就希望找到下面的兩個矩陣:

  1. 潛在因子—— 使用者矩陣Q

    這個矩陣表示不同使用者對于不同元素的偏好程度, 1代表很喜歡, 0代表不喜歡, 比如下面這樣:

DW FM打卡
  1. 潛在因子——音樂矩陣P

    表示每種音樂含有各種元素的成分, 比如下表中, 音樂A是一個偏小清新的音樂, 含有小清新的Latent Factor的成分是0.9, 重口味的成分是0.1, 優雅成分0.2…

DW FM打卡

利用上面的這兩個矩陣, 我們就能得出張三對音樂A的喜歡程度:

張三對小清新的偏好 * 音樂A含有小清新的成分 + 張三對重口味的偏好 * 音樂A含有重口味的成分 + 張三對優雅的偏好 * 音樂A含有優雅的成分…,

下面是對應的兩個隐向量:

DW FM打卡

根據隐向量其實就可以得到張三對音樂A的打分,即: 0.6 ∗ 0.9 + 0.8 ∗ 0.1 + 0.1 ∗ 0.2 + 0.1 ∗ 0.4 + 0.7 ∗ 0 = 0.69 0.6 * 0.9 + 0.8 * 0.1 + 0.1 * 0.2 + 0.1 * 0.4 + 0.7 * 0 = 0.69 0.6∗0.9+0.8∗0.1+0.1∗0.2+0.1∗0.4+0.7∗0=0.69

按照這個計算方式, 每個使用者對每首歌其實都可以得到這樣的分數, 最後就得到了我們的評分矩陣:

DW FM打卡

這裡的紅色表示使用者沒有打分,我們通過隐向量計算得到的。

上面例子中的小清晰, 重口味, 優雅這些就可以看做是隐含特征, 而通過這個隐含特征就可以把使用者的興趣和音樂的進行一個分類, 其實就是找到了每個使用者每個音樂的一個隐向量表達形式(embedding的原理其實也是這樣, 那裡是找到每個詞的隐向量表達), 這個隐向量就可以反映出使用者的興趣和物品的風格,并能将相似的物品推薦給相似的使用者等。 有沒有感覺到是把協同過濾算法進行了一種延伸, 把使用者的相似性和物品的相似性通過了一個叫做隐向量的方式進行表達

但是, 真實的情況下我們其實是沒有上面那兩個矩陣的, 音樂那麼多, 使用者那麼多, 我們沒有辦法去找一些隐特征去表示出這些東西, 另外一個問題就是即使能表示也不一定準, 對于每個使用者或者每個物品的風格,我們每個人都有不同的看法。 是以事實上, 我們有的隻有使用者的評分矩陣, 也就是最後的結果, 并且一般這種矩陣長這樣:

DW FM打卡

這種矩陣非常的稀疏,如果直接基于使用者相似性或者物品相似性去填充這個矩陣是不太容易的, 并且很容易出現長尾問題, 是以矩陣分解就可以比較容易的解決這個問題。

矩陣分解模型其實就是在想辦法基于這個評分矩陣去找到上面例子中的那兩個矩陣, 也就是使用者興趣和物品的隐向量表達, 然後就把這個評分矩陣分解成Q和P兩個矩陣乘積的形式, 這時候就可以基于這兩個矩陣去預測某個使用者對某個物品的評分了。 然後基于這個評分去進行推薦。這就是矩陣分解算法的原理。

矩陣分解算法的原理

在矩陣分解的算法架構下, 我們就可以通過分解協同過濾的共現矩陣來得到使用者和物品的隐向量, 就是上面的使用者矩陣Q和物品矩陣P, 這也是“矩陣分解”名字的由來。

DW FM打卡

矩陣分解算法将 m × n m\times n m×n維的共享矩陣 R R R分解成 m × k m \times k m×k維的使用者矩陣 U U U和 k × n k \times n k×n維的物品矩陣 V V V相乘的形式。 其中 m m m是使用者數量, n n n是物品數量, k k k是隐向量次元, 也就是隐含特征個數, 隻不過這裡的隐含特征變得不可解釋了, 即我們不知道具體含義了, 要模型自己去學。 k k k的大小決定了隐向量表達能力的強弱, k k k越大, 表達資訊就越強, 了解起來就是把使用者的興趣和物品的分類劃分的越具體。

那麼如果有了使用者矩陣和物品矩陣的話, 我們就知道了如果想計算使用者 u u u對物品 i i i的評分, 隻需要

Preference ⁡ ( u , i ) = r u i = p u T q i = ∑ f = 1 F p u , k q k , i \operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{f=1}^{F} p_{u, k} q_{k,i} Preference(u,i)=rui​=puT​qi​=f=1∑F​pu,k​qk,i​

這裡的 p u p_u pu​就是使用者 u u u的隐向量, 就類似與上面的張三向量, 注意這是列向量, q i q_i qi​是物品 i i i的隐向量, 就類似于上面的音樂A向量, 這個也是列向量, 是以才用了 p u T q i p_{u}^{T} q_{i} puT​qi​得到了一個數, 也就是使用者的最終評分, 計算過程其實和上面例子中一樣。 這裡的 p u , k p_{u,k} pu,k​和 q i , k q_{i,k} qi,k​是模型的參數, 也正是我們想辦法要計算的, p u , k p_{u,k} pu,k​度量的是使用者 u u u的興趣和第 k k k個隐類的關系, 而 q i , k q_{i,k} qi,k​度量了第 k k k個隐類和物品 i i i之間的關系。

矩陣分解

通過分解協同過濾的共現矩陣來得到使用者和物品的隐向量

這裡的 p u p_u pu​就是使用者 u u u的隐向量, 就類似與上面的張三向量, 注意這是列向量, q i q_i qi​是物品 i i i的隐向量, 就類似于上面的音樂A向量, 這個也是列向量, 是以才用了 p u T q i p_{u}^{T} q_{i} puT​qi​得到了一個數, 也就是使用者的最終評分, 計算過程其實和上面例子中一樣。 這裡的 p u , k p_{u,k} pu,k​和 q i , k q_{i,k} qi,k​是模型的參數, 也正是我們想辦法要計算的, p u , k p_{u,k} pu,k​度量的是使用者 u u u的興趣和第 k k k個隐類的關系, 而 q i , k q_{i,k} qi,k​度量了第 k k k個隐類和物品 i i i之間的關系。

Basic SVD

2006年的Netflix Prize之後, Simon Funk公布了一個矩陣分解算法叫做Funk-SVD, 後來被Netflix Prize的冠軍Koren稱為Latent Factor Model(LFM)。 Funk-SVD的思想很簡單: 把求解上面兩個矩陣的參數問題轉換成一個最優化問題, 可以通過訓練集裡面的觀察值利用最小化來學習使用者矩陣和物品矩陣。

DW FM打卡

我們上面已經知道了, 如果有了使用者矩陣和物品矩陣的話, 我們就知道了如果想計算使用者 u u u對物品 i i i的評分, 隻需要

Preference ⁡ ( u , i ) = r u i = p u T q i = ∑ k = 1 K p u , k q k , i \operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{k=1}^{K} p_{u, k} q_{k,i} Preference(u,i)=rui​=puT​qi​=k=1∑K​pu,k​qk,i​

而現在, 我們有真實的 r u , i r_{u,i} ru,i​, 但是沒有 p u T q i p_{u}^{T} q_{i} puT​qi​, 那麼我們可以初始化一個啊, 随機初始化一個使用者矩陣 U U U和一個物品矩陣 V V V, 然後不就有 p u T q i p_{u}^{T} q_{i} puT​qi​了? 當然你說, 随機初始化的肯定不準啊, 但是, 有了 p u T q i p_{u}^{T} q_{i} puT​qi​之後, 我們就可以計算一個猜測的 r ^ u i \hat{r}_{u i} r^ui​, 即

r ^ u i = p u T q i \hat{r}_{u i}=p_{u}^{T} q_{i} r^ui​=puT​qi​

這時候, 肯定是不準, 那麼這個猜測的和真實值之間就會有一個誤差:

e u i = r u i − r ^ u i e_{u i}=r_{u i}-\hat{r}_{u i} eui​=rui​−r^ui​

有了誤差, 我們就可以計算出總的誤差平方和:

SSE ⁡ = ∑ u , i e u i 2 = ∑ u , i ( r u i − ∑ k = 1 K p u , k q k , i ) 2 \operatorname{SSE}=\sum_{u, i} e_{u i}^{2}=\sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k, i}\right)^{2} SSE=u,i∑​eui2​=u,i∑​(rui​−k=1∑K​pu,k​qk,i​)2

有了損失, 我們就可以想辦法進行訓練, 把SSE降到最小, 那麼我們的兩個矩陣參數就可以算出來。是以就把這個問題轉成了最優化的的問題, 而我們的目标函數就是:

min ⁡ q ∗ , p ∗ ∑ ( u , i ) ∈ K ( r u i − p u T q i ) 2 \min _{\boldsymbol{q}^{*}, \boldsymbol{p}^{*}} \sum_{(u, i) \in K}\left(\boldsymbol{r}_{\mathrm{ui}}-p_{u}^{T} q_{i}\right)^{2} q∗,p∗min​(u,i)∈K∑​(rui​−puT​qi​)2

這裡的 K K K表示所有使用者評分樣本的集合。

有了目标函數, 那麼我們就可以使用梯度下降算法來降低損失。 那麼我們需要對目标函數求偏導, 得到梯度。 我們的目标函數如果是上面的SSE, 我們下面來推導一下最後的導數:

SSE ⁡ = ∑ u , i e u i 2 = ∑ u , i ( r u i − ∑ k = 1 K p u , k q k , i ) 2 \operatorname{SSE}=\sum_{u, i} e_{u i}^{2}=\sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)^{2} SSE=u,i∑​eui2​=u,i∑​(rui​−k=1∑K​pu,k​qk,i​)2

首先我們求SSE在 p u , k p_{u,k} pu,k​(也就是Q矩陣的第 u u u行 k k k列)的梯度:

∂ ∂ p u , k S S E = ∂ ∂ p u , k ( e u i 2 ) = 2 e u i ∂ ∂ p u , k e u i = 2 e u i ∂ ∂ p u , k ( r u i − ∑ k = 1 K p u , k q k , i ) = − 2 e u i q k , i \frac{\partial}{\partial p_{u,k}} S S E=\frac{\partial}{\partial p_{u,k}}\left(e_{u i}^{2}\right) =2e_{u i} \frac{\partial}{\partial p_{u,k}} e_{u i}=2e_{u i} \frac{\partial}{\partial p_{u,k}}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)=-2e_{u i} q_{k,i} ∂pu,k​∂​SSE=∂pu,k​∂​(eui2​)=2eui​∂pu,k​∂​eui​=2eui​∂pu,k​∂​(rui​−k=1∑K​pu,k​qk,i​)=−2eui​qk,i​

DW FM打卡

然後求SSE在 q k , i q_{k,i} qk,i​處(也就是V矩陣的第 k k k行 i i i列)的梯度:

∂ ∂ q k , i S S E = ∂ ∂ p k , i ( e u i 2 ) = 2 e u i ∂ ∂ p k , i e u i = 2 e u i ∂ ∂ p k , i ( r u i − ∑ k = 1 K p u , k q k , i ) = − 2 e u i p u , k \frac{\partial}{\partial q_{k,i}} S S E=\frac{\partial}{\partial p_{k,i}}\left(e_{u i}^{2}\right) =2e_{u i} \frac{\partial}{\partial p_{k,i}} e_{u i}=2e_{u i} \frac{\partial}{\partial p_{k,i}}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)=-2e_{u i} p_{u,k} ∂qk,i​∂​SSE=∂pk,i​∂​(eui2​)=2eui​∂pk,i​∂​eui​=2eui​∂pk,i​∂​(rui​−k=1∑K​pu,k​qk,i​)=−2eui​pu,k​

為了讓公式更為簡單, 把前面的2給他越掉, 即可以令SSE等于:

SSE ⁡ = 1 2 ∑ u , i e u i 2 = 1 2 ∑ u , i ( r u i − ∑ k = 1 K p u k q k i ) 2 \operatorname{SSE}=\frac{1}{2} \sum_{u, i} e_{u i}^{2}=\frac{1}{2} \sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u k} q_{k i}\right)^{2} SSE=21​u,i∑​eui2​=21​u,i∑​(rui​−k=1∑K​puk​qki​)2

這時候, 梯度就沒有前面的系數了, 有了梯度, 接下來我們就可以用梯度下降算法更新梯度了:

p u , k = p u , k − η ( − e u i q k , i ) = p u , k + η e u i q k , i q k , i = q k , i − η ( − e u i p u , k ) = q k , i + η e u i p u , k p_{u, k}=p_{u,k}-\eta (-e_{ui}q_{k,i})=p_{u,k}+\eta e_{ui}q_{k,i} \\ q_{k, i}=q_{k, i}-\eta (-e_{ui}p_{u,k})=q_{k, i}+\eta e_{ui}p_{u,k} pu,k​=pu,k​−η(−eui​qk,i​)=pu,k​+ηeui​qk,i​qk,i​=qk,i​−η(−eui​pu,k​)=qk,i​+ηeui​pu,k​

這裡的 η \eta η是學習率, 控制步長用的, 但上面這個有個問題就是當參數很多的時候, 就是兩個矩陣很大的時候, 往往容易陷入過拟合的困境, 這時候, 就需要在目标函數上面加上正則化的損失, 就變成了RSVD, 關于RSVD的詳細内容, 可以參考下面給出的連結, 由于篇幅原因, 這裡不再過多的贅述。

但在實際中, 單純的 r ^ u i = p u T q i \hat{r}_{u i}=p_{u}^{T} q_{i} r^ui​=puT​qi​也是不夠的, 還要考慮其他的一些因素, 比如一個評分系統, 有些固有的屬性和使用者物品無關, 而使用者也有些屬性和物品無關, 物品也有些屬性和使用者無關。 是以, Netfix Prize中提出了另一種LFM, 在原來的基礎上加了偏置項, 來消除使用者和物品打分的偏差, 即預測公式如下:

r ^ u i = μ + b u + b i + p u T ⋅ q i \hat{r}_{u i}=\mu+b_{u}+b_{i}+p_{u}^{T} \cdot q_{i} r^ui​=μ+bu​+bi​+puT​⋅qi​

這個預測公式加入了3項偏置 μ , b u , b i \mu,b_u,b_i μ,bu​,bi​, 作用如下:

  • μ \mu μ: 訓練集中所有記錄的評分的全局平均數。 在不同網站中, 因為網站定位和銷售物品不同, 網站的整體評分分布也會顯示差異。 比如有的網站中使用者就喜歡打高分, 有的網站中使用者就喜歡打低分。 而全局平均數可以表示網站本身對使用者評分的影響。
  • b u b_u bu​: 使用者偏差系數, 可以使用使用者 u u u給出的所有評分的均值, 也可以當做訓練參數。 這一項表示了使用者的評分習慣中和物品沒有關系的那種因素。 比如有些使用者比較苛刻, 對什麼東西要求很高, 那麼他評分就會偏低, 而有些使用者比較寬容, 對什麼東西都覺得不錯, 那麼評分就偏高
  • b i b_i bi​: 物品偏差系數, 可以使用物品 i i i收到的所有評分的均值, 也可以當做訓練參數。 這一項表示了物品接受的評分中和使用者沒有關系的因素。 比如有些物品本身品質就很高, 是以獲得的評分相對比較高, 有的物品本身品質很差, 是以獲得的評分相對較低。

加了使用者和物品的打分偏差之後, 矩陣分解得到的隐向量更能反映不同使用者對不同物品的“真實”态度差異, 也就更容易捕捉評價資料中有價值的資訊, 進而避免推薦結果有偏。 注意此時的 S S E SSE SSE會發生變化:

SSE ⁡ = 1 2 ∑ u , i e u i 2 + 1 2 λ ∑ u ∣ p u ∣ 2 + 1 2 λ ∑ i ∣ q i ∣ 2 + 1 2 λ ∑ u b u 2 + 1 2 λ ∑ u b i 2 = 1 2 ∑ u , i ( r u i − μ − b u − b i − ∑ k = 1 K p u k q k i ) 2 + 1 2 λ ∑ u ∣ p u ∣ 2 + 1 2 λ ∑ i ∣ q i ∣ 2 + 1 2 λ ∑ u b u 2 + 1 2 λ ∑ u b i 2 \begin{array}{l} \operatorname{SSE}=\frac{1}{2} \sum_{u, i} e_{u i}^{2}+\frac{1}{2} \lambda \sum_{u}\left|\boldsymbol{p}_{u}\right|^{2}+\frac{1}{2} \lambda \sum_{i}\left|\boldsymbol{q}_{i}\right|^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{u}^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{i}^{2} \\ =\frac{1}{2} \sum_{u, i}\left(\boldsymbol{r}_{u i}-\boldsymbol{\mu}-\boldsymbol{b}_{u}-\boldsymbol{b}_{i}-\sum_{k=1}^{K} \boldsymbol{p}_{u k} \boldsymbol{q}_{k i}\right)^{2}+\frac{1}{2} \lambda \sum_{u}\left|\boldsymbol{p}_{u}\right|^{2}+\frac{1}{2} \lambda \sum_{i}\left|\boldsymbol{q}_{i}\right|^{2}+\frac{\mathbf{1}}{2} \lambda \sum_{u} \boldsymbol{b}_{u}^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{i}^{2} \end{array} SSE=21​∑u,i​eui2​+21​λ∑u​∣pu​∣2+21​λ∑i​∣qi​∣2+21​λ∑u​bu2​+21​λ∑u​bi2​=21​∑u,i​(rui​−μ−bu​−bi​−∑k=1K​puk​qki​)2+21​λ∑u​∣pu​∣2+21​λ∑i​∣qi​∣2+21​λ∑u​bu2​+21​λ∑u​bi2​​

此時如果把 b u b_u bu​和 b i b_i bi​當做訓練參數的話, 那麼它倆的梯度是:

∂ ∂ b u S S E = − e u i + λ b u ∂ ∂ b i S S E = − e u i + λ b i \frac{\partial}{\partial b_{u}} S S E=-e_{u i}+\lambda b_{u} \\ \frac{\partial}{\partial b_{i}} S S E=-e_{u i}+\lambda b_{i} ∂bu​∂​SSE=−eui​+λbu​∂bi​∂​SSE=−eui​+λbi​

更新公式為:

b u = b u + η ( e u i − λ b u ) b i = b i + η ( e u i − λ b i ) \begin{aligned} \boldsymbol{b}_{u}&=\boldsymbol{b}_{\boldsymbol{u}}+\boldsymbol{\eta}\left(\boldsymbol{e}_{u i}-\lambda \boldsymbol{b}_{\boldsymbol{u}}\right) \\ \boldsymbol{b}_{\boldsymbol{i}} &=\boldsymbol{b}_{\boldsymbol{i}}+\boldsymbol{\eta}\left(\boldsymbol{e}_{\boldsymbol{u} i}-\lambda \boldsymbol{b}_{\boldsymbol{i}}\right) \end{aligned} bu​bi​​=bu​+η(eui​−λbu​)=bi​+η(eui​−λbi​)​

而對于 p u , k p_{u,k} pu,k​和 p k , i p_{k,i} pk,i​, 導數沒有變化, 更新公式也沒有變化。

FM

1. FM模型的引入

1.1 邏輯回歸模型及其缺點

FM模型其實是一種思路,具體的應用稍少。一般來說做推薦CTR預估時最簡單的思路就是将特征做線性組合(邏輯回歸LR),傳入sigmoid中得到一個機率值,本質上這就是一個線性模型,因為sigmoid是單調增函數不會改變裡面的線性模型的CTR預測順序,是以邏輯回歸模型效果會比較差。也就是LR的缺點有:

  • 是一個線性模型
  • 每個特征對最終輸出結果獨立,需要手動特征交叉( x i ∗ x j x_i*x_j xi​∗xj​),比較麻煩

1.2 二階交叉項的考慮及改進

由于LR模型的上述缺陷(主要是手動做特征交叉比較麻煩),幹脆就考慮所有的二階交叉項,也就是将目标函數由原來的

y = w 0 + ∑ i = 1 n w i x i y = w_0+\sum_{i=1}^nw_ix_i y=w0​+i=1∑n​wi​xi​

變為

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n − 1 ∑ i + 1 n w i j x i x j y = w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{i+1}^nw_{ij}x_ix_j y=w0​+i=1∑n​wi​xi​+i=1∑n−1​i+1∑n​wij​xi​xj​

但這個式子有一個問題,隻有當 x i x_i xi​與 x j x_j xj​均不為0時這個二階交叉項才會生效,後面這個特征交叉項本質是和多項式核SVM等價的,為了解決這個問題,我們的FM登場了!

FM模型使用了如下的優化函數:

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ i + 1 n < v i , v j > x i x j y = w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^{n}\sum_{i+1}^n\lt v_i,v_j\gt x_ix_j y=w0​+i=1∑n​wi​xi​+i=1∑n​i+1∑n​<vi​,vj​>xi​xj​

事實上做的唯一改動就是把 w i j w_{ij} wij​替換成了 < v i , v j > \lt v_i,v_j\gt <vi​,vj​>,大家應該就看出來了,這實際上就有深度學習的意味在裡面了,實質上就是給每個 x i x_i xi​計算一個embedding,然後将兩個向量之間的embedding做内積得到之前所謂的 w i j w_{ij} wij​好處就是這個模型泛化能力強 ,即使兩個特征之前從未在訓練集中同時出現,我們也不至于像之前一樣訓練不出 w i j w_{ij} wij​,事實上隻需要 x i x_i xi​和其他的 x k x_k xk​同時出現過就可以計算出 x i x_i xi​的embedding!

2. FM公式的了解

從公式來看,模型前半部分就是普通的LR線性組合,後半部分的交叉項:特征組合。首先,單從模型表達能力上來看,FM是要強于LR的,至少它不會比LR弱,當交叉項參數 w i j w_{ij} wij​全為0的時候,整個模型就退化為普通的LR模型。對于有 n n n個特征的模型,特征組合的參數數量共有 1 + 2 + 3 + ⋯ + n − 1 = n ( n − 1 ) 2 1+2+3+\cdots + n-1=\frac{n(n-1)}{2} 1+2+3+⋯+n−1=2n(n−1)​個,并且任意兩個參數之間是獨立的。是以說特征數量比較多的時候,特征組合之後,次元自然而然就高了。

定理:任意一個實對稱矩陣(正定矩陣) W W W都存在一個矩陣 V V V,使得 W = V . V T W=V.V^{T} W=V.VT成立。

類似地,所有二次項參數 ω i j \omega_{ij} ωij​可以組成一個對稱陣 W W W(為了友善說明FM的由來,對角元素可以設定為正實數),那麼這個矩陣就可以分解為 W = V T V W=V^TV W=VTV, V V V 的第 j j j列( v j v_{j} vj​)便是第 j j j維特征( x j x_{j} xj​)的隐向量。

y ^ ( X ) = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n < v i , v j > x i x j \hat{y}(X) = \omega_{0}+\sum_{i=1}^{n}{\omega_{i}x_{i}}+\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n} \color{red}{<v_{i},v_{j}>x_{i}x_{j}}} y^​(X)=ω0​+i=1∑n​ωi​xi​+i=1∑n−1​j=i+1∑n​<vi​,vj​>xi​xj​

需要估計的參數有 ω 0 ∈ R \omega_{0}∈ R ω0​∈R, ω i ∈ R \omega_{i}∈ R ωi​∈R, V ∈ R V∈ R V∈R, < ⋅ , ⋅ > < \cdot, \cdot> <⋅,⋅>是長度為 k k k的兩個向量的點乘,公式如下:

< v i , v j > = ∑ f = 1 k v i , f ⋅ v j , f <v_{i},v_{j}> = \sum_{f=1}^{k}{v_{i,f}\cdot v_{j,f}} <vi​,vj​>=f=1∑k​vi,f​⋅vj,f​

上面的公式中:

  • ω 0 \omega_{0} ω0​為全局偏置;
  • ω i \omega_{i} ωi​是模型第 i i i個變量的權重;
  • ω i j = < v i , v j > \omega_{ij} = < v_{i}, v_{j}> ωij​=<vi​,vj​>特征 i i i和 j j j的交叉權重;
  • $v_{i} 是 第 是第 是第i$維特征的隐向量;
  • < ⋅ , ⋅ > <\cdot, \cdot> <⋅,⋅>代表向量點積;
  • k ( k < < n ) k(k<<n) k(k<<n)為隐向量的長度,包含 k k k 個描述特征的因子。
    DW FM打卡
    DW FM打卡

這裡下載下傳連結是這個

http://www.grouplens.org/system/files/ml-100k.zip 這裡下載下傳是對的

DW FM打卡

繼續閱讀