論文|LinUCB論文的思想解讀、場景應用與痛點說明

本篇文章主要介紹一下雅虎在2012年發表的論文 【A Contextual-Bandit Approach to Personalized News Article Recommendation】,同時由於最近在做用戶留存方面的工作,也涉及了一些冷啓動方面的東西,嘗試了很多種方法:包括性別熱門、用戶羣體熱門、bandit算法和LDA等嘗試,有的效果好,有的效果差(當然和具體的業務場景和使用方法都有關係,不能否則算法或者思路本身的好壞)。最近也在嘗試LinUCB算法,因此重新翻看了該論文,整理成下文,同時涉及一些個人的想法和一些實踐思路。

概述

個性化Web服務通過利用用戶和內容的信息調整他們的服務以滿足用戶的個性化需求,儘管之前的研究取得了一些進展,但仍然存在兩個問題:

  • Web服務具有動態更改內容池的功能,從而使傳統的協同過濾算法無法使用。
  • 大多數具有實際意義的Web服務要求具有快速學習和進行計算

論文中把文章推薦看作是多臂老虎機問題,一種有效的做法是根據用戶和文章的上下文信息,選擇文章推薦給用戶,同時基於用戶對文章的點擊行爲動態調整策略,追求點擊次數最大化。實驗證明加入上下文信息的Bandit算法比傳統的Bandit算法CTR提升在12.5%以上,如果是基於稀疏的數據,效果會變得更好。

通常用戶和物品都有其特徵進行表示,在這種情況下不同用戶對於同一物品而言,看法也會不同,因此識別不同內容之間的共性,並在內容池中轉移該知識變得格外重要。

論文分析了已有的Bandit算法,包括UCB、E-Greedy、Thompson Smapling、樸素Bandit,然後提出了LinUCB算法,LinUCB分爲兩種:

  • 簡單的線性不相交模型 disjoint LinUCB
  • 混合相交的線性模型 hybrid LinUCB

Disjoint LinUCB

之所以稱爲DisJoint LinUCB是因爲不同臂之間的參數不共享。

首先定義每個臂的期望收益爲:
E[rt,axt,a]=xt,aTθa E[r_{t,a} | x_{t,a} ] = x^T_{t,a} \theta^*_a
其中:

  • θa\theta^*_a 表示臂a的參數
  • xt,ax_{t,a}表示臂a的特徵

通常模型優化採用的是最小化損失函數,在這裏損失函數可以表示爲:
loss=(caDaθa)2+λθa loss = (c_a - D_a \theta_a)^2 + \lambda|| \theta_a||

基於嶺迴歸得到的參數估計值爲:
θ^a=(DaTDa+Id)1DaTca \hat{\theta}_a = (D^T_a D_a + I_d)^{-1} D^T_ac_a
其中:

  • DaD_a表示是一個m*d的矩陣(即m行,d列),m即選擇臂a得到的m個上下文特徵組,d爲特徵的維度
  • IdI_d 表示d*d的單位矩陣
  • cac_a 表示臂a返回的事物是否被點擊的記錄向量,長度爲m

根據最小平方和強化學習理論:
xt,aTθ^aE[rt,axt,a]αxt,aT(DaTDa+Id)1xt,a | x^T_{t,a} \hat{ \theta}_a - E[r_{t,a} | x_{t,a} ] | \leqslant \alpha \sqrt{ x^T_{t,a}(D^T_aD_a + I_d)^{-1} x_{t,a} }
其中 α\alpha是一個常數,爲:1+ln(2/δ)/21+\sqrt{ln(2/\delta )/2}

基於這個不等式可以選擇收益最大的臂,在進行第t次實驗時:
at=defargmaxaAt(xt,aTθ^a+αxt,aTAa1xt,a) a_t \overset{def}{=} \underset{a \in A_t}{arg max} (x^T_{t,a} \hat{ \theta}_a + \alpha \sqrt{ x^T_{t,a}A_a^{-1} x_{t,a} } )
其中A=defDaTDa+IdA \overset{def}{=}D^T_aD_a + I_d

其對應的算法流程爲:
LinUCB的算法流程

Hybrid LinUCB

Hybrid LinUCB考慮了臂之間的共性,因此每個臂的期望修改爲:
E[rt,axt,a]=zt,aTβ+xt,aTθa E[r_{t,a} | x_{t,a} ] =z^T_{t,a}\beta^* + x^T_{t,a} \theta^*_a
其中:

  • zt,az_{t,a}表示的是用戶/文章的組合特徵
  • β\beta^*表示的是所有臂的共享未知參數
  • θa\theta^*_a表示的是臂a的私有參數

由於篇幅有限,論文中並沒有給出hybrid的推斷,給出的僞代碼如下:
Hybrid LinUCB的算法流程

評估算法

與傳統的監督學習算法評測相比,融合上下文的Bandit算法的評估十分困難,由於算法的交互性,似乎只能在線上進行效果評測。然而在具體的實踐過程中,這種方法是不可行的,對線上效果帶來的挑戰也很大。

文中提到了一種方法是根據記錄的數據模擬臂的選擇過程,但隨即又說明了這種方法在實驗過程中會引入偏差,導致結果不可信。

文中提出了一種實驗方法,其實驗算法如下:
LinUCB實驗方法

  • π\pi爲選擇的策略,這裏即爲帶上下文的bandit算法
  • ht1h_{t-1}即爲t1t-1時刻的歷史行爲記錄
  • RT/TR_T/T即爲最終的實驗指標

實驗說明

