学习排序Learning to Rank之RankNet

       今天给大家介绍一个Learning to Rank系列算法中的一个:RankNet。

       先简单地简介一下Learning to Rank是什么玩意吧~从名字“学习排序”来看,估计大家也已经基本明白它是干什么的了,它就是去从Training Set中学习出一个排序的规则,通常来说是学习一个打分函数(Scoring Function),还是举个实例的例子吧,我一向喜欢举例子说明问题《学习排序Learning to Rank之RankNet》Learning to Rank最常用的地方就是搜索引擎,那就举一个搜索引擎的例子,假设一个搜索引擎已经投入使用一段时间了,有了大量用户搜索、点击的数据,这些数据能在某种程度上反映出当前搜索引擎的排序效果的好坏,为什么呢?大家想,如果搜索引擎搜索出来的结果非常准确,能把最相关的结果排在第一位,或者前几位,如果从这些数据里发现,用户经常点击的不是排名前几的搜索结果,那么就说明排序排得不好,那么怎样的排序才是好的?其实用户已经告诉你了,从用户搜索、点击的数据中就能得到答案,对于某个搜索结果列表,一般来说,用户点击得越多,这个网页就和搜索越相关,于是就越应该排在前面,那如何让机器自动从这些数据中去学习,来改善当前的排序模型呢?这就是Learning to Rank所要做的事情,而在这里,Training Set就可以从用户搜索、点击的数据中构造出来~

       注意,机器学习算法是有泛化能力的,所以不要以为“改善当前的排序模型”就只会针对Training Set中的搜索来改善,而对Training Set中没出现的搜索就没有影响。实际上,它能从Training Set学习,并用在未知的搜索中,这和人的学习过程是很像的,比如给你看了很多台电脑,告诉你之个东西叫电脑,再给你看一台你没见过的电脑,你基本上也能知道它是电脑,为什么?因为你的学习具有泛化能力,你学习到了电脑的特征,就利用这些特征去识别出了新的电脑,虽然它与你之前看过的任何一台电脑都不相同。

        灯灯灯灯~下面正式介绍RankNet,名字中的Net是指神经网络,RankNet以利用神经网络来训练的,关于神经网络的资料,如果大家不嫌弃,可以参考我的另一篇博文:BP神经网络

        好了,首先说说RankNet的Training Set。

        RankNet是一种Pairwise的Learning to Rank算法,什么叫“Pairwise的”?这是从Training Set的角度来说的,它的Training Set是Pairwise的,也就是对于一个查询,会给出一个Pair,然后Label就是这个Pair中哪一个与查询更相关,这个Label可以是Binary的,也可以不是,例如在RankNet中,它的Label可以是这个Pair中一个结果比另一个结果与查询更相关的概率。似乎又有点绕了。。。来个例子吧《学习排序Learning to Rank之RankNet》比如搜索是“CSDN”,Pair是<CSDN首页,CSDN_百度百科>,那么因为对于“CSDN”这个搜索,显然“CSDN首页”是比较相关的的,于是这个Pair的Label可以是1,当然也可以是非Binary的,前提是有合理的办法获得这个非Binary的值,例如从用户搜索、点击的数据中挖掘出来,比如Label是0.9,就可以表示对于搜索“CSDN”,CSDN首页”比“CSDN_百度百科”与搜索更相关这种说法可靠的概率是0.9,或者说置信度是0.9。对于一个搜索,可以有很多个Pair,Training Set中的内容就是,多个搜索与其对应的Pair及Pair的Label。

         说完了RankNet的Training Set,下面来说说RankNet本身,首先,你得有一个为搜索结果打分的函数(Scoring Function),这个函数的作用是用来给搜索结果排序的,函数中带有未知参数,RankNet会帮你把参数训练出来,这个Scoring Function在这里并不是RankNet中特定的,但由于RankNet是用神经网络训练的,而神经网络说到底又是用梯度下降(梯度下降可以参考:gradient descent 梯度下降算法)来训练的,因此只要提供的Scoring Function是smooth的,也就是可导的,那么就可以灌入RankNet中求解,至于Scoring Function的设计,并不是RankNet的责任,在这里,为了方便理解,我就给出一个超级简单的线性Scoring Function吧:

《学习排序Learning to Rank之RankNet》

       其中X是Feature Vector(什么是Feature Vector以及如何进行Feature Extraction就不解释了吧?),W是权重向量,也就是要训练出来的,那么下面我们来看看RankNet如何训练。我们知道,在机器学习中,一般来说,要训练,就要有个Loss Function,来衡量当前模型与Training Set的Loss,也就是差距,然后训练的过程就是把Loss不断减少的过程。下面定义一个概率,它表示对于一个Pair,中的两个网页(对于web搜索来说是网页,但RankNet不仅限于用在web搜索搜索引擎,为了方便讲解,这里说是网页),网页u比第网页v与搜索更相关的的概率:

《学习排序Learning to Rank之RankNet》

       仔细看会发现,这个函数其实就是sigmoid(x)函数,其中x为f(x_u)-f(x_v),sigmoid函数的值域是0到1,因此可以表示概率。这样一个,模型对于Training Set中的一个Pair,就有了这个Pair的概率,还记得刚才说Training Set的时候也说到Training Set 的Label其实也可以看作是概率么?于是它就可以与Training Set中的Pair的Label来比较了,也就是定义一个Loss Function表示误差,在RankNet中,它采用交叉熵(Cross Entropy)来衡量:

《学习排序Learning to Rank之RankNet》

       这是一个Pair的Loss,而Training Set中有很多Pair,因此简单地Sum Up一下就得到了总的Loss。

       现在有了总的Loss,如何进行Optimization以训练出Scoring Function中的参数W,RankNet采用神经网络来训练,还记得刚才提到那个算概率的函数P实际上就是sigmoid函数吗?而神经网络里的激活函数也是sigmoid函数,于量把函数P套进神经网络中那是相当地自然啊,就直接放在神经网络的输出结点就好了~RankNet采用两层的神经网络,如下图所示:

《学习排序Learning to Rank之RankNet》

       包含一个隐藏层和一个输出层,输入结点不算在层数内。

       好了,现在的问题就已经完全是训练神经网络的问题了,这里就不展开了,具体细节可以参考我的另一篇博文:BP神经网络,里面详细介绍了用后向传播(Back Propagation)算法来训练神经网络。

       至此,已经可以把Scoring Function中的参数W求解出来了,那么Scoring Function就可以确定了,就可以把它用在新的搜索上了,直接传入Feature Vector就可以得到score了,有了score可以排序了,就可以得到搜索结果的排序列表,于是整个搜索模型就可以用了。

       参考:

       [1] Learning to Rank using Gradient Descent.

       [2] Learning to Rank for Information Retrieval.


点赞