1.矩阵分解
隐语义模型的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)。
矩阵分解模型原理:
基于评分矩阵去找到用户兴趣和物品的隐向量表达, 把评分矩阵分解成Q和P两个矩阵乘积的形式(通过分解协同过滤的共现矩阵来得到用户和物品的隐向量,基于这两个矩阵去预测某个用户对某个物品的评分去进行推荐。
Preference?(u,i)=rui=puTqi=∑f=1Fpu,kqk,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? ,其中这里的pup_upu?就是用户uuu的隐向量,qiq_iqi?是物品iii的隐向量
2.矩阵分解算法的求解
- 特征值分解(EVD)
- 奇异值分解(SVD)
Funk-SVD:
把求解上面两个矩阵的参数问题转换成一个最优化问题, 可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵。
(1)猜测值和真实值之间的误差: eui=rui?r^uie_{u i}=r_{u i}-\hat{r}_{u i} eui?=rui??r^ui?
总的误差平方和: SSE?=∑u,ieui2=∑u,i(rui?∑k=1Kpu,kqk,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
(2)为了把SSE降到最小, 目标函数:
min?q,p∑(u,i)∈K(rui?puTqi)2\min {\boldsymbol{q}^{}, \boldsymbol{p}^{}} \sum{(u, i) \in K}\left(\boldsymbol{r}{\mathrm{ui}}-p{u}^{T} q_{i}\right)^{2} minq,p∑(u,i)∈K(rui?puTqi?)2
这里的KKK表示所有用户评分样本的集合。
(3)使用梯度下降算法来降低损失。
(4)加了用户和物品的打分偏差之后, 矩阵分解得到的隐向量更能反映不同用户对不同物品的“真实”态度差异, 也就更容易捕捉评价数据中有价值的信息, 从而避免推荐结果有偏。 注意此时的SSESSESSE会发生变化: SSE?=12∑u,ieui2+12λ∑u∣pu∣2+12λ∑i∣qi∣2+12λ∑ubu2+12λ∑ubi2=12∑u,i(rui?μ?bu?bi?∑k=1Kpukqki)2+12λ∑u∣pu∣2+12λ∑i∣qi∣2+12λ∑ubu2+12λ∑ubi2\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?λ∑ubu2+21?λ∑ubi2 =21?∑u,i(rui?μ?bu?bi?∑k=1Kpukqki)2+21?λ∑u?∣pu∣2+21?λ∑i∣qi∣2+21?λ∑ubu2+21?λ∑ubi2?? 此时如果把bub_ubu?和bib_ibi?当做训练参数的话, 那么它俩的梯度是:
??buSSE=?eui+λbu??biSSE=?eui+λbi\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? 更新公式为: bu=bu+η(eui?λbu)bi=bi+η(eui?λbi)\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?=bu+η(eui?λbu) bi?=bi+η(eui?λbi)? 而对于pu,kp_{u,k}pu,k?和pk,ip_{k,i}pk,i?, 导数没有变化, 更新公式也没有变化。