論文閱讀之“Real-time Personalization using Embeddings for Search Ranking at Airbnb”

??這篇論文主要就是講了如何對id類特征進行embedding操作,Airbnb結(jié)合word2vec模型預(yù)訓(xùn)練了2類embedding特征用來抓捕用戶的短期興趣(listing embedding)和長期興趣(user-type embedding和listing-type embedding)。

Listing Embedding

??listing embedding是直接對用戶歷史行為進行分析,此時特征粒度是最細(xì)的。Airbnb將用戶的租房點擊信息(只有瀏覽超過30秒才算點擊信息)分為多個session(按照用戶30分鐘沒有點擊來劃分),此時我們可以將一個session看做是一條完整的句子,接下來需要做的就是對session滑動窗口截取訓(xùn)練樣本。由于平臺上租房id是很多的,所以Airbnb在訓(xùn)練時使用了word2vec的negtive sampling技巧來降低計算量,此時模型的優(yōu)化目標(biāo)是\mathop{\arg\max}_{\theta} \sum_{(l,c) \in D_p}\log \frac{1}{1+e^{-v_c^{'}v_l}}+\sum_{(l,c) \in D_n}\log \frac{1}{1+e^{v_c^{'}v_l}}其中,v_l是滑動窗口中心租房id對應(yīng)embedding向量,D_pD_n分別是正樣本對和負(fù)樣本對。
??上面我們提到session是按照用戶30分鐘沒有點擊來劃分,此時我們還可以將每個session按照最后一個操作接著分類:1)booked session,最后一個操作是預(yù)定;2)exploratory session,最后一個操作還是點擊。對于exploratory session,優(yōu)化目標(biāo)不變,而對于booked session,則將最后booked的租房id對應(yīng)的embedding向量作為全局信息,每次滑動窗口時都加上最后的booked id embedding,此時優(yōu)化目標(biāo)變成\mathop{\arg\max}_{\theta} \sum_{(l,c) \in D_p}\log \frac{1}{1+e^{-v_c^{'}v_l}}+\sum_{(l,c) \in D_n}\log \frac{1}{1+e^{v_c^{'}v_l}}+\log \frac{1}{1+e^{-v_{lb}^{'}v_l}}??另外還有一個問題,當(dāng)我們對租房id表進行負(fù)采樣時所得到的D_n中大部分租房id很可能和滑動窗口中心租房id不是同一個market,這樣就會導(dǎo)致sub-optimal。因此我們還需要在和滑動窗口中心租房id所在的market中隨機選取一些負(fù)樣本,此時優(yōu)化目標(biāo)就變成\mathop{\arg\max}_{\theta} \sum_{(l,c) \in D_p}\log \frac{1}{1+e^{-v_c^{'}v_l}}+\sum_{(l,c) \in D_n}\log \frac{1}{1+e^{v_c^{'}v_l}}+\log \frac{1}{1+e^{-v_{lb}^{'}v_l}}+\sum_{(l,m_n) \in D_{m_n}}\log \frac{1}{1+e^{v_{m_n}^{'}v_l}}??對于那些新加入的租房id,Airbnb提出可以利用已經(jīng)訓(xùn)練好的embedding向量為其賦賦初始值。首先需要房屋主人提供一些相關(guān)信息,如位置、價錢、類型等,然后利用這些信息找到3個最相似的房屋id(個人感覺這里可以利用KNN實現(xiàn)),并將其對應(yīng)embedding向量求平均作為新加入房屋的embedding向量初始值。Listing embedding對應(yīng)的skip-gram模型如下:

listing embedding對應(yīng)的skip-gram模型.png

User-type & Listing-type Embedding

??前面講到的listing embedding可以很好的找到相同market中房屋之間的相似性,適合抓住user的短期興趣。但是對于用戶的長期興趣還需要訓(xùn)練一些其他的特征。比如一個user過去是在洛杉磯租過房,但是現(xiàn)在需要在紐約租房,在這種場景下listing embedding就沒法很好的為user進行推薦了。而且有些用戶租房次數(shù)很少(其對應(yīng)session可能只有1個)或者有些房屋被租出的次數(shù)很少,這些情況下都沒法很好的訓(xùn)練embedding向量。換句話說就是id類特征粒度太細(xì)了,分給某個embedding向量的樣本太少了,這樣訓(xùn)練出來的embedding向量必然不是最優(yōu)解。因此Airbnb提出user-type和listing-type embedding,對極其稀疏的id類特征進行裝桶,將粒度變粗,保證每個embedding向量都對應(yīng)足夠的訓(xùn)練樣本,此時訓(xùn)練集的每個session就不再是單個用戶的交互行為(房屋id),而是(user-type,listing-type)對,并且session中記錄的都是booking event,不包括exploratory event。相應(yīng)的,每次訓(xùn)練時模型中需要更新的參數(shù)是user-type embedding和listing-type embedding,這2個embedding向量是處于同一個空間的。此時對于user-type(u_t)的優(yōu)化目標(biāo)是\mathop{\arg\max}_{\theta} \sum_{(u_t,c) \in D_{book}}\log \frac{1}{1+e^{-v_c^{'}v_{u_t}}}+\sum_{(u_t,c) \in D_{neg}}\log \frac{1}{1+e^{v_c^{'}v_{u_t}}}對于listing-type(l_t)的優(yōu)化目標(biāo)是\mathop{\arg\max}_{\theta} \sum_{(l_t,c) \in D_{book}}\log \frac{1}{1+e^{-v_c^{'}v_{l_t}}}+\sum_{(l_t,c) \in D_{neg}}\log \frac{1}{1+e^{v_c^{'}v_{l_t}}}其中,D_{book}是用戶的最近book歷史,D_{neg}是隨機挑選的(user-type,listing-type)對。不過我還是有個疑惑:這里session是怎么按照時間進行劃分的?
2019.2.28補充:最近這篇博文,收獲頗多。首先需要指明的是,對于user_type embedding和listing_type embedding的訓(xùn)練使用的數(shù)據(jù)是book session,而不是listing embedding訓(xùn)練中用到的click session。但是使用book session就會帶來數(shù)據(jù)稀疏問題,airbnb的做法是利用一些規(guī)則對user_id和list_id進行聚類,將特征相似的user_id或者list_id設(shè)置為相同的user_type或者list_type。此時一個book session中就對應(yīng)了一類user type的租房歷史記錄,也就是多個用戶的book listing,那么此時session中的租房信息怎么排列呢?博主認(rèn)為還是按照絕對時間排序。同時我們需要注意的是,同一個user_id的可能對應(yīng)多個user_type,因為聚類的規(guī)則中包含時間規(guī)則的,所以一個用戶在不同時期對應(yīng)的user_type也可能不同,這就可能導(dǎo)致同一個用戶的歷史信息被分到不同的session中。我在上文中還提到了“這2種embedding向量是處于同一個空間的”,之前寫這句話時并沒有深入的理解,看了下博主的解釋感覺有所理解了。博主認(rèn)為是將user_type和list_type看作是一樣的item,也就是把session中的元組(user_type, list_type)進行扁平化,再按照word2vec的方式對滑動窗口中心item對應(yīng)的embedding向量進行學(xué)習(xí),不過博主對這點還不是很確定,而評論中另外一位用戶也提出不一樣的數(shù)據(jù)劃分方式。我暫時也不太清楚哪種方式更準(zhǔn)確,或者說時更優(yōu),不過那個評論的用戶有一點我很贊同——user_type embedding和list_type embedding處在相同空間是因為兩者的優(yōu)化目標(biāo)中都使用了相同的網(wǎng)絡(luò)參數(shù)v_c^{'}。為什么要說明下這2種embedding向量是處于同一個空間呢?因為按照原始的word2vvec的思想是沒法訓(xùn)練user_type embedding的,但是這里將兩者放在同一個空間中,也就是將兩者視為相同的item,所以就可以訓(xùn)練user_type embedding了。
??此時還需要考慮房屋主人的出租反饋(確定出租還是拒絕出租)。該特征可以被用來為user-type embedding和listing-type embedding編碼。所以此時對于user-type(u_t)的優(yōu)化目標(biāo)積就變成\mathop{\arg\max}_{\theta} \sum_{(u_t,c) \in D_{book}}\log \frac{1}{1+e^{-v_c^{'}v_{u_t}}}+\sum_{(u_t,c) \in D_{neg}}\log \frac{1}{1+e^{v_c^{'}v_{u_t}}}+\sum_{(u_t,l_t) \in D_{reject}}\log \frac{1}{1+e^{v_{l_t}^{'}v_{u_t}}}而對于listing-type(l_t)的優(yōu)化目標(biāo)就變成\mathop{\arg\max}_{\theta} \sum_{(l_t,c) \in D_{book}}\log \frac{1}{1+e^{-v_c^{'}v_{l_t}}}+\sum_{(l_t,c) \in D_{neg}}\log \frac{1}{1+e^{v_c^{'}v_{l_t}}}+\sum_{(l_t,u_t) \in D_{reject}}\log \frac{1}{1+e^{v_{u_t}^{'}v_{l_t}}}User-type和listing-type embedding對應(yīng)的skip-gram模型如下:

user-type和listing-type對應(yīng)的skip-gram模型.png
其中,a圖沒有考慮host reject這一情況,而b圖考慮了host reject這一情況。
訓(xùn)練細(xì)節(jié):

  1. 根據(jù)30分鐘不活動規(guī)則對用戶點擊序列進行劃分
  2. 將訓(xùn)練集中的booked session過采樣了5倍
  3. 按照時間滑窗不斷更新訓(xùn)練集數(shù)據(jù)(從頭訓(xùn)練比對原模型接著訓(xùn)練效果要好)
  4. embedding size=32,session滑動窗口大小=5(中心房屋前面選5個,后面選5個),epoch=10,利用MapReduce進行訓(xùn)練(300個mappers讀取數(shù)據(jù),1個reducer訓(xùn)練模型)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容