【推荐系统】推荐系统中的排序学习
“?本文首先介紹排序學習的三種主要類別,然后詳細介紹推薦領域最常用的兩種高層排序學習算法框架:BPR和LambdaMART。因為排序學習的算法和實踐大都來源于信息檢索,一些理論也必須從信息檢索的領域說起,所以本文也會涉及一些的信息檢索、搜索方面的理論知識,但重點依然會放在推薦領域排序學習的應用思路。”
作者:盧明冬,個人博客:https://lumingdong.cn/learning-to-rank-in-recommendation-system.html
「排序學習(Learning to Rank,LTR)」,也稱「機器排序學習(Machine-learned Ranking,MLR)」 ,就是使用機器學習的技術解決排序問題。自從機器學習的思想逐步滲透到信息檢索等領域之后,如何利用機器學習來提升信息檢索的性能水平變成了近些年來非常熱門的研究話題,因此產生了各類基于機器學習的排序算法,也帶來了搜索引擎技術的成熟和發展,如今,Learning to Rank已經成為搜索、推薦和廣告領域非常重要的技術手段。
本文我們首先介紹排序學習的三種主要類別,然后詳細介紹推薦領域最常用的兩種高層排序學習算法框架:BPR和LambdaMART。因為排序學習的算法和實踐大都來源于信息檢索,一些理論也必須從信息檢索的領域說起,所以本文也會涉及一些的信息檢索、搜索方面的理論知識,但重點依然會放在推薦領域排序學習的應用思路。
為什么需要排序學習
傳統的排序方法可粗略分為基于相似度和基于重要性進行排序兩大類,早期基于相關度的模型,通常利用 query 和 doc 之間的詞共現特性(如布爾模型)、VSM(如 TF-IDF、LSI)、概率排序思想(如BM25、LMIR)等方式。基于重要性的模型,利用的是 doc 本身的重要性,如 PageRank、TrustRank 等。在之前《基于內容的推薦算法》和《文本內容分析算法》兩篇文章中,稍有涉及其中的知識點。[^1][^2][^3]
傳統的檢索模型所考慮的因素并不多,主要是利用詞頻、逆文檔頻率和文檔長度、文檔重要度這幾個因子來人工擬合排序公式,且其中大多數模型都包含參數,也就需要通過不斷的實驗確定最佳的參數組合,以此來形成相關性打分。這種方式非常簡單高效,但是也同時存在很多問題[^4]:
很難融合多種信息
手動調參工作量太大,如果模型參數很多,手動調參的可用性非常低
可能會過擬合
LTR則是基于特征,通過機器學習算法訓練來學習到最佳的擬合公式,相比傳統的排序方法,優勢有很多:
可以根據反饋自動學習并調整參數
可以融合多方面的排序影響因素
避免過擬合(通過正則項)
實現個性化需求(推薦)
多種召回策略的融合排序推薦(推薦)
多目標學習(推薦)
$排序學習在推薦領域的重要作用
「推薦的整個流程可以分為召回、排序、重排序這三個階段」,通俗來說,召回就是找到用戶可能喜歡的幾百條資訊,排序就是對這幾百條資訊利用機器學習的方法預估用戶對每條資訊的偏好程度,一般以點擊率衡量,也就是點擊率預估問題。不難看出,排序學習在推薦領域主要用于排序階段,最常用的是Pointwise排序方法;重排序更多是考慮業務邏輯的規則過濾,如在推薦結果的多樣性、時效性、新穎性等方面進行控制。
在沒有Learning to Rank之前,基于內容的推薦算法和基于鄰域的協同過濾雖然也能預測用戶的偏好,可以幫助用戶召回大量的物品,但是我們必須知道,「推薦系統中更重要的目標是排序,因為真正最后推薦給用戶的只有少數物品,我們更關心這些召回物品中哪些才是用戶心中更加喜歡的,也就是排序更靠前,這便是Top-N推薦」。例如使用用戶最近點擊的資訊信息召回這些item的相關結果與用戶偏好類別的熱門結果組合后進行返回。但是這對于資訊類推薦需要考慮以下問題:**資訊類信息流屬于用戶消費型場景,item時效性要求高,item base cf容易召回較舊的內容,而且容易導致推薦結果收斂。**因此可以將item的相關結果保證時效性的基礎上,融合類別、標簽熱門結果,對各個策略的召回結果按照線上總體反饋進行排序,就可以作為用戶的推薦結果。但是這一融合過程比較復雜,一種簡單的方式就是看哪種召回策略總體收益越高就擴大這個策略的曝光占比,對于個體而言卻顯得不是特別個性化,而且在規則調參上也比較困難[^5],「而Leaning to Rank則可以根據用戶的反饋對多路召回的item進行排序推薦。」
排序學習框架
排序學習是一個典型的有監督機器學習過程,我們分別簡單來看一下排序學習在搜索以及推薦領域中的框架和基本流程。
基本流程
在信息檢索中,對每一個給定的查詢-文檔對,抽取特征,通過日志挖掘或者人工標注的方法獲得真實數據標注。然后通過排序模型,使得輸入能夠和實際的數據相似。
排序學習在現代推薦架構中處于非常關鍵的環節,它可以完成不同召回策略的統一排序,也可將離線、近線、在線的推薦結果根據根據用戶所處的場景進行整合和實時調整,完成打分重排并推薦給用戶。
美團推薦框架(2017年)無論是搜索還是推薦,排序學習模型的特征提取以及訓練數據的獲取是非常重要的兩個過程,與常見的機器學習任務相比,也有很多特殊的地方,下面我們簡單介紹這兩個過程中可能需要考慮的問題。
特征提取
在排序學習模型中,文檔都是轉化成特征向量來表征的,這便涉及一系列文本特征提取的工作,我們這里簡單介紹一些可能用到的特征提取方法以及常用的特征類型。
文檔的特征通常可以從傳統排序模型獲得一些相關特征或者相關度打分值,所以可分為兩種類型:
一是文檔本身的特征,比如Pagerank值、內容豐富度、spam值、number of slash、url length、inlink number、outlink number、siterank,用戶停留時間、CTR、二跳率等。
二是Query-Doc的特征:文檔對應查詢的相關度、每個域的tf、idf值,bool model,vsm,bm25,language model相關度等。
也可以對文檔分域,如對于一個網頁文本,特征所在的文檔區域可以包括body域,anchor域,title域,url域,whole document域等。
通過各個域和各種特征,我們可以組合出很多特征,當然有些特征是正相關有些是負相關,這需要我們通過學習過程去選取優化。
標簽獲取
特征可以通過各種方式進行提取,但是Label的獲取就不是那么容易了。目前主要的方式是人工標注或者日志提取,需注意的是,標注的類型與算法選擇以及損失函數都有很大關系。
「人工標注」
人工標注比較靈活,但是若需要大量的訓練數據,人工標注就不太現實了,人工標注主要有以下幾種標注類型:
「單點標注」
單點標注只關注單點,不考慮相互聯系,單點標注又分三種不同的標注方式:
優缺點
優點:標注的量少,為O(n)
缺點:難標,不好統一
對于每個查詢文檔直接打上絕對標簽,即相關度得分
二元標注
相關和不相關
五級標注
按照相關度劃分五級(同NDCG指標):即“最相關”、“相關”、“中性”、“不相關”、最不相關”,通常在模型訓練時會用數字來表示,如1~5
「兩兩標注」
優缺點
優點:標注起來比較方便 缺點:標注量大,應該有
對于一個查詢Query,標注文檔d1比文檔d2是否更加相關,即
「列表標注」
優缺點
優點:相對于上面兩種,標注的效果會很好 缺點:工作量巨大,人工幾乎無法完成(整體的文檔數量太大)
對于一個查詢Query,將人工理想的排序全部標好
「日志抽取」
當搜索引擎搭建起來之后,就可以通過用戶點擊記錄來獲取訓練數據。對應查詢返回的搜索結果,用戶會點擊其中的某些網頁,我們可以假設用戶優先點擊的是和查詢更相關的網頁,盡管很多時候這種假設并不成立,但實際經驗表明這種獲取訓練數據的方法是可行的。
比如,搜索結果A、B、C分別位于第1、2、3位,B比A位置低,但卻得到了更多的點擊,那么B的相關性可能好于A。
「這種點擊數據隱含了Query到文檔的相關性好壞。所以一般會使用點擊倒置的高低位結果作為訓練數據」。
但是日志抽取也存在問題:
用戶總是習慣于從上到下瀏覽搜索結果
用戶點擊有比較大的噪聲
一般頭查詢(head query)才存在用戶點擊
排序學習設計方法
排序學習的模型通常分為「單點法(Pointwise Approach)」、**配對法(Pairwise Approach)「和」列表法(Listwise Approach)**三大類,三種方法并不是特定的算法,而是排序學習模型的設計思路,主要區別體現在損失函數(Loss Function)、以及相應的標簽標注方式和優化方法的不同。
三種方法從ML角度的總覽:
單點法(Pointwise)
單點法排序學習模型的每一個訓練樣本都僅僅是某一個查詢關鍵字和某一個文檔的配對。它們之間是否相關,與其他文檔和其他查詢關鍵字都沒有關系。很明顯,單點法排序學習是對現實的一個極大簡化,但是對于訓練排序算法來說是一個不錯的起點。
單點法將文檔轉換為特征向量后,機器學習系統根據從訓練數據中學習到的分類或者回歸函數對文檔打分,打分結果即是搜索結果。
單點排序學習可以按照標注和損失函數設計的不同,將排序問題轉化成回歸、分類、和有序分類問題(有些文獻也稱有序回歸)問題,可參考下圖:
分別看一下損失函數的設計思想:
分類(Classification):輸出空間包含的是無序類別,對每個查詢-文檔對的樣本判斷是否相關,可以是二分類的,如相關認為是正例,不相關認為是負例;也可以是類似NDCG那樣的五級標注的多分類問題。
分類模型通常會輸出一個概率值,可根據概率值的大小排序作為排序最終結果。
回歸(Regression):輸出空間包含的是真實值相關度得分,可通過回歸來直接擬合相關度打分。
有序分類(Ordinal Classification):有序分類也稱有序回歸(Ordinal Regression),輸出空間一般包含的是有序類別,通常的做法是找到一個打分函數,然后用一系列閾值對得分進行分割,得到有序類別。如采用 PRanking、基于 Margin 的方法。
$推薦領域的Pointwise排序學習
「回到我們的推薦系統領域,最常用就是二元分類的Pointwise,比如常見的點擊率(CTR)預估問題,之所以用得多,是因為二元分類的Pointwise模型的復雜度通常比Pairwise和Listwise要低,而且可以借助用戶的點擊反饋自然地完成正負樣例的標注,而其他Pairwise和Listwise的模型標注就沒那么容易了。成功地將排序問題轉化成分類問題,也就意味著我們機器學習中那些常用的分類方法都可以直接用來解決排序問題,如LR、GBDT、SVM等,甚至包括結合深度學習的很多推薦排序模型,都屬于這種Pointwise的思想范疇。」
「Pointwise方法存在的問題:」
Pointwise方法通過優化損失函數求解最優的參數,可以看到Pointwise方法非常簡單,工程上也易實現,但是Pointwise也存在很多問題:
Pointwise只考慮單個文檔同query的相關性,沒有考慮文檔間的關系,然而排序追求的是排序結果,并不要求精確打分,只要有相對打分即可;
通過分類只是把不同的文檔做了一個簡單的區分,同一個類別里的文檔則無法深入區別,雖然我們可以根據預測的概率來區別,但實際上,這個概率只是準確度概率,并不是真正的排序靠前的預測概率;
Pointwise 方法并沒有考慮同一個 query 對應的文檔間的內部依賴性。一方面,導致輸入空間內的樣本不是 IID 的,違反了 ML 的基本假設,另一方面,沒有充分利用這種樣本間的結構性。其次,當不同 query 對應不同數量的文檔時,整體 loss 將容易被對應文檔數量大的 query 組所支配,應該每組 query 都是等價的才合理。
很多時候,排序結果的Top N條的順序重要性遠比剩下全部順序重要性要高,因為損失函數沒有相對排序位置信息,這樣會使損失函數可能無意的過多強調那些不重要的 docs,即那些排序在后面對用戶體驗影響小的 doc,所以對于位置靠前但是排序錯誤的文檔應該加大懲罰。
「代表算法:」
基于神經網絡的排序算法RankProp、基于感知機的在線排序算法Prank(Perception Rank)/OAP-BPM和基于SVM的排序算法。
「推薦中使用較多的Pointwise方法是LR、GBDT、SVM、FM以及結合DNN的各種排序算法。」
配對法(Pairwise)
配對法的基本思路是對樣本進行兩兩比較,構建偏序文檔對,從比較中學習排序,因為對于一個查詢關鍵字來說,最重要的其實不是針對某一個文檔的相關性是否估計得準確,而是要能夠正確估計一組文檔之間的“相對關系”。
因此,Pairwise的訓練集樣本從每一個“關鍵字文檔對”變成了“關鍵字文檔文檔配對”。也就是說,每一個數據樣本其實是一個比較關系,當前一個文檔比后一個文檔相關排序更靠前的話,就是正例,否則便是負例,如下圖。試想,有三個文檔:A、B 和 C。完美的排序是“B>C>A”。我們希望通過學習兩兩關系“B>C”、“B>A”和“C>A”來重構“B>C>A”。
這里面有幾個非常關鍵的假設[^6]:
**第一,我們可以針對某一個關鍵字得到一個完美的排序關系。**在實際操作中,這個關系可以通過五級相關標簽來獲得,也可以通過其他信息獲得,比如點擊率等信息。然而,這個完美的排序關系并不是永遠都存在的。試想在電子商務網站中,對于查詢關鍵字“蘋果”,有的用戶的意圖是購買水果,有的用戶則是打算購買蘋果手機,甚至對于同一個用戶,在不同時期,對于同一個關鍵詞的搜索意圖也可能是不一樣的,顯然,這類情況就不存在一個完美排序。
**第二,我們寄希望能夠學習文檔之間的兩兩配對關系從而“重構”這個完美排序。**然而,這也不是一個有“保證”的思路。用剛才的例子,希望學習兩兩關系“B>C”、“B>A”和“C>A”來重構完美排序“B>C>A”。然而,實際中,這三個兩兩關系之間是獨立的。特別是在預測的時候,即使模型能夠正確判斷“B>C”和“C>A”,也不代表模型就一定能得到“B>A”。注意,這里的關鍵是“一定”,也就是模型有可能得到也有可能得不到。兩兩配對關系不能“一定”得到完美排序,這個結論其實就揭示了這種方法的不一致性。也就是說,我們并不能真正保證可以得到最優的排序。
**第三,我們能夠構建樣本來描述這樣的兩兩相對的比較關系。**一個相對比較簡單的情況,認為文檔之間的兩兩關系來自于文檔特征(Feature)之間的差異。也就是說,可以利用樣本之間特征的差值當做新的特征,從而學習到差值到相關性差異這樣的一組對應關系。
Pairwise最終的算分,分類和回歸都可以實現,不過最常用的還是二元分類,如下圖:
「不同類型的人工標注標簽如何轉換到 pairwise 類方法的輸出空間:」
Pairwise方法的輸出空間應該是包括所有文檔的兩兩文檔對的偏序關系(pairwise preference),其取值為,+1 表示文檔對中前者更相關,-1則表示文檔對中后者更相關,我們可以把不同類型的人工標注的標簽轉換到Pairwise的真實標簽。
對于單點標注,比如相關度打分 ,文檔對 () 的真實標簽可定義為 ;
對于兩兩標注,本身已經是文檔對的偏序標簽,可直接作為真實標簽,文檔對 () 的真實標簽可定義為;
對于列表標注,拿到的是整體排序 ,文檔對 () 的真實標簽可定義為。
「Pairwise方法存在的問題:」
Pairwise 方法通過考慮兩兩文檔之間的相關對順序來進行排序,相比Pointwise方法有明顯改善。但 Pairwise 方法仍有如下問題:
使用的是兩文檔之間相關度的損失函數,而它和真正衡量排序效果的指標之間存在很大不同,甚至可能是負相關的,如可能出現 Pairwise Loss 越來越低,但 NDCG 分數也越來越低的現象。
只考慮了兩個文檔的先后順序,且沒有考慮文檔在搜索列表中出現的位置,導致最終排序效果并不理想。
不同的查詢,其相關文檔數量差異很大,轉換為文檔對之后,有的查詢可能有幾百對文檔,有的可能只有幾十個,這樣不加均一化地在一起學習,模型會優先考慮文檔對數量多的查詢,減少這些查詢的loss,最終對機器學習的效果評價造成困難。
Pairwise方法的訓練樣例是偏序文檔對,它將對文檔的排序轉化為對不同文檔與查詢相關性大小關系的預測;因此,如果因某個文檔相關性被預測錯誤,或文檔對的兩個文檔相關性均被預測錯誤,則會影響與之關聯的其它文檔,進而引起連鎖反應并影響最終排序結果。
「代表算法:」
基于SVM的Ranking SVM算法、基于神經網絡的RankNet算法和基于Boosting的RankBoost算法。
「推薦中使用較多的Pairwise方法是貝葉斯個性化排序(Bayesian personalized ranking,BPR)。」
「$Pointwise與Pairwise的結合方案」
Pairwise方法的訓練樣例是偏序文檔對,它將對文檔的排序轉化為對不同文檔與查詢相關性大小關系的預測;因此,如果因某個文檔相關性被預測錯誤,或文檔對的兩個文檔相關性均被預測錯誤,則會影響與之關聯的其它文檔,進而引起連鎖反應并影響最終排序結果。而Pointwise方法的訓練樣例是單個文檔,它解決的問題恰恰是對單個文檔的相關性預測。基于此,本文在Pairwise方法的基礎上,增加Pointwise損失函數,通過融入對單個文檔相關性大小的考慮,減小因錯誤預測單個文檔相關性大小而導致連鎖反應所造成的損失,來優化Pairwise方法去排序模型,提升其排序性能。
1)推薦領域中,凡是基于協同過濾對單個物品進行偏好打分預測的模型,其實都可以看成是Pointwise排序方法。對于Pairwise方法,協同過濾可以發展為用戶對一對物品偏好。一個通常的做法是將Pointwise的輸出作為Pairwise的輸入特征,然后兩兩作差,在用Pointwise方法保證單個物品預測精度的基礎上,用Pairwise對做進一步排序優化。這種方法的一個典型案例是BPR,它是推薦領域中使用較多的Pairwise方法,具體內容我們將在下一小節單獨介紹。
2)將Pointwise的損失函數融合進Pairwise的損失函數[^7]
考查現存Pointwise方法,大多將排序問題轉化為分類或回歸問題,所用到的損失函數分別為分類或回歸問題的損失函數。本文采用回歸損失函數,它也是人工神經網絡中常用的用于衡量訓練樣例的預測值與真實值之間誤差的函數。記為訓練集合中文檔的相關性大小標注值,為排序模型對文檔的相關性預測值,則其Pointwise損失函數形式如下:
考慮到Pairwise方法不會將所有文檔的相關性預測錯誤,且單個文檔在不同偏序文檔對中存在重復,因而將Pairwise損失函數與Pointwise損失函數線性插值,得到改進的損失函數,形式如下:
其中, 與 是不同損失函數的權重,試驗中通過驗證集來確定其大小。
列表法(Listwise)
相對于嘗試學習每一個樣本是否相關或者兩個文檔的相對比較關系,列表法排序學習的基本思路是嘗試直接優化像 NDCG(Normalized Discounted Cumulative Gain)這樣的指標,從而能夠學習到最佳排序結果。
關于NDCG以及其他相關排序指標,可參考我之前寫的文章《工業界推薦系統的評測標準》。
列表法的相關研究有很大一部分來自于微軟研究院,這其中著名的作者就有微軟亞州院的徐君、李航、劉鐵巖等人,以及來自微軟西雅圖的研究院的著名排序算法LambdaMART以及Bing搜索引擎的主導人克里斯托弗·博格斯(Christopher J.C. Burges)。
列表法排序學習有兩種基本思路。第一種稱為Measure-specific,就是直接針對 NDCG 這樣的指標進行優化。目的簡單明了,用什么做衡量標準,就優化什么目標。第二種稱為Non-measure specific,則是根據一個已經知道的最優排序,嘗試重建這個順序,然后來衡量這中間的差異。
「1)Measure-specific,直接針對 NDCG 類的排序指標進行優化」
先來看看直接優化排序指標的難點和核心在什么地方。
難點在于,希望能夠優化 NDCG 指標這樣的“理想”很美好,但是現實卻很殘酷。NDCG、MAP以及AUC這類排序標準,都是在數學的形式上的“非連續”(Non-Continuous )和“非可微分”(Non-Differentiable)。而絕大多數的優化算法都是基于“連續”(Continuous )和“可微分” (Differentiable)函數的。因此,直接優化難度比較大。
針對這種情況,主要有這么幾種解決方法。
第一種方法是,既然直接優化有難度,那就找一個近似 NDCG 的另外一種指標。而這種替代的指標是“連續”和“可微分”的 。只要我們建立這個替代指標和 NDCG 之間的近似關系,那么就能夠通過優化這個替代指標達到逼近優化 NDCG 的目的。這類的代表性算法的有 SoftRank 和 AppRank。
第二種方法是,嘗試從數學的形式上寫出一個 NDCG 等指標的“邊界”(Bound),然后優化這個邊界。比如,如果推導出一個上界,那就可以通過最小化這個上界來優化 NDCG。這類的代表性算法有 SVM-MAP 和 SVM-NDCG。
第三種方法則是,希望從優化算法上下手,看是否能夠設計出復雜的優化算法來達到優化 NDCG 等指標的目的。對于這類算法來說,算法要求的目標函數可以是“非連續”和“非可微分”的。這類的代表性算法有 AdaRank 和 RankGP。
「2)Non-measure specific,嘗試重建最優順序,衡量其中差異」
這種思路的主要假設是,已經知道了針對某個搜索關鍵字的完美排序,那么怎么通過學習算法來逼近這個完美排序。我們希望縮小預測排序和完美排序之間的差距。值得注意的是,在這種思路的討論中,優化 NDCG 等排序的指標并不是主要目的。這里面的代表有 ListNet 和 ListMLE。
「3)列表法和配對法的中間解法」
第三種思路某種程度上說是第一種思路的一個分支,因為很特別,這里單獨列出來。其特點是在純列表法和配對法之間尋求一種中間解法。具體來說,這類思路的核心思想,是從 NDCG 等指標中受到啟發,設計出一種替代的目標函數。這一步和剛才介紹的第一種思路中的第一個方向有異曲同工之妙,都是希望能夠找到替代品。
找到替代品以后,接下來就是把直接優化列表的想法退化成優化某種配對。這第二步就更進一步簡化了問題。這個方向的代表方法就是微軟發明的 LambdaRank 以及后來的 LambdaMART。微軟發明的這個系列算法成了微軟的搜索引擎 Bing 的核心算法之一,而且LambdaMART也是推薦領域中可能用到一類排序算法。
「Listwise方法存在的問題:」
列表法相較單點法和配對法針對排序問題的模型設計更加自然,解決了排序應該基于 query 和 position 問題。
但列表法也存在一些問題:一些算法需要基于排列來計算 loss,從而使得訓練復雜度較高,如 ListNet和 BoltzRank。此外,位置信息并沒有在 loss 中得到充分利用,可以考慮在 ListNet 和 ListMLE 的 loss 中引入位置折扣因子。
「代表算法:」
基于Measure-specific的SoftRank、SVM-MAP、SoftRank、LambdaRank、LambdaMART,基于Non-measure specific的ListNet、ListMLE、BoltzRank。
「推薦中使用較多的Listwise方法是LambdaMART。」
推薦常用的排序學習算法
BPR(貝葉斯個性化排序)
「基本設定」
「貝葉斯個性化排序(Bayesian personalized ranking,BPR」)是一種Pairwise方法,并且借鑒了矩陣分解的思路,在開始深入講解原理之前我們先了解整個BPR的基礎假設以及基本設定。[^8] [^9]
因為是基于貝葉斯的Pairwise方法,BPR有兩個基本假設:
每個用戶之間的偏好行為相互獨立,即用戶 在商品 和 之間的偏好和其他用戶無關。
同一用戶對不同物品的偏序相互獨立,也就是用戶 在商品 和 之間的偏好和其他的商品無關。
完整性:
反對稱性:
傳遞性:
訓練數據由正樣本,負樣本和缺失值構成。兩個未觀測到的物品的缺失值正好就是以后需要進行排序的物品對。這意味著從成對訓練的角度,訓練數據和測試數據是不相交的。
訓練數據是為后面的排序目標函數生成的,也就是觀測值的子集被用作訓練數據。
隨機初始化矩陣P、Q
迭代更新模型參數:
當兩個相關性不同的文檔算出來的模型分數相同時,即,此時的損失函數的值為,依然大于0,仍會對這對pair做懲罰,使他們的排序位置區分開。
損失函數是一個類線性函數,可以有效減少異常樣本數據對模型的影響,因此具有魯棒性。
如果模型 對此Query返回的n條結果中, 分別位于前兩位,那么pairwise error就為0;
如果模型 對此Query返回的n條結果中, 分別位于第1位和第n位,那么pairwise error為n-2;
如果模型 對此Query返回的n條結果中, 分別位于第2和第3位,那么pair-wise error為2;
分析了梯度的物理意義;
繞開損失函數,直接定義梯度。
每棵樹的訓練會先遍歷所有的訓練數據(label不同的文檔pair),計算每個pair互換位置導致的指標變化 以及Lambda,即:
然后計算每個文檔的Lambda:
為了簡化表示,我們將上述求和操作表示如下:
因此,對于該模型的任何給定狀態(即對于任何特定的一組分數),以及特定的,我們可以利用Lambda梯度推出更新損失(效用)函數:
由此可得
我們定義:
于是可知:
再計算每個 的導數,用于后面的牛頓法求解葉子節點的數值:
創建回歸樹擬合第一步生成的 ,劃分樹節點的標準是MSE(Mean Square Error),生成一顆葉子節點數為的回歸樹。
對第二步生成的回歸樹,計算每個葉子節點的數值,采用牛頓迭代法求解,即對落入該葉子節點的文檔集,用下面的公式計算第棵樹的第個葉子節點上的值:
更新模型,將當前學習到的回歸樹加入到已有的模型中,用學習率(也叫shrinkage系數)做regularization。
適用于排序場景:不是傳統的通過分類或者回歸的方法求解排序問題,而是直接求解;
損失函數可導:通過損失函數的轉換,將類似于NDCG這種無法求導的IR評價指標轉換成可以求導的函數,并且富有了梯度的實際物理意義,數學解釋非常漂亮;
增量學習:由于每次訓練可以在已有的模型上繼續訓練,因此適合于增量學習;
組合特征:因為采用樹模型,因此可以學到不同特征組合情況;
特征選擇:因為是基于MART模型,因此也具有MART的優勢,每次節點分裂選取Gain最?的特征,可以學到每個特征的重要性,因此可以做特征選擇;
適用于正負樣本比例失衡的數據:因為模型的訓練對象具有不同label的文檔pair,而不是預測每個文檔的label,因此對正負樣本比例失衡不敏感。
用于多路召回策略的融合排序
一個推薦系統的召回階段可能會用到多種不同召回策略,比如基于內容的召回、基于熱門物品的召回、基于協同過濾的召回、基于類別和標簽的召回等等,不同的召回策略召回的物品無法確切地分辨哪個策略召回更重要,所以需要一個排序學習模型,根據用戶的行為反饋來對多路召回的物品進行排序推薦,這也是排序模塊的一大重要作用。
多目標學習排序
通常一個推薦系統的目標是提高點擊率(CTR)或轉化率(CVR),但是這些并不能完全反映用戶對推薦物品的滿意度,以此為目標的推薦系統也無法保證用戶存留。為了提高用戶對推薦物品滿意度,可能還需要依賴更多的指標,比如加購、收藏、分享等等。由此便產生了多種目標,那如何將多種目標綜合到一個模型里面進行學習,這就是推薦系統的多目標學習,而排序學習可以作為多目標學習的一種方法。
關于多目標學習,更多內容可參考我的另一篇文章《推薦系統中的多任務學習》(https://lumingdong.cn/multi-task-learning-in-recommendation-system.html),這里僅談一下常見的多目標學習方法。
1)每個目標訓練一個模型,每個模型算出一個分數(預估概率),然后根據業務設計一個經驗公式計算出綜合分數,再按照綜合分數進行排序推薦。這個經驗公式通常會包含代表各個目標重要性的超參數(比如最簡單的線性回歸中的權重),但這些超參數基本是靠人工根據經驗來確定的,因為很難標注 Label,不太容易用模型學習。
2)使用排序學習方法融合多目標,一種常見的方法是對多目標產生的物品構建Pair,比如用戶對物品產生的購買,對物品 產生了了點擊,假入我們覺得購買的目標比點擊的目標更重要,就可以讓。有了順序對,我們便可以訓練排序學習模型。比如根據前面講得特征工程建立一個 LR模型或者DNN模型。訓練目標就是學習DNN或者LR的參數。
3)采?用多任務學習(multi-task learning),共享參數,學習出多個分數,最后結合起來。典型的算法有谷歌的MMOE(Multi-gate Mixture-of-Experts)以及阿里的ESMM(Entire Space Multi-Task Model)。
在原始論文中,BPR用來解決隱式反饋的推薦排序問題,假設有用戶集 和物品集 ,當用戶 ()在物品展示頁面點擊了物品 ()卻沒有點擊同樣曝光在展示頁面的物品 (),則說明對于物品和物品 ,用戶 可能更加偏好物品 ,用Pairwise的思想則是物品 的排序要比物品 的排序更靠前,這個偏序關系可以寫成一個三元組$,為了簡化表述,我們用>_u符號表示用戶u的偏好,可以表示為:i>_uj。單獨用>_u代表用戶u對應的所有商品中兩兩偏序關系,可知>_u \subset I^2,且>_u$滿足下面的特性:
記S為所有用戶對所有物品發生的隱式反饋集合,這里針對隱式反饋問題對評分矩陣進行了簡化,即點擊過則視為正例,記為1;沒點擊過則視為負例,通常會置為0,如下圖所示:
可知,,我們這里定義:
「矩陣分解的一些缺陷」
我們知道,矩陣分解是通過預測用戶對候選物品的評分,然后根據這個預測評分去排序,最后再推薦給用戶。這種方法是一種典型的Pointwise方法,無論是預測評分還是預測隱式反饋,本質上都是在預測用戶對一個物品的偏好程度。
但是這種方法有很大的問題,因為很多時候我們只能收集到少數正例樣本,剩下的數據其實是真實負例和缺失值的混合構成(這里的缺失值是指訓練數據中除正例和負例外的未知數據,可以理解為未曝光或者曝光了的但是用戶可能沒有注意到缺失數據,所以缺失值中的樣本即有可能是正例,也有可能是負例),而我們用這種方法構建訓練數據的時候,往往無法確定負例到底是哪些,就只能把除正例以外的其他部分都當作是負例,這就會使得訓練數據中負例的一部分其實是缺失值。把缺失值當作是負樣本,再以預測誤差為評判標準去使勁逼近這些樣本。逼近正樣本沒問題,但是同時逼近的負樣本只是缺失值而已,真正呈現在用戶面前,并不能確定是不喜歡還是喜歡。而且,這樣的模型僅能預測正例或負例,對于類別內的樣本無法深入區別其重要性,不利于排序。
當然,對于這種情況,我們也可以用一些其他方法來規避這些問題,比如負例采樣,比如按預測概率排序,但這些方法也僅僅是“緩兵之計”,對于解決排序問題來說并不完善。
我們來看看BPR是怎么解決的,它是如何采用Pairwise方法來重新優化矩陣分解的。
「BPR的樣本構建」
首先BPR利用Pairwise的思想來構建偏序關系,它依然沒有從無反饋數據中去區分負例樣本和缺失值,不過和之前的方法不一樣的是,BPR不是單純地將無反饋數據都看做是負例,而是與正例結合一起來構建偏序關系。「這里的核心假設是,某用戶對他有過反饋的物品的偏好程度一定比沒有反饋過的物品高」(這里的反饋一般指隱式反饋,如點擊瀏覽等,不涉及負反饋),未反饋的物品包括真正的負例以及缺失值。BPR試圖通過用戶的反饋矩陣S來為每一個用戶構建出完整的偏序關系,也稱全序關系,用表示。
例如下圖:
圖左邊的矩陣是反饋數據集S,“+”代表有反饋數據,“?”代表無反饋數據。
圖右邊的小矩陣是每個用戶的偏序關系矩陣,“+”代表用戶喜歡 勝過喜歡 ,作為訓練數據的正例;“-”代表用戶喜歡 勝過喜歡 ,作為訓練數據的負例;“?”代表同類數據無法確定偏序關系。
比如用戶看過產品但是沒看過產品,所以我們假設用戶喜歡產品勝過:即。對于用戶均產生反饋過的產品,我們不能推斷出任何偏好,同樣,對于那些用戶都沒有反饋過的兩個產品,我們也不能推斷出任何偏好。也就是說,兩個有反饋數據之間以及兩個無反饋數據之間都無法構建偏序關系。
為了形式化描述這種情形,我們定義訓練數據 :
其中 的表示是用戶 更喜歡 勝過 ; 是離散數學中的符號,表示and,等同于;表示物品集 除正例外其他剩余的樣本。
由于是反對稱的,因此我們也隱式地考慮了負樣本。
相比于單點法的矩陣分解,基于配對法的BPR有兩大優勢:
「從MF到BPR」
通過上面的樣本構造便可以得到我們的訓練樣本,每一個樣本都是由用戶 、物品 、物品 、以及兩個物品的偏序關系 構成的四元組 ,其中 表示兩個物品偏序關系并作為label,通常用0、1標注,如物品 的偏序大于物品 的,則 標注為1,反之則標注為0。
接下來我們來看看如何構建目標函數。
首先我們必須清楚,這回的目標不再是像MF的均方根誤差最小,而是需要滿足物品相對排序最佳。一個簡單的思路就是當得到了用戶和物品的推薦分數后,就可以計算四元組的樣本中,物品 和物品 的分數差,這個分數可能是正數,也可能是負數,也可能是 0。
我們可以通過預測分數的差值的大小來判斷排序是否良好,最希望的情況是:如果物品 和物品 偏序關系的標注為 1,那么希望兩者分數之差是個正數,而且越大越好;如果物品 和物品 的相對順序是 0,則希望分數之差是負數,且越小越好。
可以看出,這種方式來構建目標函數的話,依然是需要預測分數的,而這個分數的預測最常用的就是矩陣分解的方法,原論文中還用到了另外一種方法,叫自適應K近鄰(Adaptive KNN)。這里我們這里只看矩陣分解。「當然BPR中的預測的分數無論在顯示反饋還是隱式反饋情境下,都只是用來輔助度量相對排序,其評分并不作為實際的意義上的評分。」
同FunkSVD矩陣一樣,預測分數的問題可以視作對矩陣進行估計。通過矩陣分解我們可以將目標矩陣X近似分解為兩個低秩矩陣和 的乘積:
其中 是特征矩陣的維度。 中的每一行可以視作描述一個用戶的特征向量,類似地中的每一行可以視作描述物品 的特征向量。因此,預測公式也可以寫成:
$$\hat{x}_{ui}=q_i^T p_u==\sum _{f=1}^{k}p_{uf} \cdot q_{if} $$其中,??,?? 代表向量點積。
有了這些基礎的理解后,接下來我們來看BPR如何在矩陣分解的基礎上來構建排序的目標函數,BPR的過程實際上是一種優化過程。
「BPR 損失函數推導」
BPR 基于「最大后驗估計」來求解模型參數,這里我們用來表示參數和, 代表用戶u對應的所有商品的全序關系,則優化目標是。根據貝葉斯公式,我們有:
由于我們求解假設了用戶的排序和其他用戶無關,那么對于任意一個用戶 來說,對所有的物品一樣,所以有:
這個優化目標轉化為兩部分。第一部分和樣本數據集有關,第二部分和樣本數據集無關。
對于第一部分,由于我們假設每個用戶之間的偏好行為相互獨立,同一用戶對不同物品的偏序相互獨立,所以有:
其中,
這里說一下我對負例部分 寫法的理解:
在構建樣本一小節,我們已經知道,,這里依然以上面矩陣圖為例來說明。
對而言,其訓練集合。根據,它的負例表達為,并且只有這一種表達。因為(,,)中的和都是有限制的。
根據上面講到的完整性和反對稱性,優化目標的第一部分可以簡化為:
而對于這個概率,我們可以使用下面這個式子來代替:
其中,是sigmoid函數,即:
這里你也許會問,為什么可以用這個sigmoid函數來代替呢? 其實這里的代替可以選擇其他的函數,不過式子需要滿足BPR的完整性,反對稱性和傳遞性。原論文作者這么做除了是滿足這三個性質外,另一個原因是為了方便優化計算。
對于這個式子,我們要滿足當時,, 反之當時,,最簡單的表示這個性質的方法就是
而 , ,就是我們的矩陣對應位置的值。這里為了方便,我們不寫,這樣上式可以表示為:
注意上面的這個式子也不是唯一的,只要可以滿足上面提到的當時,,以及對應的相反條件即可。這里我們仍然按原論文的式子來。
最終,我們的第一部分優化目標轉化為:
對于第二部分,原作者大膽使用了貝葉斯假設,即這個概率分布符合正態分布,且對應的均值是0,協方差矩陣是,即
原作者為什么這么假設呢?個人覺得還是為了優化方便,因為后面我們做優化時,需要計算,而對于上面假設的這個多維正態分布,其對數和成正比。即:
可以發現,它正是我們常見的正則化項,用來防止過擬合,這就是說正則項其實可以認為模型參數還有個先驗概率,這是貝葉斯學派的觀點,也是 BPR 這個名字中“貝葉斯”的來歷。
最終對于我們的最大對數后驗估計函數
由于
再添加負號以求最小損失,并將拆分,由此我們便得到「BPR最終的損失函數」:
這樣一看,其實BPR的損失函數還是很簡單的。
「BPR的優化學習過程」
BPR可以用常用的梯度下降或者牛頓法來優化,我們以梯度下降為例。
對求導:
這樣我們可以求出:
有了梯度迭代式子,用梯度下降法求解模型參數就容易了。下面我們歸納下BPR的算法流程。
「BPR算法流程」
下面簡要總結下BPR的算法訓練流程:
輸入:訓練集D三元組,學習率, 正則化參數,分解矩陣維度k。
輸出:模型參數,矩陣P、Q
3. 如果P、Q收斂,則算法結束,輸出P、Q,否則回到步驟2。
當我們拿到P、Q后,就可以計算出每一個用戶u對應的任意一個商品的排序分:,最終選擇排序分最高的若干商品輸出。
「BPR和AUC的關系」
我們通過上面的內容知道,AUC是一個不連續不可微分的函數,我們無法直接當做目標函數來進行優化,不過BPR目標函數經過化簡和變形后,和把 AUC 當成目標函數是非常相似的,因此,「BPR 模型從某種角度來說,其實是AUC的一種近似。」
單用戶AUC通常定義為:
因此平均AUC為:
如用我們上面Ds表示方法,則可寫成:
其中, 為歸一化常數:
而我們之前BPR的優化目標函數為:
通過這兩個公式的對比,不難發現,除了標準化常數之外,它們只是在損失函數上稍有不同。AUC使用了不可微分的損失,實際上可以看作一個階躍函數(Heaviside Function):
而BPR則用的是可微分的Sigmoid函數來代替這個Heaviside函數,因為這兩個函數圖像非常相似。其實這種方式在實踐中很常見 ,通常會啟發式地選擇一個與不可微的躍遷函數圖像非常接近的可微函數,當然這里我們為了便于優化,最后我們用的是。如下圖所示:
「BPR小結」
BPR其實可以看作在準確率之上更加高層的排序算法框架,可以將Pointwise變成Pairwise,因此,實際上它不僅僅局限于矩陣分解,理論上Pointwise算法都可以使用BPR,難點在于求損失函數。另外,基于MF的BPR經過了很好的驗證,使用范圍很廣,所以但凡適用于MF的推薦場景,基本都可以在其上層添加BPR進行排序優化。
在實際產品中,BPR之類的推薦排序在海量數據中選擇極少量數據做推薦的時候有優勢,因此在很多互聯網大廠中應用也很廣泛。
LambdaMART
LambdaMART是一個享有盛譽的經典機器學習排序模型,也是微軟在Bing中使用了較長時間的模型。LambdaMART的提出先后經由RankNet、LambdaRank逐步演化而來,這三種算法被多次證明能夠很好地解決現實中的排序問題,而它們的提出,都涉及一個核心人物,他就是來自微軟研究院的克里斯多夫?博格斯(Christopher J.C. Burges),可以說,是博格斯領導的團隊發明了微軟搜索引擎 Bing 的算法。
接下來,我們依次介紹RankNet、LambdaRank和LambdaMART算法。[^10]
RankNet
RankNet是2005年微軟提出的一種Pairwise的Learning to Rank算法,它從概率的角度來解決排序問題。RankNet的核心是「提出了一種概率損失函數來學習Ranking Function」,并應用Ranking Function對文檔進行排序。這里的Ranking Function可以是任意對參數可微的模型,也就是說,該概率損失函數并不依賴于特定的機器學習模型,在論文中,RankNet是基于神經網絡實現的。除此之外,GDBT、LR、MF等模型也可以應用于該框架。
「預測相關性概率」
RankNet網絡將輸入query的特征向量映射為一個實數。其實它的整個過程其實與上面介紹的BPR十分相似。具體地,給定特定query下的兩個文檔和,其特征向量分別為和,經過RankNet進行前向計算得到對應的分數為和。用表示比排序更靠前(如對某個query來說,被標記為“good”,被標記為“bad”)。RankNet把排序問題轉換成比較一個 文檔對的排序概率問題,它首先計算每個文檔的得分,再用下面的公式來計算應該比排序更靠前的概率:
這個概率實際上就是深度學習中經常使用的sigmoid函數,由于參數影響的是sigmoid函數的形狀,對最終結果影響不大,因此通常默認使用 進行簡化。
RankNet證明了如果知道一個待排序文檔的排列中相鄰兩個文檔之間的排序概率,則通過推導可以算出每兩個文檔之間的排序概率。因此對于一個待排序文檔序列,只需計算相鄰文檔之間的排序概率,不需要計算所有pair,減少計算量。
「真實相關性概率」
對于特定的query,定義為文檔和文檔被標記的標簽之間的關聯,即
我們定義比更相關(排序更靠前)的真實概率為:
「RankNet的損失函數」
對于一個排序,RankNet從各個doc的相對關系來評價排序結果的好壞,排序的效果越好,那么有錯誤相對關系的pair就越少。所謂錯誤的相對關系即如果根據模型輸出排在前面,但真實label為的相關性小于,那么就記一個錯誤pair,**RankNet本質上就是以錯誤的pair最少為優化目標,也就是說RankNet的目的是優化逆序對數。而在抽象成損失函數時,RankNet實際上是引入了概率的思想:不是直接判斷排在前面,而是說以一定的概率P排在前面,即是以預測概率與真實概率的差距最小作為優化目標。**最后,**RankNet使用交叉熵(Cross Entropy)作為損失函數**,來衡量對的擬合程度:(注:這里為了與原論文保持一致,用C表示損失函數,但實際上,更習慣用L。)
化簡后,有:
當,有:
當,有:
可以看出損失函數具有對稱性,也即交換和的位置,損失函數的值不變。
分析損失函數的趨勢發現,如果對文檔和的打分可以正確地擬合標記的標簽,則趨向于0,否則趨向于線性函數。具體地,假如,即應該比排序高:
如果,則擬合的分數可以正確排序文檔和文檔,
如果$s_i
下面展示了當分別取1,0,-1的時候損失函數以為變量的示意圖[^11]:
可以看到當時,模型預測的相關性分數比越大,其損失函數的值越小;時,比越小,損失函數的值越小;時,損失函數的最小值在與相等處取得。
該損失函數有以下幾個特點:
Ranknet最終目標是訓練出一個打分函數;,使得所有pair的排序概率估計的損失最小,即:
其中,表示所有在同一query下,且具有不同相關性判斷的doc pair,每個pair有且僅有一次。
通常,這個打分函數只要是光滑可導就行,比如都可以,RankNet使用了兩層神經網絡:
「參數更新」
RankNet采用神經網絡模型優化損失函數,也就是后向傳播過程,采用梯度下降法求解并更新參數:
其中, 是學習率,論文中實驗時選取的范圍是1e-3到1e-5,因為RankNet是一種方法框架,因此這里的可以是NN、LR、GBDT等算法的權重。
對RankNet的梯度進行因式分解,有:
其中,
可以發現其中的對稱關系,和對的偏導數可根據神經網絡求偏導數的方式求得。
由公式可知,結果排序最終由模型得分 確定,它的梯度很關鍵,于是我們定義:
考慮有序對 ,有 ,于是有簡化
這個就是接下來要介紹的LambdaRank和LambdaMART中的Lambda,稱為Lambda梯度。
「RankNet小結」
排序問題的評價指標一般有NDCG、ERR、MAP、MRR等,這些指標的特點是不平滑、不連續,無法求梯度,因此無法直接用梯度下降法求解。RankNet的創新點在于沒有直接對這些指標進行優化,而是間接把優化目標轉換為可以求梯度的基于概率的交叉熵損失函數進行求解。因此任何用梯度下降法優化目標函數的模型都可以采用該方法,RankNet采用的是神經網絡模型,其他類似boosting tree等模型也可以使用該方法求解。
LambdaRank
RankNet有哪些缺陷,為什么需要LambdaRank?
盡管 RankNet 取得了一些成功,但它存在一些缺陷,我們講過RankNet本質上就是以錯誤的pair最少為優化目標,也就是說RankNet的直接目的就是優化逆序對數(pairwise error),這種方式一定程度上能夠解決一些排序問題,但它并不完美。
我們先來直觀認識一下RankNet優化逆序對數量這個過程。
逆序對數(pairwise error)表示一個排列中,抽查任意兩個item,一共有 種可能的組合,如果這兩個item的之間的相對排序錯誤,逆序對數量增加1。
「逆序對數的實質就是插入排序過程中要移動元素的次數。直觀理解為要想把某個元素移動到最優排序位置,需要移動多少次,兩個元素就是二者移動次數的和。」
例如,對某個Query,和它相關的文章有兩個,記為 。
假設RankNet經過兩輪迭代實現下圖所示的順序優化:
第一輪的時候逆序對數為13,第二輪為 3 + 8 = 11,逆序對數從13優化到11,損失確實是減小了,如果用AUC作為評價指標,也可以獲得指標的提升。但實際上,我們不難發現,優化逆序對數并沒有考慮位置的權重,這與我們實際希望的排序目標不一致。下一輪迭代,RankNet為了獲得更大的逆序對數的減小,會按照黑色箭頭那樣的趨勢,排名靠前的文檔優化力度會減弱,更多的重心是把后一個文檔往前排,這與我們搜索排序目標是不一致的,我們更希望出現紅色箭頭的趨勢,優化的重點放在排名靠前的文檔,盡可能地先讓它排在最優位置。所以我們需要一個能夠考慮位置權重的優化指標。
你應該理解了,「RankNet以優化逆序對數為目標,并沒有考慮位置的權重,這種優化方式對AUC這類評價指標比較友好,但實際的排序結果與現實的排序需求不一致,現實中的排序需求更加注重頭部的相關度,排序評價指標選用 NDCG 這一類的指標才更加符合實際需求。而RankNet這種以優化逆序對數為目的的交叉熵損失,并不能直接或者間接優化NDCG這樣的指標。」
我們知道NDCG是一個不連續的函數,無法直接優化,那LambdaRank又是如何解決這個問題的呢?
我們必須先有這樣一個洞察,「對于絕大多數的優化過程來說,目標函數很多時候僅僅是為了推導梯度而存在的。而如果我們直接就得到了梯度,那自然就不需要目標函數了。」
于是,微軟學者經過分析,就直接把RankNet最后得到的Lambda梯度拿來作為LambdaRank的梯度來用了,這也是LambdaRank中Lambda的含義。這樣我們便知道了LambdaRank其實是一個經驗算法,它不是通過顯示定義損失函數再求梯度的方式對排序問題進行求解,而是分析排序問題需要的梯度的物理意義,直接定義梯度,即Lambda梯度。有了梯度,就不用關心損失函數是否連續、是否可微了,所以,微軟學者直接把NDCG這個更完善的評價指標與Lambda梯度結合了起來,就形成了LambdaRank。
我們來分析一下Lambda梯度的物理意義。
LambdaRank中的Lambd其實就是RankNet中的梯度,「可以看成是和中間的作用力,代表下一次迭代優化的方向和強度」。如果,則會給予向上的大小為的推動力,而對應地會給予向下的大小為的推動力[^12]。對應上面的那張圖,Lambda的物理意義可以理解為圖中箭頭,即優化趨勢,因此有些人也會把Lambda梯度稱之為箭頭函數。
之后,直接用乘以就可以得到LambdaRank的Lambda,即:
其中是和交換排序位置得到的NDCG差值。NDCG傾向于將排名高并且相關性高的文檔更快地向上推動,而排名低而且相關性較低的文檔較慢地向上推動,這樣通過引入IR評價指標就實現了類似上面圖中紅色箭頭的優化趨勢。可以證明,通過此種方式構造出來的梯度經過迭代更新,最終可以達到優化NDCG的目的。
另外還可以將替換成其他的評價指標,比如ERR等(其實AUC也可,但不會這樣用)。
對于對于特定,累加其他所有排序項的影響,得到:
可以理解為?檔在query 排列中移動的?向和?度。也就是說:「每條文檔移動的方向和趨勢取決于其他所有與之 label 不同的文檔。」
如何理解上面這個公式呢?舉個例子:
如果只有一組Pair ,則。可知。
當然,我們還可以反推一下 LambdaRank 的損失函數,確切地應該稱為效用函數(utility function):
這里的泛指可用的評價指標,但最常用的還是NDCG。
總結LambdaRank的主要突破點:
LambdaMART
LambdaRank重新定義了梯度,賦予了梯度新的物理意義,因此,所有可以使用梯度下降法求解的模型都可以使用這個梯度,基于決策樹的MART就是其中一種,將梯度Lambda和MART結合就是大名鼎鼎的LambdaMART。實踐證明,基于決策樹的方法對于排序問題非常有效果,也就成了很多類似方法的標準配置。LambdaMART不但是微軟 Bing 搜索引擎使用較長時間的算法,也是獲得2008年Yahoo!learning to rank challenge比賽的冠軍使用的算法。
MART就是我們熟知的GBDT,LambdaMART只是在GBDT的過程中做了一個很小的修改。原始GBDT的原理是直接在函數空間對函數進行求解模型,結果由許多棵樹組成,每棵樹的擬合目標是損失函數的梯度,而在LambdaMART中這個梯度就換成了Lambda梯度,這樣就使得GBDT 并不是直接優化二分分類問題,而是一個改裝了的二分分類問題,也就是在優化的時候優先考慮能夠進一步改進 NDCG 的方向。
由此,LambdaMART的整個過程如下:
關鍵過程數學推導:
需注意的是,原論文的這部分推導過程比較跳躍,非常粗略,加上數學符號的表示也是不太常見,所以我也不能保證下面我的理解一定是對的,LambdaMART這個過程理解起來不難,但是真的要去代碼實現會涉及很多計算細節,難度不小,代碼實踐可參考 :link: LambdaMART代碼實現(https://blog.csdn.net/mr_tyting/article/details/80580075)。
LambdaMART具有很多優勢:[^13]
LambdaMART提供了一個很好的算法框架,有了這個Lambda梯度的計算和應用方法,我們還可以與深度網絡相結合,通過該梯度構造出的深度學習網絡稱之為LambdaDNN,訓練的時候利用深度網絡預測同Query下的Doc得分,根據用戶實際點擊Doc的情況計算Lambda梯度并反向傳播回深度網絡,則可以得到一個直接預測NDCG的深度網絡。Lambda梯度除了與DNN網絡相結合外,事實上可以與絕大部分常見的網絡結構相結合。為了進一步學習到更多交叉特征,在LambdaDNN的基礎上還可以拓展到LambdaDeepFM和LambdaDCN網絡;其中DCN網絡是一種加入Cross的并行網絡結構,交叉的網絡每一層的輸出特征與第一層的原始輸入特征進行顯性的兩兩交叉,相當于每一層學習特征交叉的映射去擬合層之間的殘差。美團技術團隊在今年發表了一篇:link:《大眾點評搜索基于知識圖譜的深度學習排序實踐》(https://tech.meituan.com/2019/01/17/dianping-search-deeplearning.html),大家可參考其中深度排序的一些思路。
另外需要注意的是,LmabdaRank和LambdaMART雖然看起來很像配對法(Pairwise),但其實都屬列表法(Listwise),確切來說是Listwise和Pairwise之間的一種混合方法。列表法從理論上和研究情況來看,都是比較理想的排序學習方法。因為列表法嘗試統一排序學習的測試指標和學習目標。盡管在學術研究中,純列表法表現優異,但是在實際中,類似于 LambdaRank和LambdaMART 這類思路,也就是基于配對法和列表法之間的混合方法更受歡迎。因為從總體上看,純列表法的運算復雜度都比較高,而在工業級的實際應用中,真正的優勢并不是特別大,因此純列表法的主要貢獻目前還多是學術價值。
應用場景
在推薦領域,排序學習可能會用在以下場景:
參考資料
[^1]: [延伸]Tie-Yan Liu. Learning to Rank for Information Retrieval. Springer
[^2]: [延伸]Hang Li. Learning to rank for information retrieval and natural language processing
[^3]: [延伸]Li Hang. A Short Introduction to Learning to Rank
[^4]: Learning to rank學習基礎
[^5]: 達觀數據. 資訊信息流LTR實踐. 機器之心
[^6]: 洪亮劼. AI技術內參. 極客時間
[^7]: [吳佳金等. 改進Pairwise損失函數的排序學習方法. 知網](http://cpfd .cnki.com.cn/Article/CPFDTOTAL-ZGZR201008001015.htm)
[^8]: Steffen Rendle et. Bayesian Personalized Ranking from Implicit Feedback. arxiv
[^9]: 劉建平. 貝葉斯個性化排序(BPR)算法小結. cnblogs
[^10]: Christopher J.C. Burges. From RankNet to LambdaRank to LambdaMART: An Overview. Microsoft
[^11]: 笨兔勿應. Learning to Rank算法介紹. cnblogs
[^12]: RL-Learning. 機器學習排序算法:RankNet to LambdaRank to LambdaMART. cnblogs
[^13]: huagong_adu. Learning To Rank之LambdaMART的前世今生. CSDN
總結
以上是生活随笔為你收集整理的【推荐系统】推荐系统中的排序学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小白学PyTorch】14.tenso
- 下一篇: 谷歌大佬花了半年整理的Leetcode刷