關於推薦系統冷啟動中的Bandit算法


推薦系統中經常會遇到EE問題和冷啟動問題,Bandit算法就是為解決這兩個問題的一種在線學習算法。

啥是EE問題

EE問題: 又稱為exploit-explore問題。

exploit就是用戶確定比較感興趣的事物,要求准確率較高。

explore就是探索用戶可能感興趣的,新的事物。

因為只對用戶感興趣的事物進行推薦,用戶很快會膩,我們需要科學的冒險的為用戶推薦一些新鮮事物。

Bandit算法源於賭博學,一個賭徒去搖one-arm bandit,一個one-arm bandit共有 n 個外表一模一樣的臂,每個臂的中獎概率為 Pi,他不知道每個臂中獎的概率分布,那么每次選擇哪個臂可以做到收益最大化呢?這就是多臂賭博機 ( Multi-armed Bandit,MAB ) 問題。最好的辦法就是去試一試,不是盲目的去試,而是有策略的快速的去試。這些策略,就是bandit算法。

bandit解決冷啟動的大致思路如下:

我們用分類或者topic來表示用戶興趣,也就是MAB問題中的臂,我們可以通過幾次實驗,來刻畫出新用戶心目中對每個topic的感興趣概率。
如果用戶對某個topic感興趣(提供了顯示或者隱式反饋),就表示我們獲得了收益;

如果推薦了不感興趣的topic(也提供了顯示或者隱式反饋,即用戶明確反饋不感興趣,或者用戶對topic長時間,多次未進行任何操作,無動於衷),推薦系統就表示regret了。
當一個用戶來了, 針對這個用戶,我們采用湯普森采樣為每一個topic 采樣一個隨機數,排序后,我們取前top n的推薦item,注意,這里有一點改動,那就是在原始的多臂問題一次只搖一個臂,我們這里一次搖n個臂。
獲取用戶的反饋,比如點擊。沒有反饋則更新對應top的lose,點擊了則更新對應topic的win值。

bandit 算法需要量化一個核心問題:錯誤的選擇到底有多大的遺憾?如何使遺憾少一些?對同樣的多臂問題,用不同的 bandit 算法試驗相同次數,看看誰的 regret 增長得慢,以此衡量不同 bandit 算法在解決多臂問題上的效果。

常用的bandit算法

1 湯姆森采樣(Thompson sampling) 算法

湯姆森采樣是一種通過貝葉斯后驗采樣 ( Bayesian Posterior Sampling ) 進行探索與利用的方法。采用貝葉斯思想,對獎賞分布的參數假設一個先驗分布,根據觀測到的獎賞更新后驗分布,根據后驗分布選擇臂。

在多臂one-arm bandit中,Bernoulli分布正好有Beta分布作為共軛先驗,有了共軛先驗,就容易做貝葉斯更新(根據證據來更新參數).

准確來說,多臂one-arm bandit問題中,每次選出推薦的物品(要拉的one-arm bandit)后,根據物品是否被轉化(one-arm bandit是否吐出錢)來更新Beta分布的參數.有了新參數的Beta分布就是結合了這次經驗后,被選中的物品(one-arm bandit)被轉化率的更准確的估計.

而使用湯普森采樣,允許我們利用每個物品被轉化率的先驗知識來設定每個beta分布的參數.

對應於多臂one-arm bandit的情景,一個物品(或one-arm bandit)的beta參數的

  • α為一個物品被轉化的次數加一,
  • β為該物品被選中但沒轉化的次數加一.

如果我們在試驗前就知道某個物品的被轉化率為0.25,方差大概是0.00186,那么我們就可以得到先驗α=25,β=75.然后每次抽到該物品后,被轉化則α加1,否則β加1.

對於臂的獎賞服從伯努利分布,中獎概率 ( 被點擊的概率 ) 即平均獎賞 θk∈[0,1]。假設第 k 個臂的獎賞分布固定但未知,即參數 θk 未知。在 Bernoulli Bandit 問題中,采用 Beta 分布對第 k 個臂的中獎概率建模,因為 Beta 分布是二項分布的共軛分布。如果先驗分布為 Beta(α,β),在觀測到伯努力二元選擇 ( Bernoulli Trial ) 后,后驗分布變為 Beta(α+1,β) 或 Beta(α,β+1)。

  • 如果候選物品被選中的次數很多,那么 Beta 分布隨着 αkk 的增大會變得更加集中,即這個候選物品的收益已經確定,用它產生的隨機數基本在分布的中心位置附近,且接近這個分布的平均收益。
  • 如果一個候選物品的 α+β 很大,且 α/(α+β) 也很大,那么該候選物品是一個好的候選項,其平均收益也很好。
  • 如果一個候選物品的 α+β 很小,且分布很寬,即沒有給予充分的探索次數,無法確定好壞,那么這個較寬的分布有可能得到一個較大的隨機數,在排序時被優先輸出,並用給予次數進行探索。

