
6.5.1 算法原理
该实时矩阵分解算法也是采用6.4.1节中整合偏差项的方法来预测用户u对标的物v的评分的,具体预测公式如下:

其中μ是全局均值,bv是标的物偏差,bu是用户偏差,是用户标的物交叉项。那么最终的优化问题就转化为

我们定义

基于上面的最优化问题,我们可以得到如下SGD迭代更新公式(上式对各个参数求偏导数,并且沿着导数相反方向更新各个参数就得到如下公式,感兴趣的读者可以自行推导一下):

该论文采用与6.4.5节隐式反馈中一样的思路,用wuv表示用户u对标的物v的偏好置信度,wuv的计算公式如下,其中a、b是超参数,tuv、tv分别是用户播放视频v的播放时长及视频v总时长。

该论文中也尝试过采用

这类线性公式,但是经过线上验证,上述对数函数的公式效果更好。
笔者公司也是做视频的,曾经用公式

来计算视频的得分,其中ratio就是视频播放时长与视频总时长的比例,等价于上面的tuv/tv,log是对数函数,上式中乘以10是为了将视频评分统一到0到10之间,并且当ratio=0时,vscore=0;当ratio=1时,vscore=10。这个公式与腾讯论文中的公式本质上是一致的。
采用对数函数是有一定的经济学道理在里面的,因为dlogx/dx=1/x是自变量x的递减函数,即导数(斜率)是单调递减函数,当自变量x越大时,函数值增长越慢,因此基于该公式的数学解释可以说明对数函数是满足经济学上的“边际效应递减”这一原则的。针对视频来说,意思就是你在看前十分钟视频的兴趣程度是大于在后面看十分钟的,这就像你在很饿的时候,吃第一个馒头的满足感远大于吃了四个馒头之后再吃一个馒头的满足感。
用户u对视频v的偏好ruv为二元变量,ruv=1表示用户喜欢视频v(用户播放、收藏、评论等隐式行为),ruv=0表示不喜欢(视频曝光给用户而用户未产生行为或者视频根本没有曝光给用户),具体公式如下:

在近实时训练矩阵分解模型时,只有当ruv=1时(隐式)用户行为才用于更新模型,ruv=0时直接将该行为丢弃,而更新时,学习率与置信度成正比,用户越喜欢该视频,该用户行为对训练模型的影响越大。具体采用如下公式来定义学习率,它是wuv的线性函数。

具体的实时训练采用SGD算法,算法逻辑如下。
腾讯矩阵分解算法:利用SGD实时训练矩阵分解算法


上面就是该论文中实时矩阵分解算法的迭代求解公式,与本节前面介绍的迭代公式是一致的,只不过学习率(ηuv=η0+αwuv)不是一个常数,而是与偏好置信度wuv有关,下面我们来讲解该算法的具体工程实现细节。