搜尋和其他機器學習問題有什麼不同?

vivo網際網路技術發表於2019-05-08

本文首發於  vivo網際網路技術  微信公眾號  https://mp.weixin.qq.com/s/uWg3m5xIGBAKNqqDmxzw2Q

作者:Doug Turnbull

譯者:林壽怡

目錄:

一、衡量搜尋的好壞

二、用機器學習生成 ranking 函式

三、單文件 機器學習排序 (point-wise learning to rank)

四、文件列表方法(LIST-WISE),文件對方法(PAIR-WISE)

五、直接用 w/ListNet 最佳化列表

六、使用 RankSVM 最佳化文件對方法

七、RankSVM 與 List-Wise 方法

八、結論

機器學習排序(Learning to rank)將搜尋轉化為機器學習問題,在本文中,我想找出搜尋與其他機器學習問題不同的原因,如何將搜尋排名作為機器學習或者是分類和迴歸問題?我們將透過兩種方法,對機器學習排序方法的評估有個直觀的認識。

一、衡量搜尋的好壞

目標是搜尋和經典機器學習問題的根本區別,更具體地說,如何量化搜尋的好壞。例如股價預測系統的準確性,取決於我們有多少預測資料是來自真實的公司股價。如果我們預測亞馬遜的股價是123.57美元,實際上是125美元,我們會說這非常接近。假設按均值來說,我們的預測跟實際股價的誤差在1美元到2美元之間,我們可以認為系統預測的很好。

這種情況下的誤差我們稱之為殘差,即實際值與預測值之間的差異:實際值-預測值。(實際上,殘留^2才是最小化,但在這裡保持通俗易懂。)

訓練期間,迴歸系統透過如何量化好壞來得到最優解。我們可以嘗試公司不同的量化特徵,例如員工人數、收入、手頭現金、或者其他任何有助於減少股價誤差的特徵。它可能會使最小二乘迴歸(l east-squares regression )學習為線性公式,例如:股價= 0.01*員工人數+0.9*收入+0.001*手頭現金,作為減少誤差的最佳方式。

搜尋結果的好壞(或介於兩者之間)卻完全不一樣。股價預測系統完全是為了減少實際值-預測值的誤差,但搜尋系統是儘量接近搜尋查詢的理想排序。換句話說,目標是減小理想排序到結果項集合的距離,排序的優先反映出搜尋者感知搜尋的好壞。

例如,電子商務使用者搜尋“ dress shoes ”,我們定義一個粗略的理想排序:

  1. Best-selling dress shoes

  2. Low-performing dress shoes

  3. Other kinds of shoes

  4. Ladies dresses (if at all)

以此我們可以想象一些場景,並猜測他們距離理想結果有多遠。至少需要向“ dress shoes ”的搜尋者在展示衣服前優先展示一些鞋子 - 但這一點都不完美。這就像預測亞馬遜的股價是150美元而不是125美元:下面的結果接近嗎?

  1. A pair of tennis shoes

  2. Meh Dress Shoes

  3. A ladies dress

另一方面,優先於其他鞋子並在 best-selling dress shoes 前一個位置展示 meh dress shoes ,這樣可能會非常接近,但也並不完美。這可能與預測亞馬遜的股價為123美元相當:

  1. Meh pair of dress shoes

  2. Best-selling pair of dress shoes

  3. Tennis Shoes

正如你看到的搜尋,並不是實際值-預測值,而是儘可能接近每個使用者查詢的最佳排序。 NDCG 是一種衡量搜尋結果和理想排序差距的指標。其他一些指標衡量搜尋結果的好壞各有利弊,這些指標幾乎總是取值介於0(最差搜尋結果)至1(最好搜尋結果)。

此外,這些指標不能僅是純粹的差異或編輯距離型別的計算。由於使用者更關注頂部的搜尋結果,因此要獲取這些位置需具備優先權。因此,搜尋指標通常包括位置偏差,這意味著前幾個結果偏離理想時,比底部結果偏離更糟糕, NDCG 內建了位置偏差。

雖然有一些可用的指標 ( 例如  ERR MAP 等 ),在本文中我只把 “ NDCG ”作為真正相關性指標的縮寫。

二、用機器學習生成ranking函式