實驗位置

實驗位置

實驗使用的數據是Yahoo-Today Moudle,在選擇數據時,爲了避免曝光位置帶來的偏差,只關注Story和F1位置。

數據選擇

在選取數據時,文中提出了一點:選取了一週的數據作爲評估數據,運行bandit算法。從實踐經驗上講這是靠譜的,避免了數據本身帶來的偏差。

特徵選擇

  • 用戶維度
    • 人口統計學信息(性別化爲兩類,年齡劃分爲10個等級)
    • 地理特徵(文中選取的是200個城市地區)
    • 行爲類別信息(用戶的消費歷史和屬性信息)
  • 文章維度:
    • 文章URL類別(推斷出數十個類別信息)
    • 人工編輯的類別信息

特徵降維

這裏通過K-means對用戶特徵進行聚類,劃分爲5個簇,即最終得到的用戶特徵維度爲5,最後補一列特徵值爲1(即第六列特徵值爲1,爲什麼爲1,文中並沒有說明,這裏小編也不太明白,如果你有想法的話歡迎留言

實驗結論

吧啦吧啦就是比別的算法好!

注意點

  • 【實踐】在使用Thompson sampling時每個臂的a、b值初始化時要注意,如果差值過大,就會導致經過幾次負反饋之後,排在top的臂依舊排在top,因此設計a、b值的時候需要進行特別的設計
  • 計算每個臂時的特徵爲臂a的特徵,切勿和臂下的樣本特徵搞混(如果一個樣本是一個臂的話,那麼這裏的特徵就是樣本的特徵)
  • disjoint linucb中的xt,zx_{t,z}表示的是臂a的特徵,zt,az_{t,a}表示的是用戶/文章的組合特徵(臂和文章在某種程度上是一樣的概念,比如候選池有100篇文章,那麼每篇文章就可以看作是一個臂)
  • 讀論文時有些論文的實驗並不太好做,這時候不僅要學習論文中算法的思路,還要學習論文中實驗的設計技巧和評判技巧

LinUCB 的重點

  • LinUCB 不再是上下文無關地,像盲人摸象一樣從候選臂中去選擇了,而是要考慮上下文因素,比如是用戶特徵、物品特徵和場景特徵一起考慮。
  • 每一個候選臂針對這些特徵各自維護一個參數向量,各自更新,互不干擾。
  • 每次選擇時用各自的參數去計算期望收益和置信區間,然後按照置信區間上邊界最大的輸出結果。
  • 觀察用戶的反饋,簡單說就是“是否點擊”,將觀察的結果返回,結合對應的特徵,按照剛纔給出的公式,去重新計算這個候選臂的參數。
  • 當 LinUCB 的特徵向量始終取 1,每個候選臂的參數是收益均值的時候,LinUCB 就是 UCB。

2019-12-27 補充

  • 當備選池不大的時候,每個備選物品可以作爲一個臂,如果備選池大的話可以對備選池的物品進行歸類,一個類別作爲一個臂
  • 不同業務場景下,設置的獎勵和懲罰應該是不一樣的,比如點擊,可以設置爲1,購買設置爲2,懲罰可以設置爲0
  • alpha的值通常是拍腦門子定的幾個,通過測試比較效果,一般初始值選0.5更加穩妥些

場景應用

當來一個新用戶的時候,我們並不知道該用戶的偏好和興趣,那麼最常見的方法就是試探法,假設我們有10個標籤,每個標籤下都有運營配置的一些精品文章或者商品或者新聞等。

那麼這裏就可以把每個標籤看作是一個臂,我們可以每個臂下展示一個事物,來對用戶的興趣進行試探,然後根據用戶的行爲進行結果修正。

在選取特徵時,論文中使用了用戶維度和臂維度的特徵,那麼在我們實踐過程中通常可以使用下面的三大維度的特徵:

  • 用戶維度:性別、年齡、城市、手機品牌等
  • 臂維度:曝光點擊率、標籤類別信息等
  • 用戶x事物交互維度:用戶在該臂下的一些交互維度特徵,比如點擊、曝光點擊率等

在實際的應用過程中,並沒有那麼簡單,常見的痛點如下:

  • LinUCB不是一個傳統的ctr算法,如何與線上服務進行集成?
  • 經過onehot或者分桶之後的特徵維度會增高,高維的特徵必然會引起延遲增大,如何進行線上降維?
  • 特徵包括了用戶訪問時攜帶的特徵、臂的離線和實時特徵,如何進行特徵拼接,進行計算?
  • LinUCB和Thomson sampling、UCB相比,參數增多數倍,線上如何進行參數維護和更新?
  • 新用戶數量往往並不多,在有限的新用戶下進行不同留存策略的ABTest,如何保證結果的可靠和有效?
  • LinUCB是針對新用戶的,那麼對於新老用戶之間的界定也十分重要,如何界定新老用戶或者具體場景下的新老用戶?

具體的場景、業務面對的問題和解決的辦法往往是不盡相同的,如果大家決定要應用LinUCB算法,那麼在使用之前一定要考慮後相關的問題和解決辦法,這樣才能避免使用過程中遇到的坑。

針對上邊的問題並沒有唯一具體的解決辦法,感興趣的歡迎在進行留言討論。


掃一掃 關注微信公衆號!號主 專注於搜索和推薦系統,嘗試使用算法去更好的服務於用戶,包括但不侷限於機器學習,深度學習,強化學習,自然語言理解,知識圖譜,還不定時分享技術,資料,思考等文章!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章