1. 程式人生 > 其它 >搜尋系統核心技術概述【1.5w字長文】

搜尋系統核心技術概述【1.5w字長文】

前排提示:本文為綜述性文章,梳理搜尋相關技術,如尋求前沿應用可簡讀或略過

搜尋引擎介紹

搜尋引擎(Search Engine),狹義來講是基於軟體技術開發的網際網路資料查詢系統,使用者通過搜尋引擎查詢所需資訊,如日常使用的Baidu、Google等;廣義上講,搜尋引擎是資訊檢索(Information Retrieval,IR)系統的重要組成部分,完整的資訊檢索系統包含搜尋引擎、資訊抽取(Information Extraction)、資訊過濾(Infomation Filtering)、資訊推薦(Information Recommending)等。

搜尋技術已經經過很長時間迭代完善,目前整體上搜索引擎主要分為:爬取(Crawl)、解析(Analyze)、索引(Index)、檢索(Search)和排序(Rank)幾個階段。

  • 爬取:也叫搜尋器、聯結器等,常見的應用實現即爬蟲程式。本階段通過初始指定的種子Web頁面出發,以深度或廣度的方式擴充套件搜尋結果並進行元資料的儲存。
  • 解析:也叫轉換器、清洗器等,用於將初始階段爬取到的資料進行格式化處理、過濾、重建等工作。複雜的解析器還會進行如標題抽取、摘要生成、關鍵詞提取、內容標籤等工作。
  • 索引:索引器將基於元資料、解析資料構建索引表,索引表可以幫助搜尋引擎快速檢索相關資訊,如我們查詢字典都會先通過拼寫檢視詞語位置。常見的索引建立方式如正排索引、倒排索引等。
  • 檢索:當用戶鍵入查詢內容(Query)後,搜尋引擎會通過一系列技術分解使用者Query,再通過對索引的查詢返回一系列Query關聯的查詢結果。這個階段通常也被稱為初篩或召回
  • 排序:在檢索結果的基礎上,搜尋引擎會基於演算法模型對檢索結果進行排序,在這個階段通常會引入使用者特徵、內容特徵等資訊,以便在最終展示上能夠更加符合使用者的搜尋期望。完善的搜尋引擎通常會包含多個排序階段如粗排精排等等。

有些文章對組成部分會有其它定義,但整體功能流程是相同的。

搜尋引擎整體架構流程如上圖,資料爬取、解析及索引生成通常作為離線系統模組為搜尋引擎持續抓取新的資料並生成索引,不直接體現在使用者搜尋過程中;召回和排序通常作為線上模組,直接為使用者搜尋提供服務。

搜尋引擎分類

根據搜尋場景一般可以將搜尋引擎分為四類:

  • 全文搜尋引擎:全文搜尋引擎爬取網際網路上的網頁並記錄生成索引,這種搜尋方式使使用者易於獲取相關資訊,但搜到的結果也過於雜亂,需要使用者篩選甄別,如Baidu、Google均屬於該類別。參考第五篇文章,筆者認為稱之為Crawler-Based Search Engines
    更為貼切。
  • 元搜尋引擎:元搜尋引擎將其他搜尋引擎的結果彙總展示,本身不會進行資料爬取和索引記錄,只需將使用者Query分發到不同的搜尋引擎再整合結果即可。因此與元搜尋引擎對比,其他類引擎也稱為獨立搜尋引擎
  • 垂直搜尋引擎:垂直搜尋引擎用於領域資訊搜尋,是搜尋引擎的行業細分應用,通常只對特定機構、人群提供服務,其特點是搜尋結果的專業和精確。譬如購房者搜尋房產資訊,希望獲取的是相關售賣內容和交易內容,而不是房產新聞。
  • 目錄搜尋引擎:目錄搜尋引擎依靠人工編輯維護網頁目錄並呈現給使用者,使用者的檢索結果也基本由人工整理來決定,如過去的一些入口網站。目錄引擎方式由於人工維護成本高、內容更新緩慢,因此應用場景有限,已經少有應用。

上文對搜尋引擎的整體流程架構做了簡單說明,下面將分為離線和線上兩部分介紹搜尋引擎的核心技術。

搜尋引擎核心技術—離線部分

資料爬取

爬取階段包括並不限於資料庫接入、日誌接入、線下匯入及網路爬蟲等方式,由於除爬蟲外通常為定製化開發對接,因此不做介紹。

網路爬蟲是搜尋引擎最基礎也是最關鍵的元件,爬蟲也稱為"Wanderers"、"Robots"、"Spiders",爬蟲程式從一組種子站點出發,以深度、廣度或其他一些遍歷演算法漫遊到其他連結網站,抓取並存儲網頁連結和內容。

爬蟲程式整體結構流程如圖所示,通常爬蟲程式會維護自己的DNS伺服器,避免頻繁發起DNS解析請求。

Robots協議:Robots協議是Web站點和爬蟲互動的協議,站點會將robots.txt放在站點的根目錄上,表明爬蟲可以訪問和禁止訪問的內容,爬蟲程式應當嚴格遵從協議進行資料爬取。

爬蟲質量評估一般有三個標準:抓取網頁的覆蓋率、時效性及重要性,簡單來說就是抓的全、抓的快、抓的準。爬蟲系統有很多優秀的開源實現如Heritrix、crawler4j等,感興趣的讀者可以自行深入學習。

資料解析

爬取到的資訊大部分是非結構化或半結構化內容,對於資料解析系統來說,最主要的工作就是完成對這些內容的過濾清洗、資訊提取以及權重排序。

