R&S[19] | 學習排序入門級概述

2021-02-17 CS的陋室

往期回顧:

學習排序,英文是learning to rank,縮寫LTR,最近我之所以要看這塊內容,主要是因為無論是搜索系統還是推薦系統,都是分為「召回」和「排序」兩個階段,而排序階段作為其中一個重要的階段一致被人們關注,但是很多視角其實只是關注在CTR預估等口徑比較小的方面,私以為不夠,所以就稍微探了一下更大口徑的問題——學習排序,經過一些初步的學習,感覺有了一定的理解,此處給大家簡單科普一波,讓大家對這個領域有一定的了解,同時,也希望和大家交流~

什麼是LTR

此處的排序,不是數據結構與算法之中的排序,實質上是在探索一種在特定問題下,尤其是特徵或者因素複雜的情況下,最合適的一種排序標準,這個標準是基於模型計算的。

來看個例子,電影推薦系統中,我們已經為用戶A召回了10部電影,這10部召回的渠道不同,有的是基於協同過濾得到的,也有近期的熱門電影等等,不論是召回渠道,此時都面臨一個問題,就是把召回池中的內容,根據特定的順序排列展示在用戶面前,這裡涉及了用戶體驗、商家體驗等多角度因素,而這些因素也要從很多特徵體現。再舉個例子,對於用戶輸入的一個query,系統召回了很多不同的內容,可以是直接匹配得到的,可以是同義詞轉換得到的等等,召回得到的內容很多,我們該如何進行排序,這裡要考慮query的匹配度,要考慮用戶的實際深層需求等。

在上述兩個例子下,我們都要尋求合適的方法來完成這個排序,那麼學習排序其實給了我們很大的空間。現在給出一個比較可靠的學習排序定義:

Methods that use machine learning technologies to solve the problem of ranking.

這樣,把推薦系統中提到的CTR、CVR包含進來,甚至還能夠把搜索領域的排序之類的都涵蓋進來,甚至包括可能要做成類似推薦的模式的問題,例如在翻譯軟體中會給出的幾個翻譯備選方案、搜索預想等等。

當然的,說一個未來會有點擔心的點,什麼問題都用機器學習其實會為未來的進步設限,希望新的研究能多出點新的方法而不要受到現行機器學習方法的限制,不過就結果來看,目前機器學習確實處於統治地位。

LTR模型的核心思路

LTR模型的核心思路其實就要歸結到LTR的核心了——機器學習,如上述定義所示,因此實質上就是抽象好問題然後套用到機器學習模型中即可。下面是概括的比較好的一個LTR框架。

這個圖是不是覺得在哪裡見過?我來告訴你在哪裡見過吧。《統計學習方法》,第一版19頁,第二版第7頁。

其實就能看到LTR的本質其實就是機器學習,用訓練數據進行訓練,得到模型後作用有具體的排序系統中,對每個新來的數據進行預測排序。

既然機器學習大家都已經知道了(默認大家就是知道怎麼回事哈,不知道的後臺回復「深度學習入門」,告訴你入門路線),那麼現在的問題就是怎麼定義這個排序問題,使得我們能夠使用機器學習,定義這個排序問題,如果把目光放在輸入端,即x的內容,是重在研究單個點的重要性,還是研究兩者的對比優劣,還是對整個列表(召回池)的排序情況,這就引出了3大學習排序模型派系。

LTR的三大方法思路

可以分為pointwise、pairwise和listwise。

pointwise

這是目前最為流行的,代表方法就是現在比較常見的一系列CTR模型,對於一堆待排序的item,每個分別將其特徵輸入,會得到一個打分,這個打分代表著這個東西的重要程度,最後根據每個item的得分進行排序,那麼這個y其實就被定義為諸如點擊率之類的值,那麼最後的排序結果,其實就是根據用戶的點擊率來排序,當然在搜索領域,可以用相關性的標註來代替,即query和doc之間的相關性。

說的有點玄乎,我們來看一個基於回歸的pointwise損失函數,大家就能理解了。

說白了,就是構造一個模型,使得他儘可能去接近這個標籤,而這個標籤其實就是體現相似度、用戶是否點擊之類的問題。

但是,這種直接的方法,其實會有一些缺點:

pairwise

pairwise顧名思義,其實就是考慮兩者的相對關係了,也就是在構造機器學習模型時,輸入應該是兩個item的特徵,最終的輸出應該是兩個item的大小關係,來看公式可能更加抽象清楚。

對於兩個item,u和v,其實兩者的排序只有兩種,u>v和v>u(不會平行,排序必有高下!),因此我們去預測實質上就是預測這兩個值:P(Xu>Xv)和P(Xu<Xv),那麼現在我們來看看這個損失函數:

