苗大東:京東基於強化學習的電商搜索排序算法

分享嘉賓:苗大東 京東 算法工程師

編輯整理:吳祺堯 加州大學聖地亞哥分校

出品平臺:DataFunTalk

導讀: 電商場景的搜索排序算法根據用戶搜索請求,經過召回、粗排、精排、重排與混排等模塊將最終的結果呈現給用戶,算法的優化目標是提升用戶轉化。傳統的有監督訓練方式,每一步迭代的過程中優化當前排序結果的即時反饋收益。但是,實際上用戶和搜索系統之間不斷交互,用戶狀態也在不斷變化,每一次交互後排序結果和用戶反饋也會對後續排序產生影響。因此,我們通過強化學習來建模用戶和搜索系統之間的交互過程,優化長期累積收益。目前這個工作已經在京東全量上線。

今天的介紹會圍繞下面五點展開:

01 搜索排序場景及算法概述

首先和大家分享下搜索排序的典型場景以及常用的算法。

搜索排序場景下的主要優化目標是提升用戶轉化率,常用的算法分別從用戶建模角度(DIN、DIEN、Memory Network 等)和多目標建模角度(ESMM、MOE、MMOE 等)進行設計。這些模型都採用了有監督的訓練方式,在每一步迭代的過程中都是優化當前排序結果的即時獎勵。而實際上用戶和搜索系統之間存在交互,用戶狀態是不斷改變的,這也使得每一步排序結果和反饋跟後續排序有相關性。爲了提升搜索精排的效率,我們使用強化學習來建模用戶和搜索系統之間的交互過程,並且考慮對後續排序結果影響帶來的長期價值。

02 強化學習在搜索排序中的建模過程

我們的工作經過整理後發表在 2021CIKM 上,接下來介紹的算法也主要與這篇論文相關。

首先介紹強化學習在搜索排序中的建模。強化學習的優化目標是長期價值的期望最大化。如上圖公式中所示,長期價值期望 Q 是在一個狀態下,執行一個動作後,當前時刻的即時獎勵和後續時刻帶來的累積折損獎勵之和。它和有監督學習的最主要區別在於後者通常優化當前決策帶來的即時收益,而強化學習是去優化決策的長期價值。

在搜索場景下強化學習的建模過程如上圖所示,當用戶(即強化學習中的 environment)發起一次搜索請求時,我們的排序引擎會基於當前用戶的狀態,選取一個排序動作(排序動作即爲對候選商品進行打分)並將排序結果呈現給用戶。用戶在看到排序結果後會做出一系列反饋,如下單或者點擊。此時,用戶的狀態會發生變化,排序模塊會收到用戶的反饋(即獎勵)。排序模塊收到獎勵之後會對策略進行迭代優化,進而在收到下一次用戶請求時會基於新的用戶狀態和排序策略進行下一步動作的執行。

基於上述完整算法流程,我們需要對用戶狀態進行建模,並且對排序策略建模優化長期價值。強化學習的建模思路主要依照其四要素:狀態、動作、獎勵的設計以及算法的選擇。在業界對於強化學習在搜索排序的應用也有一些研究,我們主要參考了阿里巴巴的一篇論文以及 2019 年 YouTube 強化學習在推薦中的應用的論文。但是,經過一些實驗後,我們最終的方案和業界還是存在比較大的差異。

首先,阿里的那篇文章是建模用戶在單次搜索中多次翻頁情況下的序列決策過程,即當用戶在一次請求後,模型會考慮當前頁的及時反饋以及後續翻頁後反饋帶來的影響,對應的優化目標是用戶單次搜索多次翻頁的場景價值。而我們的方案進一步考慮了用戶多次搜索的決策過程,因爲用戶在發生購買行爲前會經過一系列搜索決策。具體地,我們會考慮用戶在本次搜索結果的即時獎勵以及對後續搜索結果影響的長期價值,對應的優化目標是用戶在整個搜索決策過程中的長期價值。結合具體的建模過程以及工業界落地的時候針對時效性的考慮,我們的技術路線主要包括兩個方面:

