背景介紹
論文《Real-time Personalization using Embeddings for Search Ranking at Airbnb》是airbnb公布的房源推薦算法,獲得了2018年的KDD最佳論文,論文基于airbnb的房源推薦場景,需要對客人和房主都進(jìn)行有效的推薦,即用戶輸入目的地和行程日期進(jìn)行搜索時(shí),將位置、價(jià)格、風(fēng)格和評價(jià)等方面對用戶有吸引力的房子排前,也要考慮房主的偏好,將可能會拒絕客人的排名名降低,比如用戶評價(jià)差,有寵物,人數(shù)等。論文主要服務(wù)于相似物品的推薦和搜索排序兩個(gè)場景,前者是用戶在瀏覽一個(gè)房源時(shí),界面上的相似房源推薦,后者是用戶進(jìn)行搜索后的房源展示順序,99%的房源預(yù)定都發(fā)生在這兩個(gè)場景下,算法的最終目標(biāo)是提升推薦房源的預(yù)訂率,論文所說的實(shí)時(shí)的個(gè)性化推薦,是根據(jù)用戶和房主的實(shí)時(shí)行為對房源的推薦進(jìn)行一定的調(diào)整,需要注意的是文章的標(biāo)題是設(shè)計(jì)了一些embedding的方法用于實(shí)時(shí)的個(gè)性化推薦,而非實(shí)時(shí)的更新。
Embedding可以將高維的id/類別類特征轉(zhuǎn)換為稠密、連續(xù)的向量,向量之間可以計(jì)算夾角計(jì)算相似性,也便于神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。embedding的計(jì)算常見的有兩種:
- 有監(jiān)督學(xué)習(xí),end-to-end。embedding作為優(yōu)化變量,隨機(jī)初始化,在優(yōu)化最終logloss的過程中,得到有意義的embedding作為“副產(chǎn)品”,Youtube對video_id、Wide&Deep對app_id、Deep Interest Network對商品id的embedding都是這一思路。
- 無監(jiān)督學(xué)習(xí),兩步走。以Item2vec: Neural Item Embedding for Collaborative Filtering為代表。第一步,就是簡單套用word2vec的思路,在電商場景,就將word2vec中的句子換成購物車,將單詞換成商品;新聞推薦場景中,將句子換成session,將單詞換成文章。再直接調(diào)word2vec算法,就得到商品、文章的embedding向量。第二步,這些embedding向量,可以用于召回,可以用于第一類方法的embedding矩陣的初值,也可以當(dāng)特征喂入其他模型。
本文的embedding計(jì)算方式屬于第二種。
論文重點(diǎn)內(nèi)容
這篇論文的重點(diǎn)可以分為以下三個(gè)部分:
- Listing Embeddings
- Listing_type Embeddings 和 User_type Embeddings
- 兩類embedding如何用戶實(shí)時(shí)的個(gè)性化推薦
這里的listing表示房源,listing_type和user_type是粗粒度的房源類型和用戶類型,文章的重點(diǎn)是提出了與業(yè)務(wù)緊密結(jié)合的embedding方法。下面將分別對每種embedding的設(shè)計(jì)原理、有效性驗(yàn)證和如何應(yīng)用于實(shí)時(shí)的個(gè)性化推薦進(jìn)行詳細(xì)的說明。
Listing Embedding
論文用點(diǎn)擊行為表示用戶的短期興趣,基于用戶的Listing點(diǎn)擊序列,得到每個(gè)listing的embedding。看似平淡無奇,但是有一些別致的設(shè)計(jì):
序列的構(gòu)建
每個(gè)序列都由某個(gè)用戶的點(diǎn)擊時(shí)間構(gòu)成,按時(shí)間先后順序排序,相隔超過30min的點(diǎn)擊時(shí)間被隔開為不同的序列。
原始計(jì)算方法+負(fù)采樣
類似于word2vec中的skip-gram算法,窗口大小為2m,softmax損失函數(shù),要優(yōu)化的目標(biāo)函數(shù)為:
其中
vl表示房源l的向量表示。
采用了隨機(jī)負(fù)采樣
其中Dp表示正例,Dn表示負(fù)采樣的正例,l表示Listing,c表示上下文。
采用了隨機(jī)梯度下降的優(yōu)化方法。
增加預(yù)定的Listing為全局內(nèi)容
最初的版本是上圖中橙色的部分,用戶的點(diǎn)擊序列可以分為兩類,以預(yù)定為結(jié)尾的和只有點(diǎn)擊沒有預(yù)定,為了讓embedding的構(gòu)造不僅體現(xiàn)出相鄰上下文的相似關(guān)系,也能體現(xiàn)出最后的預(yù)定信息,可以對以預(yù)定為結(jié)尾的序列,將預(yù)定的Listing作為全局的上下文,每次窗口滑動時(shí)都作為正例參與訓(xùn)練,即每次訓(xùn)練都加上圖中紫色的Listing,有點(diǎn)類似于doc2vec中的設(shè)置,目標(biāo)函數(shù)的最后一項(xiàng)體現(xiàn)了這一點(diǎn)。
針對搜索的市場集中的特點(diǎn)增加負(fù)例
訂房的搜索結(jié)果通常限制在某一個(gè)市場區(qū)域中,就容易導(dǎo)致正例集合Dp中包含的Listing都來自同一個(gè)市場區(qū)域,而反例由于隨機(jī)采樣包含各個(gè)市場區(qū)域,這樣就導(dǎo)致同一個(gè)市場的Listing的embedding訓(xùn)練不充分,所以文章又增加了一些搜索區(qū)域的負(fù)例,用集合Dmn表示,在目標(biāo)函數(shù)上的體現(xiàn)如下:
Listing的冷啟動Embedding設(shè)置
對于新的Listing,肯定沒有embedding可用,文章利用新Listing的一些基本信息,比如位置、價(jià)格、類型等,找到三個(gè)基本距離最近、類型、價(jià)位相同的已有Embedding的Listings,將它們的Embedding做平均,作為新Listing的初始Embedding,這樣的設(shè)定可以覆蓋98%的新Listing。
Listing的Embedding有效性初步驗(yàn)證
文章在上線這種方法之前先進(jìn)行了Embedding效果的觀察,分三個(gè)方面:
- 觀察Kmeans分到同一蔟的Listing的地理位置是否相近,考察了Embedding對市場區(qū)域的相似度的學(xué)習(xí)情況,結(jié)果發(fā)現(xiàn)同一蔟的Listing地理位置相近,學(xué)習(xí)有效,聚類結(jié)果還可以反過來幫助市場區(qū)域的劃分;
- 用cosine相似度評估相同類型、相同價(jià)格區(qū)間的Listing相似度,比較發(fā)現(xiàn)類型相同、價(jià)格區(qū)間相同的Listing往往相似度更高;
-
用KNN找一些特殊結(jié)構(gòu)、類型的Listing最近鄰,考察Embedding對房屋結(jié)構(gòu)和風(fēng)格這種不易挖掘的相似度學(xué)習(xí)情況,結(jié)果找到的最近鄰?fù)彩怯邢嗨频慕Y(jié)構(gòu)和風(fēng)格,比如城堡、樹屋等。
實(shí)際應(yīng)用中的生成和更新
訓(xùn)練Listing Embedding用了8億點(diǎn)擊序列,使用了登陸的用戶,按id進(jìn)行g(shù)roup并按時(shí)間排序,30min無動作則隔開,并且移除了停留時(shí)間短(30s)和過短的序列(<2),最后進(jìn)行匿名訓(xùn)練,并且對預(yù)定結(jié)尾的序列進(jìn)行了5倍的過采樣,訓(xùn)練了450萬的Listing embedding。
文章使用滑動窗口,每天都對Embedding進(jìn)行更新,并發(fā)現(xiàn)重新訓(xùn)練比在之前的結(jié)果上進(jìn)行增量訓(xùn)練效果更好,學(xué)習(xí)到的embedding維度為32,Skip-gram窗口大小為10(前5后5)。使用時(shí)將Embedding結(jié)果加載在內(nèi)存,并用map reduce進(jìn)行實(shí)時(shí)計(jì)算。
User-type & Listing-type Embeddings
通過點(diǎn)擊序列得到的Embedding主要體現(xiàn)了相同市場區(qū)域的Listing相似度,反映了用戶短期的興趣,但是用戶長期的興趣也依然有用,比如用戶搜索了Los Angeles的Listing,他之前在New York和London也有預(yù)定信息,就可以給他推薦和之前預(yù)定相似的Listing。于是文章就希望利用用戶的預(yù)定序列,生成能反映長期興趣的User Embedding和Listing Embedding,分別對應(yīng)租客和房源的長期興趣。
但是對每個(gè)用戶或者Listing都生成預(yù)定序列用類似上文的學(xué)習(xí)方法面臨著一些現(xiàn)實(shí)挑戰(zhàn):
- 用戶的預(yù)定序列數(shù)據(jù)量少,預(yù)定的數(shù)據(jù)量遠(yuǎn)少于點(diǎn)擊;
- 有很多用戶只有一次預(yù)定記錄,序列長度只為1,無法使用;
- 能有效學(xué)習(xí)到Embedding的對象至少需要出現(xiàn)5-10次,這樣的限制條件使得能用的數(shù)據(jù)量更少了;
- 預(yù)定發(fā)生時(shí)間跨度較長的話,用戶的偏好可能會發(fā)生變化。
基于以上現(xiàn)實(shí)業(yè)務(wù)情況考慮,文章決定不以User ID和生成預(yù)定序列,而是粗化粒度,從用戶類型和Listing類型的角度生成embedding。
User type和Listing type的構(gòu)造
文章通過規(guī)則映射的方式將用戶和Listing劃分成不同的類別,如下兩張表所示,以用戶為例,首先根據(jù)一些基本信息或歷史消費(fèi)信息,根據(jù)每一維度不同取值劃分成不同的桶,不同用戶就會落入到不同的桶中,再綜合考慮所有維度,就得到了每個(gè)用戶的類別,特別的,隨著時(shí)間的拉近,不同時(shí)段的用戶的類別可能不同,不同Listing的類別也可能不同。
另外,一些只有基本信息可以利用的用戶分到的類別還可以起到冷啟動的作用。
得到在相同向量空間的結(jié)果
如果用戶向量和Listing向量在相同的向量空間中,就可以直接通過相似度計(jì)算來體現(xiàn)二者的契合匹配程度。
文章利用用戶的預(yù)定序列,將用戶ID和預(yù)定的Listing ID都替換成各自對應(yīng)的type,然后以用戶、Listing交替的方式排列組成可用的序列,值得注意的是,這里每個(gè)序列都是某一個(gè)用戶的預(yù)定記錄,但是用戶的類型和Listing的類型是會隨著時(shí)間變化的。如下圖所示,Ut代表User type,Lt代表Listing type,這里是要對Uti進(jìn)行更新。
和Skip-gram類似的,采用了滑動窗口,每次對窗口中心的元素進(jìn)行更新,對User type和List type的更新公式是類似的。
User type:
Listing type:
其中,book表示預(yù)定,正例,neg是反例,負(fù)采樣,C表示上下文,包括了User type和Listing type,這樣使得學(xué)習(xí)到的embedding在同一個(gè)向量空間。
這樣構(gòu)造的Listing type分布在各個(gè)市場區(qū)域,沒有必要進(jìn)行額外市場區(qū)域的負(fù)采樣了。
加入拒絕信號
點(diǎn)擊和預(yù)定反映了用戶的興趣,但是在airbnb里,戶主是可以拒絕用戶預(yù)定的,拒絕是個(gè)強(qiáng)烈的反映戶主偏好的信號,在得到的embedding中,戶主和他討厭的用戶類型不能是相似的,如果相似了進(jìn)行推薦,也是不利于提升預(yù)訂率的。基于這方面的考慮,文章將拒絕信號加入了目標(biāo)函數(shù)中:
兩類embedding如何用戶實(shí)時(shí)的個(gè)性化推薦
論文主要服務(wù)于相似物品的推薦和搜索排序兩個(gè)場景,前者是用戶在瀏覽一個(gè)房源時(shí),界面上的相似房源推薦,用到了Listing Embedding,后者是用戶進(jìn)行搜索后的房源展示順序,Listing Embedding和User/Listing Type embedding都有使用。
相似房源推薦
之前的方法是利用search model的結(jié)果,經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn)直接用Listing embedding找相似就可以達(dá)到比之前更好的效果,經(jīng)過線下驗(yàn)證后上線,相似房源的點(diǎn)擊率增加了20%以上。
這是線下評價(jià)指標(biāo)圖,藍(lán)色表示baseline,其余的分別表示利用不同目標(biāo)函數(shù)公式后的結(jié)果,縱坐標(biāo)表示預(yù)定的Listing在相似中的排名,數(shù)值越低越好,橫坐標(biāo)表示距離預(yù)定的點(diǎn)擊次數(shù),可以看出使用了embedding的方法在早期點(diǎn)擊的優(yōu)勢最為明顯,添加了預(yù)定信息和區(qū)域負(fù)采樣的embedding方法效果最好。
搜索排序模型
原始的搜索排序模型利用了Listing/user/query的feature以及它們之間交互信息的feature,根據(jù)用戶對搜索結(jié)果的交互,設(shè)定了一些label,包括{0, 0.01, 0.25, 1, -0.4},0表示房源有曝光但是沒點(diǎn)擊,0.01表示用戶點(diǎn)擊了房源,0.25表示用戶聯(lián)系了房東但是并沒有預(yù)訂,1表示房源預(yù)訂成功,-0.4表示房東拒絕了用戶的預(yù)訂。采用的是GBDT(Gradient Boosting Decision Trees)回歸算法。
文章利用了用戶實(shí)時(shí)的點(diǎn)擊等信息來構(gòu)造新的相似特征加入到GBDT算法中,具體地,將用戶最近兩周有行為的房源做個(gè)分類,一共包括6個(gè)類別,1)用戶擊過的房源,用 H_c 表示;2)用戶點(diǎn)擊并且停留時(shí)長超過60秒的房源,表示長點(diǎn)擊房源,用 H_lc 表示;3)曝光卻沒有點(diǎn)擊的房源,用 H_s 表示;4)用戶加入收藏的房源,用 H_w 表示;5)用戶聯(lián)系過房東但是卻未預(yù)訂的房源,用 H_i 表示;6)用戶在過去兩周內(nèi)預(yù)定過的房源,用 H_b 表示。將候選房源與上述6個(gè)類別的房源計(jì)算相似度,作為特征加入到搜索排序模型中,如圖10的前6個(gè)特征,EmbClickSim, EmbSkipSim等。這些數(shù)據(jù)都是用的用戶最近兩周的行為,表示用戶的短期興趣。
具體如何計(jì)算,我們以 H_c 為例進(jìn)行介紹,其他5個(gè)類別的計(jì)算方法相同。對于每個(gè)類別,根據(jù)城市再一次進(jìn)行劃分,比如H_c中的房源來自于New York和Los Angeles兩個(gè)城市,將H_c劃分為H_c(NY)和H_c(LA)。將 H_c(NY) 中所有房源的embedding求平均,作為centroid embedding,然后計(jì)算當(dāng)前候選房源與centroid embedding的余弦相似度。類似的,計(jì)算候選房源與 H_c(LA) 的centroid embedding的余弦相似度。最后,取兩個(gè)相似度的最大值作為EmbClickSim。如果 H_c 中的房源來自于兩個(gè)以上城市,也是相同的計(jì)算方法。
下圖表示了各個(gè)特征的重要性和覆蓋率,可以看到,UserTypeListingTypeSim, EmbClickSim和EmbSkipSim的覆蓋度較高。第3列顯示了特征的重要程度,分母表示一共有104個(gè)特征,分子表示該特征的重要程度排名。
對User type和List type embedding的利用就是查詢現(xiàn)在的用戶的類別和Listing的類別,求出二者的相似性作為特征。
引入 embedding features后,線上NDCU提升2.27%,booking DCU增長2.58%
總而言之,
對Listing Embedding的使用:通過獲取并實(shí)時(shí)更新用戶歷史兩周的點(diǎn)擊等信息,構(gòu)造了不同的集合,再對需要排序的Listing,計(jì)算到各個(gè)集合中Listing的相似度,作為特征加入模型中。
對User/Listing Type Embedding的使用:獲取當(dāng)前用戶的類型和要排序的Listing的類型,計(jì)算相似度,作為特征加入模型中
在實(shí)際應(yīng)用時(shí),都將embedding或相似度加載到后端中,便于快速計(jì)算,維度設(shè)置成32也是性能和成本trade-off的結(jié)果。
參考文獻(xiàn):
https://astro.temple.edu/~tua95067/kdd2018.pdf
https://zhuanlan.zhihu.com/p/57234648
https://www.zhihu.com/question/302288216/answer/530729525