對於爬取到的內容,首先需要進行過濾清洗,去除重複內容、失效內容等,最大限度降低搜尋系統的噪音資料,該階段通常使用一些基本的相似性演算法或者規則等粗略手段進行過濾;然後通過結構化轉換、資訊抽取、內容分類等演算法對爬取內容的價值資訊進行細分,如提取網頁中的關鍵詞、生成網頁資訊摘要、為網頁內容打上類別標籤等;權重排序為同類網頁進行重要度排序,由於網際網路資訊繁雜,內容質量參差不齊,因此對於爬取的網頁內容必須有可量化的手段區分網頁的好壞,如著名的PageRank演算法通過分析網頁間的引用關係劃分網頁質量。

整體來說,該環節通常包含很多如定製化規則編寫、資料標註類的Dirty Work,但資料解析是整個搜尋系統中十分必要的一環,為搜尋系統的後續環節提供資料有效性的基礎保障。

索引

面對海量文件,如何快速找到包含使用者查詢的內容,索引是必不可少的核心模組之一。索引本質上就是目錄,例如書本目錄、字典目錄等等,方便使用者快速完成查詢,下面對搜尋引擎中的索引應用進行簡單介紹。

倒排索引

文件ID 文件內容
1 谷歌地圖之父跳槽Facebook
2 谷歌公司在搜尋市場擁有最高的市場佔用率
3 蘋果公司釋出了IPhone13手機

假設當前有如上3篇文件集合,以文件ID建立索引關係,如果使用者輸入"蘋果公司"進行檢索,當前以文件ID為索引項的結構無法滿足查詢需求,只能遍歷所有文件才能查詢出包含"蘋果公司"的內容,檢索效率極低,為了解決該問題,倒排索引(Inverted Index)被提出用於反向建立文件內容和文件ID的索引關係,前者即可稱為正向索引。

對上3篇文件進行分詞、去停用詞,假設得到結果為:

文件ID 文件內容 分詞結果
1 谷歌地圖之父跳槽Facebook [谷歌,1][地圖,2][跳槽,3][Facebook,4]
2 谷歌公司在搜尋市場擁有最高的市場佔用率 [谷歌,1][公司,2][搜尋,3][市場,4][擁有,5][市場,6][佔有率,7]
3 蘋果公司釋出了IPhone13手機 [蘋果,1][公司,2][釋出,3][IPhone13,4][手機,5]

對分詞後的結果按照單詞維度進行統計,記錄每個詞條出現的文件ID、詞頻、位置等資訊,便構成了倒排列表,如下表所示:

單詞ID 單詞 文件頻率 倒排列表(文件ID、詞頻、位置)
1 谷歌 2 (1,1,<1>),(2,1,<1>)
2 地圖 1 (1,1,<2>)
3 搜尋 1 (2,1,<3>)
4 跳槽 1 (1,3,<1>)
5 Facebook 1 (1,1,<4>)
6 擁有 1 (1,1,<5>)
7 市場 1 (2,2,<4,6>)
8 佔有率 1 (2,1,<7>)
9 蘋果 1 (3,1,<1>)
10 公司 2 (2,1,<2>),(3,1,<2>)
11 釋出 1 (3,1,<3>)
12 IPhone13 1 (3,1,<4>)
13 手機 1 (3,1,<5>)

依照倒排表可以構建完善的倒排索引系統,藉助倒排索引,搜尋系統可以迅速檢索出使用者搜尋的內容,如輸入"谷歌"即可根據索引查到相關文件ID,進一步可依照文件頻率、詞頻等值對文件進行排序,如典型的TF-IDF、BM25。

工業場景中倒排索引的實際應用本質上與上表相似,實際場景的倒排索引規模往往很大,更多需要考慮如索引的分散式儲存、更新時效等問題,基於開源Lucene的ElasticSearch、Solr都對此提供了完善的解決方案,業界也大多以開源方案進行索引構建,有能力的公司會在此基礎上進行優化和二次開發。

向量索引

向量索引(vector index)是通過某種數學模型,將待檢索的內容轉化為數學向量,並對向量構建的一種時間和空間上比較高效的資料結構,藉助向量索引可以高效地查詢與目標向量相似的若干向量。

常見的向量度量方式有:歐式距離、餘弦相似度、向量內積、海明距離,向量檢索不同於基於二分、雜湊等傳統查詢演算法的精確檢索,如需達到精確結果,需要對所有候選向量進行線性度量計算,計算消耗較大,因此目前的向量檢索大都屬於ANNS(Approximate Nearest Neighbors Search,近似最近鄰檢索)。ANNS的核心思想是不侷限於返回最精確的結果項,而是搜尋向量空間上臨近的資料項,在可接受的範圍內犧牲精度提高範圍檢索效率,因此與搜尋系統的屬性也十分契合,ANNS向量索引從實現上主要分為:

  • 基於樹的索引

    基於樹的索引根據向量的分佈特徵採用一系列超平面將高維向量空間劃分為多個子空間,並採用樹形結構維護空間層次關係,如向量\((1,0,1)\)依據維度進行構建,除去根節點,第一層節點記錄取值為\(1\),第二層取值為\(0\),第三層取值為\(1\),由此除根節點外的每一個節點均對應其父節點空間被劃分後的子空間,再通過樹形結構搜尋到若干距離目標向量較勁的葉子節點,節點路徑即為候選向量。隨著向量維度的提高,劃分空間的超平面開銷將顯著增大,從而影響樹形結構的構建效率。

  • 基於雜湊的索引

    向量索引使用的雜湊是區域性敏感雜湊,區域性敏感雜湊簡單來說就是對內容相近的輸入計算出來的雜湊值也很相近,通過區域性敏感雜湊將向量劃分為若干區間,從而使每個向量均屬於特定雜湊函式的值域區間。搜尋時可先通過雜湊函式計算選擇相近的向量空間,然後再依次對所屬區間內的向量進行度量計算。但如果實際場景中向量分佈不均,那麼雜湊函式劃分的區域大小也不平衡,無法有效提升搜尋的準確率和效率。

  • 基於向量量化的索引

    基於向量量化的索引通常採用如k-means等聚類方式對向量集合進行劃分,記錄各個聚類的中心座標,在搜尋時首先選取相近的中心座標,然後再對相近的個聚類空間中的向量進行度量計算。該方法在高維向量中容易遺漏部分潛在與目標相近的向量,難以達到較高的準確度。

  • 基於圖的索引

    前面的幾種索引都屬於空間劃分的方法,每個向量存在與劃分好的區域,基於圖的方法將所有向量間的相似度預先計算好,並以圖的形式維護向量間的距離關係,由於圖的連通性,鄰居的鄰居也可能是鄰居,這樣就將最近鄰計算轉化為圖的遍歷,在搜尋時從一個或多個節點出發,探索當前節點的所有鄰居節點與目標向量的相似度,並進一步通過深度或廣度的方式進行遍歷探索。基於圖的方法在準確率和效率上都有較好的表現,但在構建圖的過程需要進行大量的向量距離計算,且在新增向量時需重新對圖進行構建,均會產生很大開銷。

