攜程旅遊研發部大數據與AI研發團隊,為旅遊事業部提供豐富的AI技術產品與技術能力。
搜尋是電商最重要的門面之一,大部分用戶透過搜尋來找到他們想要的商品,因此搜尋是用戶表達意圖最直接的方式,也是轉換率最高的流量來源之一。絕大部分的電商搜尋是透過搜尋框輸入搜尋詞(Query)來完成,因此,搜尋詞的詞義解析和意圖理解成為了搜尋中的重要一環。
主流的搜尋詞義解析和Query理解需要經過糾錯、同義詞替換、分詞、詞性標註、實體辨識、意圖辨識、詞重要度權重、丟詞等步驟。以旅遊場景下的搜尋舉例,如圖1所示,當用戶在搜尋框輸入「雲南香各里拉」作為Query的時候,首先搜尋引擎需要對該搜尋字詞進行糾錯,這是為了便於後續步驟正確解析出使用者想要搜尋的內容;如果有必要,也會進行同義詞替換。然後,對搜尋詞進行分詞和詞性標註,識別出“雲南”是省,“香格里拉”是城市或酒店品牌,緊接著會做實體識別,召回“雲南”和“香格里拉”在後台數據庫裡對應的實體id。
這個時候,出現了一個分歧,「香格里拉」既可能是城市,也可能是飯店品牌。在使用者進行搜尋的時候,是否能夠預測出正確的類別和實體,對於搜尋結果的精準展示和提升使用者體驗有重要的意義。因此,我們必須辨識出使用者真正想要搜的是什麼類別,並找到對應的實體,否則可能在搜尋清單頁前排會給出使用者不想要的結果。從人的先驗知識來看,用戶搜尋“雲南香格里拉”,很大可能性是想要搜城市。意圖辨識步驟,就是為了實現這個功能,辨識出使用者真正的搜尋意圖是代表城市的「香格里拉」。
後續就可以進入搜尋的召回步驟,召回主要負責的是把和搜尋字詞意圖相關的商品或內容找出來。前面的步驟獲取了「雲南」和「香格里拉」的id,就可以很方便的召回和「雲南」和「香格里拉」都相關的商品或內容。但是,有些時候,召回的結果為空或過於稀少,這個時候給用戶的體驗不好,因此,在召回的結果為空或者過於稀少的情況下,往往還需要丟詞和二次召回的操作。此外,有些詞屬於可省略詞,或對搜尋產生幹擾的詞,也可以用丟詞來處理。
所謂丟詞,就是把搜尋詞中相對不重要或是聯繫不緊密的詞丟掉,再次回想。那麼該如何衡量每個字的重要性或緊密程度呢?這裡就需要引入了Term Weighting的模組,把每個字視為term,透過演算法或規則計算每個term的weight,每個term的weight直接決定了term重要度和緊密度的順序。例如,假設“雲南”的term weight是0.2,“香格里拉”的term weight是0.8,那麼如果需要丟詞,就應該先丟“雲南”,保留“香格里拉”。
圖1 搜尋詞義解析與Query理解步驟
傳統的搜尋意圖辨識會採用詞表匹配,類目機率統計,加上人為設定規則。傳統的Term Weighting同樣會採用詞表匹配和統計方法,例如根據全量商品的標題和內容統計出詞的TF-IDF、前後詞互資訊、左右鄰熵等數據,直接存成字典和分值,提供給線上使用,再根據一些規則輔助判斷,例如業界專有名詞直接給予較高的term weight,助詞直接給出較低的term weight。
但是,傳統的搜尋意圖識別和Term Weighting演算法無法達到很高的準確率和召回率,特別是無法處理一些較為罕見的搜尋字詞,因此需要一些新的技術來提升這兩個模組的準確率和回想率,以及提升對罕見搜尋字詞的適應能力。此外,因為訪問頻率較高,搜尋詞義解析需要非常快的反應速度,在旅遊搜尋場景下,反應速度往往需要達到接近個位數的毫秒級,這對於演算法來說是一個很大的挑戰。
為了提高準確率和召回率,我們採用深度學習來改進搜尋意圖辨識和Term Weighting演算法。深度學習透過樣本的學習,可以有效解決各種情況下的意圖辨識和Term Weighting。此外,針對自然語言處理的大規模預訓練語言模型的引入,可以進一步強化深度學習模型的能力,減少樣本的標註量,使得原本標註成本較高的深度學習在搜尋上應用成為可能。
但是深度學習面臨的問題是,由於模型的複雜度較高,神經網路層數較深,且反應速度無法滿足搜尋的高要求。因此我們採用模型蒸餾和模型壓縮來減少模型的複雜度,在略微降低準確率和召回率的情況下減少深度學習模型的耗時,以此保證較快的響應速度和較高的性能。
類別目辨識是意圖辨識的主要組成部分。意圖辨識中的類目辨識是搜尋字詞query經過分詞後,對分詞結果打上所屬類目並給出對應機率值的方法。解析使用者的搜尋字詞的意圖有利於分析使用者的直接搜尋需求,進而輔助提升使用者體驗。例如用戶在旅遊頁面搜尋 “雲南香格里拉”,獲取到用戶輸入的“香格里拉”對應的類目是“城市”,而不是“酒店品牌”,引導後續檢索策略偏向城市意圖。
在旅遊場景下,使用者輸入的類別存在歧義的搜尋字詞佔總量約11%,其中包含大量無分詞的搜尋字詞。 「無分詞」是指經過分詞處理後無更細化的切分片段,「類目存在歧義」是指搜尋詞本身存在多種可能的類目。例如使用者輸入“香格里拉”,無更細化的切分片段,且對應類目資料中存在“城市”、“飯店品牌”等多個類目。
如果搜尋字詞本身是多個字的組合,則可以透過搜尋字詞本身來明確類別目,優先會以搜尋字詞本身作為辨識目標。如果單從搜尋詞本身無法明確所屬類目,我們會優先追加該用戶不相同的最近歷史搜尋詞,以及最近商品類目點擊記錄,若無上述資訊則追加定位站,作為補充語料。原始搜尋詞經過處理獲得待辨識的Query R。
最近幾年,預訓練語言模型在許多自然語言處理任務中大放異彩。在類別目辨識中,我們利用預訓練模型的訓練網路參數,取得含上下文語意的字特徵Outputbert;使用字詞轉換模組,字特徵結合位置編碼:
得到到分詞對應的字元片段,如:
#代表第i個分詞對應的長度為li的字特徵。基於字元片段Wi,字詞轉換模組聚合出每個字的特徵Hwi。聚合手段可以是最大值池化max-pooling、最小值池化min-pooling、均值池化mean-pooling等方式,實驗得到最大池化效果最佳。模組輸出為搜尋詞R的詞特徵OutputR;透過平行分類器對搜尋詞的詞特徵OutputR中各個片段給出類目資料庫中涵蓋的匹配類目,並給出對應類目的匹配機率。
圖2 類別目識別整體結構示意圖
#類別目辨識模型是基於BERT-base 12層模型,由於模型太大,不滿足線上運行的響應速度要求,我們對模型進行了知識蒸餾(Knowledge Distillation),將網絡從大網絡轉化成一個小網絡,保留接近於大網絡的性能的同時滿足線上運行的延遲要求。
原先訓練好的類目辨識模型作為teacher網絡,將teacher網絡的輸出結果 作為student網絡的目標,訓練student網絡,使得student網絡的結果p接近q ,因此,我們可以將損失函數寫成:
這裡CE是交叉熵(Cross Entropy),symmetricalKL是對稱KL散度(Kullback–Leibler divergence),y是真實標籤的one-hot編碼, q是teacher網路的輸出結果,p是student網路的輸出結果。
圖3 知識蒸餾示意圖
#經過知識蒸餾,類目辨識最終仍可達到較高的準確率和召回率,同時可以做到整體反應時間的95線大約是5ms。
經過類別目辨識之後,還需要經過實體連結等步驟,完成最終的意圖辨識流程。具體內容可參考《攜程實體連結技術的探索與實踐》一文,本文不再闡述。
對於使用者輸入的搜尋詞,不同的term對於使用者的核心語意訴求有著不同的重要性。在搜尋的二次回想排序中需要專注於重要性高的term,同時在丟詞的時候可以忽略重要性低的term。透過計算使用者輸入搜尋字詞的各個term weight,來二次召回最接近使用者意圖的產品,提升使用者體驗。
首先,我們需要尋找線上使用者真實的回饋資料作為標註資料。使用者在搜尋框的輸入和聯想詞點擊情況一定程度上反映了使用者對於搜尋短語中詞語的重視程度,因此我們選用聯想詞輸入和點擊數據,加以人工篩選和二次標註,作為Term Weighting模型的標註數據。
在資料預處理方面,我們所能獲得的標註資料為短語及其對應的關鍵字,這裡為了使權重的分配不過於極端,給定非關鍵字一定量小的權重,並將剩餘權重分配給關鍵字的每個字上,如果某一短語在資料中出現了複數,且對應的關鍵字不同,則會根據關鍵字的頻率對這些關鍵字的權重進行分配,並進一步分配每個字的權重。
模型部分主要嘗試BERT作為特徵提取的方法,並進一步對每個term的權重進行擬合。對於給定的輸入,將其轉換為BERT所能接收的形式,將通過BERT後的張量再通過全連接層進行壓縮,得到一維的向量後進行Softmax處理,並用該向量對結果的權重向量進行擬合,具體模型框架如下圖所示:
#圖4 Term Weighting模型框架
#由於中文BERT基於字符,因此需要將每個term中的所有字的權重進行求和,從而最終得到term的權重。
在整個模型框架中,除去一些訓練的超參數,能調整的部分主要包含兩個部分:一是透過BERT產生Embedding時,可以選擇BERT最後一層,或是綜合BERT的第一層和最後一層的方式產生Embedding;二是在損失函數的選擇上,除去使用MSE損失衡量預測權重與實際權重之間差距之外,也嘗試使用非重要詞的預測權重的和作為損失進行計算,但這種損失更適合只有單一關鍵字的情況使用。
模型最終是以小數的形式輸出每個term weight,例如[「上海」、「的」、「迪士尼」]的term weight結果為[0.3433,0.1218,0.5349]。
該模型是為搜尋服務的,有嚴格的反應速度要求。由於BERT模型整體比較大,在推理部分很難達到反應速度要求,因此類似於類目辨識模型,我們對訓練好的BERT模型進行進一步的蒸餾處理,以達到符合線上的要求。在這個專案中,透過少數幾層transformer去擬合BERT-base 12層transformer的效果,最後以損失可以接受的一部分性能的情況下,使得模型整體的推理速度快了10倍左右。最終,Term Weighting線上服務整體的95線可以達到2ms左右。
採用深度學習後,旅遊搜尋對於較為罕見的長尾搜尋字詞,詞義解析能力有了較大的提升。在目前的線上真實搜尋場景,深度學習方法一般選擇與傳統的搜尋詞義解析方法結合,這樣既可以確保頭部常見搜尋字詞的效能穩定,又可以加強泛化能力。
未來,搜尋詞義解析致力於為用戶帶來更好的搜尋體驗,隨著硬體技術和AI技術的更新換代,高效能運算和智慧運算越來越成熟,搜尋詞義解析的意圖識別和Term Weighting未來會往更高效能的目標發展。此外,更大規模的預訓練模型和旅遊領域的預訓練模型有助於進一步提升模型的準確率和召回率,更多用戶資訊和知識的引入有助於提升意圖識別的效果,線上用戶的回饋和模型迭代有助於提升Term Weighting的效果。這些都是我們後續會嘗試的方向。
除了意圖辨識和Term Weighting之外,搜尋的其他功能,例如詞性標註、糾錯等,在滿足反應速度要求的前提下未來也可以採用深度學習技術,來實現更強大的功能和更優秀的效果。
以上是深度學習在攜程搜尋詞義解析中的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!