Bandit:一種簡單而強大的線上學習演算法
假設我有5枚硬幣,都是正反面不均勻的。我們玩一個遊戲,每次你可以選擇其中一枚硬幣擲出,如果擲出正面,你將得到一百塊獎勵。擲硬幣的次數有限(比如10000次),顯然,如果要拿到最多的利益,你要做的就是儘快找出“正面概率最大”的硬幣,然後就拿它賺錢了。
這個問題看起來很數學化,其實它在我們的生活中經常遇見。比如我們現在有很多線上場景,遇到一個相同的問題:一個平臺這麼多資訊,該展示什麼給使用者,才能有最好的收益(比如點選率)?
Google作為最大的搜尋廣告公司,在使用者搜尋時該展示什麼廣告;Facebook作為社交平臺,當使用者好友過載的時候,該怎麼組織好友的說說(把你最感興趣的放前面);Taobao有海量的商品池子,該如何撈取使用者最容易剁手的商品展示出來?
一切通過資料收集而得到的概率預估任務,都能通過Bandit系列演算法來進行線上優化。這裡的“線上”,指的不是網際網路意義上的線上,而是隻演算法模型引數根據觀察資料不斷演變。
Bandit演算法的創造其實來源於人類的經驗,這個演算法框架包含兩個部分,一是探索未知(explore),二是利用已知(exploit)。一部分精力做探索(不考慮曾經的經驗),一部分精力做採集(利用已知的最好策略)。
How Bandit
首先來看看Bandit的概率原理,我們希望知道每一個硬幣“正面”的概率 pi 。事實上我們能觀察到的,只是這個硬幣正面的頻率
怎麼利用起觀察到的頻率,來最好地預估真實的概率呢?下面介紹4種策略,分別是隨機(Random)、簡單觀察(Naive)、ε-貪心法(ε-Greedy)、置信上限法(UCB)。
Random
每次隨機選擇一枚硬幣進行投擲。如果不能勝過這個策略,就不必玩了。
Naive
先給每個硬幣一定次數的嘗試,比如每個硬幣擲10次,根據每個硬幣正面朝上的次數,選擇正面頻率最高的那個硬幣,作為最佳策略。這也是大多人能想到的方法。
但是這個策略有幾個明顯問題:
- 10次嘗試真的靠譜嗎?最差的硬幣也有可能在這10次內有高於最好硬幣的正面次數。
- 假設你選到的這個硬幣在投擲次數多了後發生了問題(比如掉屑),改變了其屬性,導致其正面的概率大大降低,如果你還死守著它,那不是吃大虧了?(這是對變數的考慮)
- 就算你給一個硬幣10次機會,如果硬幣真的很多,比如K>100,給每個硬幣10次機會是不是也太浪費了呢?等所有硬幣都嘗試過,再回來“賺錢”,花兒都謝了!
ε-Greedy
有了前兩個墊背,可以開始讓Bandit登場了。ε-Greedy就是一種很機智的Bandit演算法:它讓每次機會以ε的概率去“探索”,1-ε的概率來“開發”。也即,如果一次機會落入ε中,則隨機選擇一個硬幣來投擲,否則就選擇先前探索到正面概率最大的硬幣。這個策略有兩個好處:
- 它能夠應對變化,如果硬幣“變質”了,它也能及時改變策略。
- ε-Greedy機制讓玩的過程更有趣,有時“探索”,有時“賺錢”。
在此基礎上,又能引申出很多值得研究的問題,比如ε應該如何設定呢?它應不應該隨著時間而變?因為隨著探索次數的增多,好的選擇自然浮現得比較明顯了。ε大則使得模型有更大的靈活性(能更快的探索到未知,適應變化),ε小則會有更好的穩定性(有更多機會去“開發”)。
UCB
在統計學中,對於一個未知量的估計,總能找到一種量化其置信度的方法。最普遍的分佈正態分佈(或曰高斯分佈)N(μ,δ),其中的E就是估計量的期望,而δ則表示其不確定性(δ越大則表示越不可信)。比如你擲一個標準的6面色子,它的平均值是3.5,而如果你只擲一次,比如說到2,那你對平均值的估計只能是2,但是這個置信度應該很低,我們可以知道,這個色子的預估平均值是2,而以95%的置信區間在[1.4,5.2]。
UCB(Upper Confidence Bound - 置信上限)就是以均值的置信上限為來代表它的預估值:
上面是一個例子,其中是對期望的預估,ni是嘗試次數,可以看到對i的嘗試越多,其預估值與置信上限的差值就越小。也就是越有置信度。
這個策略的好處是,能讓沒有機會嘗試的硬幣得到更多嘗試的機會,是騾子是馬拉出來溜溜!將整個探索+開發的過程融合到一個公式裡面,很完美!
模擬結果
將這幾個策略做一下模擬,取K=5個硬幣,每次10000輪投擲機會,跑100次取平均。得到結果如下:
- 隨機:每次隨機取一枚硬幣投擲
- 簡單觀察:先給每個硬幣100次機會,然後以正面概率最大的硬幣為策略。
- ε-Greedy:取ϵ=0.01進行探索,1−ε進行開發。
- UCB1:以(1−1/t)的上限進行探索
- UCB-95%:取95%的置信區間進行探索
上圖以累積後悔(Cumulative Expected Regret)來作為評估指標,橫座標是投擲次序,縱座標是累積後悔(取對數)。後悔最小的演算法最好。Regret定義如下:
可以看出,隨機的效果最爛,Naive演算法在前K*100輪跟隨機效果一樣爛(因為在收集資料,沒有開始利用)。ε-Greedy的收斂效果好,但因為有那ε的浪費,到最後還是跟Naive一樣浪費了很多機會。UCB的表現最好,收斂快、花費小!
這裡只是模擬了固定概率下這些演算法的表現,如果預估量(正面概率)是一個會變的量,這些演算法的表現會重新洗牌嗎?後續可以探索下!
Bandit application
說了這麼多擲硬幣,這個演算法在真實世界有什麼大展身手的地方呢?小列一些:
- 線上排序(Online Ranking)
- CTR預估
- Stock Option
- 選擇最好的股票進行投資
- A/B test
- 快速選擇好的AB版本,快速淘汰差的
附1:參考連結
相關文章
- DBA手記(學習) – LOGMNR 簡單而強大的工具
- Sublime Text for Mac:簡約而不簡單,功能強大Mac
- reqwest:簡單而強大的 Rust HTTP 客戶端RustHTTP客戶端
- 手寫一個Parser - 程式碼簡單而功能強大的Pratt Parsing
- 優思學院|簡單而強大的5W1H提問法
- 流程圖——正交連線的演算法的一種簡單實現流程圖演算法
- 強化學習之父Richard Sutton給出一個簡單思路,大幅增強所有RL演算法強化學習演算法
- 【深度學習基礎-10】簡單線性迴歸(上)深度學習
- 強化學習(六)時序差分線上控制演算法SARSA強化學習演算法
- 簡單的快樂是一種奢侈?《人類跌落夢境》今日上線!
- 簡單又強大的SHELL
- 讓AI簡單且強大:深度學習引擎OneFlow技術實踐AI深度學習
- 強大!Nginx 配置線上一鍵生成“神器”Nginx
- 強化學習之路一 QLearning 演算法強化學習演算法
- 演算法學習---歸併演算法簡單記錄演算法
- 從最簡單的入手學習 Docker (一)Docker
- 觀點丨新經濟 DTC 轉型,一個簡單而強大的資料平臺至關重要
- springmvc簡單學習(一)-----入門SpringMVC
- ???又一個管理端框架上線了,設計理念簡單而不簡約框架
- 一款線上的POc,CVE,EXP漏洞利用線上搜尋引擎很強大!
- 多工學習時轉角遇到Bandit老虎機
- 一個小巧而強大的 Key-Value 管理框架框架
- 強化學習-簡介強化學習
- Python單例的一種簡單寫法Python單例
- 最簡單的深度學習演算法——感知器的前世今生深度學習演算法
- 原創|強大!Nginx 配置線上一鍵生成“神器”Nginx
- Git簡單學習Git
- 簡單學習jsJS
- 只用1/500資料就打敗人類!一種取樣高效的強化學習演算法強化學習演算法
- Android架構設計:手把手教你擼一個簡潔而強大的MVP框架!Android架構MVP框架
- 遊戲的強化學習簡史遊戲強化學習
- 如何編寫一個簡單但強大的規則引擎? – maxant
- JSON to Insights:快速而簡單JSON
- 硼酸鋇鈉,一種因機器學習而誕生的LED熒光粉機器學習
- 強化學習(十七) 基於模型的強化學習與Dyna演算法框架強化學習模型演算法框架
- 簡單的SQL語句學習SQL
- jni安全利用的簡單學習
- Linux學習系列之一:在centos 7.5上安裝nginx 以及簡單配置LinuxCentOSNginx
- 強化學習筆記之【論文精讀】【ACE:一種基於熵規整和因果關係的離線SAC演算法】強化學習筆記熵演算法