經典的迴歸問題構建了一個用一組特徵直接預測的函式  f 。我們儘量減少實際股價-  f (公司特徵)。機器學習排序的目標是構建不直接預測的 ranking 函式。相反,它用於排序-我們提供一組理想的順序作為訓練資料, ranking 函式需要兩個輸入,即 query 查詢和 document 文件,併為每一個查詢正確排序的文件分配一個分數。

重述以上一點更多內容:

股市:對於公司x,生成函式f(x),使y - f(x)最小化

搜尋:對於檔案d,查詢q,生成函式f(d,q),當f(d,q)降序排序時,使所有文件的NDCG最大化

我們來看一個粗略的例子,看看我們的意思。作為資料科學家/搜尋工程師,我們認為以下查詢/文件的特徵對我們的電子商務搜尋有幫助:

  • 商品標題中關鍵字的TF * IDF分數:titleScore(d,q)

  • 商品描述中關鍵字的TF * IDF分數:descScore(d,q)

  • 商品的銷量:numSold(d)

機器學習過程可能會得到一個文件評分公式,如:

f(d,q)= 10 * titleScore(d,q)+ 2 * descScore(d,q)+ 5 * numSold(d)

透過一組測試查詢(透過這樣的模型,我們可以得到儘可能接近使用者理想的排序)可以最大限度地提高 NDCG

大多數機器學習排序的複雜度通常來自於調整的問題,以便可以應用其他機器學習方法。這些往往分為三種:單文件方法( point-wise ),文件對方法(  pair-wise )和文件列表方法( list-wise ),我們將在下面介紹。我們將簡要介紹幾種方法,並思考每種方法的利弊。

三、單文件 機器學習排序(point-wise learning to rank)

搜尋的“訓練集”看起來有點像一般的機器學習訓練集。單文件學習排名基於這種情況,所以讓我們簡要回顧一下搜尋訓練集的樣子。搜尋訓練集的形式為在某個查詢下帶得分的文件,並稱為判斷列表,以下是一個判斷列表的例子:

 

得分,查詢,文件

4,dress shoes,best_selling_dress_shoes

3,dress shoes,meh_dress_shoes

...

0,dress shoes,ladies_dress

0,dress shoes,toga_item

正如你所看到的,非常相關的文件比如best_selling_dress_shoes的得分為4,而完全不相關的文件(toga_item)得分為0。

單文件學習排名不關注直接最佳化每個查詢的排名。相反,我們只是嘗試預測相關性得分。我們使用某種迴歸來建立包含文件d,查詢q的排序函式 f d,q )。就像股價的例子一樣,我們試圖儘量減少殘差。我們希望 f (toga_item ,“ dress shoes )得分為0,和f(best_selling_dress_shoes,“dress shoes”)得分為4。

在訓練和評估期間,我們單純將殘差  y - f(d,q) 最小化(這裡的 y d q 的得分)。在這種情況下,假設我們的排序函式 f 給出了上述0分的文件為0.12分,4分的文件為3.65分。只看殘差的話這似乎做的很好。如果所有文件得分平均不偏離0.5分以上,那麼我們認為每個查詢的 NDCG 也被最大化,也就是說,我們認為如果我們能夠建立一個只返回得分的排序函式,我們應該可以得到接近使用者期望的理想排序。

但表象可能是騙人的,單文件學習排名的一個問題是獲得正確排序的頭部項通常比判斷列表尾部的模糊項更加重要。基本上所有認知和位置偏差在最大化度量(如 NDCG )下都會被忽略。

實際上,一個經常交換精準相關項和不太相關項,但可以準確地預測第50頁較低的相關性等級的模型並不是很好。買家在前幾個結果中看了些勉強相關的專案且沒有被其打動時,所以他們離開了。

更為災難性的是,當你考慮僅發生在具體查詢中的關係時會出現另一個問題,單文件方法會清除查詢分組,忽略這些查詢內的細微差別。例如,一個查詢與標題欄位上的相關性得分有很強的相關,而另一個查詢與描述欄位得分相關。或許某個查詢的“ good ”標題匹配得分是5,而另一個查詢的“ good ”標題匹配得分是15,這些情況是真實存在的:不同匹配中文件頻率不一致可能導致這些場景。

因此,一般來說,單文件方法的執行效果不佳,我們將繼續研究那些不清除查詢分組,而是嘗試使用排序函式直接最佳化每個查詢的排序的方法。

四、文件列表方法(LIST-WISE),文件對方法(PAIR-WISE)

