導讀:本文將介紹京東搜索場景中的兩塊技術,語義檢索與商品排序。在業界檢索算法基礎上,我們提出一系列更適用于電商場景的檢索排序算法,在業務上取得了顯著收益。其中的多篇論文已被 KDD/SIGIR 等收錄。
01
背景介紹
電子商務搜索是京東等電商重要組成部分,用戶通過搜索找到自己需要的商品,然后下單購買。一個典型電商搜索引擎的架構,包括三個重要組成部分:query 理解、召回和排序。
- Query 理解:包括 query 的糾錯、改寫、擴展、分詞等。
- 召回階段:給定一個查詢詞,從商品庫中召回有效正確的商品候選集,并將結果返回給排序。召回方式有很多種,這里我們只介紹基于向量檢索的召回。
- 排序階段:給定召回商品的候選集合,根據眾多因子對這些商品進行排序,挑選出最好的候選商品展示給用戶。
下面我們分別介紹,基于向量檢索召回和商品排序:
02
向量召回
向量檢索作為一種信息檢索方式在工業界已經被廣泛應用,它能解決傳統倒排檢索不能解決的問題。倒排通過字面匹配方式召回商品,這種方式存在一種缺陷,不能召回字面不匹配但語義層面相近的商品, 如 query='2-3周歲寶寶玩具'是無法召回 sku='托馬斯小火車'的。
通俗的講就是訓練一個模型,該模型通過將 query 和 sku 映射到統一維度空間,在該空間中,相似的商品距離近,不相近的商品距離較遠。如上圖例子,query=奶粉,在高緯空間里,相對鞋子、服裝、手機,奶粉商品距離 query 更近。這是建模過程,生成 query 和 sku 的向量數據。
我們得到了 query 和 sku 的向量,接下來就是做檢索,返回與 query 距離近的 topK 個 sku。而數據庫的商品量非常多,通常是十億級,不可能做線性遍歷,考慮到時效性,會引入快速向量近似檢索方法,如 KDTree、TDM、LSH、PQ、HNSW 等等,我們采用的是 PQ 算法,這里不再贅述,網上有很多材料介紹其算法。下面重點介紹我們的模型及在線檢索框架。
模型方面不僅要考慮 query-sku 的相關性,我們也對用戶行為進行建模,同一 query 針對不同用戶、同一用戶不同時刻檢索出更具有個性化的商品。我們使用的是 DPSR ( Deep Personalized and Semantic Retrieval ) 算法,模型融合個性化和搜索語義信息,我們的論文已被 SIGIR2020 收錄。
1. 檢索系統 overview
從整體看,離線模型是一個雙塔模型結構,query 和 sku 分別有一個 model tower。Query 端包括了 query 包括 query tokens、user profile、user history events 等特征。Sku 端包括 title tokens、brand、category、shopid 等特征。
離線索引 ( offline indexing ),使用的是 sku tower,導出 sku 的 embedding 構建 QP 索引。
在線服務 ( online serving ) 使用的是 query tower,模型加載在 tensorflow service,在線 predict query 的 embedding。
2. 模型詳細設計
① Two tower model architecture
上面介紹了模型結構,一個 query tower Q,一個 sku tower S,對于給定的 query=q, sku=s,模型計算過程為:
f(q,s)=G(Q(q),S(s))
Q(q)∈Rd×m 表示 query 的 embedding
S(s)∈Rd×m 表示 sku 的 embedding
G 表示打分計算函數,比如 inner product、L2 distance 等
雙塔模型訓練完后,query 和 sku 的模型相對獨立,我們可以分別計算他們。所有的 sku embedding 都在離線計算,以便快速構建向量檢索索引。雖然 model 是相互獨立的,但 query 和 sku 之間使用簡單的點積計算,理論上 query 和 sku embedding 仍然在同一個幾何空間中,具有可比性。
② Query tower with multi heads
我們看到左側的 tower 和右側有兩點不一樣:Projection layer 和 mutli heads,目的是為了豐富 query 側的信息。如下圖所示,不同的 head 可以捕獲 query 不同的語義 ( query=蘋果,語義可以是手機和水果 ),捕獲不同的品牌屬性 ( query=手機,品牌可以是華為、小米 ),捕獲不同的產品屬性 ( query=三星,產品屬性可以是筆記本、手機 ) 等等。
③ Attention Loss
Multi heads 讓 query 可以生成多個 embedding 與 sku embedding 計算 score。我們采用 attenion loss 做模型優化。
我們標記 query 的多個 embeding 為 Q(q)={e1,e2,...,em},其中 ei∈Rd,Sku 的 embedding 為 S(s)=g,g∈Rd,Query 和 sku 的打分計算如下:
其中 β 是 softmax heat 參數。假設 D 表示訓練預料,r(qi,si+) 為正樣本,r(qi,si-) 為負樣本,模型優化的 loss 可表示為:
④ Negative Sampling
我們采用的是用戶點擊數據,數據量在10億級作為正樣本。負樣本并未使用同 session 未點擊的樣本,因為搜索手機,展示了小米和華為手機,不能說未點擊就是不相關商品。負例分為兩部分:random negatives、batch negatives。我們增加了一組超參來調整兩者的比例,觀察發現 random negatives 越多,召回商品的 popularity 越高,更能吸引用戶點擊下單,但會降低商品與檢索 query 的相關性。
模型訓練算法具體如下:
3. 訓練優化
我們也嘗試過更強大的神經網絡,如 RNN、transform 等,得到的效果類似或稍好一些。然而一個短延時的模型更適用于工業生產建模,這樣可以使用更少的服務器做有效的離線訓練和在線服務。
模型系統方面,我們也做了一系列訓練優化,簡單描述其中的幾點:
- 實現 c++ tokenizer,以 custom operator 方式加載到 tensorflow,離線訓練和在線服務共用,保證 token 的一致性。
- 訓練數據壓縮,修改訓練數據格式,把共用的特征數據加載內存,訓練時展開從而降低數據存儲。也便于訓練時做負例采樣。
- 可伸縮分布式,切分大的 embedding,并將 sum up 放到 ps 以解決 worker/ps 帶寬瓶頸。
- 模型 servable 服務,我們將向量檢索和 tfs 合成一個服務,不僅減少一次網絡訪問,降低系統 3-5ms 的平響,而且將模型分片部署,從而可以支持上百個模型同時服務或者 A/B 實驗。同時 servable 服務是 cpu 和 gpu 混合部署。
4. 語義檢索效果展示
語義檢索上線后獲得了很好的體驗效果,不僅提升了轉化,長尾流量降低了近10%的 query 改寫率,也就是說用戶不需要多次改寫 query,就能獲得想要的商品結果。
03
商品排序
下面介紹下商品排序:
商品排序主要是根據用戶的輸入對商品進行打分排序。商品排序的傳統方法使用 xgboost 等基于決策樹的方法從數據中進行學習,但是這些模型通常有成百乃至上千的數值型人工特征,不能有效的從原始特征比如用戶歷史點擊購買數據、商品文本和圖像中直接學習。近年來,深度學習在各種應用中驗證了從原始特征中學習的有效性,在業界被廣泛使用,比如 wide&Deep、DIN 等。下面介紹一個我們在商品搜索排序中嘗試的方法。
1. 雙胞胎網絡
我們的訓練數據來自于用戶的搜索日志,通過將同一個 session 中用戶購買的商品 ( 商品a ) 和沒有購買的商品 ( 商品b ) 配對起來,并把購買未購買作為最終學習的 label,從而構造了用戶查詢-商品對訓練集。
根據訓練數據,我們首先設計了雙胞胎網絡結構:
雙胞胎網絡結構有兩個共享參數的模塊,每個模塊分別輸入用戶、查詢和商品特征,每個模塊采用 ReLU 作為激活函數,最終層的輸出一個分數,兩個模塊的差值和數據 label 作為交叉熵損失函數的輸入。
在特征方面,我們使用以下幾種不同類型的特征:
- 數值型特征:包括商品銷量、用戶購買力和用戶是否點過、購買過商品等。
- 文本特征:包括用戶輸入的查詢和商品名稱等。
- 用戶歷史行為:包括歷史點擊、購買、加購商品 list 等
- 商品、用戶 id 等
文本特征可以學習到一定的相關性信息,用戶歷史行為可以學習到個性化信息,id 類特征我們做了 pretrain。
2. 個性化升級
在第一版雙胞胎模型中,我們簡單的對用戶的歷史行為做 sum pooling,但是這樣缺乏和搜索商品的交互,無法精準的表示用戶的興趣;為了加強用戶的交互,我們升級了模型的結構,用候選商品和用戶歷史商品做 attention,從而將靜態的 user embedding 升級為隨 query 和當前商品變化的 user embedding。
我們還加入了 Graph 學習方法對 id 類特征 embedding 進行 pretrain,然后加入到模型訓練中。具體方法使用用戶的高質量點擊行為生成商品 graph,通過 Random Walk 生成訓練數據,然后利用 Skip-gram 進行訓練,加入 id embedding 可以提高模型離線指標和收斂速度。
3. 時效性優化
值得一提的是,為了增強排序捕捉變化的能力,提升排序的流動性,我們從三個方面:特征時效性、模型時效性、線上預估校準進行了優化。
- 提升特征時效性:接入商品小時級的點擊加購訂單等實時信號,訓練模型學習實時變化
- 實時在線校準:根據商品全站的點擊訂單等實時反饋信號,對模型原來的預測分數及時校準
- 提升模型的更新頻率:優化訓練數據生產流程,推動訓練平臺升級,提升模型訓練速度
搜索排序是商品檢索最重要的模塊之一,我們在個性化、時效性、多目標等方向不斷迭代,提升了排序體驗,也提升了商品成交量。
04
總結
我們介紹了語義檢索召回和商品排序,在京東搜索服務上部署并取得了良好效果。我們還在嘗試一些業內其他流行的方法,比如 GNN、KG、MMoE 等方向,也獲得了不錯的成績。
文章作者:
王松林、唐國瑜,京東算法工程師。
團隊介紹:
京東搜索應用科學部,負責京東商城商品搜索排序算法,覆蓋京東主站,京喜,微信一級入口的京東搜索。團隊成員有來自國內外大廠,也有來自中清北的優秀畢業生。我們致力于用技術驅動產品,用行業前沿的先進技術落地業務場景;從實際需求出發,用技術解決實際問題,做有用并且有趣的算法,我們也樂于把實踐經驗通過論文分享給業界。歡迎有技術情懷、有創新活力的你加入我們!