03 基於 RNN 的用戶狀態轉移建模

我們線上的 baseline 是一個基於 DIN 的模型, 建模目標商品與用戶歷史行爲序列中商品的關係,從而對用戶的狀態進行表徵。但是我們還希望序列化建模用戶的狀態變化,這是 DIN 無法實現的。與此同時,線上的用戶狀態也在實時不斷地變化更新,所以我們需要通過一種方式實時捕捉線上的反饋,並對用戶狀態的變化做一個表徵。具體解決方案分爲三個方面:

1. 數據層面

在數據層面,通常來說,訓練樣本的構造方式是用戶在某次搜索下的所有商品,並進行展開,如上圖左下所示,這些樣本就成爲傳統有監督學習的訓練數據。爲了把用戶的搜索數據進行時序展開,我們進行了兩步操作:

首先,我們會把用戶在一個搜索 session 下所有的曝光商品結合在一起(無序的);然後,用戶的搜索 session 會按照時間進行排序,並將其放入用戶索引下。

在樣本輸入模型之前我們需要對其進行轉化。比如在訓練 RNN 模型時,輸入的 batch size 即爲用戶數量,在 RNN 每一個 time step 輸入用戶的一個 session(即用戶的一次請求),其中包含請求中所有商品的特徵。

2. 模型層面

爲了兼容 baseline 的 DIN 模型,我們將 DIN 生成的特徵作爲 attention feature 加入模型。在每一個 timestep,用戶對應 session 下的所有商品特徵會經過一個 GRU,得到每個商品的輸出向量以及隱狀態向量,而隱狀態向量會與下一個 timestep 的 session 特徵一起作爲新的輸入傳遞進 GRU,並對 GRU 進行狀態更新。在這個過程中,用戶當前時刻的狀態依賴於上一時刻的狀態以及當前時刻的輸入,因此它是一個序列化建模的過程。

但是,實際在模型訓練時,我們需要考慮到用戶搜索數量的差異。具體地,某個用戶可能有上百次搜索請求,而其他用戶只有幾十個甚至幾個請求。訓練 RNN 時爲了保證輸入長度的一致我們會加入 padding,搜索請求數量的巨大差異導致不必要的開銷,對 RNN 的性能產生影響。基於這一問題,我們會將搜索長度較短的用戶進行篩選並進行拼接,進而減少不必要的 padding。經過實驗,優化後的 RNN 訓練效率提升了約三倍。

3. 架構層面

針對用戶狀態的實時增量更新,我們使用的架構可以分爲三個模塊,並針對目標進行對應的優化。

我們使用 RNN 用戶狀態轉移建模對精排進行了全量更新。離線情況下 session 的 AUC@10 相較於基於 Attention 機制的 baseline 模型提升了 0.58%。在線 AB 實驗後,在用戶的轉化率以及每個用戶帶來的 GMV 上也分別有顯著的提升。

04 基於 DDPG 的長期價值建模

我們想通過強化學習來建模用戶和搜索系統之間的交互,在整體上優化長期累積收益。在具體落地時,算法需要根據動作設計、狀態設計、獎勵設計、算法選擇來分爲多個階段:

首先我們基於搜索任務設計動作空間,然後基於用戶的搜索行爲使用前述的 RNN 模型進行狀態建模,接着我們會基於搜索排序的優化目標設計獎勵,最後基於整個策略迭代的收斂性和穩定性選擇相應的學習算法。

首先,考慮長期收益的優勢在於它納入了後續篩選帶來的累積收益,而有監督學習的每一步都是在優化特徵與轉化 label 之間的直接關係。對於動作設計,由於我們面對的是一個排序任務,所以動作即爲對候選商品的打分。我們在模型訓練階段選擇了 pairwise 的訓練方式,所以我們需要對輸入樣本的形式進行一些改動。具體地,我們會從用戶的每個 session 中把每一個正樣本保留下來,並對應地隨機採樣一個負樣本,從而形成一個樣本對。對應地,在訓練過程中動作便轉化爲對構造的正負樣本對進行打分。