目前,用於向量檢索的熱門工具有Facebook開源的FAISS、微軟的SPTAG,但這些都是基礎的工具庫,國內開源的Milvus集成了主流的開源能力,提供了完整的向量索引框架。

搜尋引擎核心技術—線上部分

Query理解

一般情況下,使用者通過自然語言描述想要搜尋的內容,因此Query理解是使用者搜尋的第一道環節。Query理解的結果在召回和排序階段提供基礎特徵支撐,因此Query理解很大程度影響召回和排序的質量,換句話說,如果搜尋系統無法正確理解使用者的搜尋意圖,必然無法為使用者展示準確的搜尋結果。Query理解主要包含Query預處理、Query糾錯、Query擴充套件、Query歸一、聯想詞、Query分詞、意圖識別、term重要性分析、敏感Query識別、時效性識別等,實際應用中會構建一個可插拔的pipeline完成Query理解流程。

  • Query預處理

    Query預處理比較簡單,主要是對使用者Query作如大小寫轉換、簡繁轉換、無意義符號去除等操作,方便後續模組進行分析。

  • Query改寫

    糾錯、擴充套件、歸一都屬於Query改寫的範疇。

    • Query糾錯:顧名思義,即檢測並糾正使用者搜尋的錯誤輸入如錯字、多字、漏字等。
    • Query擴充套件:通過挖掘Query的語義關係擴展出與原Query相關的候選Query列表。一方面,Query擴充套件通過推薦候選Query幫助使用者澄清搜尋需求;另一方面,通過擴充套件提高搜尋系統對長尾詞條的搜尋利用率。目前Query擴充套件主要基於語義相關性、話題相關性、使用者畫像等維度進行擴充套件。
    • Query歸一:Query歸一是將使用者Query在語義不變的情況下將搜尋內容標準化,如"華仔是啥時候生的"歸一化為"劉德華的出生日期"。
  • Query分詞

    Query分詞就是將自然語言的Query內容切分為多個term(詞語),如"手機淘寶"切分成"手機""淘寶"兩個term。分詞作為基礎的詞法分析元件,其準確性很大程度影響搜尋後續各階段的處理。

    除分詞準確性外,分詞的粒度在搜尋系統中也需進行控制,如"王者榮耀"作為一個term,在後續搜尋環節中帶來的準確度、計算複雜度的影響相較於切分成"王者"和"榮耀"兩個term更具優勢。

    分詞技術相對來說已經較為成熟,主要結合基於詞典匹配的方法、基於統計的方法以及序列標註等機器學習模型或深度學習模型進行實現,如Hanlp、IKAnalyzer、Jieba等。目前分詞更多的痛點在於新詞不能及時識別覆蓋,如領域性強的專業詞彙、網路新起的熱門詞彙等。

  • term重要性分析

    考慮不同term在同一文字中重要性不同,在做Query理解和Doc內容理解時均需要挖掘分詞後的term重要性。term重要性可以通過分等級或0.1~1.0的量化分值來衡量,如搜尋"適合女生玩的遊戲app",按照重要度排序應當是"遊戲-女生-app",那麼在搜尋時便可以按照重要度組合調整查詢條件。Doc內容方面可以通過LDA主題模型、TextRank等方法來挖掘term重要性;Query側可以通過使用者點選量等資訊訓練分類模型,判斷詞條的重要性。

  • 意圖識別

    意圖識別是Query理解的重要模組,由於使用者輸入Query不規範以及詞語本身的歧義,如何根據使用者Query的上下文準確定位使用者想要搜尋的意圖範圍對於搜尋效果起到重要作用。比如"蘋果和小米對比",通常使用者是想比較手機而非食物的差別。

    意圖識別可以歸為短文字多標籤分類任務,在進行分類之前,需要先對Query側和內容側的意圖標籤進行統一,以便預測出Query的意圖分佈後直接召回相關標籤的內容。模型方面如傳統的SVM模型、淺層網路模型Fasttext、深度神經網路模型TextRNN、TextCNN等

  • 敏感Query識別

    敏感識別主要對Query進行內容稽核,檢查內容是否涉政、涉恐、涉暴等,如果識別出敏感Query則進行定向引導、回覆等處理。敏感識別可歸為分類問題,簡單的做法可以通過敏感關鍵詞表匹配,複雜點可以基於SVM等方法訓練分類模型進行處理。

  • 時效性識別

    使用者Query可能帶有一定時效性要求,如搜尋"疫情進展"、"新上映的電影"隱式地表達了對內容時效性的要求。針對Query時效性的需求,引擎在做後續搜尋工作時就可以針對性地做一些過濾或者排序。

