Learning to Rank算法介紹:GBRank

以前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中簡單介紹了Learning to Rank的基本原理,也講到了Learning to Rank的幾類經常使用的方法:pointwise,pairwise,listwise。前面已經介紹了pairwise方法中的 RankSVM 和 IR SVM,這篇博客主要是介紹另外一種pairwise的方法:GBRank。html

GBRank的基本思想是,對兩個具備relative relevance judgment的Documents,利用pairwise的方式構造一個特殊的 loss function,再使用GBDT的方法來對此loss function進行優化,求解其極小值。函數

1. 構造loss function

GBRank的創新點之一就在於構造一個特殊的loss function。首先,咱們須要構造pair,即在同一個query下有兩個doc,咱們能夠經過人工標註或者搜索日誌中獲取的方法,來對這兩個doc與該query的相關程度進行判斷,獲得一個相關關係,即其中一個doc的相關程度要比另外一個doc的相關程度更高,這就是relative relevance judgment。一旦咱們有了這個pairwise的相對關係,問題就成了如何利用這些doc pair學習出一個排序模型。學習

假設咱們有如下的preference pairs 做爲training data:優化

咱們構造出如下的loss function:spa

我我的以爲,這個loss function有些受SVM中的hinge loss的啓發,是在hinge loss的基礎上,將原來爲1的參數改爲了。即當的差距達到以上的時候,loss才爲0,不然loss爲日誌

而後問題就變成了怎樣對這個loss function進行優化求解極小值。這裏使用了GBDT的思想,即Functional Gradient Descent的方法。htm

2. Functional Gradient Descent

首先咱們來回顧一下Functional Gradient Descent在GBDT中的使用,具體可見以前的博客:http://www.cnblogs.com/bentuwuying/p/6667267.htmlblog

在GBDT中,Functional Gradient Descent的使用爲:將須要求解的F(x)表示成一個additive model,即將一個函數分解爲若干個小函數的加和形式,而這每一個小函數的產生過程是串行生成的,即每一個小函數都是在擬合 loss function在已有的F(x)上的梯度方向(因爲訓練數據是有限個數的,因此F(x)是離散值的向量,而此梯度方向也表示成一個離散值的向量),而後將擬合的結果函數進一步更新到F(x)中,造成一個新的F(x)。排序

再回到咱們如今面對的問題,對loss function,利用Functional Gradient Descent的方法優化爲極小值。即將f(x)表示成additive model,每次迭代的時候,用一個regression tree來擬合loss function在當前f(x)上的梯度方向。此時因爲訓練數據是有限個數的,f(x)一樣只是一系列離散值,梯度向量也是一系列離散值,而咱們就是使用regression tree來擬合這一系列離散值。但不同的地方在於,這裏的loss function中,有兩個不同的f(x)的離散值,因此每次咱們須要對f(x)在這兩個點上的值都進行更新,即須要對一個training instance計算兩個梯度方向。get

首先,咱們將

看作兩個未知變量,而後求解loss function對這兩個未知變量的梯度,以下:

若是,則此時對應的loss爲0,咱們無需對f(x)進行迭代更新;而若是,則此時的loss不爲0,咱們須要對f(x)進行迭代更新,即便得新的f(x)在這個instance上的兩個點的預測值可以更接近真實值。

具體爲:

當學習速率等於1的時候,更新公式即爲:

此時須要注意的是,有些feature vector x可能會出現屢次,關鍵在不一樣instance中對其的更新值還可能不相同。

一種方法是對同一個feature vector x,將其不一樣的更新值求平均,做爲其最終須要更新到的目標值,再進行擬合。

另外一種更好的方法是,將全部的instance都加入到regression擬合過程當中,不論這些feature vector是否會出現屢次且不一樣次的擬合目標還不同。咱們須要作的就是讓regression擬合過程,結合全部instance的全局信息,本身決定該怎麼樣擬合,怎樣解決同一個feature vector有不一樣目標值得問題。

3. 模型學習步驟

當咱們收集到全部loss值不爲0的training instance後,咱們便獲得了其對應的更新值:

接着,咱們便使用一棵regression tree對這些數據進行擬合,生成一個擬合函數gk(x),而後將此次迭代更新的擬合函數更新到f(x)中,此處採用線性疊加的方式:

其中,ß即爲shrinking係數。

在這裏你們或許會有疑問,爲何在每次迭代更新的時候,新的regression tree不像GBDT中那樣,純粹地去擬合梯度方向(一個離散值的向量),而是去擬合這樣一個 原始預測值+梯度更新值 後的新預測值向量呢?我本身的理解是這樣的(不知道對不對?歡迎你們指正):由於在每次迭代更新的時候,只是取了部分訓練數據(即全部loss值不爲0的training instance中的doc pair),因此每次擬合的時候,都只是對這部分數據進行訓練,獲得一個regression tree,而後把這個新的擬合函數(即regression tree)添加到總的預測函數f(x)中去,即這個regression tree在預測時候是須要對全部訓練數據,而不是部分數據,進行預測的。因此若是每次迭代是去擬合梯度的話(梯度方向徹底有可能與當前的f(x)向量方向相差很大),在預測的時候,這個regression tree對其他數據(並無參與這個regression tree訓練的數據)的預測值會偏離它們原始值較多,並且這個偏離是不在指望之中的,由於這些數據的當前預測值已經相對靠譜了(不會對loss function有貢獻)。因此,當每次擬合的目標是 原始f(x)向量 + 梯度向量 的時候,這個新的向量不會跑的太偏(即跟原始向量相差較小),這時候擬合出來的結果regression tree在對總體數據進行預測的時候,也不會跑的太偏,只是會根據梯度方向稍微有所改變,對其它並不須要更新的數據的影響也相對較小。但同時也在逐漸朝着總體的優化方向上去嘗試,因此纔會這麼去作。

 

總結來看,GBRank的總體學習步驟總結以下:

 

版權聲明:

   本文由笨兔勿應全部,發佈於http://www.cnblogs.com/bentuwuying。若是轉載,請註明出處,在未經做者贊成下將本文用於商業用途,將追究其法律責任。

相關文章
相關標籤/搜索