h是我們構建的機器學習模型,y是標籤,兩個P是概率,但是在機器學習模型下,就是預測的概率結果了,即h(u,v)=P(Xu>Xv),h(v,u)=P(Xv>Xu),雖然從直觀的概率角度Xu>Xv和Xu<Xv是對立事件,但是在機器學習的預測中,到了預估值層面,這個計算可就不敢保證了,因此在損失函數計算的時候我們要預估雙向,這樣就能夠體現u和v的雙向關係,從而體現pairwise。

listwise

listwise在pairwise的基礎上,不僅要考慮兩者之間的關係,而是嘗試去考慮整個列表之間的關係,即輸入端,我們放入的是所有待排序的item,而在輸出端,實質上的輸出是其最後的排序,而這個排序實質上是基於內部模型的一個打分系統得到的,有意思的是,這個打分系統裡面,不僅會考慮單個被打分item,還會考慮所有輸入item的綜合信息,這樣這個排序就能夠體現整個列表下的特性。

有關損失函數這塊,我真沒有看到非常好的總結起來的方法思路,各個模型都有自己的損失和方法,此處暫時不展開說,有興趣的可以進一步了解。

來兩個簡單的例子講解

都是我之前講過的吧,這次歸結到LTR裡面來談,大家更好的理解,這兩個都是pointwise的例子,這裡只談他在LTR中的意義,對具體原理不再贅述。

電影推薦

之前手把手搞推薦一連幾篇和大家講過一個評分預估模型是怎麼從無到有做起來的,想想還有點小刺激,錯過的同學可以直接傳送過去看看這個系列哈。

R&S[11] | 手把手搞推薦[0]:我的推薦入門小結

R&S[12] | 手把手搞推薦[1]:數據探索

R&S[13] | 手把手搞推薦[2]:特徵工程指南

R&S[14] | 手把手搞推薦[3]:數據集存取思路

R&S[15] | 手把手搞推薦[4]:打分預估模型

R&S[16] | 手把手搞推薦[5]:評價指標設計

R&S[17] | 手把手搞推薦[6]:回顧整體建模過程

最後這裡我是利用了很多特徵,做了一個打分預估模型,判斷用戶對該電影的喜愛程度,最後是希望用這個打分情況來為用戶進行推薦排序,沒錯,排序的標準是我用LR模型預估的這個打分,越高分,我會把這個放在越前面,所有抽象來看,這就是一個典型的pointwise思路的模型,每個模型判斷一個item,經過預測後得到最終結果,根據每個item的結果從而完成排序。

query-doc相似度

這個其實前面我也有文章提到,傳送門在這裡。

R&S[18] | SIGIR2018:深度學習匹配在搜索與推薦中的應用NLP.TM[15] | 短文本相似度-CNN_SIM 

搜索中非常要考慮的一個問題就是query要和你給出的doc要儘可能匹配甚至一致,query是用戶表達當前搜索需求的重要接口,因此我們就是需要考慮兩者是否相關匹配,才能給出我們的搜索排序結果。

在我之前這篇文章的一系列闡述中,其實就在考慮「何為匹配」,那麼我們對于越「匹配」的doc,其實就應該擺在前面,數據的標籤只有0和1,但是預測肯定就是一個[0,1]閉區間的結果,根據這個預測,我們也可以進行排序,和上面的電影排序類似,實質上就是一種基於某種標準設置的學習排序模型,能夠為一個複雜問題提供一種排序方案。

小結

這就是LTR,學習排序,這實質上是一個非常抽象,不為大家所知,但卻時常用到的點,希望做推薦、搜索的同學有時間還是可以多少了解一下~