上述內容僅對Query理解做了概要介紹,詳細可參考文章《全面理解搜尋Query:當你在搜尋引擎中敲下回車後,發生了什麼》

召回

召回是根據Query獲取相關候選Doc的過程,召回階段要求覆蓋的內容足夠廣,如果相關Doc不能在召回階段被檢索出來,即使後續的排序演算法效果再好也是徒勞。

在搜尋場景中,召回通常主要包含兩類方法:基於詞的傳統召回和基於向量的語義召回。前者依賴傳統的倒排索引實現,後者基於語義embedding的向量索引實現。倒排索引和向量索引在前文的索引章節中已經做了相關介紹,召回階段對檢索結果的關注點主要是召回的效能和結果的多樣性,基於詞的傳統召回雖然可以通過同義詞歸一化解決部分相似問場景,但仍然有很大的侷限性;語義召回把Query和Doc分別向量化,將其對映到同一向量空間作最近鄰搜尋,可以在語義層面上提升召回的結果範圍,embedding就是向量化的過程。

語義召回可以分為基於Interaction的深度語義模型和基於Representation的深度語義模型:

  • Representation based也稱為基於表徵的匹配方法,採用深度學習模型分別表徵Query和Doc,再通過計算向量相似度來作為語義匹配分數,通常Doc的表徵計算會離線提前計算好以節省搜尋時間消耗。典型Representation方法如雙塔DSSM模型,所謂雙塔及Query塔和Doc塔分別對兩個內容進行表徵計算。
  • Interaction based也稱為基於互動的匹配方法,這種方法不直接學習Query和Doc的語義表示向量,而是在神經網路底層讓Query和Doc互動從而獲得基礎的匹配表示,再引入如CNN將基礎表示融合得到相似度結果,典型如Bert。

互動式由於可以深層考慮Query和Doc之間的關係,在相似度匹配的準確率方面較表徵式會高一些;而表徵式可以提前計算好所有Doc的向量記錄到向量索引中,接收到Query時只需對Query進行表徵計算並通過向量索引進行淺層計算即可得出得到候選Doc列表,因此會有更好的效能。在召回任務中,如果待召回的Doc庫量級較大,那麼使用表徵式方法提前記錄好向量索引更適合在不影響效能的前提下提升召回率;反之可使用互動式方法適當提升召回階段的內容準確率。

詞條召回和語義召回在搜尋系統中一般都會得到應用,參照文章《Query 理解和語義召回在知乎搜尋中的應用》,兩種召回產生的Doc列表都將送入到排序環節進行過濾篩選,在商品搜尋、內容推薦等領域,還會引入如使用者行為特徵、時空間特徵等維度來構成多路召回。

排序

排序本質上是給召回的候選Doc列表打分,以決定對使用者的內容呈現順序。排序通常分為粗排和精排兩個兩個環節,一些精度要求高或者考慮業務屬性特徵的搜尋場景還會有重排,如著名的競價排名。

如上圖所示,召回->粗排->精排->重排的流程就好比漏斗,逐層篩選使使用者的搜尋結果逐步精確化。召回是漏斗的最上游,採用一些全而快的方法對Doc進行初步篩選;排序是漏斗下游,對篩選後的Doc做小而準的精細化排序過濾。

排序是搜尋的核心組成,排序結果的好壞直接影響使用者體驗及相關場景的業務轉化率。早期的排序基於專家規則,手動識別並組合內容特徵,專家系統解釋性強,但在大資料場景下專家系統顯然無法滿足搜尋內容的多樣性。在搜尋引擎特別是網際網路相關產品中,如何解決排序是重要研究的問題,使用機器學習引數化排序特徵、規範化排序規則目前在各大搜索引擎中都得到了良好的實踐應用。

機器學習排序方法稱為LTR(Learning to Rank),由人工標註訓練資料、文件特徵抽取、學習分類函式、搜尋系統模型整合4個步驟構建,學習排序工作流程示意圖如下:

目前LTR主要分為三種:單文件方法Pointwise、文件對方法Pairwise、文件列表方法(Listwise)。

Pointwise

