學習排序Learning to Rank之RankNet

       今天給大家介紹一個Learning to Rank系列算法中的一個:RankNet。

       先簡單地簡介一下Learning to Rank是什麼玩意吧~從名字“學習排序”來看,估計大家也已經基本明白它是幹什麼的了,它就是去從Training Set中學習出一個排序的規則,通常來說是學習一個打分函數(Scoring Function),還是舉個實例的例子吧,我一向喜歡舉例子說明問題得意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中一個結果比另一個結果與查詢更相關的概率。似乎又有點繞了。。。來個例子吧得意比如搜索是“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吧:


       其中X是Feature Vector(什麼是Feature Vector以及如何進行Feature Extraction就不解釋了吧?),W是權重向量,也就是要訓練出來的,那麼下面我們來看看RankNet如何訓練。我們知道,在機器學習中,一般來說,要訓練,就要有個Loss Function,來衡量當前模型與Training Set的Loss,也就是差距,然後訓練的過程就是把Loss不斷減少的過程。下面定義一個概率,它表示對於一個Pair,中的兩個網頁(對於web搜索來說是網頁,但RankNet不僅限於用在web搜索搜索引擎,爲了方便講解,這裏說是網頁),網頁u比第網頁v與搜索更相關的的概率:


       仔細看會發現,這個函數其實就是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)來衡量:


       這是一個Pair的Loss,而Training Set中有很多Pair,因此簡單地Sum Up一下就得到了總的Loss。

       現在有了總的Loss,如何進行Optimization以訓練出Scoring Function中的參數W,RankNet採用神經網絡來訓練,還記得剛纔提到那個算概率的函數P實際上就是sigmoid函數嗎?而神經網絡裏的激活函數也是sigmoid函數,於量把函數P套進神經網絡中那是相當地自然啊,就直接放在神經網絡的輸出結點就好了~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.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章