在推薦的場景下,將beta分布的α參數作為曝光后用戶的點擊次數,β參數作為曝光未點擊次數,湯姆森采樣過程則為:

  1. 取出每一個候選item對應的參數α和β;
  2. 為每個候選item選用α和β作為參數,用beta分布產生一個隨機數;
  3. 按照隨機數排序,輸出最大值對應的候選;
  4. 貫徹用戶反饋,如果用戶點擊則將對應候選item的α+1,否則β+1;

相比於UCB算法,Thompson sampling:

  • UCB采用確定的選擇策略,可能導致每次返回結果相同(不是推薦想要的),Thompson Sampling則是隨機化策略。
  • Thompson sampling實現相對更簡單,UCB計算量更大(可能需要離線/異步計算)
  • 在計算機廣告、文章推薦領域,效果與UCB不相上下或更好competitive to or better
  • 對於數據延遲反饋、批量數據反饋更加穩健robust

補充概念

共軛先驗

一個隨機變量Χ服從參數為θ1的分布,Xi~Dist11),而θ1~Dist22).當我們根據Χ的抽樣得到了證據,用證據和θ1的先驗分布計算出θ1后驗分布。

根據貝葉斯公式,[公式]

posterior∝prior*evidence。其中

  1. posterior=P(θ1;Xi)叫做后驗概率,它是有了樣本后對先驗的修正.
  2. prior=P(θ1)叫做θ1先驗概率.
  3. evidence=P(Xi1)叫做證據,也是Likelihood(Xi1)抽樣的似然概率.
  4. 表示proportional to,等比例於。可以看到posterior∝prior*evidence符號兩側差了個P(Xi)倍數.

如果θ1后驗分布也是Dist2,那么我們就說Dist2Dist1的共軛先驗。共軛先驗分布在很多機器學習的問題中都提供了推斷和參數估計的便利。

Beta分布

Beta分布像是為Bernoulli分布和二項式分布量身定做的共軛先驗,是定義域(0, 1)上的隨機變量的一種分布.它有兩個大於0的參數,α,β.

Beta分布的均值是:α/α + β

Beta分布的方差是:α*β/[(α+β)2(α+β+1)]

Beta分布圖像:

 

 舉例來說,拋硬幣n=α+β次,出現正面α次,反面β次時,P(x;α,β) :表示【硬幣出現正面的概率為x】的概率, 雖說這里叫概率,其實並不嚴謹,因為 P(x;α,β)的值並不在0~1之間,而是滿足在【x: 0~1】,對 P(x;α,β)的積分等於1

當拋硬幣4次,出現正面2次,反面2次,也就是圖中紫色的那條線,那么單次拋硬幣為正面的概率為x=0.5的概率(可能性)最大,為 P(x;α,β)=1.5; x=0.2的概率(可能性)只有 P(x;α,β)=1。而且在【x: 0~1】,對P(x;α,β)的積分等於1

 

 貼一個講Beta分布的文章參考:https://zhuanlan.zhihu.com/p/33348118?ivk_sa=1024320u

舉個栗子,在棒球里可以把擊球當做隨機事件,只有擊中和沒擊中兩種狀態,衡量棒球運動員職業技能的一個指標就是棒球擊球率(運動員擊中的球數/總擊球數),一般認為職業棒球運動員的擊球率在0.25-0.3之間,如果擊球率能達到0.3以上就可以認為是非常優秀的運動員了。

我們現在希望預測某棒球運動員在新賽季中的擊球率。你可以直接以新賽季的擊中數/擊球數來估計,但這會有一個問題,如果現在是新賽季第一場,他就出場一次就被三振出局了,那他的擊球率就是0%了?這顯然不合理,合理的估計運動的擊球率,需要考慮他的歷史信息,如上賽季的擊球率,這就是先驗信息,而這個先驗符合貝塔分布:

其中 [公式] 是歸一化函數,保證曲線下的面積總是1, p是參數,在這里就是棒球擊球率。

我們可以查到該運動員上賽季,共擊球100次,其中擊中20次,沒擊中80次。這樣我們就有了貝塔分布的參數 [公式],如下圖藍色曲線,這就是擊球率的貝塔先驗。