Pointwise將單一文件作為訓練資料,不考慮文件間的關係,文件轉化為特徵向量後將排序問題轉換為分類或迴歸問題,如CTR問題的數學表示式為\(y=f(x)\),其中y的範圍是\([0,1]\),即\(y\)的值越大表示使用者點選概率越高。下面對常見的幾種Pointwise方法進行介紹:

  • LR

    邏輯迴歸(Logistics Regression,LR)是網際網路領域最基礎最廣泛的分類演算法,LR可以處理大規模離散化特徵、易於並行化、可解釋性強,LR是CTR預估應用最基本的模型,工業界排序模型的首選。但LR假設各特徵之間是相互獨立的(LR的函式形式決定),忽略的特徵間的關係,且對非線性擬合能力較差,限制了模型的上線,通常作為Baseline版本,LR模型定義如下:

    \[f(x) = logistics(linear(X)) \\ 其中:\quad logistics(x) = \frac {1}{1+e^{-x}}\quad\quad\quad\quad linear(x) = \theta^TX \]
  • FM/FFM

    FM在LR的基礎上作出改進,模型定義為:

    \[f(x) = logistics(linear(X) + \sum\limits_{i=1}^{n} \sum\limits_{j=i+1}^{n} w_{ij}x_ix_j) \]

    函式前半部分與LR定義相同,在LR的基礎上增加\(\sum\limits_{i=1}^{n} \sum\limits_{j=i+1}^{n} w_{ij}x_ix_j\),該項為二次交叉項,表達了特徵兩兩之間的互動作用,其中\(w_{ij}\)表示\(x_i\)\(x_j\)兩兩特徵間的互動權重。從公式可以看出,用\(n\)表示特徵數量,那麼組合特徵引數共有\(n(n+1)/2\)個,使用二階矩陣儲存\(w\),在大規模離散特徵的情況下會導致矩陣維度很大;且在多項式模型中,特徵\(x_i\)\(x_j\)的組合採用\(x_i x_j\)表示,只有兩者都非零時,組合特徵才有意義,而在樣本資料稀疏的情況下,滿足\(x_i\)\(x_j\)都非零的樣本將非常少,訓練樣本的不足也容易導致引數\(w_{ij}\)求解不準確,影響模型整體效果。

    由於\(w_{ij}\)\(w_{ji}\)表示的互動權重是相等的,那麼所有二次想引數\(w_{ij}\)可以組成一個對稱矩陣\(W\),進一步矩陣可以分解為\(W = V^T V\)\(V\)的第\(j\)列便是第\(j\)維特徵的隱含向量,進而每個權重引數可表示為\(w_ij=<v_i,v_j>\),因此FM的模型方程可定義為:

    \[f(x) = logistics(linear(X) + \sum\limits_{i=1}^{n} \sum\limits_{j=i+1}^{n} <v_i,v_j>x_i x_j) \]

    同一特徵對其它特徵的權重作用是不同的,如天氣特徵對時間特徵和性別特徵的作用是不一樣的,使用同樣的向量計算內積會導致明顯的偏差。在FM的權重基礎上引入\(field(域)\)概念,令\(w_{ij} = <v_{if_j},v_{jf_i}>\),表示不同特徵在計算權重引數時採取的向量也不同,該方法稱為\(FFM\)演算法,公式如下:

\[f(x) = logistics(linear(X) + \sum\limits_{i=1}^{n} \sum\limits_{j=i+1}^{n} <v_{if_j}, v_{jf_i}>x_ix_j) \]
  • GBDT

    LR、FM/FFM更加適合處理離散化特徵,GBDT(梯度提升決策樹)適合計算連續特徵,但如果單獨使用GBDT需要通過歸一化等措施將離散特徵統計為連續特徵,無法很好的處理高維度稀疏特徵,並且在離散化特徵歸一化的過程需要耗費比較多的時間,因此將連續型特徵和值空間不大的特徵給GBDT,其他高維度稀疏特徵和GBDT的葉子節點一併給LR、FM/FFM進行處理,組成GBDT+LR、GBDT+FM的組合應用。

Pairwise

Pointwise只考慮單個Doc和Query的相關性,沒有考慮文件間的關係,而排序問題注重的是排序結果,並不要求對相似度做精確打分。Pairwise考慮的是兩兩樣本之間的順序關係,將文件對作為輸入,輸出是區域性的優先順序。如一個Query對應的檢索結果為\({doc_1,doc_2,doc_3}\),文件可組成的文件關係集合為\({(doc_1,doc_2),(doc_1,doc_3),(doc_2,doc_3)}\),以每一個關係對\((doc_i,doc_j)\)作訓練例項,如果\(doc_i > doc_j\),則標記\(+1\),反之標記\(-1\),於是便將排序問題轉換為二分類問題。預測時模型可以得到所有文件對的偏序關係如\({<doc_1,doc_2,+1>,<doc_1,doc_3,-1>,<doc_2,doc_3,-1>}\),那麼最終排序結果即\({doc_3,doc_1,doc_2}\)

在二分類問題上,機器學習的方法就很多了,如Boost、SVM、神經網路等,典型在Pairwise上的應用如RankSVM、RankNet。

Listwise

Pairwise將文件對作為訓練例項,僅考慮文件間的偏序關係,負相關文件無法得到體現,且區域性文件對偏序關係預測錯誤會導致整體排序結果的錯誤。Listwise是將整個Doc排序序列作為訓練樣本得到最優評分函式\(F()\),對候選Doc集合的所有排序序列作預測,輸出排序後的列表,常用方法如LambdaRank、LambdaMART。

Listwise考慮模型整體的排序結果,訓練樣本基於標註好的文件有序列表,理想情況下,確實更容易滿足真實使用者需求,但該方法前期的標註工作所需成本顯然更高,其次訓練成本也要高於前兩種方法,且除專業領域外個人很難代表整體對排序結果的期望,因此Listwise在實際應用場景中有明顯的限制。

LTR 優點 缺點 輸入 時間複雜度 典型演算法
Pointwise 演算法簡單,只以每個文件作為單獨訓練資料 只考慮單文件同Query的相關性,忽略文件間的影響 \((x,y)\) \(O(n)\) LR、FM、FFM、GBDT、DNN
Pairwise 對文件對進行分類,得到文件集合的偏序關係 只考慮文件對的偏序關係,區域性偏序錯誤影響整體結果,且無法體現負相關文件 \((x_1,x_2,y)\) \(O(n^2)\) RankSVM、RankNet
Listwise 直接對文件集合結果進行優化,理論效果最好 演算法成本高,應用場景受限 \((x_1,x_2,...,x_n,y)\) \(O(n!)\) LambdaRank、LambdaMART

上表對LTR的三種典型方法進行總結,雖然在理論效果上Listwise > Pairwise > Pointwise,但在實際工業場景中的應用是相反的,出於成本、可解釋性、魯棒性等一系列問題的考慮,Pointwise往往是實際應用的首選方案。

文章未對Pairwise和Listwise進行展開,詳細可參考文章《LTR精排序筆記整理》