由於我們採用 pairwise 的訓練方式,我們採用的獎勵函數是根據正負樣本的分差進行構建的。我們的優化目標是用戶轉化率,所以我們希望在模型對正負樣本對進行打分時,不僅排序可以正確,而且正樣本與負樣本的分差儘可能大。所以,獎勵函數設計時,如果正樣本和負樣本排序正確時,分差越大獎勵越大;反之,我們希望分差越大乘法也越大。上圖中我們給出了三種獎勵函數的設計:常數 reward、交叉熵 reward 以及 sigmoidreward。

我們對這些 reward 做了一些實驗。常數 reward 在我們的場景下指標一直是振盪的,收斂性比較差,主要原因是隻要模型打分順序正確,它給予的都是固定的獎勵,這就導致了若兩個商品打分分別爲 0.51 與 0.49,雖然它們的區分度不高,但是獎勵與其他樣本對是一致的。

此外,在比較交叉熵 reward 以及 sigmoid reward 時,我們發現交叉熵 reward 一直是一個負值,而具有正值收益的 sigmoid reward 相較於前者有了 0.16% 的指標提升。

強化學習的根本任務是智能體基於環境狀態和交互反饋,學習能讓長期價值最大化的策略。一般地,有三種方法進行建模:

我們在線上分別對這第一、第三種方式進行過實驗,最後發現 Actor-critic 的建模方法效果較好,於是選擇使用這種框架進行算法迭代。

現在就來具體介紹一下 DDPG 的網絡結構。整個網絡包含三個模塊:

整個網絡設計了兩種損失函數。第一個爲 PolicyGradient 的損失函數,它的作用是優化 Actor 網絡的參數,使得其輸出的 action 的長期價值最大;另一個爲時間差分的損失函數,作用是優化 Critic 網絡,使得其可以對 Actor 輸出的動作給出的長期價值的評估越來越準。

在網絡訓練過程中我們也遇到了很多難點,其中最重要也是最常見的問題便是穩定性和收斂性問題。我們最終給出的具體解決方案是使用連續型的 reward 函數以及採用損失函數融合的方法。Loss 的融合最直接的方式是將 Policy Gradient 的 loss 和時間差分 loss 進行加權求和。我們通過實驗發現隨着 loss weight 的增加,我們的指標也有上升的趨勢。值得注意的是,當權重等於 0 或 1 時,模型都是不收斂的,這也證明了單獨使用 Policy Gradient 損失或者時間差分損失進行模型優化是無法滿足模型的穩定性與收斂性的。

另外,我們也嘗試增加了一些有監督的輔助損失函數,其也會對指標帶來一定的提升。

DDPG 在離線指標上相較於 RNN 模型在 Session AUC@10 上有了 0.83% 的提升,在線 AB 實驗指標如用戶轉化率以及 GMV 也均有大於 1 個點的顯著提升。

目前 DDPG 也在搜索精排中進行了一次全量更新。其實大家也會很擔心 DDPG 在線上的穩定性問題,我們對此也做了很多分析。

首先,我們對比了兩週的線上指標(後續其實觀察了更長時間),發現 DDPG 在上線初期指標出現震盪,但是模型穩定之後其指標持續優於 RNN 模型,證明了算法的穩定性。

另外,我們考慮了不同用戶分組上的評測指標,例如將用戶按照他的歷史搜索次數進行篩選和分組。實驗發現,DDPG 在用戶歷史搜索越多時,其對長期價值的建模越準確。這在使用新老用戶進行分組實驗時也體現了相似的結論,與我們的建模預期吻合。

05 規劃與展望