單文件學習排名以儘量減少理想與實際相關程度之間的差異。其他方法定義了不同的誤差理解,更接近直接最佳化每個查詢的理想順序。我們來看一下文件列表( LIST-WISE )和文件對方法( PAIR-WISE )機器學習排序解決方案的兩個例子,以便更接近於結合位置偏差和容納每個查詢細微差別的能力。

五、直接用w/ListNet最佳化列表

文件列表學習感覺像最純粹的機器學習排序方式。它非常直接地定義錯誤:當前 ranking 函式的列表距離理想值的差距有多大?例如,這樣的一種方法是透過檢視給定順序的排列機率。 基本思想是定義一個函式,該函式計算按給定的相關性得分的排列是使用者真實尋找的機率。如果我們從判斷列表中將“得分”作為排序,第1個結果的得分高於第2個,這樣將獲得最高機率。然而,從判斷列表中獲取的相關性等級對於當前使用者當前的地點、時間、上下文有可能是不正確的。因此,單個較低分項在高分項上不可能成為完美的相關性排序,也許這才是使用者此時此刻實際想要的,最低相關性得分排第一個的重排列表是極不可能的,排列機率接近零。

相對於計算每個列表排序可能的錯誤,僅檢視排列中的第一個項對於搜尋是“最佳”的機率來近似排列優先順序在計算上是更加可行的。這被稱為“第一”機率,它查詢單個相關性分數以及查詢的每個其他相關性分數,以計算該項將是第一的機率。正如你所預料的那樣,較高的得分的相關性項將獲得更高的機率排在前面,較低的得分項在該使用者相同上下文時間地點下不太可能排在前面。

文件列表方法 ListNet 提出最小化訓練集相關得分與神經網路中權重之間的交叉熵。聽起來像胡言亂語,但真正重要的是透過最小化的 erro r函式,開發一個直觀的例子來看看它如何工作,如下面的偽 python 所示:

def error():

error = 0

For each query

For each doc:

error -= TopOneP(doc.grade) * log( TopOneP(f(doc, query)))

這裡 f 是我們正在最佳化的 ranking 函式。  TopOneP 是給定得分或分數排第一的機率。

首先,我們來看第一項 TopOneP doc.grade )。你想想這裡發生了什麼,假如第一名基於判斷列表得分的機率高,那麼第二項 log P ... )將增加更多權重,換句話說,第一項可以被認為是基於判斷列表中的得分該項的優先順序。更高得分項有更多第一的機率:正是我們尋找的位置偏差!

現在看第二個, log TopOneP ... )。回想一下,  log (TopOneP = 1) 為0,當 TopOneP 接近0時 log TopOneP <1 )越來越負。因此,如果 TopOneP 接近於0,並且因此 log 越來越負,則整個項越來越負。負越多越不好,因為error-=( big negative number )使錯誤變成更大的正數。

綜上所述,當(1)該項在判斷列表很重要時( TopOneP(doc.grade) 很高),並且當我們的 rangking 函式 f TopOneP 很低時,會產生更多的誤差。顯然這是不好的:在判斷的基礎上,真正需要靠前的,應該用f把它排到前面。

ListNet 中的目標是透過迭代更新 f 函式中的權重來最小化誤差。這裡我不想深入講解,因為上面的點更為重要。參閱這篇文章❶ 獲得更多資訊以及如何使用誤差的定義來計算梯度(如何更改特徵的權重)以儘量減少誤差。

六、使用RankSVM最佳化文件對方法

文件對機器學習排序( pair wise learning to rank )透過最小化在搜尋結果中亂序結果數, 一個具體指標: Kendall's Tau 衡量了搜尋解決方案中有序對的比例。文件對學習排序的一種形式是對查詢進行分類,使得專案“有序”或者“亂序”。例如,你可能會發現,當對特定的查詢集進行排序時,標題得分更高的其銷售事項總數反而比較低。

Thorsten Joachims 在這篇文章❷ 中介紹了一種流行的文件對機器學習排序方法 RankSVM ,還在 Fabian Pedregrosa 的部落格文章中以Python方式實現,且樂意我在這篇文章借用他的圖。

想象一下我們有兩個查詢,或許以我們的“ dress shoes ”查詢,另一個是“ t-shirt ”。下面的圖表 y 軸為標題得分特徵,而 x 軸可能是銷量。我們將“ dress shoes ”的每個判斷繪製為三角形,並將“ t-shirt ”的每個判斷繪製成圓形。顏色越深的形狀越相關。

 我們的目標是發現一個類似於上面影像中的 w 向量的函式,將最接近於正確的搜尋結果排序。

