排序学习实践 为何一些机器学习模型须要对数据进行归一化? lucene join解决父子关系索引 lucene字典实现原理 lucene索引文件大小优化小结 lucene如何经过docId快速查

排序学习实践---ranknet方法

http://www.cnblogs.com/LBSer/p/4439542.html

1 背景

     随着移动互联网的崛起,愈来愈多的用户开始习惯于从手机完成吃、喝、玩、乐、衣、食、住、行等各个方面的需求。打开手机,点开手淘、美团等APP,商品玲玲满目,而让用户将全部商品一页页看完已经不现实,一般状况下用户也就查看前几页,若是找不到满意的商品则退出,从而形成流单。所以如何对商品进行排序使得用户能尽快完成购买流程已经成为这些平台的重要攻克方向。html

图1 手机淘宝、美团等app的商品排序示意缓存

      传统的方法是找几个特征好比评分、销量等,而后找个打分函数如简单的线性函数:F=w1*评分+w2*销量+...,并经过手工调整权重值w并结合abtest实验来达到排序的目的(分数越高排名越高)。网络

      这种方法很是简单,但面临着一些问题:1)每当增长一个特征都得调整全部特征的权重,并在线上进行abtest,费时费力;2)特征较多时(当引入个性化特征时),这种手工调整权重的方式已经不可能完成,很难找到一个较优解;3)随着数据的不断变化,每隔一段时间都须要人工从新调节权重整体来说人工调参费时费力、效果也差!app

     为了不人工调参,如今工业界主要采用排序学习方法。机器学习

2 排序学习简介

     排序学习的目的就是经过一些自动化的方法完成模型参数的训练。根据不一样类型的训练数据能够将排序学习方法分为如下三类:a)单点标注(point wise)b)两两标注(pair wise)c)列表标注(list wise)函数

2.1 point wise过程 

    下面介绍如何使用point wise方法来完成排序学习。post

     排序学习最重要的工做就是构造训练样本,即获得一组(V1,V2,V3,..., Y),其中V是特征,Y是label,获得样本以后带入相应的机器学习模型便可完成训练。学习

     通常来讲特征可分红如下几类(根据业务不一样可自行添加特征):a)商品(文档)自己特征如:评分、销量、价格等;b)用户自己特征如:性别、年龄、用户的商品类型偏好等;c)用户-商品关联特征如:是否看过此商品、是否买过此商品、对此商品的历史评价等;d)场景特征如:时间(早中晚)、与商品的距离、是不是节假日等。通常来讲咱们须要将这些特征进行归一化,缘由参见:为何一些机器学习模型须要对数据进行归一化?优化

    找到特征后须要定义label。咱们认为给用户展现过的商品label为1,用户点击过的商品label为3,用户购买过的商品label为7。url

    经过对历史日志数据的清洗整理咱们能够获得成千上万的样本(V1,V2,V3,..., Y)。

    获得样本以后咱们能够将此排序问题转换为多分类问题(样本特征-类别标记)或者回归问题(样本特征-连续值)。若是转换为多分类问题,咱们模型最后的输出只能一、3或是7,每每致使在同一类中的文档(好比两个文档输入模型的获得的结果都是7)很差继续排序,所以实际使用中每每将问题转换为回归问题,经常采用LR、GBDT等来解决。

2.2 point wise缺点

      point wise方法很直观,很是容易将问题转换为咱们所熟知的问题,但其缺点是彻底从单文档的分类角度计算,没有考虑文档之间的相对顺序。

      举个例子。假设图2左图红框为某一次用户点击的事件,这时候咱们得到一条样本i (V1i,V2i,V3i,...,Xni,   3)。右图红框为某一次用户点击的事件,咱们得到一条样本j (V1j,V2j,V3j,...,Vnj,   3)。按照pointwise的思想,咱们认为这两条样本的label都是3。但在第二张图包含更重要的信息,“用户只点了红框内的酒店,而没有点绿框内的酒店(绿框内的酒店和左图点击的酒店一致)”,即说明样本j的label应该比样本i的label大(样本j排名比样本i更靠前),而pointwise并无利用到这个信息。

图2 point wise缺点示意图

      天然咱们的问题就是:如何将文档之间相对顺序信息利用进去呢?

2.3 pair wise方法

      在pairwise方法中,咱们再也不从从单文档的分类角度来看待问题,而是从一个文档对如<d1,d2>来看待问题,即如图2右图所示,用户点击了红框的商品(d1)而没有点击绿框中的商品(d2),那这个时候认为d1的相关性大于d2,那么咱们能够把 d1-d2的label设置为+1,d2-d1的label设置为为 -1。按照这种方式,咱们就获得了二元分类器训练所需的样本了。预测时,只须要对全部pair进行分类,即可以获得文档集的一个偏序关系,从而实现排序。Pairwise方法有不少的实现,好比SVM Rank、RankNet、FRank、RankBoost等。

     下面咱们着重介绍下ranknet的原理以及应用。

3 ranknet

