導讀:58本地生活搜尋推薦場景具有同質化、人群結構複雜、決策週期複雜,以及多行業、多場景、多種類、多目標的特點。針對以上特點,58本地服務提出了針對性的解決方案。本次分享內容為58本地生活搜推演算法的演進。
今天的介紹會圍繞下面四點展開:
- 58本地服務推薦場景與特點
- 58本地服務標籤推薦演進
- 58本地服務帖子推薦演進
- 未來展望
01
58本地服務推薦場景與特點
首先和大家分享下58本地服務推薦場景。
本地服務涉及的行業種類特別多,目前涵蓋了200多個行業,它們各自有各自的特點,可以分為長週期和短週期、重決策和輕決策等。此外,由於行業類目特別多,導致使用者很難找到自己想要的東西,使得本地服務的使用者觸達較難。
58 app大致有四類推薦場景。首先,首頁包含大類目推薦。點開大類目後進入大類頁。大類頁中包含二級類目的推薦和熱門帖子、熱門服務的推薦以及標籤推薦。在點選進入具體帖子後會進入詳情頁,詳情頁下方有相關服務和商家的推薦。
我們的推薦場景具有以下一些特點:
- 資訊同質化:很多帖子區分度較差,資訊堆疊比較嚴重;
- 人群結構複雜:存在未登入使用者、新使用者、低活使用者等;
- 決策週期問題:長週期和短週期共存,輕決策和重決策共存,大部分存在短期、低頻的特點;
- 多行業、多場景、多種類、多目標:我們目前有200多個行業,十幾個場景位,推薦種類有帖子、商家、店鋪、類目、標籤,最佳化目標有ctr、cvr、call/uv等。
針對類目、行業繁多的問題,我們採用如上圖所示的解決方案。具體地,我們會進行分場景、分型別、分類目推薦,即將推薦問題不斷進行切分,使得場景更為細粒度。在每一個特殊推薦場景下我們可以制定獨特的推薦策略。此外,推薦決策資訊需要多元化。特徵的來源有使用者行為資訊,使用者長期行為和短期行為,帖子資訊和標籤資訊。使用者行為資訊有搜尋詞、瀏覽資訊、點選和篩選。帖子是推薦的重要內容,包含標題文字、類目、標籤、圖片、帖子質量、評論等。標籤資訊有標籤的來源、所述的類目、型別。多目標決策主要有兩個目標:CTR和CVR。
02
58本地服務標籤推薦演進
首先介紹一下標籤推薦。
標籤推薦和一般推薦演算法一樣分為召回和排序。我們現在使用的是多路召回策略,包括了上下文資訊、統計資訊、使用者長期行為和短期行為。上下文資訊由搜尋詞和使用者點選標籤組成。根據搜尋詞和使用者的點選標籤,我們可以計算它們和標籤庫中的標籤的相關性來做召回。統計資訊是指熱門點選標籤詞和熱門搜尋詞。使用者長期行為主要包含使用者歷史點選行為。
召回模型的演進是由簡單模型到複雜模型的過程。首先我們使用了基於統計資訊的召回策略,即取top點選的標籤以及使用者的熱搜詞。隨後,我們加入了文字相關性召回,從最簡單的詞袋模型到考慮權重的tf-idf特徵,再演變為使用詞向量來計算相關性。最後,我們使用基於使用者行為的召回模型,經歷了從Bi-lstm到ATRank模型的演進過程。
下面介紹基於使用者行為的召回模型。我們將使用者點選行為以24小時為時間間隔進行切分,如果一個使用者在這個間隔內沒有互動行為,那麼我們可以認為24小時前和後的行為序列屬於兩個不同session。訓練資料就是將session序列對應的標籤收集起來。另外,我們會對資料進行增強,例如選取一個序列的子序列作為樣本,或者採用dropout的方式去除中間的一些點選標籤形成新的樣本。
上圖展示了Bi-lstm的模型結構,它在輸入標籤序列的embedding層上加上了雙向的lstm層輸出隱向量,再透過一個softmax輸出層進行標籤預測。
ATRank模型如上圖所示。它將使用者的行為序列分成多個型別,每個型別單獨做embedding。我們的標籤推薦場景只考慮了點選這一種行為型別,但是在其他場景,如淘寶做商品推薦時會考慮更多的使用者行為(點選、篩選、收藏等)。ATRank的特點是將lstm模型的序列序列關係轉換為attention平行計算關係。Embedding向量可以被對映到一個隱式語義空間中,經過一個self-attention模組。之後,模型將得到的隱向量與當前行為隱向量做vanilla attention後,接上一個多層神經網路進行標籤預測。
上圖展示了升級後的ATRank召回模型的最佳化效果。原策略指的是詞袋模型,即把使用者搜尋詞經過切詞後得到的詞向量和標籤庫中的詞向量做相關性匹配。我們使用的評價指標是標籤詞的點選率,目標是觀察點選率的提升情況。結果表明最佳化模型相比原策略有15%的CTR提升。同樣的,我們將ATRank與Bi-listm模型進行了對比,發現ATRank相對於Bi-lstm有大約2.7%的提升。
03
58本地服務帖子推薦演進
1. 整體介紹
58本地服務帖子推薦的典型場景是列表頁的猜你喜歡,這一需求來自黃頁搜尋。黃頁搜尋是一個搜尋場景,承載了70%的流量,但在一場景下會出現一些搜尋詞沒有結果或者結果比較少的情況。如果搜尋結果不能夠展示完整的一頁的話就認為是“少無結果”,我們在結果下面增加一個“猜你喜歡”模組為使用者展示更多內容。
使用者的互動流程如上圖所示。首先使用者輸入一個搜尋詞,系統會曝光召回帖子的標題、價格、商家資訊、圖片等。如果使用者對一些帖子感興趣的話就會進行點選,進入帖子的詳情頁。進一步,如果使用者對帖子內容有興趣的話就會透過打電話或者微聊的方式進行溝通。我們的主要目標是提高連線數,即電話的數量,也可以被看作轉化率cvr。同時,我們也希望降低搜尋結果的少無結果率。
猜你想找架構分為資料層、召回層、排序層和渲染層。
- 資料層一方面需要獲取使用者的行為,另一方面需要獲取帖子的特徵。
- 召回層採用了多路召回,包含標籤召回、向量召回、使用者意圖召回和補充召回。
- 排序層經歷了從線性模型、樹模型、深度模型到多目標的深度模型的迭代過程。與此同時,排序模組會疊加一些業務規則進行約束。
- 渲染層的作用是決定如何向用戶展示排序結果。
2. 召回策略
首先介紹使用者意圖召回。使用者輸入一個查詢詞後,我們需要對其進行類目預測。我們現在有200多個類目,直接進行分類預測準確率不滿足要求,所以我們分成兩級進行分類預測。首先我們對query進行一級類目預測,之後再進一步進行二級類目預測。在得到二級類目後,我們再去呼叫主搜服務來獲取這一類目的候選帖子。
在一級類目和二級類目的預測模型中,我們都採用了bert作為基模型來訓練使用者的查詢文字和類目詞的相似度。在離線訓練的時候,我們需要蒐集大量使用者(查詢文字,類目)對以及(帖子標籤,類目)對。我們還需要打標籤來判斷這兩類資料對是否相關。值得一提的是,在一級、二級類目預測中,我們可以直接使用多分類預測進行建模,例如有十個類目那就建模為十分類問題;也可以將其建模為文字對是否相關的二分類問題。我們在實踐中採用了二分類建模方式,它比起多分類的準確率更高。此外,如果後續類目出現變動,多分類預測的訓練樣本與模型需要很大的改動,而二分類模型對變動的影響較小。
標籤召回中會從標籤系統中抽取與查詢文字相關的標籤,隨後再呼叫主搜服務來獲取包含這一些標籤的候選帖子。
向量召回使用DSSM模型生成每個帖子的向量和查詢詞的向量。我們對帖子向量建立索引,其中包含三種方式。第一種是IndexFlatL2,它是一種暴力搜尋的方式,其特點是結果最精確,但是查詢速度較慢。第二種是IndexIVFlat,它透過計算向量中心點來進行最佳化,我們在查詢時只需要對向量中心點做相似度計算找到最近鄰類,再進入這一類中進行召回即可。第三種是IndexIVFPQ,它會對向量進行有失真壓縮,損失一定的計算精度,但是這一方法的計算速度是最快的,是應對超大規模向量集合的解決方案。
補充召回透過使用者的自選類目進行召回。我們會根據使用者所在城市和所選類目召回熱門帖子。
3. 排序策略
接下來介紹一下猜你想找的排序策略。排序經過了從線性迴歸、樹模型、深度模型到多目標模型的演進過程。樹模型相較於線性模型增加了非線性特徵,並且可以對特徵進行自動組合。深度模型除了加入非線性特徵以外還提取了高階特徵。多目標模型透過設定多個相關目標來增強模型的魯棒性和泛化能力。
排序特徵有:
- 使用者特徵:包括查詢文字、裝置型號等;
- 帖子特徵:包括點選率、轉化率、標題等;
- 商家特徵:包括商家等級、是否是會員等;
- 上下文特徵:包括城市、類目等。
我們這裡主要介紹深度排序模型。首先是DeepFM模型。它是將FM和DNN組合起來的一個排序模型。FM主要進行了二階特徵組合,DNN主要用來產生高階特徵,最後這兩部分得到的特徵向量組合在一起進行預測,得到最終結果。
第二個模型是ESMM。它是一個多目標排序模型,我們設定的第一個目標是cvr,第二個目標是ctr。在原論文中,它設定的主要最佳化目標是cvr,輔助目標是ctcvr(可以分解為點選率乘以轉化率)。我們沒有直接使用這種方式進行建模,原因是我們考慮的是對任意一個帖子的最終轉化率,也就是使用者的連線數。
實驗表明DeepFM的離線auc指標是0.78,線上call/uv(連線數除以使用者訪問數)是8.11%,線上call/show(連線數除以曝光帖子數)是0.76%。而使用ESSM這一多目標模型,我們在auc和線上兩個指標上都有一定程度的提升。
04
未來展望
最後做一下展望。後面的工作目標是進一步提升推薦的效果,我認為有以下幾方面工作可以進行嘗試:
- 基礎資料的建設:比如標籤系統的準確度提升,因為標籤推薦、帖子推薦中需要每個候選帖子都打上相應的標籤。此外,我們還需要加入帖子的結構化資訊,包括類目、標籤等。
- 基礎服務能力:包括分詞、同義詞、詞向量等。
- 深度學習中準確率和效率:一般來說更復雜的模型效果會更好,但是線上推理對於時間延遲要求較高,複雜模型可能不滿足要求。此時我們需要採取一些手段,如模型蒸餾、模型壓縮、使用更小的模型、裁剪神經元數目或者網路層數目等。我們還可以借鑑推薦系統相關的前沿演算法以及其他領域的演算法來對準確率和效率進行更好的平衡。
05
精彩問答
Q:DSSM召回模型的正負樣本如何構建?模型是增量更新的嗎?DSSM模型兩個塔使用的特徵分別是什麼?
A:正樣本來源於查詢後點擊的帖子是否被轉化,即出現“打電話”的行為,此時查詢文字和帖子標題可以構成一個正樣本。負樣本則是隨機抽取的。因為召回階段和排序階段不同,我們只關注查詢文字和帖子標題是否相關即可。DSSM的查詢文字和標題文字都屬於短文字,我們首先會對它們進行分詞和embedding對映,隨後連線的神經網路可以選擇dnn、cnn或者lstm。如果使用的是lstm模型,那麼可以使用最後輸出的隱向量或者所有隱向量的和作為最終的文字向量表示。每次訓練所用的樣本資料是從最近三個月的使用者行為日誌中收集,每週自動訓練並更新一次模型。
Q:點選率特徵是如何做歸一化的?
A:一般來說點選率是一個特別小的數字,絕大部分在小於0.1的範圍內。這裡有很多歸一化的方式。我的做法是根據資料分佈來設定一個經驗值,比如統計發現90%的點選率都小於0.1,那麼可以將大於0.1的點選率都設為1,小於0.1的點選率都除以0.1,使得其數值範圍能相對均勻的分佈在[0,1]內,避免出現極端分佈。
Q:多個應用場景下是使用同一個模型的嗎?
A:在不同的場景下,我們的模型會有所差別。比如在猜你喜歡的場景下我們使用了DeepFM和ESMM模型,但是在類目推薦中我們不使用這麼複雜的模型。因為類目推薦通常以熱門類目為主,使用者個人興趣和偏好是作為輔助特徵來加入模型的。所以在每個場景下選取的模型區別還是比較大的。
Q:如何評估生成的詞向量?詞向量如何應用至召回和排序模組?
A:我們主要採用人工的方式來進行向量評估。具體地,我們會構建一些常用搜索詞,透過觀察模型生成的詞向量召回的一系列相關詞來判斷相關性是否滿足要求。在召回階段,我們會使用詞向量將與query語義相似的帖子標題透過計算詞向量相關度來進行召回。在排序階段,我們會將召回階段計算的相關度作為一個特徵加入,相較於召回階段每一路考慮的特徵較少,排序階段會把所有特徵都考慮進來。
Q:標籤系統是如何構建的?
A:標籤分為行業標籤和通用標籤。對於行業標籤,我們可以從帖子標題中抽取代表行業資訊或者行業類目資訊的特徵詞。具體地,我們會將帖子標題進行分詞,然後從生成的詞序列中抽取關鍵詞。關鍵詞還需要經過進一步的篩選來得到行業相關的詞進入標籤詞庫。這個過程需要人工參與。通用標籤數目較少,可以人工總結。
Q:query搜尋中一級類目搜尋和二級類目搜尋是怎麼實現的?
A:對於輸入query詞,我們需要判斷它和一個類目的相關性。我們是基於bert來進行建模的。對於一級類目,假如我們有十個類目,那它對應於十個類目詞,那麼這個query文字會在十個類目下進行相關度計算。最終我們會選取若干的top類目作為一級類目帶入二級類目的預測中。二級類目的預測模型會進一步預測query和哪些二級類目相關度比較高,最終召回得分較高的幾個類目下的帖子。
Q:召回源的效果如何進行評價?
A:評價可以分為離線評價和線上效果評價。召回的評價相較於排序會比較困難,因為召回是從候選池中獲取樣本,所以我們無法嚴格計算一個具體的評價指標。在召回評價時,我們首先先使用一個召回策略得到召回的樣本,然後依次加入更多的召回策略,逐個檢視每次新加入的召回策略能夠擴召回多少樣本,且需要判斷擴召回的樣本是否相關。相關性判斷可以使用人工進行判斷。
Q:使用的機器配置是怎麼樣的?訓練耗費的時間是多少?
A:我們使用的GPU是P40。由於我們整個系統涉及到很多模型,如果資料量不大的話單機訓練也是可以的。但是資料量很大的話,一般都是用分散式的多機多卡進行訓練。由於訓練都是離線的,如果每次訓練時間不超過一天的話是可以接受的。若訓練時間太長,可以考慮是不是減少訓練資料或迭代次數,只要不影響訓練效果。
Q:如果DeepFM模型不收斂或者效果無法達到要求,應該如何去排查?
A:如果訓練不收斂,很有可能是程式碼的bug。如果是效果達不到預期,這可能和特徵選擇相關。如果你選擇的特徵和想要解決的問題場景契合度不高,那麼模型在線上的效果就不會很理想,甚至模型在訓練時就無法收斂。具體來說,DeepFM模型會將無關的輸入特徵進行特徵組合和交叉,那麼噪聲資訊會進入模型,進而導致效能變差。
Q:排序模型的正負樣本的比例一般設定為多少?
A:因為轉化率cvr一般較低,是一個典型的樣本不均衡問題,所以我們會對負樣本進行降取樣,使得正負樣本的比例保持在大約1:3的水平。
今天的分享就到這裡,謝謝大家。
在文末分享、點贊、在看,給個3連擊唄~
分享嘉賓:
分享嘉賓:劉德華博士 58同城 架構師
編輯整理:吳祺堯
出品平臺:DataFunTalk