SIGIR2020|KEPS:知識圖譜和個性化搜索碰撞的火花
- 2020 年 12 月 14 日
- AI
前言
今天給大家分享一篇 SIGIR 2020 的文章:KEPS,用圖譜來輔助優化個性化搜索。整篇文章首先充滿學術風,充分且完備的設計了模型和實驗,其次很多思路也可以在工業界中進行借鑒。一開始我只是大概掃了一下作者列表,看的過程中就覺得應該是學術界和工業界合作的一篇文章,果然是人大和微軟都有署名~

顧名思義,這篇文章的主要工作是一個基於知識圖譜來優化的個性化搜索模型,命名為 KEPS。整個工作可以分為四部分:首先是構建一個個性化的實體鏈接網路;然後再進行用戶畫像的構建;接下來就可以利用搜索意圖和用戶畫像對文檔進行個性化排序;最後再根據用戶的點擊結果對實體鏈接進行調整。
首先是個性化搜索的情況,本質上是根據用戶的歷史行為來判斷現在搜索的目的。這種做法的缺點是不能利用到一些外部資訊,比如櫻花和日本之間的關係就無法獲得;另外一方面是利用實體鏈接的方法,可以獲得外部資訊,但是不善於處理模糊語義,比如 cherry 到底是在說櫻桃,還是說鍵盤?
直覺上很容易想到,將這兩者結合起來,就可以互相彌補,實現一個有效的個性化搜索功能

上面這幅圖展示了用戶輸入 「cherry review」 時的一個流程,從用戶的歷史行為可以看到這裡 cherry 這個實體指的是櫻桃花。接著通過實體鏈接圖譜,找到櫻花和 Tokyo,Sakura 之間的聯繫,進而就可以得到一些相關的文檔了。
整體流程
接下來我們簡單的介紹一下文章整體的思路,下面這幅圖給出了本文四部分主要的流程框架:

首先是 personalized entity linking,主要是為了更好的識別 query 意圖;接下來是 user profile constructing,根據 query 意圖來構建用戶偏好模型;第三部分是 personalized ranking,根據前面得到的 query 意圖和用戶偏好來構建一個對文檔相關性進行個性化排序的模型;最後是 post ranking entity linking adjustment,根據用戶點擊的回饋來調整前面 query 實體鏈接的概率,進一步優化本次搜索序列中接下來的搜索結果。
personalized entity linking
首先我們搞清楚一個實體鏈接網路是什麼形式的,一張圖,節點是不同的實體,邊是實體之間的鏈接關係。在本文中邊就是兩個實體之間鏈接的概率,更具體的說,本文中的邊表示的是「用戶輸入的 query 中提到的實體 i 和某個實體意圖 j 鏈接的概率」:

上面的式子是一個計算過程,在給定 query 和歷史行為 H 的情況下,實體 i 是 意圖 j 的概率為 p_ij。所謂的個性化的實體鏈接,其實就是針對不同的用戶歷史,這裡的 p_ij 都會是不同的取值,那麼問題就轉變到了如何構建出來個性化的 p_ij,具體的內容通過下面這幅圖進行介紹:

以中間為界,可以將上下兩部分分為 query 的實體和文檔的歷史交互記錄,以及 query 的實體和對應意圖之間的歷史交互記錄。而每一部分又可以左右分為長期的歷史行為和短期的歷史行為。
在這裡需要補充一個作者提到的關鍵點,作者認為用戶的歷史查詢可以分為多個 session,每個 session 是一個短期歷史行為,而整個歷史行為則是作為長期歷史。比如用戶當前想搜索一些關於旅遊的資訊,那麼當前這個 session 中他搜索的行為都是一個主要目的,本次搜索就對下一次起到重要影響。
上面 p_ij 公式中的 f(*) 函數的內容就如下:


這兩個式子分別計算了當前 e_ij 和當前 query 的關聯程度,以及 e_ij 和歷史行為的關聯程度,在歷史行為部分也分別考慮了長期和短期。
通過這種辦法可以構建出一個個性化的實體鏈接圖,實體與意圖之間的邊就是 p_ij。接下來介紹用戶畫像的構建方法。
user profile constructing
使用前面的實體鏈接來反映用戶的搜索意圖,對應的來檢索用戶與此意圖相關的搜索歷史,通過相應的文檔點擊歷史來構建用戶偏好。在本文中,使用 key-value memory network 來保存用戶的歷史。與第一部分類似,本文既考慮實體的歷史記錄,也考慮文檔的歷史記錄。整體結構如下:

這裡作者利用 memory network 來構建用戶偏好,分別從實體的 memory network 和文本的 memory network 兩部分來構建,以前者為例,我們簡單的介紹一下。
entity memory network
這裡將用戶歷史行為中的 query 「實體」向量作為 key,然後點擊過的文本向量作為 value,然後利用下面的公式來計算用戶短期歷史的實體偏好,長期歷史只需要將公式中所有的 s 換成 l ,同樣的計算思路。

這裡的 k 表示 memory network 中的 key, v 表示 value,所以簡單點理解計算思路就是,利用實體 key 和前面的實體鏈接概率圖來作為權重,再對 value 進行加權,獲得最終的偏好表示。
文章中對得到結果進行了進一步處理,但是和這個思路一致,將得到的偏好和當前 query 結合起來再查詢一次 memory network,也就是圖中標註的 read 2 hop。
text memory network
文本的 memory network 也是類似的思路,不同之處在於前面的 entity memory network 將 query 的實體向量和文檔的向量分別作為 key 和 value,而這裡將 query 本身的向量作為 key,將對應點擊過的所有文本向量的平均值作為 value。
不同的 key 和 value 其實是提供了不同的特徵表達方式,而考慮到直接用 query 的 embedding 不能充分的表示當次搜索的意圖,作者還添加了 t_s 短期興趣作為 query 的補充。所以計算方法就成了如下這樣:

計算思路和前面一致,這裡是用短期歷史作為例子,長期也是同樣的思路。
personalized ranking
通過前面的兩個部分,可以得到用戶的意圖概率,用戶的偏好畫像,然後就可以進一步來對候選的 item 進行排序,這裡以文檔排序為例,計算公式可以簡化為這樣:

相當於分別計算文檔和用戶意圖的相關性,候選文檔和用戶偏好的相關性,以及候選文檔與輸入的 query 之間的相關性。三部分的 embedding 向量進行拼接,經過一個 MLP 層就是最終的排序得分。
以文檔與意圖的相關性進行示例:

每次的計算中,同時考慮了文檔和長期與短期,文本與實體,共兩個維度,四種組合的相關性,並將最終結果拼接起來作為最後的計算結果。
這樣就充分考慮了前面的工作成果,並將其結合起來作為對候選文檔的個性化打分的依據,輸出一個個性化的排序結果。
post ranking entity linking adjustment
在給用戶展示了排序好的文檔後,根據用戶的當次點擊情況,可以再作為標籤回饋,對實體鏈接圖進行調整。
作者在文中舉了這樣一個例子,首先,每次搜索的一個 session 中,用戶搜索的意圖背景可以看做是相似的。在這樣的前提下,假如用戶搜了 Java 相關的內容,當他再搜編程書的時候,我們就可以優先展示 Java 相關的編程書籍。
具體的調整思路,也就是根據用戶點擊的文檔,以及其中提到的實體,來更新前面構建的個性化實體鏈接圖:

訓練與實驗
最終作者將所有的內容整合起來,用一個 pair-wise 的損失函數來直接進行訓練,一次傳播中對涉及的所有參數都進行更新,具體的 loss 就比較簡單了:

d+ 和 d- 兩個分別表示正樣本和負樣本,也就是給用戶展示了以後,用戶點擊與每點擊的文檔。
實驗部分作者做了很多工作,感興趣的同學可以去找論文看看,作者除了對比了一些 baseline 的搜索方法,也對比了一些 sota 的工作。
除了與別的工作作對比之外,作者也進行了很多自身的對比,比如刪除自己模型的不同部分,分別進行效果的驗證。大家可以在後台輸入關鍵詞獲得論文,再自行欣賞。
總結
這篇文章整體的思路還是比較清晰,很多設計不是非常新穎,但卻考慮的很周到,事業設計也很完備。我們組做搜索,感覺對於長短期歷史行為的設計,的確得到了一些啟發,可以做的更精細些。相關從業者的小夥伴可以靈活借鑒其中的一些思路,對自己的工作提供幫助,
想看論文的小夥伴,可以在後台輸入「KEPS」,獲得論文的網盤鏈接(PS:因為之前下載的比較早,後來有朋友想看這篇文章說找不到,不知道是啥原因,我後來也沒找到,所以放到了網盤裡,供大家有需要的小夥伴學習。
喜歡文章的同學點個再看喲~
往期回顧