首先,在技術方面,因爲我們一開始強化學習的模型並沒有在線上使用 online learning,所以剛開始迭代的時候模型還是進行離線更新。目前我們 online learning 的技術已經全量上線了,後續會做一些更復雜的探索,爲 on-policy 的強化學習算法奠定基礎。採用 on-policy 強化學習算法能夠更加實時捕捉用戶反饋,不斷地進行策略的更新。

另一方面,在業務層面,京東主站商品和 LBS 商品(小時購)部署的排序模塊是兩個獨立模型。那麼如何對這兩種類型的商品進行混排來達到整體收益最大化是我們想要探索的目標。

06 精彩問答

Q1:Dump feature 中包含什麼內容?

A:首先,dump feature 包含用戶在此次請求時模型使用到的所有商品特徵;此外,RNN 模型生成的 hidden state 也會一起加入 dump feature 中,爲後續 RNN 狀態在線增量更新做準備。

Q2:請問有沒有嘗試過 offline 強化學習的方法?

A:其實剛纔介紹的模型就是一個 offline RL 的方法。我們的模型會使用歷史上一段時間的數據,在訓練時我們先離線地使模型達到收斂狀態,再將其推至線上進行服務。模型一般一天更新一次,所以在一天之內模型的參數是不變的,但是用戶的狀態向量會做不斷的增量更新。

Q3:請問模型是使用什麼方式進行部署的,性能怎麼樣?

A:其實這是我們京東內部模型部署的一個架構,我們稱其爲 Predictor。在正常情況下,我們模型導出之後會有一些驗分的流程,之後會將其推送至 Predictor 進行線上部署。針對性能的話,雖然在線上有 RNN 模塊,但是我們已經把使用用戶歷史的搜索計算出的用戶狀態保存下來並作爲 RNN 的初始狀態,所以每一步 RNN 前向計算都是一個增量計算的過程,對性能沒有特別大的影響。

Q4:請問我們的環境是靜態數據嗎?如果是靜態數據,怎麼做探索?

A:在訓練的過程中,環境是一個靜態數據,我們使用用戶的歷史 session,通過 RNN 不斷地學習下一個 session 的狀態。在線服務時,當模型有了初始狀態之後,在線環境會給予它實時反饋,進而做在線的更新。

Q5:請問有沒有考慮過 listwise 的排序方法?

A:Listwise 排序更多地會用在有監督學習中。在我們強化學習的建模中,我們除了考慮當前的即時獎勵之外還會考慮後續的長期價值。但是,我們並沒有在用戶當前搜索下考慮商品與商品之間的關係, session 內樣本構造還是一個 pairwise 的方法。

Q6:請問爲什麼會設計這種連續的 reward 函數?

A:這和我們動作的設計有關。我們的動作是對候選商品的排序打分,這是一個連續的動作空間。另外,我們的目標是輸出排序動作後,模型對正負樣本存在一定的區分性,即在排序正確的情況下得分相差越多,獎勵越高。此外,如果給予打分接近、沒有太大區分度的兩個商品同等的獎勵對模型的收斂性不是特別好。

Q7:請問模型在線上會有探索的過程嗎?探索的過程是否會造成收益的損失?

A:目前我們的模型是離線訓練好後推至線上服務的,並且在一天之內不會進行參數更新,所以也沒有線上的探索過程。目前 online learning 的模型已經全量上線了,之後我們會採用離線預訓練好一個模型、在線做探索的方法進行一些嘗試。但是,直接去線上做策略探索的話,損失是我們承擔不起的,所以一般還是會有一個離線預訓練模型,加上線上 online learning 進行 policy 的探索。

今天的分享就到這裏,謝謝大家。

分享嘉賓:

DataFunSummit DataFun 社區旗下賬號,專注於分享大數據、人工智能領域行業峯會信息和嘉賓演講內容,定期提供資料合集下載。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/uZbw28WHAwROM_1-qkHUCQ