引言
2018年12月31日,美團酒店單日入住間夜突破200萬,再次創下行業的新紀錄,而酒店搜尋在其中起到了非常重要的作用。本文會首先介紹一下酒店搜尋的業務特點,作為O2O搜尋的一種,酒店搜尋和傳統的搜尋排序相比存在很大的不同。第二部分介紹深度學習在酒店搜尋NLP中的應用。第三部分會介紹深度排序模型在酒店搜尋的演進路線,因為酒店業務的特點和歷史原因,美團酒店搜尋的模型演進路線可能跟大部分公司都不太一樣。最後一部分是總結。
酒店搜尋的業務特點
美團的使命是幫大家“Eat Better,Live Better”,所做的事情就是連線人與服務。使用者在美團平臺可以找到他們所需要的服務,商家在美團可以售賣自己提供的服務,而搜尋在其中扮演的角色就是“聯結器”。大部分使用者通過美團App找酒店是從搜尋開始的,搜尋貢獻了大部分的訂單,是最大的流量入口。在美團首頁點選 “酒店住宿”圖示,就會進入上圖右側的搜尋入口,使用者可以選擇城市和入住時間併發起搜尋。
酒店搜尋技術團隊的工作不僅有搜尋排序,還有查詢引導、推薦等工作,查詢引導如搜尋智慧提示、查詢糾錯等。之所以還有推薦的工作,是因為很多使用者在發起搜尋時不帶查詢詞,本質上屬於推薦,此外還有特定場景下針對少無結果的推薦等。本文主要介紹搜尋排序這方面的工作。
不同搜尋對比
現在,大家對搜尋都很熟悉,常見的有網頁搜尋,比如Google、百度、搜狗等;商品搜尋,像天貓、淘寶、京東等;還有就是O2O(Online To Offline)的搜尋,典型的就是酒店的搜尋。雖然都是搜尋,但是使用者使用搜尋的目的並不相同,包括找資訊、找商品、找服務等等,不同搜尋之間也存在很大的差別。
上圖對不同搜尋進行了簡單對比,可以從5個維度展開。首先是目標維度。因為使用者是來找資訊,網頁搜尋重點是保證查詢結果和使用者意圖的相關性,而在商品搜尋和酒店搜尋中,使用者的主要目的是查詢商品或服務,最終達成交易,目標上有較大區別。使用者使用不同搜尋的目的不同,從而導致不同搜尋對個性化程度的要求不同。交易屬性的搜尋,包括商品搜尋和酒店搜尋,對個性化程度的要求都比較高,因為不同使用者的消費水平不同,偏好也不一樣。
在技術層面上,也存在很多不同點。網頁搜尋會索引全網的資料,這些資料不是它自己生產,資料來源非常多樣,包括新聞、下載頁、視訊頁、音樂頁等各種不同的形態,所以整個資料是非結構化的,差異也很大。這意味著網頁搜尋需要擁有兩種技術能力,資料抓取能力和資料解析能力,它們需要抓取網頁並解析形成結構化資料。在這個層面上,酒店搜尋和商品搜尋相對就“幸福”一些,因為資料都是商家提交的結構化資料,相對來說更加規範。
此外,酒店作為一種O2O的服務,使用者線上上(Online)下單,最終需要到線下(Offline)去消費,所以就有一個位置上的約束,而位置的約束也就導致出現供給側的約束,供給只能在某個特定位置附近。比如北京大學方圓幾公里之內的酒店。這兩點約束在網頁搜尋和商品搜尋中就不用考慮,網頁可以無限次的進行閱讀。商品搜尋得益於快遞業的快速發展,在北京也可以買到來自浙江的商品,供給側的約束比較小。
介紹完不同搜尋產品的特點,接下來看不同搜尋產品的優化目標。通用搜尋的優化目標是相關性,評價指標是DCG、NDCG、MAP等這些指標,要求查詢結果和使用者意圖相關。對商品搜尋來說,不同電商平臺的優化目標不太一樣,有的目標是最大化GMV,有的目標是最大化點選率,這些在技術上都可以實現。
而對酒店搜尋而言,因為它屬於O2O的業務形態,線上下單,線下消費,這就要求搜尋結果必須和使用者的查詢意圖“強相關”。這個“強相關”包括兩層含義,顯性相關和隱性相關。舉個例子,使用者搜尋“北京大學”,那麼他的訴求很明確,就是要找“北京大學”附近的酒店,這種屬於使用者明確告訴平臺自己的位置訴求。但是,如果使用者在本地搜尋“七天”,即使使用者沒有明確說明酒店的具體位置,我們也知道,使用者可能想找的是距離自己比較近的“七天酒店”,這時候就需要建模使用者的隱性位置訴求。
美團是一個交易平臺,大部分使用者使用美團是為了達成交易,所以要優化使用者的購買體驗。刻畫使用者購買體驗的核心業務指標是訪購率,用來描述使用者在美團是否順暢的完成了購買,需要優化訪購率這個指標。總結一下,酒店搜尋不僅要解決相關性,儘量優化使用者購買體驗、優化訪購率等指標,同時還要照顧到業務訴求。
根據上面的分析,酒店搜尋的整個搜尋框架就可以拆分成三大模組:檢索、排序以及業務規則。檢索層包括查詢理解和召回兩部分,主要解決相關性問題。查詢理解做的事情就是理解使用者意圖,召回根據使用者意圖來召回相關的酒店,兩者強耦合,需要放在一起。檢索的核心是語義理解,比如使用者搜尋“北京大學”,平臺就知道使用者想找的是“北京大學附近的酒店”,所以這個模組的優化方式是問題驅動,不斷地發現問題、解決問題來進行迭代。
接下來,從檢索模組檢索出來的酒店都已經是滿足使用者需求的酒店了。還是上面“北京大學”的那個例子,檢索模組已經檢索出來幾百家“北京大學”附近的酒店,這些都是和使用者的查詢詞“北京大學”相關的,怎麼把使用者最有可能購買的酒店排到前面呢?這就是排序模組要做的事情。
排序模組使用機器學習和深度學習的技術提供“千人千面”的排序結果,如果是經常預定經濟連鎖型酒店的使用者,排序模組就把經濟連鎖型酒店排到前面。針對消費水平比較高,對酒店要求比較高的使用者,排序模組就把高檔酒店排到前面,對每個使用者都可以做到個性化定製。排序屬於典型的技術驅動模組,優化目標是訪購率,用這個技術指標驅動技術團隊不斷進行迭代和優化。
最後是業務層面,比如有些商家會在美團上刷單作弊,針對這些商家需要做降權處理。
整體框架
上圖是搜尋的整體框架,這裡詳細描述下呼叫過程:
搜尋API負責接收使用者的查詢詞併傳送給搜尋控制中心。
控制中心把接收到的查詢請求傳送到檢索與意圖模組,搜尋詞會先經過查詢分析模組做使用者的查詢意圖分析,分析完之後,會把使用者的查詢意圖分析結果傳回去給業務檢索模組,業務檢索模組根據意圖識別結果形成查詢條件,然後去基礎檢索端查詢結果。
基礎檢索訪問索引得到查詢結果後,再把結果返回給上層。
業務檢索模組獲取基礎的檢索結果後,會呼叫一些外部服務如房態服務過濾一些滿房的酒店,再把結果返回給控制中心。
此時,控制中心得到的都是和使用者查詢意圖強相關的結果,這時就需要利用機器學習技術做排序。通過預測模組對每個酒店做訪購率預測,控制中心獲取預測模組的排序結果後,再根據業務邏輯做一些調整,最終返回結果給搜尋API。
可以看到,模組劃分和前文描述的思想一致,檢索模組主要解決使用者意圖識別和召回問題,也就是解決相關性。預測模組做訪購率預測,業務邏輯放在搜尋控制中心實現。接下來會介紹一下意圖理解和排序模組中涉及的一些深度學習技術。
先來看下查詢理解的問題,這個模組通過資料分析和Case分析,不斷的發現問題、解決問題來迭代優化。之前的評測發現少無結果的原因,主要包括以下幾種:
地標詞:比如使用者搜尋“望京國際研發園”,但是後臺沒有一家酒店包含“望京國際研發園”這幾個字,其實使用者想找的是望京國際研發園附近的酒店。
結構化查詢:比如芍藥居附近7天,酒店描述資訊中沒有“附近”這個詞,搜尋體驗就比較差。這種需要對查詢詞做成分識別,丟掉不重要的詞,並且對不用類別的Term走不同的檢索域。
異地查詢:使用者在北京搜尋“大雁塔”沒有結果,其實使用者的真實意圖是西安大雁塔附近的酒店,這種需要做異地需求識別並進行異地跳轉。
同義詞:在北京搜尋“一中”和搜尋“北京第一中學”,其實都是同一個意思,需要挖掘同義詞。
針對這幾類問題,我們分別作了以下工作:
針對地標詞問題,提供地標意圖識別和地標策略,把地標類別的查詢詞改成按經緯度進行畫圈檢索。
針對結構化查詢的問題,我們對查詢詞做了成分識別,設計了少無結果時的多級檢索架構。
針對異地查詢的問題,做異地意圖識別和異地的跳轉引導。
針對語義查詢的問題,做同義詞和查詢改寫。
這裡的每一個模組都用到了機器學習和深度學習的技術,本文挑選兩個酒店搜尋中比較特殊的問題進行介紹。
地標問題是O2O搜尋的一個典型問題,在網頁搜尋和商品搜尋中都較少出現此類問題。當使用者搜尋類似“望京國際研發園”這種查詢詞的時候,因為搜尋的相關性是根據文字計算的,需要酒店描述中有相關文字,如果酒店的描述資訊中沒有這個詞,那就檢索不出來。比如昆泰酒店,雖然就在望京國際研發園旁邊,但是它的描述資訊中並沒有出現“望京國際研發園”,所以就無法檢索出來,這會導致使用者體驗較差。
經過分析,我們發現有一類查詢詞是針對特定地點的搜尋,使用者的訴求是找特定地點附近的酒店,這種情況下走文字匹配大概率是沒有結果的。這個問題的解法是針對這種型別的查詢詞,從“文字匹配”改成“座標匹配”,首先分析查詢詞是不是有地標意圖,如果是的話就不走文字匹配了,改走座標匹配,檢索出來這個座標附近的酒店就可以了。這時就產生了兩個問題:第一,怎麼確定哪些查詢詞有地標意圖;第二,怎麼獲取經緯度資訊。
針對這個問題,我們做了地標策略,步驟如下:
多渠道獲取可能包含地標詞的候選集,這些候選集包括使用者少無結果的查詢詞,以及一些酒店提供的描述資訊。
對候選集合進行命名實體識別(NER,Named Entity Recognition),可以得到各個命名實體的型別,標識為“地標”型別的就是疑似地標詞。
把疑似地標詞放到美團地圖服務中獲取經緯度,經過人工校驗無誤後,存入線上資料庫中;線上來查詢請求時,先會去匹配精準地標庫,如果匹配成功,說明這個查詢詞是地標意圖,這時就不走文字檢索了,直接在意圖服務層走經緯度檢索。
經過人工校驗的精準地標庫補充到NER模型的訓練資料中,持續優化NER模型。
這裡提到了NER模型,下面對它做一下詳細的介紹。
NER是命名實體識別,是機器學習中的序列標註問題,比如輸入“北大附近的七天”,就會標註出來每個詞的成分,這裡“北大”是地標,“七天”是酒店品牌。這裡的類別是根據業務特點自己定義的,酒店業務中有地標、品牌、商圈等不同的類別。與分類問題相比,序列標註問題中當前的預測標籤不僅與當前的輸入特徵相關,還與前後的預測標籤相關,即預測標籤序列之間有強相互依賴關係。
解決序列標註問題的經典模型是CRF(Conditional Random Field,條件隨機場),也是我們剛開始嘗試的模型。條件隨機場可以看做是邏輯迴歸的序列化版本,邏輯迴歸是用於分類的對數線性模型,條件隨機場是用於序列化標註的對數線性模型,可以看做是考慮了上下文的分類模型。
機器學習問題的求解就是“資料+模型+特徵”,資料方面先根據業務特點定義了幾種實體類別,然後通過“人工+規則”的方法標註了一批資料。特徵方面提取了包括詞性、Term文字特徵等,還定義了一些特徵模板,特徵模板是CRF中人工定義的一些二值函式,通過這些二值函式,可以挖掘命名實體內部以及上下文的構成特點。標註資料、模型、特徵都有了,就可以訓練CRF模型,這是線上NER問題的第一版模型。
隨著深度學習的發展,用Word Embedding詞向量作為輸入,疊加神經網路單元的方法漸漸成為NLP領域新的研究方向。基於雙向LSTM(Long Short-Term Memory)+CRF的方法成為NER的主流方法,這種方法採用雙向LSTM單元作為特徵提取器替代原有的人工特徵,不需要專門的領域知識,框架也通用。Embedding輸入也有多種形式,可以是詞向量,可以是字向量,也可以是字向量和詞向量的拼接。
我們嘗試了雙向LSTM+CRF,並在實際應用中做了些改動:由於在CRF階段已經積累了一批人工特徵,實驗發現把這些特徵加上效果更好。加了人工特徵的雙向LSTM+CRF是酒店搜尋NER問題的主模型。
當然,針對LSTM+CRF的方法已經有了很多的改進,比如還有一種NER的方法是融合CNN+LSTM+CRF,主要改進點是多了一個CNN模組來提取字級別的特徵。CNN的輸入是字級別的Embedding,通過卷積和池化等操作來提取字級別的特徵,然後和詞的Embedding拼接起來放入LSTM。這種方法在兩個公開資料集上面取得了最好的結果,也是未來嘗試的方向之一。
為了解決少無結果的問題,我們設計了多級檢索架構,如上圖所示,主要分4個層次:基本檢索、二次檢索、核心詞檢索和異地檢索。
基本檢索會根據查詢詞的意圖選擇特定的檢索策略,比如地標意圖走經緯度檢索,品牌意圖只檢索品牌域和商家名。
基本檢索少無結果會進行二次檢索,二次檢索也是分意圖的,不同意圖型別會有不同的檢索策略,地標意圖是經緯度檢索的,二次檢索的時候就需要擴大檢索半徑;品牌意圖的查詢詞,因為很多品牌在一些城市沒有開店,比如香格里拉在很多小城市並沒有開店,這時比較好的做法,是推薦給使用者該城市最好的酒店。
如果還是少無結果,會走核心詞檢索,只保留核心詞檢索一遍。丟掉非核心詞有多種方式,一種是刪除一些運營定義的無意義詞,一種是保留NER模型識別出來的主要實體型別。此外還有一個TermWeight的模型,對每個詞都有一個重要性的權重,可以把一些不重要的詞丟掉。
在還沒有結果的情況下,會選擇”異地+全國“檢索,即更換城市或者在全國範圍內進行檢索。
多級檢索架構上線後,線上的無結果率就大幅度降低了。
排序
排序其實是一個典型的技術問題,業界應用比較廣泛的有廣告排序和推薦排序,廣告排序比如Google和百度的關鍵字廣告排序,今日頭條、騰訊的展示廣告排序。推薦排序比如快手、抖音這些短視訊平臺,以及各大App、瀏覽器的資訊流。廣告排序和推薦排序優化的目標都是點選率,技術棧也比較相似,包括LR/FTRL、FM/FFM、GBDT、DNN等模型。
跟以上兩種排序應用相比,酒店排序有自己的業務特點,因為美團酒店具有LBS屬性和交易屬性,天生自帶很多連續特徵,如酒店價格、酒店評分、酒店離使用者的距離等,這些連續特徵是決定使用者購買行為的最重要因素。優化目標也不一樣,大部分場景下酒店搜尋的優化目標是訪購率,部分場景下優化目標是點選率。在技術層面,酒店排序整體的技術棧和廣告、推薦比較相似,都可以使用LR/FTRL、FM/FFM、GBDT、DNN等模型。
面臨的挑戰
具體到酒店排序工作,我們面臨一些不一樣的挑戰,主要包括以下4點:
資料稀疏。住酒店本身是一種低頻行為,大部分使用者一年也就住一兩次,導致很多特徵的覆蓋率比較低。
業務眾多。美團酒店包括國內酒店業務、境外酒店業務,以及長租、鐘點房等業務,同時有美團和點評兩個不同的App。
場景複雜。按照使用者的位置可以分成本地和異地,按照使用者的訴求可以分成商務、旅遊、本地休閒等幾大類,這些使用者之間差異很明顯。比如商務使用者會有大量復購行為,典型例子是美團員工的出差場景,美團在上海和北京各有一個總部,如果美團的同學去上海出差,大概率會在公司差旅標準內選一家離公司近的酒店,從而會在同一家酒店產生大量的復購行為;但是如果是一個旅遊使用者,他就很少反覆去同一個地方。
供給約束。酒店行業供給的變化很快,一個酒店只有那麼多房間,一天能提供的間夜量是固定的,全部訂出的話,使用者提價也不會提供新的房間,這種情況在勞動節、國慶這種節假日特別明顯。
上圖右側是排序的整體架構圖,分為線下、線上和近線上三個部分。線上下部分,主要做離線的模型調優和評估,線上部分做預測。這裡比較特別的是近線上部分,我們在實時層面做了大量的工作,包括使用者的實時行為、酒店實時價格、實時庫存等等,以應對供給變化快的特點。
這裡介紹一個業務特點導致的比較獨特的問題:模型切分。美團酒店有很多業務場景,包括國內酒店、境外酒店、長租、鐘點房等;還有兩個App,美團App和大眾點評App;還有搜尋和篩選兩種場景,搜尋帶查詢詞,篩選沒有查詢詞,兩種場景差異較大;從地理位置維度,還可以分成本地和異地兩種場景。
面對這麼多的業務場景,第一個問題就是模型怎麼設計,是用統一的大模型,還是分成很多不同的小模型?我們可以用一個大模型Cover所有的場景,用特徵來區分不同場景的差異,好處是統一模型維護和優化成本低。也可以劃分很多小模型,這裡有一個比較好的比喻,多個專科專家會診,勝過一個全科醫生。切分模型後,可以避免差異較大的業務之間互相影響,也方便對特殊場景進行專門的優化。
在模型切分上,主要考慮三個因素:
第一,業務之間的差異性。比如長租和境外差異很大,國內酒店和境外業務差異也很大,這種需要拆分。
第二,細分後的資料量。場景分的越細,資料量就越小,會導致兩個問題,一是特徵的覆蓋率進一步降低;二是資料量變小後,不利於後續的模型迭代,一些複雜模型對資料量有很高的要求。我們做過嘗試,國內酒店場景下,美團和大眾點評兩個App資料量都很大,而且使用者也很不一樣,所以做了模型拆分;但是境外酒店,因為本身是新業務資料量較小,就沒有再進行細分。
第三,一切以線上指標為準。我們會做大量的實驗,看當前資料量下怎麼拆分效果更好,比如美團App的國內酒店,我們發現把搜尋和篩選拆開後,效果更好;篩選因為資料量特別大,拆分成本、異地效果也更好,但是如果搜尋場景拆分成本地、異地模型就沒有額外收益了。最終,一切都要以線上的實際表現為準。
模型演進
接下來介紹一下排序模型的演進過程,因為業務特點及歷史原因,酒店搜尋的排序模型走了一條不一樣的演進路線。大家可以看業界其他公司點選率模型的演進,很多都是從LR/FTRL開始,然後進化到FM/FFM,或者用GBDT+LR搞定特徵組合,然後開始Wide&Deep。
酒店搜尋的演進就不太一樣。酒店業務天生自帶大量連續特徵,如酒店價格、酒店和使用者的距離、酒店評分等,因此初始階段使用了對連續特徵比較友好的樹模型。在探索深度排序模型的時候,因為已經有了大量優化過的連續特徵,導致我們的整個思路也不太一樣,主要是借鑑一些模型的思想,結合業務特點做嘗試,下面逐一進行介紹。
初始階段線上使用的模型是XGB(XGBOOST, eXtreme Gradient Boosting)。作為GBDT的改進,XGB實現了非線性和自動的特徵組合。樹節點的分裂其實就實現了非線性,樹的層次結構實現了不同特徵的自動組合,而且樹模型對特徵的包容性非常好,樹的分裂通過判斷相對大小來實現,不需要對特徵做特殊處理,適合連續特徵。
樹模型的這些特點確實很適合酒店這種連續特徵多的場景,至今為止,XGB都是資料量較小場景下的主模型。但是樹模型優化到後期遇到了瓶頸,比如特徵工程收益變小、增大資料量沒有額外收益等,此外樹模型不適合做線上學習的問題愈發嚴重。酒店使用者在勞動節、國慶節等節假日行為有較大不同,這時需要快速更新模型,我們嘗試過只更新最後幾棵樹的做法,效果不佳。考慮到未來進一步的業務發展,有必要做模型升級。
模型探索的原則是從簡單到複雜,逐步積累經驗,所以首先嚐試了結構比較簡單的MLP(Multiple-Layer Perception)多層感知機,也就是全連線神經網路。神經網路是一種比樹模型“天花板”更高的模型,“天花板”更高兩層意思:第一層意思,可以優化提升的空間更大,比如可以進行線上學習,可以做多目標學習;第二層意思,模型的容量更大,“胃口”更大,可以“吃下”更多資料。此外它的表達能力也更強,可以擬合任何函式,網路結構和引數可以調整的空間也更大。但是它的優點同時也是它的缺點,因為它的網路結構、引數等可以調整的空間更大,神經網需要做很多的引數和網路結構層面的調整。
上圖是MLP的網路結構圖,包含輸入層、若干個隱藏層、輸出層。在很長一段時間內,在特徵相同的情況下,MLP效果不如XGB,所以有段時間線上使用的是XGB和MLP的融合模型。後來經過大量的網路結構調整和引數調整,調參經驗越來越豐富,MLP才逐步超越XGB。這裡額外說明一下,酒店搜尋中有少量的ID類特徵,在第一版MLP裡ID類特徵是直接當做連續特徵處理的。比如城市ID,ID的序關係有一定的物理意義,大城市ID普遍較小,小城市開城晚一些,ID較大。
在MLP階段我們對網路結構做了大量實驗,嘗試過三種網路結構:平行結構、菱形結構、金字塔結構。在很多論文中提到三者相比平行結構效果最好,但是因為酒店搜尋的資料不太一樣,實驗發現金字塔結構效果最好,即上圖最右邊的“1024-512-256”的網路結構。同時還實驗了不同網路層數對效果的影響,實驗發現3-6層的網路效果較好,更深的網路沒有額外收益而且線上響應時間會變慢,後面各種模型探索都是基於3到6層的金字塔網路結構進行嘗試。
MLP上線之後,我們開始思考接下來的探索方向。在樹模型階段,酒店搜尋組就在連續特徵上做了很多探索,連續特徵方面很難有比較大的提升空間;同時業界的研究重點也放在離散特徵方面,所以離散特徵應該是下一步的重點方向。
深度排序模型對離散特徵的處理有兩大類方法,一類是對離散特徵做Embedding,這樣離散特徵就可以表示成連續的向量放到神經網路中去,另一類是Wide&Deep,把離散特徵直接加到Wide側。我們先嚐試了第一種,即對離散特徵做Embedding的方法,借鑑的是FNN的思想。其實離散特徵做Embedding的想法很早就出現了,FM就是把離散特徵表示成K維向量,通過把高維離散特徵表示成低維向量增加模型泛化能力。
實際使用中,我們稍微做了一些改動,實驗中發現使用FM預訓練的效率不高,所以嘗試了不做預訓練直接把Embedding隨機初始化,然後讓Embedding跟隨網路一起學習,實驗結果發現比FM預訓練效果還要好一點。最後的做法是沒有用FM做預訓練,讓Embedding隨機初始化並隨網路學習,上圖是線上的V3模型。
FNN的成功上線證明離散特徵Embedding這個方向值得深挖,所以我們接著實驗了DeepFM。DeepFM相對於Wide&Deep的改進,非常類似於FM相對LR的改進,都認為LR部分的人工組合特徵是個耗時耗力的事情,而FM模組可以通過向量內積的方式直接求出二階組合特徵。DeepFM使用FM替換了Wide&Deep中的LR,離散特徵的Embedding同時“喂”給神經網和FM,這部分Embedding是共享的,Embedding在網路的優化過程中自動學習,不需要做預訓練,同時FM Layer包含了一階特徵和二階的組合特徵,表達能力更強。我們嘗試了DeepFM,線下有提升線上波動提升,並沒有達到上線的標準,最終沒有全量。
儘管DeepFM沒有成功上線,但這並沒有動搖我們對Embedding的信心,接下來嘗試了PNN。PNN的網路重點在Product上面,在點選率預估中,認為特徵之間的關係更多是一種And“且”的關係, 而非Add“加”的關係,例如性別為男且用華為手機的人,他定酒店時屬於商務出行場景的概率更高。
PNN使用了Product Layer進行顯式的二階特徵組合。上圖右邊是PNN的網路結構圖,依然對離散特徵做Embedding,Embedding向量同時送往隱層和Product層,Product通過內積或者外積的方式,對特徵做顯式的二階交叉,之後再送入神經網的隱層,這樣可以做到顯式的二階組合和隱式的高階特徵組合。特徵交叉基於乘法的運算實現,有兩種方式:內積和外積。我們嘗試了內積的方式,線下略有提升線上也是波動提升,沒有達到上線標準,所以最終也沒有全量上線。
PNN之後我們認為Embedding還可以再嘗試一下,於是又嘗試了DCN(Deep&Cross Network)。DCN引入了一個Cross Network進行顯式的高階特徵交叉。上圖右邊是論文中的圖,可以看到Deep&Cross中用了兩種網路,Deep網路和Cross網路,兩種網路並行,輸入都一樣,在最後一層再Stack到一起。
Deep網路和前面幾種網路一樣,包括連續特徵和離散特徵的Embedding,Cross網路是DCN的特色,在Cross網路裡面,通過巧妙的設計實現了特徵之間的顯式高階交叉。看上圖左下角的Cross結構示意,這裡的x是每一層的輸入,也就是上一層的輸出。Feature Crossing部分包括了原始輸入x0、本層輸入x的轉置、權重w三項,三項相乘其實就做了本層輸入和原始輸入的特徵交叉,x1就包含了二階的交叉資訊,x2就包含了三階的交叉資訊,就可以通過控制Cross的層數顯式控制交叉的階數。
不得不說,DCN在理論上很漂亮,我們也嘗試了一下。但是很可惜,線下有提升線上波動提升,依然未能達到上線的標準,最終未能全量上線。
經過DeepFM、PNN、DCN的洗禮,促使我們開始反思,為什麼在學術上特別有效的模型,反而在酒店搜尋場景下不能全量上線呢?它們線上下都有提升,線上上也有提升,但是線上提升較小且有波動。
經過認真分析我們發現可能有兩個原因:第一,連續特徵的影響,XGB時代嘗試了600多種連續特徵,實際線上使用的連續特徵接近400種,這部分特徵太強了; 第二,離散特徵太少,離散特徵只有百萬級別,但是Embedding特別適合離散特徵多的情況。接下來方向就很明確了:補離散特徵的課。
最終,我們還是把目光轉回Wide&Deep。Wide&Deep同時訓練一個Wide側的線性模型和一個Deep側的神經網路,Wide部分提供了記憶能力,關注使用者有過的歷史行為,Deep部分提供了泛化能力,關注一些沒有歷史行為的Item。之前的工作主要集中在Deep測,對低階特徵的表達存在缺失,所以我們新增了LR模組以增加對低階特徵的表達,Deep部分和之前的V3一樣。剛開始只用了少量的ID類特徵,效果一般,後來加了大量人工的交叉特徵,特徵維度達到了億級別後效果才得到很好的提升。下圖是我們的V4模型:
接下來介紹一下優化目標的迭代過程(後面講MTL會涉及這部分內容)。酒店搜尋的業務目標是優化使用者的購買體驗,模型的優化指標是使用者的真實消費率,怎麼優化這個目標呢? 通過分析使用者的行為路徑可以把使用者的行為拆解成“展示->點選->下單->支付->消費”等5個環節,這其中每個環節都可能存在使用者流失,比如有些使用者支付完成後,因為部分商家確認比較慢,使用者等不及就取消了。
剛開始我們採用了方案1,對每一個環節建模(真實消費率=使用者點選率×下單率×支付率×消費率)。優點是非常簡單直接且符合邏輯,每個模組分工明確,容易確認問題出在哪裡。缺點也很明顯,首先是特徵重複,4個模型在使用者維度和商家維度的特徵全部一樣,其次模型之間是相乘關係且層數過多,容易導致誤差逐層傳遞,此外4個模型也增加了運維成本。後來慢慢進化到了方案2的“End to End”方式,直接預測使用者的真實消費率,這時只需要把正樣本設定為實際消費的樣本,一個模型就夠了,開發和運維成本較小,模型間特徵也可以複用,缺點就是鏈路比較長,上線時經常遇到AB測抖動問題。
模型切換到神經網路後就可以做多工學習了,之前樹模型時代只預測“End to End”真實訪購率,神經網路則可以通過多工學習同時預測CTR展示點選率和CVR點選消費率。多工學習通過硬共享的方式同時訓練兩個網路,特徵、Embedding層、隱層引數都是共享的,只在輸出層區分不同的任務。上圖是酒店搜尋當前線上的模型,基於Wide&Deep做的多工學習。
網路結構演進路線
上圖是酒店搜尋排序的深度排序模型演進路線,從MLP開始,通過對離散特徵做Embedding進化到FNN,中間嘗試過DeepFM、PNN、DCN等模型,後來加入了Wide層進化到Wide&Deep,現在的版本是一個MTL版的Wide&Deep,每個模組都是累加上去的。
除了上面提到的模型,我們還探索過這個:
這是我們自己設計的混合網路,它融合了FNN、DeepFM、PNN、DCN、Wide&Deep等不同網路的優點,同時實現了一階特徵、顯式二階特徵組合、顯式高階特徵組合、隱式高階特徵組合等,有興趣的同學可以嘗試一下。
不同模型實驗結果
上圖是不同模型的實驗結果,這裡的BP是基點(Basis Point),1BP=0.01%。XGB是Baseline,MLP經過很長時間的除錯才超過XGB,MLP和XGB融合模型的效果也很好,不過為了方便維護,最終還是用FNN替換了融合模型。Wide&Deep在開始階段,提升並沒有特別多,後來加了組合特徵後效果才好起來。我們Embedding上面的嘗試,包括DeepFM、Deep&Cross等,線下都有提升,線上波動有提升,但是未能達到上線的標準,最終未能全量。
在特徵預處理方面對連續特徵嘗試了累計分佈歸一化、標準化,以及手工變換如根號變換、對數變換等;累積分佈歸一化其實就是做特徵分桶,因為連續特徵多且分佈範圍很廣,累積分佈歸一化對酒店搜尋的場景比較有效。
離散特徵方面嘗試了特徵Embedding及離散特徵交叉組合,分別對應FNN和 Wide&Deep。這裡特別提一下缺失值引數化,因為酒店業務是一種低頻業務,特徵覆蓋率低,大量樣本存在特徵缺失的情況,如果對缺失特徵學一個權重,非缺失值學一個權重效果較好。
引數調優方面分別嘗試了啟用函式、優化器等。啟用函式嘗試過Sigmoid、ReLU、Leaky_ReLU、ELU等;優化器也實驗過Adagrad、Rmsprop、Adam等;從實驗效果看,啟用函式ReLU+Adam效果最好。剛開始時,加了Batch Normalization層和Dropout層,後來發現去掉後效果更好,可能和酒店搜尋的資料量及資料特點有關。網路結構和隱層數方面用的是3到6層的金字塔網路。學習率方面的經驗是學習率小點比較好,但是會導致訓練變慢,需要找到一個平衡點。
下面介紹深度排序模型線上Serving架構的演化過程,初始階段組內同學各自探索,用過各種開源工具如Keras、TensorFlow等,線上分別自己實現,預測程式碼和其他程式碼都放一起,維護困難且無法複用。
後來組內決定一起探索,大家統一使用TensorFlow,線上用TF-Serving,線上線下可以做到無縫銜接,預測程式碼和特徵模組也解耦了。現在則全面轉向MLX平臺,MLX是美團自研的超大規模機器學習平臺,專為搜尋、推薦、廣告等排序問題定製,支援百億級特徵和流式更新,有完善的線上Serving架構,極大地解放了演算法同學的生產力。
最後介紹一下我們對搜尋排序技術節奏的一些理解,簡單來說就是在不同階段做不同的事情。
在上圖中,橫軸表示技術深度,越往右技術難度越大,人力投入越大,對人的要求也越高。縱軸是業務階段。業務階段對技術的影響包括兩方面,資料量和業務價值。資料量的大小,可以決定該做什麼事情,因為有些技術在資料量小的時候意義不大;業務價值就更不用說了,業務價值越大越值得“重兵投入”。
起步階段:起步階段,還沒有資料,這時候做簡單排序就好,比如純按價格排序或者距離排序,目的是讓整個流程快速地跑起來,能提供最基本的服務。比如2017年,美團的長租業務當時就處於起步階段。
業務初期:隨著業務的發展,就進入了業務發展初期,訂單數慢慢增長,也有了一些資料,這時候可以增加一些啟發式規則或者簡單的線性模型,檢索模型也可以加上。但是由於資料量還比較小,沒必要部署很複雜的模型。
穩定成長期:業務進一步發展後,就進入了穩定成長期,這時候訂單量已經很大了,資料量也非常大了,這段時間是“補課”的時候,可以把意圖理解的模組加上,排序模型也會進化到非線性模型比如XGB,會做大量的特徵工程,實時特徵以及實時模型,在這個階段特徵工程收益巨大。
技術瓶頸期:這個階段的特點是基本的東西都已經做完了,在原有的技術框架下效果提升變的困難。這時需要做升級,比如將傳統語義模型升級成深度語義模型,開始嘗試深度排序模型,並且開始探索強化學習、多模型融合、多目標學習等。
中國有句俗話叫“殺雞焉用牛刀”,比喻辦小事情,何必花費大力氣,也就是不要小題大做。其實做技術也一樣,不同業務階段不同資料量適合用不同的技術方案,沒有必要過度追求先進的技術和高大上的模型,根據業務特點和業務階段選擇最匹配的技術方案才是最好的。我們認為,沒有最好的模型,只有合適的場景。
總結
酒店搜尋作為O2O搜尋的一種,和傳統的搜尋排序相比有很多不同之處,既要解決搜尋的相關性問題,又要提供“千人千面”的排序結果,優化使用者購買體驗,還要滿足業務需求。通過合理的模組劃分可以把這三大類問題解耦,檢索、排序、業務三個技術模組各司其職。在檢索和意圖理解層面,我們做了地標策略、NER模型和多級檢索架構來保證查詢結果的相關性;排序模型上結合酒店搜尋的業務特點,借鑑業界先進思想,嘗試了多種不同的深度排序模型,走出了一條不一樣的模型演進路線。同時通過控制技術節奏,整體把握不同業務的技術選型和迭代節奏,對不同階段的業務匹配不同的技術方案,只選對的,不選貴的。
參考文獻
[1] John Lafferty et al. Conditional random fields: Probabilistic models for segmenting and labeling sequence data.ICML2001. [2] Guillaume Lample et al Neural architectures for named entity recognition. NAACL2016. [3] Zhiheng Huang, Wei Xu, and Kai Yu. 2015. [4] Bidirectional LSTM-CRF models for sequence tagging. arXiv preprint arXiv:1508.01991. [5] Xuezhe Ma et al.End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF.ACL2016. [6] T Chen, C Guestrin. XGBoost: A scalable tree boosting system. KDD2016. [7] Weinan Zhang et al. Deep Learning over Multi-Field Categorical Data: A Case Study on User Response Prediction. ECIR 2016. [8] Huifeng Guo et al. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction. IJCAI2017. [9] Yanru Qu et al. Product-based neural networks for user response prediction. ICDM2016. [10] Heng-Tze Cheng et al. 2016. Wide & deep learning for recommender systems. 2016.In Proceedings of the 1st Workshop on Deep Learning for Recommender Systems. [11] Ruoxi Wang et al. Deep & Cross Network for Ad Click Predictions. ADKDD2017.
作者簡介
藝濤,美團高階技術專家,2016年加入美團,現負責美團酒店業務搜尋排序技術。2010年畢業於中科院計算所,曾在網易有道等公司工作,先後從事網頁搜尋、購物搜尋、計算廣告等方向的研發工作。曾榮獲“Kaggle衛星影像分類大賽”亞軍,QCon明星講師。