排序學習實踐---ranknet方法 爲何一些機器學習模型須要對數據進行歸一化?

要: 1 背景      隨着移動互聯網的崛起,愈來愈多的用戶開始習慣於從手機完成吃、喝、玩、樂、衣、食、住、行等各個方面的需求。打開手機,點開手淘、美團等APP,商品玲玲滿目,而讓用戶將全部商品一頁頁看完已經不現實,一般狀況下用戶也就查看前幾頁,若是找不到滿意的商品則退出,從而形成流單。html

1 背景

     隨着移動互聯網的崛起,愈來愈多的用戶開始習慣於從手機完成吃、喝、玩、樂、衣、食、住、行等各個方面的需求。打開手機,點開手淘、美團等APP,商品玲玲滿目,而讓用戶將全部商品一頁頁看完已經不現實,一般狀況下用戶也就查看前幾頁,若是找不到滿意的商品則退出,從而形成流單。所以如何對商品進行排序使得用戶能儘快完成購買流程已經成爲這些平臺的重要攻克方向。緩存

圖1 手機淘寶、美團等app的商品排序示意markdown

      傳統的方法是找幾個特徵好比評分、銷量等,而後找個打分函數如簡單的線性函數: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。

    經過對歷史日誌數據的清洗整理咱們能夠獲得成千上萬的樣本(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方法作一些探討。

相關文章
相關標籤/搜索