ALS損失函數(shù)優(yōu)化推導(dǎo)

損失函數(shù)推導(dǎo)公式以及如何推導(dǎo)

目錄:

  1. 原因:為何要推導(dǎo)這些公式
  2. 舉例:根據(jù)文章來說明這個推導(dǎo)的必要性
  3. 分析:如何推導(dǎo)添加用戶相似度的公式
  4. 存在的問題

1. 原因

首先解釋說一下原因,接著分析要如何推導(dǎo)加了用戶相似度的兩個矩陣的計算方式(待解決)。

  1. ALS 的修改模型不僅僅是輸入一條損失函數(shù)的公式,然后輸入數(shù)據(jù)就能直接跑起來模型的。
  2. 模型的更新是要根據(jù)損失函數(shù)修改推導(dǎo)后導(dǎo)出的公式來重新編寫代碼。
  3. 眾所周知,ALS 是一個交替最小二乘法,需要先固定用戶矩陣或者項目矩陣中的其中 1 個,然后計算另一個矩陣的,最終得到兩個最優(yōu)解矩陣。而如何計算另一個矩陣辦法或者公式我們目前需要計算。
  4. 因此,我們要根據(jù)損失函數(shù)來推導(dǎo)出這兩個矩陣(用戶矩陣和項目矩陣),是如何在固定一個矩陣的情況下來計算更新另一個矩陣的。
  5. 以上就是我們需要從損失函數(shù)推導(dǎo)公式的原因。

接下來,按照知乎文章中的損失函數(shù)推導(dǎo)公式過程以及代碼來舉例說明整個過程

2. 舉例說明

舉例說明一下文章中的 ALS 算法的推導(dǎo)過程,和配套代碼的含義

2.1 文章中的 ALS 損失函數(shù)

首先是損失函數(shù),下面是知乎文章中的 ALS 模型的損失函數(shù):

文章鏈接: https://zhuanlan.zhihu.com/p/47584486?utm_source=wechat_session&utm_medium=social&utm_oi=896399378548404224

L=-\frac{1}{2} \sum_{i=0}^{n}\left(R_{a i}-U^{T} a * I i\right)^{2} (1)

這個是損失函數(shù)。

2.2 推導(dǎo)的過程

由于 ALS 算法的流程是先固定 1 個矩陣,然后求另一個矩陣的。然而現(xiàn)在的問題是“不知道是如何計算另一個矩陣”,也就是不知道另一個矩陣的計算公式。因此我們需要來推導(dǎo)這個另一個矩陣的計算公式。

由損失函數(shù)推導(dǎo)出用戶矩陣 U_a 和項目矩陣 I_b 的計算公式,那么推導(dǎo)的過程主要分 3 步:

  1. 對損失函數(shù)求 U_a 的一階偏導(dǎo)數(shù),得到結(jié)果如下:

\begin{aligned} \frac{d L}{d U_{a}} &=\left(R_{a}-U^{T} a * I\right) * I^{T} \\ \frac{d L}{d U a} &=I *\left(R^{T} a-I_{T} * U_{a}\right) \end{aligned} (2)

  1. 然后再令一階偏導(dǎo)數(shù)等于0 ,即等式左邊項為 0 ,得到了用戶矩陣 U_a ,結(jié)果如下:

\begin{array}{l}{I * R^{T} a=I * I^{T} * U a} \\ {U a=\left(I * I^{T}\right)^{-1} * I * R_{a}^{T}}\end{array} (3)

  1. 同理,可證得項目矩陣 I_b 的計算公式

I_=\left(U * U^{T}\right)^{-1} * U * R_ (4)

2.3 推導(dǎo)的公式在代碼上的應(yīng)用

下面截取了 ALS 算法的代碼中核心部分

  • 含義
    • 這段代碼的內(nèi)容是按照上面推導(dǎo)出來的、用來計算兩個矩陣 U 和 I 的公式設(shè)計出來的。
  • 作用
    • 輸入數(shù)據(jù)后通過調(diào)用該方法,最終計算得到 U 和 I 的兩個矩陣。
for i in range(max_iter):
    if i % 2:
      # U = (I * I_transpose) ^ (-1) * I * R_transpose(需要修改以下函數(shù))
      items = self.item_matrix
      self.user_matrix = self._items_mul_ratings(
        items.mat_mul(items.transpose).inverse.mat_mul(items),
        ratings
      )
    else:
      # I = (U * U_transpose) ^ (-1) * U * R(需要修改以下函數(shù))
      users = self.user_matrix
      self.item_matrix = self._users_mul_ratings(
      users.mat_mul(users.transpose).inverse.mat_mul(users),
      ratings_T
        )

這兩段代碼是ALS中用戶矩陣 U_a 和項目矩陣 I_b ,默認(rèn)情況下的計算公式(未優(yōu)化前)。我們的工作是需要重新計算這個兩個值。

3. 如何處理加了相似度的損失函數(shù)

為什么要重新計算呢?因為原有的損失函數(shù)更改了以下內(nèi)容。

3.1 加了相似度的損失函數(shù)

首先需要先了解加了用戶相似度的損失函數(shù)是怎樣的。

加了相似度的損失函數(shù)如下,這是在論文中截取到的:

\begin{aligned} L=& \min _{U, V} \frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{n} I_{i j}\left(r_{i j}-\mathbf{u}_{i}^{T} \mathbf{v}_{j}\right)^{2} \\ &+\frac{\alpha}{2} \sum_{i=1}^{m} \sum_{f \in \mathcal{F}+(i)} s_{i f}\left\|\mathbf{u}_{i}-\mathbf{u}_{f}\right\|_{F}^{2} \\ &+\frac{\lambda_{1}}{2}\|U\|_{F}^{2}+\frac{\lambda_{2}}{2}\|V\|_{F}^{2} \end{aligned} (5)

這個損失函數(shù)的參數(shù)解釋如下:

  • 其中 α 是正則化參數(shù),s_if 表示用戶 i 與用戶 f 之間的相似度,\mathcal{F}+(i) 表示用戶的外向好友,即相似度較高的朋友。

3.2 推導(dǎo)步驟

這是原來的推導(dǎo)步驟,但我覺得圈出來的部分錯了,我把圈出來的部分改為:

(6)

3.3 推導(dǎo)過程參考文章

推導(dǎo)過程參考文章:

https://blog.insightdatascience.com/explicit-matrix-factorization-als-sgd-and-all-that-jazz-b00e4d9b21ea

文章從下圖開始詳細(xì)介紹了 ALS 算法的推導(dǎo)過程

存在的問題

跑完代碼后,發(fā)現(xiàn)加了相似度后,MSE提高了。
有可能有以下原因:
1.加了一些未知的矩陣的原因。因為跟一些其他的模型對比,我們不難發(fā)現(xiàn)ALS的跑出來的MSE比其他的模型高一點。因為ALS本身的原因。ALS是通過固定U_i求出V,再固定V求出U_i,不停的重復(fù),直到收斂或達(dá)到最大迭代次數(shù)。而這些固定的矩陣因為都是未知,所以都是隨機生成的。我覺得這可能就是ALS得出來的MSE比其他模型高的原因。

2.我們加了相似度后就不止兩個未知矩陣了(加的方法是直接矩陣相加,公式6),每多出一個相似用戶就會多出一個未知矩陣。假設(shè)我們選擇5個最相似的用戶和5個最不相似的用戶,那么就會多出10個未知矩陣。為了求出V或者U_i,對于這些多出來的矩陣,我們都是采用隨機生成的方法。而這可能也是為什么加了相似度MSE會升高的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容