事實證明,這個任務與使一個項好於另一個項的分類問題是一樣的,適用於支援向量機( Support Vector Machine SVM )的二元分類任務。如果dress_shoes比meh_dress_shoes更好,我們可以將該排序標記為“更好”或者“1”。類似地,meh_dress_shoes在dress_shoes之前標記為“更差”或“-1”。然後,我們可以構建一個分類器來預測一個項可能比另一個更好。

這個分類任務需要更多底層特徵值,想想“更好“的含義是什麼,這意味著dress_shoes和meh_dress_shoes之間存在某些差異而將它歸類為更好。所以 RankSVM 在此增量: itemA 的特徵值減去 itemB 的特徵值上進行分類。

作為一個例子,只關注單一特徵“銷量”,我們可能會看到dress_shoes銷售為5000,而meh_dress_shoes的銷售量只有1000。所以產生的4000“差異”在訓練過程中將會是一個特徵。我們將這個差異作為一個 SVM 訓練樣本:(1,4000)。這裡1是我們預測的“更好”的標籤,而4000是我們在 SVM 中用作特徵的“銷量”增量。

在特徵空間中繪製每個成對的差異來建立兩個分類,如下所示,可以使用SVM來找到兩個分類之間的適當判定邊界:

 

當然,我們不需要一個判定邊界。 我們需要一個方向向量表示這個方向“更相關”。 最終,與該判定邊界垂直的向量提供了 ranking 函式的線性權重比例:

 

這聽起來就像變成簡單的線性迴歸,畢竟我們只獲得特徵權重和線性 ranking 函式。 但是如果你還記得單文件方法的討論,在單個查詢中你有時會具有查詢內依賴性/細微差別。 特徵中的一個好的標題在“ dress shoes ”得分為“5”,相比在“ t-shirts ”的得分為“15”,“ RankSVM ” 所做的是透過關注單個查詢中指出“標題得分越高,對應查詢中相關性越高”的粗略的感官中的分類增量。

在圖形中,你可以看到,使用線性迴歸執行上述相同的資料:

 

 

七、RankSVM與List-Wise方法

你可以看到,  RankSVM 似乎仍然建立一個直接的、線性的相關性。我們知道現實往往是非線性的。使用 SVM ,可以使用非線性核心,儘管線性核心往往是最受歡迎的。  RankSVM 的另一個缺點是它只考慮到文件對的差異,而不考慮位置偏差。當 RankSVM 中的項無序時,無法優先保證頭部項正確的同時忽略底部項的不準確。

雖然文件列表方法往往更準確,並且包含位置偏差,但訓練和評估的成本很高。雖然 RankSVM 往往不那麼準確,但該模型很容易訓練和使用。

由於其簡單性, RankSVM 可以輕鬆地為特定使用者或部分查詢/使用者構建模型。可以想象將查詢分類到不同的用例中。也許對於電子商務,有些查詢我們可以肯定地說是錯別字。而其他的是我們知道的廣泛的類目搜尋查詢(如“ shoes ”)。

如果我們相應地對查詢進行分類,我們可以為每種型別的用例分別構建模型。我們甚至可以組合不同的 SVM 模型。例如,由於模型是一組線性權重集合,我們可以將模型繫結到特定的使用者 Tom ,並將其與 Tom 正在執行的查詢繫結的模型相加,搜“ dress shoes ”返回 dress shoes ,我們覺得 Tom 會很喜歡。

八、結論

主要的結論是無論選擇什麼樣的模型,明白該模型需要最佳化什麼,需要儘量減少什麼樣的誤差?

你瞭解了單文件方法如何最佳化判斷的殘差,以及如何為不理想。  RankSVM 執行一個更簡單的最佳化來消除無序對,但這也有問題,因為沒有考慮到位置偏差。有趣的是, ListNet 的排列機率和第一機率給同樣有效的好答案留有餘地。我個人認為,如果這種方法用於多樣化搜尋結果,可以為當前使用者展示許多有效的假設。

當然,結束之刻,假如我們不選取正確的特徵來訓練我們的模型,模型的型別可能不是很重要!特徵選取,創作,生成和設計,往往才是最難的一部分,而非模型的選擇。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912579/viewspace-2643671/,如需轉載,請註明出處,否則將追究法律責任。

相關文章