3.1 ranknet原理

      假设有文档i和j,其中文档i的特征向量是Xi(1i, v2i, v3i, ..., vni),文档j的特征向量是Xj(v1i, v2j, v3j, ..., vnj),咱们要找一个打分函数F,假设F是线性函数,F(Xi)=W*Xi=w1*v1i + w1*v2i + ... + wn*vni,其中w表示权重系数,F(Xi)表示针对文档Xi给出的得分。

      咱们但愿找出这样一个函数F(本质上是训练获得这些权重w),当文档X1比X2排名高时,咱们但愿F(Xi) > F(Xj)。

      下面咱们须要定义损失函数了。首先定义几率Pij,用于表示Xi比Xj排名高的几率,直观上能够设Pij=F(Xi)-F(Xj),这样F(Xi)-F(Xj)越大表示Xi比Xj排名高的几率越大,但这里问题的关键是几率值是在[0,1]区间范围内的,所以须要归一化。能够参考逻辑斯蒂回归的归一化函数:

       其中Oi=F(i),Oij=F(i)-F(j),这个函数有比较好的特质,当Oij=0时,Pij=0.5,当Oij>0时,Pij>0.5,而且当Oij趋向于无穷大时,Pij=1,反之当Oij<0时,Pij<0.5,当Oij趋向于无穷小时,Pij=0。

       这个时候咱们就能够定义损失函数了。损失函数经常使用有两种类型:

1)平方损失函数

     这是最经常使用的损失函数,可是如今因为已经作了归一化逻辑映射,使得平方损失函数再也不是一个凸函数,这给咱们最优化求解形成了比较大的挑战,所以实际经常使用另外一种损失函数---交叉熵。

2)交叉熵

     这里插句题外话,为何非凸函数的最优解很差求?

     以下图所示一个非凸函数,要求最小值,咱们常使用的梯度降低法或者牛顿迭代法每每限于局部最优解,很难找到全局最优解。


     下面看看交叉熵损失函数是否能知足咱们的需求。

    获得了凸损失函数以后,就可使用梯度降低方法求解最优化参数。

     若是直接这么训练最终获得的是线性模型,不能学习特征之间的非线性关系,通常学习非线性关系有几种方法:1)一种是对特征进行高维映射,例如svm的核方法;2)树模型;3)带有隐藏层的神经网络。

3.2 基于神经网络的ranknet

     在实际使用中,ranknet采用神经网络方法进行学习,通常采用的是带有隐层的神经网络。学习过程通常使用偏差反向传播方法来训练

     这里的输入层(最底部)的神经元表明了样本的每个特征,虚线的神经元表明隐藏层,最终输出只有一个神经元。

     如何训练呢?这里提供了两种思路:

     1)取一个样本对(Xi, Xj),首先对Xi带入神经网络进行前向反馈,其次将Xj带入神经网络进行前向反馈,而后计算差分结果并进行偏差反向传播,接着取下一个样本对。。。

     这种方法很直观,缺点是收敛速度慢。

     2)批量训练。咱们能够对同一个排序下的全部文档pair所有带入神经网络进行前向反馈,而后计算总差分并进行偏差反向传播,这样将大大减小偏差反向传播的次数,原理以下公式推导所示。

3.3 ranknet代码实现

      开源ranknet实现:http://people.cs.umass.edu/~vdang/ranklib.html

3.4 应用

     咱们输入的样本以下所示:相应的字段为:<target> qid:<qid> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>。其中target就是label,购买label=7,点击label=3,展现label=1;qid表明一次排序的标识,feature就是特征,#后面是注释信息。

7 qid:1 1:1 2:1 3:0 4:0.2 5:0 # 1A

3 qid:1 1:0 2:0 3:1 4:0.1 5:1 # 1B 

1 qid:1 1:0 2:1 3:0 4:0.4 5:0 # 1C

1 qid:1 1:0 2:0 3:1 4:0.3 5:0 # 1D  

1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2A  

3 qid:2 1:1 2:0 3:1 4:0.4 5:0 # 2B 

1 qid:2 1:0 2:0 3:1 4:0.1 5:0 # 2C 

1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2D  

1 qid:3 1:0 2:0 3:1 4:0.1 5:1 # 3A 

3 qid:3 1:1 2:1 3:0 4:0.3 5:0 # 3B 

7 qid:3 1:1 2:0 3:0 4:0.4 5:1 # 3C 

1 qid:3 1:0 2:1 3:1 4:0.5 5:0 # 3D

      将样本输入到ranknet进行训练,最终获得以下所示结果,其中咱们特征为46个,即输入层中神经元个数为46个,隐藏层只设置了1层,隐藏层神经元个数设置为10个。

      获得模型结果后,将此模型保存到缓存中。假设来一个线上请求,咱们首先提取出各个文档的特征向量(V1, V2, V3, ..., Vn),带入此神经网络模型获得各个文档的评分,并按照评分进行排序。

4 小结

     本文对排序学习作了一个简单的介绍,并着重介绍了ranknet的原理以及应用,后面会对其余pair wise方法、list wise方法作一些探讨。

 

检索实践文章系列:

lucene join解决父子关系索引

lucene字典实现原理

lucene索引文件大小优化小结

lucene如何经过docId快速查找field字段以及最近距离等信息?

相关文章
相关标签/搜索