我們可以根據參數 [公式] 來估計一下:

  • 先驗貝塔分布的均值:[公式]
  • 從圖中可以看到先驗貝塔分布主要在(0.1,0.3)之間,這是從歷史數據中總結出的合理估計。

有了先驗分布之后,我們來考慮一個運動員在新賽季擊球10次,擊中3次。這時候我們可以根據新觀察的數據來更新分布,讓曲線移動一些來適應我的新信息。貝塔分布與二項分布是共軛先驗的。共軛先驗的意思就是說如果先驗分布是貝塔分布,那么其貝葉斯后驗分布也是貝塔分布,所以此時新的后驗貝塔分布就是:

[公式]

其中 [公式]是先驗分布的參數。在10擊球后, [公式] 增加了3(擊中3次)。 [公式] 增加7(未擊中7次)。這時候新的貝塔分布就是 [公式] ,如圖中的橙色曲線。

可以看到新分布其實沒多大變化,這是因為只打了10次球並不能說明什么問題。但如果我們得到了更多的數據,假設一共打了100次,擊中了33次,未擊中67次,那么這一新分布就是 [公式] ,如圖綠色曲線所示。

可以看到綠色曲線,變得更尖了,並且向右平移了一段距離,表示該運動員的擊球率提高了。

我們可以根據這個新的貝塔分布,估計出新的數學期望:

[公式]

這比直接計算 [公式] 要小。因為我們用了上賽季他擊中20次,未擊中80次這一先驗信息。

2 UCB 算法

UCB 算法全稱是 Upper Confidence Bound(置信區間上界)。

算法步驟:先對每一個臂都試一遍,之后在任意時刻 [公式] 按照如下公式計算每個臂的分數,然后選擇分數最大的臂作為選擇

[公式]

觀察選擇結果,更新tTj,k。其中 [公式] 表示的是這個臂到目前的收益均值,j∈{1,……,K},后面的叫做bonus,本質上是均值的標准差,t是目前的試驗次數,Tj,k是這個臂被試次數。這個公式反映一個特點:均值越大,標准差越小,被選中的概率會越來越大,同時那些被選次數較少的臂也會得到試驗機會。

 UCB思想是樂觀地面對不確定性,以item回報的置信上限作為回報預估值的一類算法,其基本思想是:我們對某個item嘗試的次數越多,對該item回報估計的置信區間越窄、估計的不確定性降低,那些均值更大的item傾向於被多次選擇,這是算法保守的部分(exploitation);對某個item的嘗試次數越少,置信區間越寬,不確定性較高,置信區間較寬的item傾向於被多次選擇,這是算法激進的部分(exploration)。

 

3 Epsilon-Greedy 算法

這個算法有點類似模擬退火的思想。選一個(0,1)之間較小的數ε ,每次以ε的概率在所有臂中隨機選一個。以1-ε的概率選擇截止當前,平均收益最大的那個臂。根據選擇臂的回報值來對回報期望進行更新。這里ε的值可以控制對exploit和explore的偏好程度,每次決策以概率ε去Exploration,1-ε的概率來 Exploitation 。

這樣做的好處在於:

  • 能夠應對變化:如果item的回報發生變化,能及時改變策略,避免卡在次優狀態
  • 可以控制對Exploration和Exploitation的偏好程度:ε大,模型具有更大的靈活性(能更快的探索潛在可能高回報item,適應變化,收斂速度更快),ε小,模型具有更好的穩定性(更多的機會用來開發利用當前最好回報的item),收斂速度變慢

雖然ε-Greedy算法在Exploration和Exploitation之間做出了一定平衡,但

  • 設置最好的ε比較困難,大則適應變化較快,但長期累積回報低,小則適應變好的能力不夠,但能獲取更好的長期回報。
  • 策略運行一段時間后,我們對item的好壞了解的確定性增強,但仍然花費固定的精力去exploration,浪費本應該更多進行exploitation機會
  • 策略運行一段時間后,我們已經對各item有了一定程度了解,但沒用利用這些信息,仍然不做任何區分地隨機exploration(會選擇到明顯較差的item)

4 朴素bandit算法

先試若干次,然后計算每個臂的平均收益,一直選擇均值最大的那個。

 

除了 bandit 算法之外,還有一些其他的 explore 的辦法,比如:在推薦時,隨機地去掉一些用戶歷史行為(特征)。解決 Explore,勢必就是要冒險,勢必要走向未知,而這顯然就是會傷害用戶體驗的:明知道用戶肯定喜歡 A,你還偏偏以某個小概率給推薦非 A。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM