在线推荐算法研究(2) - Online Collaborati
引言
- 本文论文阅读过程所留笔记,如有错误请指正
- 如引用请注明链接及作者信息,谢谢
- 论文为2019年 DASFAA会议长文(CCF B类会议,数据库领域顶会)
- Online Collaborative Filtering with Implicit Feedback
问题
针对利用隐式反馈数据进行在线推荐
具体而言,三个问题:
(i) 当正向反馈依次到达时,如果我们将给定用户的所有其他缺失项视为负向反馈,则错误分类的项将产生较大的偏差,因为某些物品可能在后续交互中是正向反馈;
(ii)错判一个正向物品的成本要比拥有一个假正向反馈的成本高得多;
(iii)现有工作通常假设在学习任务之前,通过人工选择或通过交叉验证来给出固定模型。 如果所选模型在新环境中不合适,则可能会导致性能不佳,这在现实环境中通常会发生,因为用户偏好和物品属性会随着时间动态变化。
原文以矩阵分解模型为例(LFM),对于交互矩阵,,对于分解得到的矩阵,目前的在线推荐方法中使用交替更新的思想,交替更新,最小化误差
方法
文章提出了OCFIF框架,如下图所示
- 基于后悔厌恶的原理,提出了一种损失函数:Diverstiture Loss 来弥补对负例错分引起的偏差。
后悔厌恶指当人们做出错误的决策时,会对自己的行为感到痛苦,后悔。而且这个决策越是那种不平常或者非传统(Unconventional)的决策的时候,人们的后悔感就越强。
假设有一个人,他一直以来上下班都走同一条路。有一天他决定换条新的路线,结果不幸遇到了交通事故,尽管事实上两条路线遇到交通事故的概率是一样的,但是他仍然会后悔:“早知道如此,我就走原来的路线了。”很显然后悔厌恶会影响人们的决策。后悔厌恶会使人们墨守成规,以使后悔达到最小化,此处就是错误分类带来的不良影响。 - 提出了一种代价敏感的学习方法 cost-sentive learning, 可以有效地优化隐式MF模型,并没有对缺少项增加权重限制(其他对隐式反馈进行处理的MF中,WALS/Fast-eALS等都加了权重)
- 使用元学习 Meta-Learning,对多个模型进行赋权操作,以弥补现有方法中使用单一固定模型的缺点。
在这样的框架下,最佳模型的选择是自适应的,并且根据数据流而不断更新。
Diverstiture Loss
在原文中,作者提出重要假设:模型会给曾被误分类的正例更高的权重,比起其他样本。
将前t轮中为负样本(缺失项)历史用户-物品对的集合定义为:,则Diverstiture Loss为:
超参数用来引入额外的损失,大于0时,表示对分错的样例增加惩罚;等于0,则就是普通的损失函数。简言之,就是增大对负样本分类的惩罚。 实话讲,原文该部分理论前后完全可以整合。。。
定义为t轮迭代前尚未输入模型的用户-物品对的集合,从采样个负样本用于模型参数更新讯息。传统的采样策略是从中等概率采样,每个缺少项被抽到的概率相同。原文作者采用了基于流行度的采样策略,流行度比较高的物品被采样的概率比较高(这种做法在何向南的文章中最早提及,思想简单而且有效):
代价敏感的学习
尽管ξ可以处理错误分类的负样本的问题,没有对正例错分的情况进行特殊处理。但在隐式反馈中,错分正例的代价要比错分负例高得多。
原文中引入了以下处理:
- , q 是分类的阈值,原文中,写的是,读下来感觉不是这个意思,应该是对模型的预测值进行二值化处理,而非训练数据
- 采用更合适的指标,采用加权平均的方法:
- ,值越大,效果越好;
-
, M_p,M_n分别表示错误的负例和正例,cost值越小,效果越好;
以上指标等同于最小化以下目标函数:
由于指标函数不是凸的(contex function),为了解决这个问题,用凸替代代替该目标函数,并得出以下两个成本敏感的损失函数:
元学习 Meta-Learning
为了决定超参数等参数值,一般通过手动选择或者交叉验证的方法进行超参数设置,但是在线推荐系统中,用户偏好和物品属性都在动态变化,原文作者提出采用元学习的方法来探究多模型的影响。
具体来说,以超参数ρ为例,通过将(0,1)离散分为S个均匀分布的值来构造参数ρ的多个值的池,设.
之后是从模型候选集(S个)选出一个MF模型用来预测和更新,使用Hedge算法,根据采样概率分布选取一个模型:,
对于矩阵分解模型,最后的更新策略为: 是学习率,完整的算法流程如下:
实验
实验部分作者采用了三个数据集,Yelp,MoviesLens, Pinterest.
评价方法部分,将每个数据集随机划分为两部分,80%用于训练,20%用于测试,随机划分10次,对应运行算法10次,计算结果的平均值(AUC和F值)
让人非常疑惑的是,既然是在线推荐算法,为什么没有在线平均的测试设置?上面的实验仅仅能看出其静态表现,无法体现其在线更新的效果和速度?
总结
总体而言,该文工作具有一定的创新性,包括提出的loss和元学习的引入,框架挺新;但是并没有对算法的效率进行展示。在其框架中,单次更新的计算量看起来不低,其次也没有展示在线更新的效果,哪怕是展示几个迭代过程也可以啊?