精排和粗排

粗排和精排都是排序階段的環節,排序的核心目標是對召回的內容做進一步過濾篩選,按照使用者搜尋的相關度為使用者返回排序後的搜尋結果。精排階段會採用排序準確度較高的模型,此類模型複雜度也較高,受算力限制一般在效能上不容易滿足大規模Doc排序,因此在召回和精排之間會插入粗排對召回結果做初步過濾,如排序章節開篇的漏斗圖。

粗排階段的核心目標是滿足整體搜尋效能的前提下為精排縮小候選排序集,與精排的不同點主要有兩個:算力和RT約束更嚴格,排序候選集更大;因此粗排階段採用的演算法模型通常計算特徵少、計算效率高,也會引入如TF-IDF、BM25、向量匹配等較為輕量級的方法,一定程度上會與召回有所重合,且目前召回階段使用的一些框架演算法也具備一定的排序能力,因此有些文章會將召回和粗排放在一起,劃分為粗召回和精排序兩個階段。

雖然粗排和召回在模型上有重合,但由於目標不同,在樣本構造上也不一樣,以DSSM為例,在召回階段以召回率為主,關鍵是不遺漏,可以從全體Doc庫中負取樣;在粗排階段以準確率為主,可以用線上曝光的負樣本或者從召回候選中負取樣。

如果算力充足可以對全庫Doc排序,是否還要保留召回?

召回是必要的,排序關注的是準確度,只有排序階段就限制了冷門Doc的曝光機會,召回為系統提升了結果的多樣性,避免使用者陷入資訊繭房,在推薦系統中多樣尤為重要。

隨著技術迭代和算力提升,粗排、精排的邊界劃分也逐漸模糊,有時也會將一些新的模型方法放置到精排階段進行驗證和優化,待模型優化或算力提升再將其應用到粗排階段,精排技術向粗排的遷移也是粗排精排化的趨勢過程,未來不再區分粗排精排也不是沒有可能。

深度學習在搜尋的應用

傳統機器學習方法極度依賴輸入特徵資料的前期處理,即人工的特徵工程,在模型的泛化能力上有所欠缺。為了降低人工干預,使模型在特徵擴充套件和效果泛化上具備更好的效果,深度學習模型被引入解決搜尋中的一些任務,並取得了不錯的效果,下文對深度學習中應用比較廣泛的模型做出簡單闡述。

  • DNN

    DNN(Deep Neural network,深度神經網路)也叫多層感知機(MLP,Multilayer Perceptron),是經典的深度神經網路模型,DNN能夠對原始特徵進行學習,抽取出深層資訊,提高模型準確率和泛化能力。

    DNN模型如圖,層與層之間是全連線的,因此對於非線性特徵處理有很大優勢,特別是在搜尋推薦系統中,很多特徵與訓練目標的關係並不清晰,使用DNN可以很好提取高維度特徵。DNN在召回和排序環節都可應用,只是在最後的輸出層選擇使用$softmax$還是$sigmoid$的區別。召回使用$softmax$是因為召回面向的是全量內容,使用$softmax$更能保證結果的多樣性;排序階段輸入也可以進一步加入精細特徵,使用$sigmoid$轉化為分類問題對結果進行排序校準。

  • Wide&Deep

    Wide&Deep是Google 2016的一篇論文提出,該模型將線性模型和深度神經網路融合,結合線性模型的記憶能力和深度模型的泛化能力,從而提升整體效果。

    如圖所示,左側是寬線性模型,右側是深度模型,中間的Wide&Deep可以看做兩個模型的組合:

    • Wide部分為LR模型,優點是模型記憶性好,對於樣本出現的高頻低階特徵能夠使用少量引數學習,缺點是泛化能力差,用於學習樣本中的高頻部分。
    • Deep部分為DNN模型,優點是泛化能力強,對於少量出現的樣本甚至沒出現過的樣本都可以走出預測,缺點是對低階特徵的學習需要較多引數才能達到Wide部分效果,且泛化能力強也會導致一定程度的過擬合。

    通過兩者的結合,平衡兩種方法的優缺點,形成一個end-to-end的寬深度學習框架,數學表示式如下:

    \[f(x) = logistics(linear(X) + DNN(X)) \]

    是不是很眼熟,和GBDT+LR的形式如出一轍

  • DeepFM

    DeepFM實在Wide&Deep的基礎上,將Wide部分的LR替換成FM,由於LR對低階特徵利用簡單,在實際使用中還需要人為構建交叉特徵,FM在前文介紹過可自動進行特徵交叉計算,對低階特徵的利用更加合理,克服了W&D線性部分依然需要對低階特徵做複雜特徵工程的缺點。

  • DSSM

    DSSM在召回部分提到過,下面簡單進行展開介紹。

    上圖是DSSM三層結構,圖右側是DSSM表示層的結構。輸入層的作用是將文字轉化成向量提供給深度學習網路,如英文可通過Word Hashing方式處理、中文可以使用一些預訓練模型做轉換;表示層通過多層非線性轉換將輸入的高維向量轉換為低維向量,如圖中所示從原始的50萬維轉化為128維;匹配層將Query和Doc得到的兩個128維向量,通過餘弦公式計算其相似度。

  • Transformer

    Transformer由Google論文《Attention is All You Need》提出,巨集觀上是由encoder和decoder組成的模型,用於解決如機器翻譯、對話生成等seq2seq的問題,如下圖所示,左側是模型展開,原文中由6個encoder和decoder組成,右側是單層encoder和decoder的網路結構。

    自注意機制(Self Attention)是Transformer的核心機制,什麼是自注意呢?假如我們現在要翻譯下面的句子

    the animal didn't cross the street because it was too tired

    其中的it指代的是animal還是street對演算法而言是很難區分的,通過注意力機制,當演算法對it這個單詞進行編碼時,attention層會在其他單詞上都分配注意力,即計算句子中每一個單詞的注意力向量時,其他的詞都會對當前計算的單詞打分,這樣對當前單詞的編碼就會考慮其他單詞的影響。Transformer通過增加"多頭注意力"(Multi-Head Attention),擴充套件模型對不同位置的關注能力(如某個頭更關注前兩個單詞,某個頭更關注結尾兩個單詞),進一步完善了Self Attention層。

    上圖是阿里在商品重排環節提出的《Personalized Re-ranking for Recommendation》模型細節,其中輸入層\(x_{i_n}\)\(pv_{i_n}\)分別是原始商品的原始特徵和個性化特徵,\(pe_{i_n}\)是精排輸出的排序位置特徵;圖中可以看出該模型的編碼層採用多層Transformer編碼層實現,再經過\(softmax\)輸出重排後的打分。參考文章《Transformer 在美團搜尋排序中的實踐》也採用的同樣的方式構建了商戶重排環節,該文章同時還介紹了Transformer在特徵構建的應用,感興趣的讀者可通過參考文章列表的連結檢視。

