《Real-time Personalization using Embeddings for Search Ranking at Airbnb》
其核心在SKIP-GRAM上根據(jù)業(yè)務做了一個改進點為:當序列中存在下單動作的時候喝噪,認為序列中的任意一個商品都與該下單動作的商品應該存在一定的關系酝惧,因此在SKIP_GRAM算法中僅需要將在有下單序列中每個窗口中多加入一個商品即下單的商品即可伯诬。
1:基礎符號解釋說明
https://zhuanlan.zhihu.com/p/55259412
假定從 個用戶獲得了一個點擊的session集合姑廉,其中每個session 為用戶點擊的一個LIST桥言,其中session的切割方式為:當以個點擊時間距離下一個點擊時間大于30分鐘后葵礼,該session被切割鸳粉。目標是對于每一個listing 學習一個維的向量使得相似的listing在embedding空間中更接近。
2:模型設計
記的正樣本對為枯夜,記其集合為湖雹。即窗口為大小的曙搬,同一個用戶點擊序列中的上下文為其正樣本對纵装。隨機選取個負樣本對$$,記其集合為诗箍,則目標函數(shù)變?yōu)椋▽嶋H上就是交叉熵損失函數(shù)扳还,與SKIP-GRAM的損失函數(shù)一致):
通過隨機梯度下降進行求解氨距。
3:切割SESSION的機制
將SESSION切分為兩個部分
1)預定序列 booked session棘劣。即序列的終止動作為下單。此時優(yōu)化目標要變?yōu)椋?/p>
可以這樣理解最后加的一項寡喝,相當于勒奇,無論下單動作的商品在不在窗口內赊颠,都把它當做中心商品 的一個上下文。
2)探索序列 exploratory session 顶猜。即序列中切分為時間間隔大于30分鐘了痘括,被切割的SESSION中沒有下單的動作纲菌,全是瀏覽點擊的動作。
3)肆资?灶芝?夜涕?不太理解這塊的含義:
通俗地理解是不是可以這樣想女器,如果全局選取負樣本住诸,會導致同一個market 的房源的 embedding 接近驾胆,非同一 market 就會遠,內部區(qū)分不是很明顯贱呐,但是若負采樣在 的market 里進行選取的話丧诺,是否可以將內部房源區(qū)分得更開?此處相當于作者關于隨機負采樣根據(jù)業(yè)務需求做了一些優(yōu)化奄薇。
4:冷啟動的問題
提出了一種利用其它的已經(jīng)存在的embedding 向量去表示未知的embedding 向量 驳阎。采取的策略是找10 miles為半徑的范圍內,與已知embedding 房源屬性最近的3個房源,然后求平均得到未知EMBEDDING房源的辦法呵晚。
5:uer_type 和 listing_type
假定我們給定了一個由 個用戶預訂的商品序列集合蜘腌,其中每個預訂的session 為 ,通過預訂商品序列生成embedding 向量存在如下的幾個問題:
1)預訂的商品序列會比點擊序列的長度短很多
2)很多用戶可能就預訂一單撮珠,也就是序列的長度為1,無法學到
3)為了學到有意義的 emebdding 向量金矛,一般要求商品出現(xiàn)的次數(shù)要大于5-10次芯急,但是很多商品實際上出現(xiàn)的次數(shù)是少于5-10次的,比如那些比較少見的商品绷柒。
4)用戶預訂的兩個商品若時間間隔過久志于,這兩個時間段用戶可能因為職業(yè)改變等導致價格偏好發(fā)生改變。
為了解決上述問題废睦,作者提出了伺绽,我們傾向于學習 listing_type 而不是listing_id。具體是如何做呢嗜湃?
首先給定listing_id必要的元數(shù)據(jù)信息奈应,比如像JD商品id對應的屬性三級品類、品牌等购披。文章給出的是位置杖挣、價格、大小刚陡、床的數(shù)量等惩妇。給出了一個映射規(guī)則,對應的論文的 table3 筐乳。文章中給了一個例子歌殃, 一個房間的信息為:
1)國家為US,對應第一行第一個蝙云,映射表中取值為US
2)Listing_type是Ent氓皱,對應第二行第一個,映射表中取值為lt1表示 list type縮寫lt 且為第1列
3)每晚價格60.8$勃刨,對應第三行第3個在56-69區(qū)間內波材,映射表中取值為pn3,pn是per night 的縮寫身隐,3表示第3列
4)平均每個顧客29.3$廷区,對應第四行第3個,映射表中取值為pg3贾铝,pg 表示per gust縮寫躲因,3表示第3列
依次查表早敬,最終可以表示為listing_type = US_lt1_pn3_pд3_r3_5s4_c2_b1_bd2_bt2_nu3,顯然這是一種多對一的映射關系大脉。問題搞监,映射關系很重要,實際上此處的映射關系已經(jīng)決定了镰矿,哪些房源滿足什么基礎條件的時候琐驴,就一定相似,比如映射成同一個listing_type的lsiting_id 的emebdding 表示肯定是一致的秤标。此處價格區(qū)間的劃分等映射表的構建也是至關重要的绝淡。以同樣的方式構建用戶的映射關系,映射表見論文的table4苍姜。
現(xiàn)在的問題是如何讓listing_type 和user_type 的emebdding 的向量是在一個向量空間中牢酵?
首先構造book session ,只不過和之前的相比衙猪,在 session 中不僅有商品還有用戶 馍乙,即
6:在 word2vec的基礎上修改源碼,實現(xiàn)論文 垫释,初步構思方向
1)將原始sentence 后加上一個判斷是否是下單的符號丝格,比如-1表示該sentence 有booked 的商品,LOSS加上 含booked 一項棵譬。若尾部的ID不等于-1就表示該sentence 沒有booked 的商品显蝌,在更新的過程LOOS沿用之前的。但是這樣處理后订咸,就會發(fā)現(xiàn)-1會被當做詞在構建huffman樹的時候當做詞被構建進樹中曼尊,且由于每個帶booked的sentence中幾乎都有-1,就會導致其詞頻很高脏嚷,在構建樹的過程中很大概率會離根節(jié)點很近涩禀,導致使用層次softmax的時候,幾乎很多詞的路徑中都包含了該節(jié)點然眼,顯然是不合理的。
2)介于第一步引入贅余詞后的不合理點葵腹,需要在統(tǒng)計詞頻和構建詞典的過程中將這兩個詞filter掉高每。
3)基于論文的思想,當引入booked 的商品后践宴,在更新每個中心詞的輸入向量的過程中鲸匿,需要將booked 的商品也當做窗口詞進行更新其參數(shù)向量。因此首先要判斷尾部的商品ID是否等于-1阻肩,若是則sentence-1带欢,不更新尾部的詞运授。且每次更新的過程中先記錄尾部詞,在窗口詞更新完后乔煞,將尾部詞都更新一遍吁朦。有個問題(booked 的詞是否要作為中心詞更新一遍?渡贾?逗宜??此處個人理解是不需要更新)
基于上述分析空骚,最終修改的代碼見:https://github.com/Hongqiong12/Embedding/tree/main/aribnb
建議:
當sentence的長度為2的時候纺讲,尾部是下單詞,不要在尾部加-1囤屹。尾部詞也作為中心詞進行訓練熬甚。