相關焦點

  • R語言實現幾種經典排序算法
    冒泡排序        冒泡排序是一種計算機科學領域的較簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
  • R語言入門筆記·數據·排序與長寬型轉換
    編者按:   1、 加粗為代碼,藍色字體為解釋   2、無>且有[1]則後面為r輸出的結果
  • 真題解析Ⅰ | CCF CSP-J 2019 入門級 C++語言真題及答案(附信奧真題庫)
    2019CCF非專業級別軟體能力認證第一輪(CSP-J)入門級C++語言試題A卷(B卷與A卷僅順序不同)認證時間:2019年10月19日考生注意事項:4.若有如下程序段,其中s、a、b、c均已定義為整型變量,且a、c均已賦值(c大於0)s=afor(b= 1: b< c: b++)s=s-1則與上述程序段功能等價的賦值語句是()A.s=a-c;          B.s=a-b;      C.s=s-c;          D.s=b-c;
  • 【R教程】《即刻R入門》What is R?
    It provides an environment in which you can perform statistical analysis and produce high-quality graphics.
  • ...選擇,插入,希爾,歸併,快排,堆排序,計數排序,桶排序,基數排序)
    arr[j] = temp; } } }return arr;}var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
  • R語言中的排序,集合運算,reshape,以及merge總結
    不想排版,心情也不好,但是這個知識點很重要,尤其是學習R語言的朋友,請仔細看~一直以來我都是隨便看了點R的編程教程,因為我學了一點點
  • 第三十一講 R-機器學習與回歸概述
    機器從已知的觀察結果中學習,以便預測未來病例的結果。無監督機器學習:無監督學習與監督學習相比,訓練集沒有人為標註的結果。常見的無監督學習算法有聚類分析和主成分分析。監督學習和非監督學習的差別就是訓練集目標是否人標註。此外,機器學習還有其他類別:半監督學習:介於監督學習與無監督學習之間。
  • R入門?從Tidyverse學起!
    這種入門的學習路徑屬於base R first,學習的流程基本是先了解變量的類型、數據的結構,再深入點就會學到循環與自定義函數。有些類似於先認識編程,再按照數據處理、可視化、統計分析等應用方向開始下一個學習的旅程。但是對於很多人來說,R僅僅是一個可視化工具,來做出漂亮的圖,或者是一個可以方便的做回歸分析,生存分析,顯著性檢驗的統計工具。
  • R語言ETL工程系列:排序(arrange)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com前言上篇介紹如何從表中檢索一個或多個數據列,本章介紹如何在R中對表格數據進行排序,主要使用arrange函數。
  • 優先級隊列與堆排序
    ,比如首先處理優先級最高的對象,然後處理次高的對象。在這種情況下,我們的數據結構應該提供兩個最基本的操作,一個是返回最高優先級對象,一個是添加新的對象。這種數據結構就是優先級隊列(Priority Queue) 。
  • 快速入門 | 學習 R 語言
    函數入門與 Python 類似,函數同樣是 R 語言編程的核心下面的函數統計向量中奇數的個數其中 %% 是求餘操作符(Python 中是 %)oddcount <- function(x) { k <- 0 for (n in x) { if (n %% 2 == 1) k <
  • 堆排序算法C語言詳解
    在學習堆排序之前,首先需要了解堆的含義:在含有 n 個元素的序列中,如果序列中的元素滿足下面其中一種關係時,此序列可以稱之為堆。
  • python入門第四課:列表的排序、元素遍歷
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes本節介紹列表的操作,包括列表的排序、元素遍歷等操作。一、列表的排序有時候我們需要按升序或降序排列列表的元素,可以用sort()方法,sort方法默認是升序,如果加個參數,變成sort(reverse=True)就會按降序排列,見下面的代碼:Mylists = [2,58,64,21,33,5,8,9,4,15,23,45,60,88]Mylists.sort() #默認升序print(Mylists,' 升序排列
  • 西班牙語入門:輔音發音學習
    ce, cicena, peces, cine(3)c在c, n, t, d前面時,發舌後軟顎擦濁輔音[ γ ],但發音較輕西班牙語入門:輔音發音學習西班牙語入門:輔音發音學習。acción, lección, tecnología, pacto, lectura, conectar2.
  • 潮科技行業入門指南 | 深度學習理論與實戰:提高篇(14)——Mask R...
    = results[0] visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], class_names, r['scores'])檢測結果r包括rois(RoI)、masks(
  • 必讀好書 《DK木工全書》(英國字典級木工學習教科書)
    《DK木工全書》(英國字典級木工學習教科書 ,2000幅高清照片全程指導木工製作,29種榫卯技巧和25款基礎
  • 法語入門:發音入門難點學習
    法語入門學習第一關:法語發音。優秀的法語發音是今後學習法語的堅實的基礎和強韌的推力。所以學好發音是非常重要的。
  • 左手用R右手Python系列7——排序
    排序可能是日常數據清洗過程中比較高頻的應用了,今天這一篇給大家介紹R語言和Python中最為常見的排序函數應用。R語言:排序根據對向量排序和數據框的排序要使用不同的函數,以上四個函數中,前三個是針對向量的,最後一個是針對數據框的。
  • 十大經典排序算法(動圖+代碼)
    i…m]和r[m +1 …n]歸併到輔助數組rf[i…n]void Merge(ElemType *r,ElemType *rf, int i, int m, int n){ int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r
  • 十大經典排序算法(動態演示+代碼)!乾貨收藏
    以前也零零碎碎發過一些排序算法,但排版都不太好,又重新整理一次,排序算法是數據結構的重要部分,系統地學習很有必要} a[j+1] = x; //插入到正確位置 } print(a,n,i); //列印每趟排序的結果 }}int main(){ int a[15] = {2,3,4,5,15,19,16,27,36,38,44,46,47,48,50}; InsertSort(a,15); print(a,15,15);}