Recommendation

Learn To Recommend

Binary classification recommendation system

目前广泛使用的一些推荐算法,本质上还是二分类算法,类似于“点击率预估”。尽管线上效果还不错,但是距推荐系统的实际需求还有差距:

  • 推荐系统中的“排序”任务关心的是相对顺序正确与否,而不是对“单个物料的点击概率”预测得是否精准。

  • 二分类优化的loss只基于“预测分数”与“真实值”的差异,对“预测分数”可导,可用Gradient Descent优化之。而推荐系统中的很多业务指标,如NDCG, MAP,是基于“排序位置”的。“预测分数”的微小变化,或者不足以改变顺序使metric不变,导数始终为0,或者改变排序而导致metric剧烈变化,不可导,使得无法用Gradient Descent优化。

Regression recommendation for User-item

movie_count = 17771
user_count = 2649430
model_left = Sequential()
model_left.add(Embedding(movie_count, 60, input_length=1))
model_right = Sequential()
model_right.add(Embedding(user_count, 20, input_length=1))
model = Sequential()
model.add(Merge([model_left, model_right], mode='concat'))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('sigmoid'))
model.add(Dense(64))
model.add(Activation('sigmoid'))
model.add(Dense(64))
model.add(Activation('sigmoid'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adadelta')

Learn to recommend

注意两点,

  • 以上binary loss function,对“列表头部的排序正确性”与“列表尾部的排序正确性”一视同仁,实际上优化的是AUC

LambdaRank/LambdaMART的解决思路,简单而被证明有效:既然无法定义一个符合要求的loss,那就不定义了,直接定义一个符合我们要求的梯度就行了。这个不经过loss,而被人为定义出来的梯度,就是所谓的Lambda梯度

那么优化NDCG需要怎样的Lambda梯度?很简单,

  • 在上一轮迭代结束后,将候选文档/物料,按照上一轮迭代得到的预测分数从大到小排序

  • 对<Ui,Uj>这一对儿,如果还用binary cross entropy loss预测排序是否正确,其梯度定义和图3中一样

Learn to recommend four essentials

综上所述,我们可以看到,实现一个Learning-To-Rank算法,有4个重点:

  • 样本如何组织。显而易见,排序只对“同一个query下的候选文档”或“同一个推荐session下的候选商品”才有意义。所以,与普通二分类不同,LTR训练集有一个分组的概念,同一个组内的候选物料才能匹配成对,相互比较

  • 定义loss。Learning-To-Rank有pointwise/pairwise/listwise三种定义loss的方式。Pointwise与普通的ctr预估无异,上面的例子介绍的就是pairwise, listwise以后找个机会再介绍。不同的loss定义方式,再结合优化不同指标而定义的不同lambda weight,可以衍化出更多种算法。

Binary classification VS. Score based ranking system (LTR)

  • LTR比目前常用的预测点击/转化的二分类算法,更加符合推荐系统的实际需求

  • 我经常使用 lightgbm, xgboost 来进行LTR,但是 GBDT 天生只擅长处理稠密特征,而“稀疏特征”才是推荐、搜索领域中的“一等公民”。TF-Ranking 基于 TensorFlow,可以充分利用 embedding, crossing, hashing 等手段来处理“稀疏特征”。

  • TF-Ranking 是一个框架,可以接入任意一种算法来计算 query-doc, user-item 之间的相关性,也可以在 pointwise/pairwise/listwise 这三大类 loss function 中方便切换。这使我们可以轻松尝试多种组合,比如基于 wide & deep 的 pairwise LTR,基于deepfm 的 listwise LTR。

  • TF-Ranking 是基于 TensorFlow Estimator 框架实现的,自动具备了分布式训练、部署的能力,可以应对海量数据集。

Metric for recommendation system

MAP (Mean Average Precision)

The "Mean" in MAP

OK that was Average Precision, which applies to a single data point (like a single user). What about MAP@N? All that remains is to average the AP@N metric over all your |U||U|users. Yes, an average of an average.

MAP@N=1Uu=1U(AP@N)u=1Uu=1U1mk=1NPu(k)relu(k)MAP@N=1|U|∑u=1|U|(AP@N)u=1|U|∑u=1|U|1m∑k=1NPu(k)⋅relu(k)

NDCG series

CG(Cumulative Gain)

DCG (Discounted Cumulative Gain)

NDCG (Normalized Discounted Cumulative Gain)

Last updated