深度學習模型的應用就簡單介紹這麼多,在具體應用上模型並不侷限於召回或排序階段,使用不同的取樣方式、輸出函式都可產生不同的結果,本質上是深度模型是為我們帶來更多的交叉特徵表徵,挖掘除人工統計外的潛在特徵互動關係,不可形成簡單的思維定式認為某種模型只能用於解決某個問題。

深度模型對特徵交叉的應用整體處於黑盒狀態,可解釋性差,這也是為什麼演算法工程師自嘲"煉丹"的原因。

搜尋引擎評估方法

搜尋引擎評價指標大體分為兩個方面:效率和效果。效率方面與傳統計算機系統評價方式類似,如考慮時間開銷、空間開銷、併發量及可靠性等,此處不做展開。效果評價針對搜尋引擎屬性,主要對搜尋結果的質量進行量化評估,效果評價指標整體分為兩方面:單條查詢的效果評估和多條查詢的平均效果評估。

單條查詢的評價指標

  • 準確率和召回率

    準確率(Precision)也叫查準率,召回率(Recall)也叫查全率,在搜尋引擎乃至機器學習中都是最常用,也是最受認可的指標。在搜尋引擎中,準確率與召回率的定義如下

    \[P = 檢出的相關文件數 / 檢出的全部文件數 \\ R = 檢出的相關文件數 / 資料庫中所有的相關文件數 \]

    假設資料庫中某個Query的相關文件有\(60\)篇,單次檢索得到\(50\)篇,其中\(40\)篇是Query相關文件、\(10\)篇是不相關文件,那麼準確率等於\(40/50\),召回率等於\(40/60\)

    理想的搜尋引擎\(P\)&\(R\)都應當等於\(1\),但實際上不存在這樣的引擎,且\(P\)\(R\)之間事實上存在一定反變關係,即一方提高另一方下降。如果追求過高的準確率,那麼演算法模型就需要更高的擬合度,導致相關度不明顯或新文件無法被檢索出來,即過擬合問題;如追求過高的召回率,模型就需要放鬆擬合度的要求,容易導致不相關的文件也被檢出,即欠擬合問題。在生產環境中,優質的搜尋引擎應當結合具體業務場景來決定應該偏重哪方面,垂域搜尋引擎應當偏重準確率,保證領域資訊檢索的準確性;綜述類的搜尋引擎應當適當偏向召回率,保證資訊能得到全面呈現。

    追求高召回率就是"寧可錯殺,絕不漏過"

  • F值

    \(F\)值綜合衡量準確率和召回率,定義為準確率和召回率的調和平均值,\(F\)值一般也稱為\(F1\)值,計算公式如下

    \[F1 = 2 * \frac{P*R} {P+R} \]

    假如某個查詢召回率是\(1\),準確率是\(0\),那麼公式計算\(F1\)值為\(0\)

    為什麼不直接計算\(PR\)的平均數?

    如果採用算數平均數,那一個返回全部文件的搜尋引擎都將有50%以上的分數。

  • Precision@N

    不考慮召回率的情況下,\(Precision@N\)用於衡量截止到位置\(N\)的準確率,一般寫作\(P@N\),由於使用者比較關心排序靠前的搜尋質量,最常用的指標如\(P@10\)\(P@20\),即僅計算前\(10\)條、\(20\)條結果的準確率。

  • AP

    平均正確率(Average Precision,AP):對不同召回率點上的準確率進行平均。

    • 未插值的\(AP\):某個Query共有\(6\)個相關結果,某系統排序返回\(5\)篇相關文件,位置分別是\(1、2、5、10、20\),則\(AP=(1/1+2/2+3/5+4/10+5/20+0)/6\)
    • 只對返回的相關文件計算\(AP\):如第一個例子,\(AP=(1/1+2/2+3/5+4/10+5/20)/5\)
    • 插值的\(AP\):在召回率分別為\(0、0.1、0.2...1.0\)的十一個點上求的正確率均值

    什麼是插值

    在搜尋結果的不同位置上,準確率和召回率也是不同的,假如某個Query的標準答案是{\(d_3\),\(d_5\),\(d_9\),\(d_{25}\),\(d_{39}\),\(d_{44}\),\(d_{56}\),\(d_{71}\),\(d_{89}\),\(d_{123}\)},該Query的\(15\)條檢索結果及對應未知的\(PR\)值分佈如下:

    1. \(d_{123}\) \(P = 1,R=0.1\) 6. \(d_9\) \(P = 0.5,R=0.3\) 11. \(d_{38}\)
    2. \(d_{84}\) 7. \(d_{511}\) 12. \(d_{48}\)
    3. \(d_{56}\) \(P = 0.67, R=0.2\) 8. \(d_{129}\) 13. \(d_{250}\)
    4. \(d_6\) 9. \(d_{187}\) 14. \(d_{113}\)
    5. \(d_8\) 10. \(d_{25}\) \(P=0.4, R=0.4\) 15. \(d_5\) \(P=0.33,R=0.5\)

    根據上表繪製\(PR\)曲線如下圖左:

    事實上\(PR\)曲線常常呈鋸齒狀,如上圖右,因為假設第\(K+1\)篇文件不相關,那麼位置\(K+1\)\(K\)上的召回率相同、準確率降低,所以曲線會下降;如果\(K+1\)位置文件相關,那麼準確率和召回率都會上升,因此整條曲線會呈現鋸齒狀。為了平滑曲線,採用插值準確率(interpolated precition)記錄召回率為\(r\)的插值準確率

    \[p_{interp}(r) = MAX_{r' \geq r} p(r') \]

    表示為不小於\(r\)的召回率位置上準確率的最大值,即從當前召回率位置往右數可取得的最大準確率。

  • NDCG

    每個文件不僅只有相關和不相關兩種情況,而是有相關度的比如定義為0、1、2、3,我們希望在結果中相關度越高的文件越多、排位越靠前越好。\(NDCG\)(Normalized Discounted Cumulative Gain,歸一化折損累計增益)用於表示位置在\(P\)處的搜尋效果,通常也記做\(NDCG@P\),如\(NDCG@5、NDCG@10\)等。

    \(i\) \(rel_i\) \(CG = \sum\limits_{i=1}^{p} rel_i\) \(log_2(i+1)\) \(DCG=\sum\limits_{i=1}^{p} \frac{rel_i}{log_2(i+1)}\) \(rel_{i理想}\) \(IDCG=\sum\limits_{i=1}^{p} \frac{rel_{i理想}}{log_2(i+1)}\) \(NDCG\)
    1 3 3 1 3 3 3 1
    2 2 3+2 1.58 3+1.26 3 3+1.89 0.87
    3 3 3+2+3 2 3+1.26+1.5 3 3+1.89+1.5 0.90
    4 0 3+2+3+0 2.32 3+1.26+1.5+0 2 3+1.89+1.5+0.86 0.79
    5 1 3+2+3+0+1 2.58 3+1.26+1.5+0+0.38 2 3+1.89+1.5+0.86+0.77 0.76
    6 2 3+2+3+0+1+2 2.8 3+1.26+1.5+0+0.38+0.71 1 3+1.89+1.5+0.86+0.77+0.35 0.81

    假設某個Query有6個相關文件,相關度為\((3、3、3、2、2、1)\),實際搜尋結果中得到5個相關文件,上表\(i\)列表示文件在搜尋結果中的位置,\(rel_i\)表示實際文件結果的相關度,\(rel_{i理想}\)表示理想情況下前6個結果的文件相關度。

    \(CG\)(Cumulative Gain,累計收益)表示搜尋結果列表中所有文件的相關度得分總和,位置\(p\)\(CG\)定義為:

    \[CG_p = \sum\limits_{i=1}^{p} rel_i \]

    \(DCG\)(Discounted cumulative gain,折損累計收益)提出在搜尋結果列表的較低位置上出現相關性較高的文件時,應該對評測得分施加懲罰。懲罰比例與文件的所在位置的對數值相關,位置\(p\)\(DCG\)定義為:

    \[DCG_p=\sum\limits_{i=1}^{p} \frac{rel_i}{log_2(i+1)} \]

    \(IDCG\)即理想的\(DCG\)值,取\(rel_{i理想}\)列代入公式進行計算,再使\(DCG\)除以\(IDCG\)就得到\(NDCG\)

    \[NDCG_p=\frac{DCG_p}{IDCG_p} \]

    \(DCG\)還有一種廣泛的計算公式為\(DCG=\sum\limits_{i=1}^{p} \frac{2^{rel_i} - 1}{log_2(i+1)}\),增強相關度在效果評估中的影響。

