Bandit:一種簡單而強大的線上學習演算法

風景不在對岸wj發表於2017-09-12


假設我有5枚硬幣,都是正反面不均勻的。我們玩一個遊戲,每次你可以選擇其中一枚硬幣擲出,如果擲出正面,你將得到一百塊獎勵。擲硬幣的次數有限(比如10000次),顯然,如果要拿到最多的利益,你要做的就是儘快找出“正面概率最大”的硬幣,然後就拿它賺錢了。

這個問題看起來很數學化,其實它在我們的生活中經常遇見。比如我們現在有很多線上場景,遇到一個相同的問題:一個平臺這麼多資訊,該展示什麼給使用者,才能有最好的收益(比如點選率)?

Google作為最大的搜尋廣告公司,在使用者搜尋時該展示什麼廣告;Facebook作為社交平臺,當使用者好友過載的時候,該怎麼組織好友的說說(把你最感興趣的放前面);Taobao有海量的商品池子,該如何撈取使用者最容易剁手的商品展示出來?

一切通過資料收集而得到的概率預估任務,都能通過Bandit系列演算法來進行線上優化。這裡的“線上”,指的不是網際網路意義上的線上,而是隻演算法模型引數根據觀察資料不斷演變。

Bandit演算法的創造其實來源於人類的經驗,這個演算法框架包含兩個部分,一是探索未知(explore),二是利用已知(exploit)。一部分精力做探索(不考慮曾經的經驗),一部分精力做採集(利用已知的最好策略)。

How Bandit

首先來看看Bandit的概率原理,我們希望知道每一個硬幣“正面”的概率 pipi 。事實上我們能觀察到的,只是這個硬幣正面的頻率

μi=

怎麼利用起觀察到的頻率,來最好地預估真實的概率呢?下面介紹4種策略,分別是隨機(Random)、簡單觀察(Naive)、ε-貪心法(ε-Greedy)、置信上限法(UCB)。

Random

每次隨機選擇一枚硬幣進行投擲。如果不能勝過這個策略,就不必玩了。

Naive

先給每個硬幣一定次數的嘗試,比如每個硬幣擲10次,根據每個硬幣正面朝上的次數,選擇正面頻率最高的那個硬幣,作為最佳策略。這也是大多人能想到的方法。

但是這個策略有幾個明顯問題:

  1. 10次嘗試真的靠譜嗎?最差的硬幣也有可能在這10次內有高於最好硬幣的正面次數。
  2. 假設你選到的這個硬幣在投擲次數多了後發生了問題(比如掉屑),改變了其屬性,導致其正面的概率大大降低,如果你還死守著它,那不是吃大虧了?(這是對變數的考慮)
  3. 就算你給一個硬幣10次機會,如果硬幣真的很多,比如K>100K>100,給每個硬幣10次機會是不是也太浪費了呢?等所有硬幣都嘗試過,再回來“賺錢”,花兒都謝了!

ε-Greedy

有了前兩個墊背,可以開始讓Bandit登場了。ε-Greedy就是一種很機智的Bandit演算法:它讓每次機會以ε的概率去“探索”,1-ε的概率來“開發”。也即,如果一次機會落入ε中,則隨機選擇一個硬幣來投擲,否則就選擇先前探索到正面概率最大的硬幣。這個策略有兩個好處:

  1. 它能夠應對變化,如果硬幣“變質”了,它也能及時改變策略。
  2. ε-Greedy機制讓玩的過程更有趣,有時“探索”,有時“賺錢”。

在此基礎上,又能引申出很多值得研究的問題,比如ε應該如何設定呢?它應不應該隨著時間而變?因為隨著探索次數的增多,好的選擇自然浮現得比較明顯了。ε大則使得模型有更大的靈活性(能更快的探索到未知,適應變化),ε小則會有更好的穩定性(有更多機會去“開發”)。

UCB

在統計學中,對於一個未知量的估計,總能找到一種量化其置信度的方法。最普遍的分佈正態分佈(或曰高斯分佈)N(μ,δ)N(μ,δ),其中的E就是估計量的期望,而δδ則表示其不確定性(δδ越大則表示越不可信)。比如你擲一個標準的6面色子,它的平均值是3.5,而如果你只擲一次,比如說到2,那你對平均值的估計只能是2,但是這個置信度應該很低,我們可以知道,這個色子的預估平均值是2,而以95%的置信區間在[1.4,5.2]。

UCB(Upper Confidence Bound - 置信上限)就是以均值的置信上限為來代表它的預估值:

μiˆ=μiˆ+21ni

上面是一個例子,其中μi是對期望的預估,ni是嘗試次數,可以看到對i的嘗試越多,其預估值與置信上限的差值就越小。也就是越有置信度。

這個策略的好處是,能讓沒有機會嘗試的硬幣得到更多嘗試的機會,是騾子是馬拉出來溜溜!將整個探索+開發的過程融合到一個公式裡面,很完美!

模擬結果

將這幾個策略做一下模擬,取K=5個硬幣,每次10000輪投擲機會,跑100次取平均。得到結果如下:

  1. 隨機:每次隨機取一枚硬幣投擲
  2. 簡單觀察:先給每個硬幣100次機會,然後以正面概率最大的硬幣為策略。
  3. ε-Greedy:取ϵ=0.01進行探索,1ε進行開發。
  4. UCB1:以(11/t)的上限進行探索
  5. UCB-95%:取95%的置信區間進行探索

bandit_simulation

上圖以累積後悔(Cumulative Expected Regret)來作為評估指標,橫座標是投擲次序,縱座標是累積後悔(取對數)。後悔最小的演算法最好。Regret定義如下:


RT=∑_i=1T(w_opt−wB(i))

可以看出,隨機的效果最爛,Naive演算法在前K*100輪跟隨機效果一樣爛(因為在收集資料,沒有開始利用)。ε-Greedy的收斂效果好,但因為有那ε的浪費,到最後還是跟Naive一樣浪費了很多機會。UCB的表現最好,收斂快、花費小!

這裡只是模擬了固定概率下這些演算法的表現,如果預估量(正面概率)是一個會變的量,這些演算法的表現會重新洗牌嗎?後續可以探索下!

Bandit application

說了這麼多擲硬幣,這個演算法在真實世界有什麼大展身手的地方呢?小列一些:

  • 線上排序(Online Ranking)
    • CTR預估
  • Stock Option
    • 選擇最好的股票進行投資
  • A/B test
    • 快速選擇好的AB版本,快速淘汰差的

附1:參考連結

相關文章