王鎮(zhèn)宇,鄭揚(yáng)飛
(華北計(jì)算技術(shù)研究所系統(tǒng)八部,北京 100083)
面對(duì)龐大的數(shù)據(jù)量和復(fù)雜的數(shù)據(jù)組織結(jié)構(gòu),傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在存儲(chǔ)和檢索數(shù)據(jù)方面的性能并不令人滿意。鑒于存儲(chǔ)和檢索數(shù)據(jù)的復(fù)雜性,對(duì)信息檢索功能提出了更高的要求。工業(yè)界常用方法是將數(shù)據(jù)遷移到集成了數(shù)據(jù)存儲(chǔ)和檢索功能的垂直分布的搜索引擎[1],例如Solr、Elasticsearch等。盡管垂直分布式搜索引擎[2]提供的域指定語(yǔ)言(Domain Specific Language, DSL)查詢可以滿足大多數(shù)復(fù)雜的檢查請(qǐng)求,但它要求工程師對(duì)檢索請(qǐng)求和文檔之間的相關(guān)性進(jìn)行詳細(xì)分析,并對(duì)垂直領(lǐng)域的數(shù)據(jù)有詳盡的了解,在此之上進(jìn)行信號(hào)的過(guò)濾、放大等建模。這對(duì)提高檢索模塊的可擴(kuò)展性和檢索性能等功能帶來(lái)了挑戰(zhàn)。本文基于Elasticsearch(ES)進(jìn)行文本的初步檢索和排序,使用機(jī)器學(xué)習(xí)排序算法(Learning to Rank, LTR)[3]建模對(duì)返回的結(jié)果進(jìn)行排序,以最大程度地檢查請(qǐng)求和結(jié)果之間的相關(guān)性[4],同時(shí)優(yōu)化相關(guān)性評(píng)分策略使評(píng)價(jià)標(biāo)準(zhǔn)考慮文本的詞頻及文本長(zhǎng)度,設(shè)計(jì)并實(shí)現(xiàn)一套智能檢索系統(tǒng)。
典型的排序?qū)W習(xí)模型如圖1所示,訓(xùn)練集為向量化的檢索集,通過(guò)學(xué)習(xí)系統(tǒng)學(xué)習(xí)出的模型,對(duì)測(cè)試集中的檢索q進(jìn)行排序相似度預(yù)測(cè)打分。排序?qū)W習(xí)算法按照輸入輸出空間、損失函數(shù)等定義的不同,可以分為3類。
圖1 排序?qū)W習(xí)模型框架
1.1.1 Pointwise方法
輸入為單個(gè)文本的特征向量,輸出則包括了每一個(gè)文本的相關(guān)性評(píng)分,通過(guò)對(duì)相關(guān)性評(píng)分[5]的排序輸出排序?qū)W習(xí)的結(jié)果。常用的Pointwise方法有梯度提升樹(shù)(Gradient Boosting Decision Tree, GBDT)、支持向量機(jī)(Support Vector Machine, SVM)等。由于并未考慮文本之間的相互依賴,且在檢索評(píng)價(jià)標(biāo)準(zhǔn)中很多都是基于檢索語(yǔ)句級(jí)別和位置定位級(jí)別的,因此Pointwise方法的局限性很大。
1.1.2 Pairwise方法
Pairwise方法的輸入為特征向量化的文本對(duì),輸出為文本選擇為{+1,-1},通過(guò)得分函數(shù)得出每對(duì)文本的相關(guān)性評(píng)分來(lái)進(jìn)行排序,當(dāng)每一對(duì)文本對(duì)都嚴(yán)格有序,則整個(gè)輸出空間的文本有序。常用的Pairwise方法有RankSVM、LambdaRank等。這種方法的局限性也很明顯,譬如一對(duì)相關(guān)度都很低的文本對(duì),它們的相對(duì)順序沒(méi)有辦法反應(yīng)它們?cè)谧罱K檢索結(jié)果中的最終位置,因此傳遞的信息依賴于結(jié)果文本對(duì)的數(shù)量。
1.1.3 Listwise方法
相較于前2種方法,Listwise的輸入為特征向量化的文本集,輸出為一個(gè)有序結(jié)果表。Listwise的評(píng)分方法本質(zhì)上還是采用Pairwise的評(píng)分方法,但不同的是將文本對(duì)作為一個(gè)樣本,從而考慮整體排序來(lái)進(jìn)行文本打分,因此相較而言Listwise的性能是優(yōu)于前2種方法的。常用的有LambdaMART等。
本節(jié)介紹在給定測(cè)試集的情況下,常規(guī)的幾種對(duì)信息檢索結(jié)果度量的相關(guān)標(biāo)準(zhǔn)。主要分為:無(wú)序檢索結(jié)果集合的評(píng)價(jià),評(píng)價(jià)標(biāo)準(zhǔn)有正確率P、召回率R以及平衡F值[6];有序檢索結(jié)果的評(píng)價(jià)標(biāo)準(zhǔn)有平均準(zhǔn)確率均值(Mean Average Precision, MAP)和歸一化折損累計(jì)增益(Normalized Discounted Cumulative Gain, NDCG)。
1.2.1 無(wú)序檢索結(jié)果集合的評(píng)價(jià)
正確率(Precision, P)計(jì)算公式見(jiàn)式(1),表示返回的文本中相關(guān)性文本的比重。
(1)
召回率(Recall, R)計(jì)算公式見(jiàn)式(2),表示返回的文本占所有相關(guān)性文本的比重。
(2)
通過(guò)表1可以更直觀地理解P和R的概念,于是有P的計(jì)算公式(3)和R的計(jì)算公式(4)。
表1 正確率召回率相關(guān)概念
(3)
(4)
(5)
1.2.2 有序檢索結(jié)果的評(píng)價(jià)方法
MAP是一種常用的有序檢索結(jié)果的評(píng)價(jià)方法。假定信息需求qj∈Q,所有滿足條件的相關(guān)文本集合為d1,…dmj,Rjk是返回結(jié)果中滿足條件的文本集合,則有MAP的計(jì)算公式(6)。
(6)
NDCG是另一種在機(jī)器學(xué)習(xí)的排序方法中常常使用的評(píng)價(jià)指標(biāo)。NDCG@k表示基于前k個(gè)檢索結(jié)果進(jìn)行計(jì)算。計(jì)算某個(gè)查詢集合Q,假設(shè)R(j,d)是人工給出的文本d對(duì)查詢j的相關(guān)性評(píng)分,則有公式(7),其中Zj,k是歸一化因子。
(7)
ROC曲線及AUC。ROC稱為受試者工程特征曲線,基于False Positive畫(huà)出True Positive而得到的曲線,在此基礎(chǔ)之上,為了能夠量化使用ROC曲線進(jìn)行性能評(píng)估,定義AUC為ROC曲線下的面積。面積越大則表示模型性能越好。
搜索的本質(zhì)分為2個(gè)階段:token匹配和文本排名系統(tǒng)。提升檢索效率是一個(gè)相關(guān)性工程,問(wèn)題的關(guān)鍵在如何提升用戶提出的檢索需求和返回文本的相關(guān)性。數(shù)據(jù)資產(chǎn)管理系統(tǒng)中的數(shù)據(jù)往往雜亂無(wú)章,且數(shù)據(jù)治理程度不高,但用戶進(jìn)行檢索時(shí)只會(huì)對(duì)幾個(gè)特定類別的數(shù)據(jù)進(jìn)行查詢。為了解決相關(guān)性反饋部分遇到的文本分類的困境,本文引入機(jī)器學(xué)習(xí)領(lǐng)域基于相關(guān)性預(yù)測(cè)搜索結(jié)果和查詢條件相關(guān)性的排序?qū)W習(xí)技術(shù)[7]。本節(jié)介紹基于Pointwise的RankSVM模型、梯度提升樹(shù)GBDT模型和基于Pairwise的LambdaRank模型在文本排序領(lǐng)域的相關(guān)改進(jìn)和優(yōu)化。
2.1.1 基于RankSVM構(gòu)建LTR模型
本節(jié)介紹使用改進(jìn)的排序支持向量機(jī)RankSVM構(gòu)建排序?qū)W習(xí)模型的過(guò)程。RankSVM是一種基于支持向量機(jī)SVM實(shí)現(xiàn)的排序算法。通常在使用SVM的過(guò)程中都會(huì)使用很多技巧來(lái)提升其性能。文本分類問(wèn)題通常都是在高維空間進(jìn)行,這意味著數(shù)據(jù)是線性不可分的,SVM引入核函數(shù)來(lái)解決這個(gè)問(wèn)題,解決思路類似于數(shù)據(jù)的降維過(guò)程,將數(shù)據(jù)映射到高維平面再進(jìn)行逐步的線性分類?;赗ankSVM構(gòu)建排序?qū)W習(xí)模型過(guò)程如下:
(8)
(9)
圖2 RankSVM使用的Hinge Loss函數(shù)
2.1.2 基于GBDT構(gòu)建LTR模型
本節(jié)介紹基于改進(jìn)的梯度提升樹(shù)[8]GBDT來(lái)構(gòu)建排序?qū)W習(xí)模型,此時(shí)排序問(wèn)題被簡(jiǎn)化為一個(gè)多分類問(wèn)題。GBDT的主要思想是通過(guò)迭代來(lái)擬合多個(gè)決策樹(shù)的殘差,樹(shù)狀結(jié)構(gòu)很適合進(jìn)行決策分類問(wèn)題,且和其它排序模型結(jié)合就可以進(jìn)行排序?qū)W習(xí)[9]。本文的基于GBDT構(gòu)建的排序?qū)W習(xí)模型過(guò)程如下:
(10)
(11)
接著定義得分函數(shù)f用來(lái)將分類結(jié)果轉(zhuǎn)化為排序得分,即將分類器的輸出轉(zhuǎn)化為概率。定義g(k)是相關(guān)性為k的一個(gè)單調(diào)遞增函數(shù),則一個(gè)文本的最終排序得分計(jì)算見(jiàn)公式(12)。
(12)
2.1.3 基于LambdaRank構(gòu)建LTR模型
RankNet[10]提出將錯(cuò)誤對(duì)最少作為優(yōu)化目標(biāo)的排序算法,但有時(shí)候僅以這種目標(biāo)來(lái)評(píng)價(jià)排序結(jié)果是不準(zhǔn)確的。例如使用NDCG@k指標(biāo)時(shí)并不會(huì)關(guān)注所有結(jié)果,只會(huì)取前k個(gè)結(jié)果進(jìn)行加權(quán)評(píng)估,從而會(huì)導(dǎo)致評(píng)價(jià)指標(biāo)不可導(dǎo),因此無(wú)法采用機(jī)器學(xué)習(xí)進(jìn)行迭代優(yōu)化參數(shù)。LambdaRank算法則另辟蹊徑,沒(méi)有進(jìn)行定義損失函數(shù)和計(jì)算梯度這2步操作,直接定義梯度來(lái)解決排序問(wèn)題[11]。因此,LambdaRank的訓(xùn)練收斂速度更快且可以直接對(duì)問(wèn)題求解。
本節(jié)介紹基于LambdaRank構(gòu)建排序?qū)W習(xí)模型的過(guò)程,采用將基于位置的權(quán)重引入Pairwise損失函數(shù)[12]的方法,這種評(píng)估方法直接用于定義訓(xùn)練過(guò)程中每個(gè)文本對(duì)的梯度,來(lái)使得對(duì)應(yīng)的損失函數(shù)可以和最終的排序結(jié)果更加一致。假設(shè)只有2個(gè)相關(guān)文本x1與x2,使用NDCG@1作為評(píng)價(jià)指標(biāo),它們的相關(guān)性如圖3所示。如果將x1或x2移動(dòng)到列表的頂端,則可以獲得最大的NDCG@1。
圖3 使用NDCG@1的文本相關(guān)性評(píng)價(jià)
從圖3中可以看出將x1向上移動(dòng)更加方便,因?yàn)楣ぷ髁繒?huì)比移動(dòng)x2小很多。因此可以定義x1排名得分的梯度要大于x2排名分?jǐn)?shù)的梯度,將移動(dòng)的工作量抽象為優(yōu)化過(guò)程中存在的一個(gè)隱式損失函數(shù)L,見(jiàn)公式(13)。
(13)
上面提到的梯度稱為L(zhǎng)ambda函數(shù),定義r(·)為文本在上一輪訓(xùn)練中的排名位置,使用NDCG來(lái)優(yōu)化訓(xùn)練過(guò)程時(shí)有如下的Lambda函數(shù),見(jiàn)公式(14)。
(14)
對(duì)于每一對(duì)文本xu和xv,每一次優(yōu)化之后它們的得分分別提升了+λ和-λ。實(shí)驗(yàn)中采用公式(14)中推導(dǎo)的Lambda函數(shù),使得算法可以讓目標(biāo)函數(shù)達(dá)到局部最優(yōu)。
本節(jié)首先介紹實(shí)驗(yàn)中所使用的文本分類特征選擇方法,然后介紹在不同的排序?qū)W習(xí)模型下構(gòu)建特征集和參數(shù)選擇的相關(guān)信息。主要介紹對(duì)訓(xùn)練數(shù)據(jù)的特征工程、基于線性SVM的RankSVM模型的構(gòu)建、基于XGBoost構(gòu)建的梯度提升樹(shù)和LambdaRank模型的相關(guān)參數(shù)選擇、模型的訓(xùn)練過(guò)程以及驗(yàn)證,最后展示將機(jī)器學(xué)習(xí)模型以插件的形式作為ES打分功能的過(guò)程。
2.2.1 構(gòu)建評(píng)價(jià)表
首先使用數(shù)據(jù)資產(chǎn)[11-12]構(gòu)建評(píng)價(jià)表,生成評(píng)價(jià)表為csv文件格式,列分別為評(píng)分-分類-文本id,評(píng)分為分類算法給出的評(píng)分,標(biāo)準(zhǔn)化后落到區(qū)間[1,10]之內(nèi)。譬如,分類器給出評(píng)分為0.238,則落到區(qū)間內(nèi)為2.38,向下取整為2,分?jǐn)?shù)越高則表示分類器認(rèn)為該文本屬于當(dāng)前類的可能性更高。本文認(rèn)為分類器評(píng)分大于5的文本為與實(shí)際分類正相關(guān)的文本,采用過(guò)濾器來(lái)組合對(duì)應(yīng)符合查詢的文本id。
與傳統(tǒng)的機(jī)器學(xué)習(xí)算法的特征不同的是,為了能夠?qū)⒛P鸵圆寮男问角度隕S中,因無(wú)法使用特征數(shù)值化和正規(guī)化等處理[13],考慮到數(shù)據(jù)資產(chǎn)管理平臺(tái)上的數(shù)據(jù)大都是結(jié)構(gòu)化數(shù)據(jù),從每一行數(shù)據(jù)的角度來(lái)看,可以拆分成特征個(gè)的字典,因此本文將數(shù)據(jù)集處理成libSVM的矢量數(shù)據(jù)格式,其格式如下:
<類別><字段1>:<值1><字段2>:<值2>…<字段N>:<值N>
其中,類別為相關(guān)性,1為正相關(guān),0為負(fù)相關(guān),后續(xù)為字段名∶值對(duì)??紤]到數(shù)據(jù)資產(chǎn)檢索使用ES的場(chǎng)景,結(jié)合檢索模塊的設(shè)計(jì),本文在對(duì)模型訓(xùn)練時(shí)選取的特征都是文本類型。
2.2.2 構(gòu)建LTR query
接著需要構(gòu)造LTR query來(lái)提供使用排序?qū)W習(xí)模塊進(jìn)行打分的功能,這里需要注意使用filter模塊,從而不會(huì)讓LTR的再評(píng)分影響到搜索引擎本身的評(píng)分策略。LTR字段提供3個(gè)屬性:name表示使用的LTR模型;field表示查詢的字段;params表示查詢關(guān)鍵詞,可以是多個(gè)參數(shù)。
2.2.3 LTR模型嵌入
ES支持自定義式插件來(lái)提供額外的功能,用戶可以其支持的格式開(kāi)發(fā)出滿足自己需求的應(yīng)用以插件的形式嵌入即可。有了上一節(jié)訓(xùn)練的排序?qū)W習(xí)模型參數(shù),可以通過(guò)POST給ES添加排序?qū)W習(xí)插件。如果想要更新或者刪除排序?qū)W習(xí)模型,可以通過(guò)DELETE指令來(lái)刪除已有的模型,可以看到ES本身是不會(huì)自己去對(duì)數(shù)據(jù)進(jìn)行處理并對(duì)模型進(jìn)行任何操作的,本質(zhì)上以插件的模式提供的是模型輸出的決策樹(shù)參數(shù)。這就讓ES通過(guò)LTR模塊進(jìn)行查詢的時(shí)候,利用排序?qū)W習(xí)的知識(shí)來(lái)對(duì)每一步的判斷作出選擇。也正因此,可以通過(guò)定制模型來(lái)讓ES返回相關(guān)度更高的檢索結(jié)果。
2.2.4 使用LTR搜索
使用LTR的檢索本質(zhì)上是對(duì)檢索結(jié)果的某個(gè)字段進(jìn)行再次打分,通過(guò)過(guò)濾的方法對(duì)結(jié)果進(jìn)行再次排序??紤]到實(shí)際使用場(chǎng)景,用戶使用LTR模塊進(jìn)行搜索的數(shù)據(jù)量可能會(huì)非常大。例如初次檢索滿足條件的文本數(shù)目為10萬(wàn)條,則在給用戶返回?cái)?shù)據(jù)之前,需要通過(guò)LTR對(duì)每個(gè)文本的字段進(jìn)行再打分。這將消耗非常多的服務(wù)器資源,且耗時(shí)很長(zhǎng)使得檢索體驗(yàn)變差。綜合考慮用戶對(duì)數(shù)據(jù)資產(chǎn)檢索的習(xí)慣,若前端展示設(shè)置為每頁(yè)展示10條結(jié)果,則一般情況下用戶不會(huì)翻到100頁(yè)去查看第1000條檢索結(jié)果,這也不符合正常查詢的習(xí)慣。因此,采用對(duì)topN的檢索結(jié)果進(jìn)行LTR再打分,N的默認(rèn)值為100。
在信息檢索的過(guò)程中信號(hào)建模和評(píng)價(jià)函數(shù)的設(shè)計(jì)相互影響[14-15],決定了檢索結(jié)果的質(zhì)量。在ES當(dāng)中每個(gè)字段都可以定義不同的相關(guān)性評(píng)分策略,這就可以讓人們根據(jù)字段數(shù)據(jù)類型的不同選擇對(duì)應(yīng)的評(píng)分策略,從而提高文本評(píng)分的準(zhǔn)確度。
BM25[16]是ES默認(rèn)的相關(guān)性評(píng)分策略,是一種基于詞項(xiàng)頻率、文本長(zhǎng)度等要素來(lái)建立概率模型的方法:對(duì)于文本d,給文本中的每個(gè)查詢?cè)~項(xiàng)賦權(quán)值,計(jì)算公式如式(15),其中,檢索狀態(tài)值RSV指最后用于排序的狀態(tài)值,dft是包含t的文本數(shù)目,N為文本總數(shù)。
(15)
本文通過(guò)引入詞項(xiàng)的頻率[17]和文本長(zhǎng)度[18-19],對(duì)BM25的相關(guān)計(jì)算公式進(jìn)行調(diào)整后的公式見(jiàn)式(16)。其中,tftd定義為詞項(xiàng)t在文本d中的權(quán)重,Ld為文本d的長(zhǎng)度,Lave是整個(gè)文本集中文本的平均長(zhǎng)度。k1和b這2個(gè)參數(shù)用來(lái)對(duì)文本中的詞項(xiàng)頻率進(jìn)行縮放控制[20]。
(16)
本節(jié)主要對(duì)比排序?qū)W習(xí)模塊各算法在文本分類[21]和文本排序任務(wù)[22]上的表現(xiàn)。選取10類共25091條數(shù)據(jù),數(shù)據(jù)選取的類別及數(shù)目見(jiàn)表2。
表2 數(shù)據(jù)類別及數(shù)量
針對(duì)3種LTR模型進(jìn)行排序結(jié)果展示,評(píng)價(jià)標(biāo)準(zhǔn)為NDCG@100和AUC,結(jié)果見(jiàn)表3。
表3 排序?qū)W習(xí)模型性能
GBDT在排序?qū)嶒?yàn)中對(duì)不同類別的數(shù)據(jù)表現(xiàn)也會(huì)有很大的波動(dòng),而RankSVM和LambdaRank則表現(xiàn)較為穩(wěn)定。
表4展示了3種排序?qū)W習(xí)模型對(duì)不同文本類型的檢索效果,從R均值可以看出,默認(rèn)配置的ES對(duì)數(shù)據(jù)的檢索效率和GBDT相近,RankSVM和LambdaRank則在前兩者基礎(chǔ)上,大大提升對(duì)相關(guān)性文本的檢索效率。
表4 檢索結(jié)果前100準(zhǔn)確性對(duì)比
系統(tǒng)架構(gòu)如圖4所示,主要分為數(shù)據(jù)源、采集、索引、檢索和結(jié)果展示5個(gè)模塊。
圖4 系統(tǒng)架構(gòu)圖
從數(shù)據(jù)流的角度來(lái)看,系統(tǒng)對(duì)數(shù)據(jù)的處理有如下幾個(gè)過(guò)程:首先是確定待整合數(shù)據(jù)類型,然后按照數(shù)據(jù)源類型配置采集任務(wù),在ES中構(gòu)建或者更新索引導(dǎo)入數(shù)據(jù),接著對(duì)索引中數(shù)據(jù)進(jìn)行檢索,經(jīng)過(guò)信號(hào)放大及過(guò)濾、使用排序?qū)W習(xí)模型重新打分,最后返回結(jié)果給用戶。
本文針對(duì)工程項(xiàng)目中采用關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行全文查詢效率低下的問(wèn)題,研究并基于排序?qū)W習(xí)算法構(gòu)建了智能檢索系統(tǒng),有效地解決了多源數(shù)據(jù)導(dǎo)入步驟繁雜、檢索數(shù)據(jù)相關(guān)性低及全文檢索耗時(shí)長(zhǎng)等問(wèn)題。試驗(yàn)結(jié)果表明,使用排序?qū)W習(xí)模塊可以有效地提升返回文本的相關(guān)性評(píng)分,使得檢索準(zhǔn)確度得到提升。本文設(shè)計(jì)的智能檢索系統(tǒng)可以有效地解決全文檢索效率低下等常見(jiàn)的問(wèn)題,但還有很多可以改進(jìn)的地方,譬如支持異構(gòu)數(shù)據(jù)的接入[21]、使用自然語(yǔ)言處理技術(shù)[22]來(lái)支持通用查詢等。