干货 | 强化学习在携程酒店推荐排序中的应用探索
宣云兒,攜程酒店排序算法工程師,主要負(fù)責(zé)酒店排序相關(guān)的算法邏輯方案設(shè)計實施。目前主要的興趣在于排序?qū)W習(xí)、強(qiáng)化學(xué)習(xí)等領(lǐng)域的理論與應(yīng)用。
前言
目前攜程酒店絕大部分排序業(yè)務(wù)中所涉及的問題,基本可以通過應(yīng)用排序?qū)W習(xí)完成。而其中模型訓(xùn)練步驟中所需的訓(xùn)練數(shù)據(jù)集,一般是通過線下收集數(shù)據(jù)來完成的。
然而在實際當(dāng)中,往往存在業(yè)務(wù)新增或者業(yè)務(wù)變更,這就使得使用歷史數(shù)據(jù)訓(xùn)練的模型,并不能很好地用于變更后的應(yīng)用場景。形成該問題的主要原因,是過去所收集的數(shù)據(jù)與實際排序場景并不一致。
為了應(yīng)對類似問題,我們嘗試在城市歡迎度排序場景中引入了強(qiáng)化學(xué)習(xí)。通過實驗發(fā)現(xiàn),增加強(qiáng)化學(xué)習(xí)后,能夠在一定程度上提高排序的質(zhì)量。
一、實際面臨的問題
在目前大部分的實踐中,我們解決排序問題所訴諸的辦法,基本都可以歸為傳統(tǒng)意義上的“排序?qū)W習(xí)”(learning to rank, L2R)。排序?qū)W習(xí)基本的建模過程,是通過收集數(shù)據(jù),構(gòu)建特征,選擇模型,訓(xùn)練模型等步驟實現(xiàn)。
其中第一步收集數(shù)據(jù),往往是以離線的方式完成。常見方法是通過埋點服務(wù)器收集用戶行為數(shù)據(jù),再進(jìn)行模型訓(xùn)練數(shù)據(jù)的構(gòu)建。
在收集數(shù)據(jù)的時候,一般存在一個假設(shè)要求:即我們所收集到的數(shù)據(jù)是和總體數(shù)據(jù)分布保持一致的,模型只要在這個基礎(chǔ)上進(jìn)行訓(xùn)練,所得到的結(jié)果在實際線上業(yè)務(wù)使用時是可靠的。我們暫且稱其為“分布一致假設(shè)”。
當(dāng)業(yè)務(wù)體量足夠大、收集數(shù)據(jù)足夠多時,一般會認(rèn)為這一假設(shè)是成立的。然而在實際當(dāng)中,要滿足分布一致假設(shè)會面臨一系列的挑戰(zhàn)。這其中包含且不限于各種埋點服務(wù)準(zhǔn)確性難以保證,數(shù)據(jù)處理中無法完全避免的數(shù)據(jù)損失,以及收集數(shù)據(jù)時間空間上的限制等問題。
此外,當(dāng)排序應(yīng)用的目標(biāo)是預(yù)測現(xiàn)有數(shù)據(jù)集中不存在的情況時,傳統(tǒng)的排序?qū)W習(xí)將變得無能為力。舉一個商品排序的例子。在排序list結(jié)果展現(xiàn)中,我們設(shè)置業(yè)務(wù)限制:top10的item只能是1000元以上的商品。假設(shè)現(xiàn)在的排序目標(biāo)為點擊率(CTR),從現(xiàn)有數(shù)據(jù)進(jìn)行模型訓(xùn)練后,模型很難準(zhǔn)確地告訴我們一件10元商品出現(xiàn)在top10時它的CTR是多少,因為它根本沒有在這個位置出現(xiàn)過。
這種“預(yù)測不曾在歷史中出現(xiàn)的事件”的需求在實際當(dāng)中并不少見:在多指標(biāo)融合的排序指標(biāo)中(例如排序指標(biāo)是要在CTR和轉(zhuǎn)化率CVR之間做加權(quán)),如何設(shè)置不同子指標(biāo)之間的權(quán)重就是一例。
由于新的權(quán)重下得到的數(shù)據(jù)分布是不存在現(xiàn)有的數(shù)據(jù)集當(dāng)中的,因此無法充分知曉用戶在新的排序結(jié)果下的行為結(jié)果,在新權(quán)重的條件下訓(xùn)練一個模型滿足業(yè)務(wù)目標(biāo)也就無從談起了。
更重要的是,實際上我們很難充分收集數(shù)據(jù):試想,對于同一個用戶,難道我們要將100種不同的權(quán)重參數(shù)所得到的排序結(jié)果,都一一展現(xiàn)給同一個用戶,然后收集其給出的行為結(jié)果么?答案當(dāng)然是否定的。
攜程酒店排序業(yè)務(wù)中,同樣也存在這樣的問題。具體來說有兩點最為明顯:
1)對于內(nèi)外網(wǎng)比價結(jié)果為優(yōu)勢或者劣勢的酒店,我們是否應(yīng)該調(diào)整該酒店的排序位置、以及應(yīng)該如何調(diào)整。這個問題的答案并不是直觀的,因為對不同用戶來說,可能會存在不同的偏好,以及對于不同酒店來說,這一個問題的結(jié)果也可能是不同的。
2)對于歷史上由于業(yè)務(wù)設(shè)置的原因排名靠后的酒店,在個性化排序或者廣告業(yè)務(wù)中若將其位置提前,如何準(zhǔn)確預(yù)測用戶對這些酒店的行為。
這兩個業(yè)務(wù)需求,都可以歸結(jié)為前面提到的無法預(yù)先收集同分布數(shù)據(jù)集的問題,傳統(tǒng)的L2R并不能很好地進(jìn)行支持解決。
二、可能的解決方案
我們再仔細(xì)考慮下“將100個不同排序結(jié)果丟給同一個用戶”這種做法的弊端。毫無疑問,這種暴力的做法雖然似乎能夠充分收集數(shù)據(jù),但事實上是有著極高的成本:極為傷害用戶體驗。
然而,為了能夠讓模型有機(jī)會預(yù)測那些未知的情況,又必然是需要一定的“隨機(jī)探索”,只有這樣我們才能知道實際中用戶的反饋。因此,隨機(jī)探索所帶來的短期損失是無法完全避免的,但最終的目標(biāo)是在于探索所帶來的收益能夠彌補(bǔ)并超過其帶來的損失。
而“強(qiáng)化學(xué)習(xí)”的目標(biāo),恰好和我們的需求不謀而合。
三、談?wù)凴L的背景,它解決的問題
為了方便后的表述,先簡單介紹下強(qiáng)化學(xué)習(xí)(reinforcement learning, RL)的背景,對其概念熟悉的同學(xué)可以略過這一部分。
“強(qiáng)化”的概念起源于行為心理學(xué)派。行為心理學(xué)派主要的概念是說,人的復(fù)雜高級行為,例如恐懼,是可以用過“強(qiáng)化”進(jìn)行塑造的。同巴普洛夫的條件反射不同,心理學(xué)派認(rèn)為生物的行為不需要通過直接的刺激所引起,行為更多地是因為行為本身所帶來的結(jié)果,生物體自發(fā)地執(zhí)行該行為。
舉個例子來說,迷信行為的出現(xiàn),主要的原因是人們認(rèn)為迷信行為會為自己帶來好運,而不是真的會直接讓我們的彩票中獎。
機(jī)器學(xué)習(xí)(machinelearning,ML)領(lǐng)域的RL,就好比是利用這種行為生成理論,訓(xùn)練一個機(jī)器人(agent),讓它能出現(xiàn)我們所期望的行為,以實現(xiàn)我們的目標(biāo)。
簡單來說,RL組成要素包括執(zhí)行動作(action)的agent,agent所在環(huán)境(environment),以及環(huán)境給與agent的反饋(reward)。Agent根據(jù)對環(huán)境的觀察(observation)通過給出action到environment,得到environment對該action的reward,由此agent判斷自己action是否有利并由此進(jìn)行迭代修正,再發(fā)出新的action。
那么它和傳統(tǒng)ML方法有什么差別呢?在我的理解來看,RL之所以能夠處理一些傳統(tǒng)ML無法做到的事情,主要是在于其具有探索(exploration)能力,以及其長期累計收益最大化(maximize long term cumulative reward)的學(xué)習(xí)目標(biāo)。
我們耳熟能詳?shù)腞L應(yīng)用例子Alpha Go為例,之所以它能夠擊敗人類職業(yè)棋手,依靠的就是RL可以通過探索獲得更好的長期收益,而不是完全地從人類歷史棋譜中進(jìn)行監(jiān)督學(xué)習(xí),從而實現(xiàn)對人類的超越。
對于我們前面提到的L2R無法處理的問題,也同樣可以訴諸RL途徑。例如前面提到電商排序問題,通過RL的exploration機(jī)制,讓排序在后面的商品有機(jī)會以一定的概率在靠前位置曝光,并且在長期收益最大化的目標(biāo)保證下,能夠讓我們隨機(jī)探索的收益大于其帶來的代價。
四、RL和業(yè)務(wù)結(jié)合應(yīng)用的思考過程,詳述實踐內(nèi)容和碰到的問題,分步驟的實踐方案
再回到前面提及的酒店排序中遇到的兩個問題。我們認(rèn)為RL是解決這兩個問題的不二途徑。成功實施RL的關(guān)鍵點在于如何設(shè)計RL中各要素以滿足業(yè)務(wù)的需求。為此我們預(yù)先設(shè)計了幾套循序漸進(jìn)的方案。
第一個方案,我們就姑且稱其為“方案A”吧。方案A我們主要將其作為一個小規(guī)模探索,摸清流程和潛在的問題。在這個方案里,我們將不會花過多的時間在特征構(gòu)建等問題上,主要是將RL的流程實現(xiàn),并觀察其帶來的結(jié)果。
具體來說,我們計劃在主排序的線性模型基礎(chǔ)之上,對線性模型的若干維度進(jìn)行權(quán)重調(diào)整,以實現(xiàn)對排序結(jié)果的調(diào)整。而RL的目標(biāo),就是學(xué)習(xí)這些對權(quán)重做出調(diào)整的“超參”,從而能夠依照不同的輸入數(shù)據(jù),得到更優(yōu)的排序序列。在粒度控制上,我們以城市為單位進(jìn)行action輸出,這樣做的主要考量是數(shù)據(jù)部分的工程復(fù)雜性。
算法選擇上,我們選擇使用DQN。DQN作為value base的RL算法,無法給出連續(xù)區(qū)間的控制輸出,這就意味著我們給出的權(quán)重調(diào)整需要預(yù)先定義一些固定的區(qū)間,但其易用性是我們在方案A中選擇它的理由之一。
在工程實現(xiàn)上,RL最大的挑戰(zhàn)在于action發(fā)出與reward回收的環(huán)節(jié)對實時性的要求較高。在方案A我們打算利用現(xiàn)有Kafka環(huán)境,通過消息同步的方式連接前后端,進(jìn)行action與reward數(shù)據(jù)匹配。這樣的額外工程量最小。
但問題也很明顯:Kafka當(dāng)時是對全業(yè)務(wù)埋點進(jìn)行統(tǒng)一定時處理,勢必存在更新緩慢延遲過大的問題,且發(fā)出action后與實際權(quán)重更新發(fā)送到前端存在不可控的時間差,由此帶來的缺陷便是RL模型update頻率被明顯拖慢,agent可能需要上線很久才能達(dá)到可用的狀態(tài)。
在第二步,我們稱為“方案B”,將主要改造action與reward數(shù)據(jù)的發(fā)送回收環(huán)節(jié)。方案A中的Kafka環(huán)境實時性不高,在方案B中,我們將采用storm實現(xiàn)流式處理,從而實現(xiàn)較為實時的action發(fā)送。在獲取reward數(shù)據(jù)時,我們也能夠更便捷地匹配到其對應(yīng)的action。
這樣一來便能夠顯著提升agent學(xué)習(xí)頻次。此外,由于避免了復(fù)雜前后端消息同步,算法的調(diào)整粒度也能夠從城市粒度進(jìn)一步提升為酒店粒度至用戶粒度,從而提升RL的潛在效能。
在方案B中,我們也將對數(shù)據(jù)維度做進(jìn)一步的豐富化。我們當(dāng)前正在進(jìn)行對酒店以及用戶的embedding表征學(xué)習(xí),在現(xiàn)有模型的線下測試中取得了一定效果。這些embedding維度也將在第二步方案中融合成為RL模型的輸入維度。
第三步方案C,我們則會將精力集中在算法的調(diào)優(yōu)上。在解決了數(shù)據(jù)同步以及粒度問題后,我們打算在方案C中嘗試不同的RL模型,目標(biāo)是保證效果的前提下,能夠用更少的參數(shù)量、更少的算法訓(xùn)練時間,以優(yōu)化整個RL部分。
首先考慮可以改進(jìn)替換的算法為DDPG。DDPG為基于value的actor-critic RL算法。首先來說,由于開銷限制,即使使用了流式處理,模型在線更新頻次也不能做得非常高,那么同樣具有experience replay機(jī)制的DDPG能夠更好地實現(xiàn)較高的數(shù)據(jù)訓(xùn)練效率。此外,DDPG的actor部分可以實現(xiàn)連續(xù)值輸出,從而能夠讓控制更為平滑。
方案A的DQN模型,其輸出值是離散的,因而需要人為將參數(shù)調(diào)整范圍進(jìn)行分段,分段的多少以及每一段區(qū)間設(shè)置需要人為指定。DDPG還有其改進(jìn)算法TD3,能夠進(jìn)一步穩(wěn)定Q網(wǎng)絡(luò)輸出,緩解TD error的大幅度波動。
另一方面,我們可以使用policy gradient的算法,例如A2C,TRPO等,與前面value base的算法進(jìn)行對比選優(yōu)。在有一些工作中,提到相比DDPG,TRPO等能夠減低由于Q-value估計的波動帶來的不穩(wěn)定性。但在我們看來,這些policy base方法由于其action輸出存在隨機(jī)性,對訓(xùn)練數(shù)據(jù)量的要求可能會更高。
最后,我們也將會考慮嘗試基于高斯過程(Gaussian process, GP)的湯普森采樣(Thompsonsampling)的算法方案。領(lǐng)英在它的首頁混排排序問題中,就應(yīng)用了這樣的構(gòu)架。
前面提到的一系列RL算法都是需要構(gòu)建深度神經(jīng)網(wǎng)絡(luò)(DNN),需要依賴TensorFlow或者PyTorch來實現(xiàn)。而基于GP的方案基本只涉及相對簡單的數(shù)值計算。當(dāng)然,作為非參數(shù)模型,需要額外空間來存放樣本數(shù)據(jù)。
總結(jié)一下我們的RL實施規(guī)劃,主要包含了前期的流程探索,打通流式數(shù)據(jù)處理并豐富數(shù)據(jù)維度,以及后期的各種算法嘗試及調(diào)優(yōu)這樣三個階段。
五、最后的實踐說明,初步探索
現(xiàn)在我們已經(jīng)完成了方案A的實施,通過結(jié)果初步說明了RL起到了一定的作用。接下來將詳細(xì)介紹下我們的做法,以及過程中遇到的問題。
整體上RL模型將會依據(jù)輸入數(shù)據(jù),調(diào)整現(xiàn)有模型的某些重要的權(quán)重值。RL模型的輸入值包括了全網(wǎng)比價結(jié)果,以及城市粒度的默認(rèn)排序相關(guān)統(tǒng)計維度。
首先,我們定義agent 的action用于調(diào)整現(xiàn)有線性排序模型的參數(shù)WBase_model。
其中,alpha即為agent輸出值。
接下來,我們構(gòu)造reward函數(shù)為:
即我們的優(yōu)化目標(biāo)為增加了RL模型的流量分桶,能夠比原模型流量分桶的轉(zhuǎn)化率(CR)更高,也就是最大化CR優(yōu)勢。
模型選擇及參數(shù)設(shè)置。在方案A中,我們沒有對算法選擇和參數(shù)設(shè)置上做太多的調(diào)整。值得說明的一點是,我們將DQN中Bellman Equation更新部分的衰減參數(shù)γ設(shè)置為0,意味這我們的優(yōu)化的目標(biāo)是一步達(dá)成更優(yōu)的CR,而不考慮多步馬爾科夫決策過程(MDP)。
顯然這是一個簡化操作,但我們認(rèn)為在城市粒度上,追求多步MDP意義不大,設(shè)置γ=0能夠簡化模型。當(dāng)粒度細(xì)化到單獨一個用戶時,考慮MDP將更為有價值。
模型調(diào)整的粒度。我們前面講到,方案A是按照城市粒度進(jìn)行參數(shù)調(diào)整的。當(dāng)agent對某個城市給出一個action后,經(jīng)過一個時間片回收reward結(jié)果,作為模型的訓(xùn)練依據(jù)。考慮城市粒度,主要是為了平衡數(shù)據(jù)量和同步難度:如果將整個默認(rèn)排序進(jìn)行調(diào)整,RL作用的價值有限;而若以更細(xì)粒度進(jìn)行,數(shù)據(jù)實時同步又會比較困難。
更新時間片長度的設(shè)置。模型所需的reward反饋依賴于由Kafka給出的埋點記錄數(shù)據(jù),而當(dāng)時是全業(yè)務(wù)埋點統(tǒng)一定時處理的,造成reward收集存在很大的時間間隔。此外,在模型給出action到最終在前端權(quán)重更新也存在較大延遲。
為了應(yīng)對這個問題,我們增加了前端的消息同步,以確保action與回收的reward能夠一一對應(yīng)。但這并不能改善模型更新頻次少、更新延遲的問題。我們原計劃是每一個小時進(jìn)行數(shù)據(jù)更新,但在極端情況下,模型更新間隔被拉長到了3個小時,對模型的效果形成了較大的影響。
最后,我們來看下線上實驗的效果。我們選擇了北上廣深四個城市觀察,發(fā)現(xiàn)這四個城市的累積reward雖有上下波動,但總趨勢為正向增長。但同時也應(yīng)注意,累積reward值絕對數(shù)值較小,對其評估還需要更多的實驗。
六、總結(jié)
我們從傳統(tǒng)L2R應(yīng)對探索問題能力不足談起,介紹了RL的背景以及其對這類平衡探索與收益問題的適應(yīng)性。在此基礎(chǔ)上,我們結(jié)合排序業(yè)務(wù)出發(fā),制定了循序漸進(jìn)的若干RL應(yīng)用方案,以期能夠利用RL的優(yōu)點,滿足排序業(yè)務(wù)的需求。
此外,對初步探索中我們的實踐與碰到的問題做了詳細(xì)的討論,并在最后通過對線上結(jié)果實驗的分析,說明了RL能夠起到一定的作用,但還需要更進(jìn)一步的應(yīng)用和實驗,以加強(qiáng)RL能夠帶來正向作用的結(jié)論。
接下來我們將首先對數(shù)據(jù)處理構(gòu)架方面進(jìn)行改進(jìn),利用流式處理構(gòu)架,并嘗試探索更為適合算法的以進(jìn)一步釋放RL的效能,從而實現(xiàn)更優(yōu)的排序結(jié)果,進(jìn)一步降低用戶費力度、提升用戶使用體驗。
總結(jié)
以上是生活随笔為你收集整理的干货 | 强化学习在携程酒店推荐排序中的应用探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM 最多支持多少个线程?
- 下一篇: 干货 | 云计算时代携程的网络架构变迁