多條查詢的評價指標

  • MAP

    MAP(Mean Average Precision):對所有查詢的\(AP\)求算數平均,如Query1有\(4\)個相關文件,Query2有\(5\)個相關文件,Query1檢索出\(4\)個相關文件位置分別為\(1、2、4、7\),Query2檢索出\(3\)個相關文件位置為\(1、3、5\),那麼Query1的平均準確率\(AP=(1/1+2/2+3/4+4/7)/4=0.83\),Query2的\(AP=(1/1+2/3+3/5+0+0)/5=0.45\),則\(MAP=(0.83+0.45)/2=0.64\)

  • MMR

    MMR(Mean Reciprocal Rank):對於某些IR系統(如問答系統或主頁發現系統),只關心第一個標註答案的位置,這個位置的倒數稱為\(RR\),對問題集合求平均即得到\(MRR\)。例如兩個Query,系統對第一個Query返回的正確答案位置為\(2\),第二個Query答案位置為\(4\),那麼\(MRR=(1/2+1/4)/2=3/8\)

總結

搜尋引擎是一個結合了多種工程技術和演算法模型的系統,本文僅對搜尋引擎的整體組成和技術範圍做了概況性介紹,其中每個技術點都可以展開作單獨的文章闡述,受限於篇幅和個人粗淺認知,文章不對各個技術細節做深入解析,感興趣的讀者可進一步閱讀參考列表中的文章,如文中存在觀點錯誤,歡迎在評論區指出。

參考