推薦中大部分算法會根據(jù)用戶已知興趣對用戶和視頻進(jìn)行匹配,從而選擇個性化的推薦集合。例如在小視頻推薦,用戶喜歡看美女,就給他推美女視頻。但是這樣會存在以下幾個問題,1. 如果美女是用戶真實的興趣點,那么一直推用戶遲早會厭倦。2. 如果用戶點美女只是因為平臺給他推了這個視頻,沒有其他更感興趣的類別可選,那么美女其實不是用戶真實的興趣點。3. 推薦系統(tǒng)是用戶,作者,平臺三方相互制衡的一個生態(tài)系統(tǒng),作者發(fā)布新視頻之后平臺需要快速冷啟推給用戶,才能達(dá)到這個生態(tài)系統(tǒng)的正向流動?;谝陨先c,我們在構(gòu)建推薦系統(tǒng)的時候除了盡可能的利用已知興趣exploit, 還需要開發(fā)更多的新興趣explore。
多臂老虎機MAB(Multi-Arm Bandit)
EE問題一般可通過MAB(Multi-Armed Bandit) 進(jìn)行建模, 如下所示所有 arm 就是每次決策中可作出的選擇,拉下某個 arm 表示作出了相應(yīng)的選擇。

數(shù)學(xué)上可表示為一個二元組 。
1. 為一系列可能的動作,
則表示給定動作下的獎賞的分布。
2. 每一時刻根據(jù)給定策略從 選擇動作
, 同時環(huán)境根據(jù)分布
生成獎賞
3. 目標(biāo)是最大化獎賞之和
如何在每一刻根據(jù)給定策略從A里面選擇動作獲取獎賞呢?
除去隨機方法,下面要介紹的兩種方法,UCB 和 Thompson sampling ,均是通過定義每個 arm 的收益的期望,然后選擇收益期望最大的 arm。其中,UCB 是頻率學(xué)派的思想,認(rèn)為每個 arm 的收益期望是固定的,通過試驗記錄得到其歷史收益狀況,然后加上一個 bound 構(gòu)成了收益期望;Thompson sampling 則是貝葉斯學(xué)派的思想,認(rèn)為 arm 的收益期望服從一個特定的概率分布,通過試驗記錄更新分布的參數(shù),然后從每個 arm 的分布中產(chǎn)生收益期望。
隨機方法
樸素Bandit
先隨機試驗N次,每次選擇收益最大的那個臂
Epsilon-Greedy
先生成一個(0,1)之間的隨機數(shù)epsilon,隨機從所有臂中選擇一個,并以1-epsilon的概率選擇最大收益的那個臂,更新rewards。
優(yōu)點:能隨時調(diào)整策略。
缺點:
- ? 是個超參數(shù),設(shè)置過大會導(dǎo)致決策隨機性過大,設(shè)置過小則會導(dǎo)致探索性不足;
- ?-greedy 策略運行一段時間后,對各個 arm 的收益情況有所了解,但沒有利用這些信息,仍然不做任何區(qū)分地隨機 exploration(會選擇到明顯較差的item);
- ?-greedy 策略運行一段時間后,但仍然花費固定的精力去 exploration,浪費了本應(yīng)該更多進(jìn)行 exploitation 機會。
針對第 2 個問題,可以在 ?-greedy 策略運行一段時間后,選擇出收益最高的前 個 arm,然后 exploration 時從這
個 arm 中隨機選擇。
針對第 3 個問題,可以設(shè)置進(jìn)行 exploration 的概率 ? 隨著策略進(jìn)行的次數(shù)而逐漸下降,比如說可以取對數(shù)形式,
表示目前進(jìn)行了
次的決策。
Thompson Sampling
TS是一種在線學(xué)習(xí)算法,通過不斷觀察數(shù)據(jù)來更新模型參數(shù)。它認(rèn)為評判某個 arm 的優(yōu)劣的指標(biāo)不再是個定值,而是服從著某種假定的分布(先驗),通過觀察到的歷史記錄去更新這個分布的參數(shù)(似然),得到了新的分布參數(shù)(后驗), 然后不斷重復(fù)這個過程。當(dāng)需要進(jìn)行比較時,從分布中隨機產(chǎn)生一個樣本即可。
所以講TS之前先復(fù)習(xí)下beta分布。beta分布可以看作一個概率的概率分布,當(dāng)你不知道一個東西的具體概率是多少時,beta分布可以給出所有概率出現(xiàn)的可能性大小,也就是說可以用beta分布來模擬各種先驗分布。beta 分布橫軸為概率值,取值范圍是 (0,1), 它有兩個控制參數(shù):α 和 β 。
1. α + β 的值越大,分布曲線越窄,也就是越集中;
2. α/(α + β) 的值是期望,它的值越大, beta 分布的中心越靠近 1。
假設(shè)每個老虎機都有一個吐錢的概率p符合beta(wins, lose)分布,每個臂都維護一個beta分布的參數(shù),即wins, lose。每次試驗后,選中一個臂,搖一下,有收益則該臂的wins增加1,否則該臂的lose增加1。每次選擇臂的方式是:用每個臂現(xiàn)有的beta分布產(chǎn)生一個隨機數(shù)b,選擇所有臂產(chǎn)生的隨機數(shù)中最大的那個臂去搖。
代碼實現(xiàn):
import numpy as np
np.argmax(pymc.rbeta(1 + successes, 1 + totals - successes))
UCB(Upper Confidence Bound)
假如能夠?qū)γ總€ arm 都進(jìn)行足夠多次的試驗,根據(jù)大數(shù)定律,次數(shù)越多,這些試驗結(jié)果統(tǒng)計得到的收益便會約接近各個 arm 真實的收益。由于觀測次數(shù)有限,基于歷史信息(當(dāng)前老虎機已經(jīng)探索的次數(shù),吐錢的次數(shù))計算出來吐錢的觀測概率p' 和實際吐錢概率p存在一定的差值 ? ,即p' - ? <= p <= p' + ?。UCB 的核心就在于如果預(yù)估這個誤差(也就是 UCB 中的 B(bound)),然后將 arm 統(tǒng)計的收益加上其通過 UCB 方法計算出來的 bound 進(jìn)行排序,選擇最高的那個。
UCB1
UCB1 方法的理論基礎(chǔ)是Hoeffding’s inequality,該不等式的定義如下:
假設(shè) 是同一個分布產(chǎn)生的
個獨立變量,其均值為
, 則如下公式成立
更直觀地說,該不等式表明了 個獨立同分布的變量的均值與該變量的真實期望的誤差小于某個預(yù)設(shè)的閾值
會以概率
恒成立。
所以我們可以將 看做某個 arm 在
次試驗中獲得的收益,則通過上面的式子可以設(shè)定一個
使得公式成立, 然后用
來近似真實的收益
;理論上也可用
,但是 UCB 方法會用上界,這也是 UCB 中 U(upper) 的含義。那么
該選多大呢?
UCB1 方法認(rèn)為如下公式,公式中的
表示目前所有arm試驗的總次數(shù),
表示某個arm的實驗次數(shù),
直觀地看上面定義的, 分子
對所有的 arm 是相同的,分母的
則表示某個 arm 目前為止試驗的次數(shù),如果這個值越小,那么
便越大,相當(dāng)于 exploration;而當(dāng)各個 arm 的 n 相同時,實際上就是在比較各個 arm 的歷史收益情況了。
代碼實現(xiàn):
import numpy as np
T = 1000 # T輪試驗
N = 10 # N個老虎機
true_rewards = np.random.uniform(low=0, high=1, size=N) # 每個老虎機真實的吐錢概率
estimated_rewards = np.zeros(N) # 每個老虎機吐錢的觀測概率,初始都為0
chosen_count = np.zeros(N) # 每個老虎機當(dāng)前已經(jīng)探索的次數(shù),初始都為0
total_reward = 0
# 計算delta
def calculate_delta(T, item):
if chosen_count[item] == 0:
return 1
else:
return np.sqrt(2 * np.log(T) / chosen_count[item])
# 計算每個老虎機的p+delta,同時做出選擇
def UCB(t, N):
upper_bound_probs = [estimated_rewards[item] + calculate_delta(t, item) for item in range(N)]
item = np.argmax(upper_bound_probs)
reward = np.random.binomial(n=1, p=true_rewards[item])
return item, reward
for t in range(1, T): # 依次進(jìn)行T次試驗
# 選擇一個老虎機,并得到是否吐錢的結(jié)果
item, reward = UCB(t, N)
total_reward += reward # 一共有多少客人接受了推薦
# 更新每個老虎機的吐錢概率
estimated_rewards[item] = ((t - 1) * estimated_rewards[item] + reward) / t
chosen_count[item] += 1
UCB2
從名字上基本就可以猜出 UCB2 是 UCB1 的改進(jìn),改進(jìn)的地方是降低了 UCB1 的 regret 的上界,regret 指的是每次能獲得的最大的收益與實際獲得的收益的差距,略。
LinUCB
上面的 UCB1 和 UCB2 算法都是解決 Bernoulli Bandit 問題的,也就是假設(shè)每個 arm 的優(yōu)劣是服從伯努利分布,而根據(jù)歷史記錄計算出的 (獲得收益的試驗次數(shù)和總試驗次數(shù)的比值)其實就是伯努利分布的參數(shù)。這樣基于統(tǒng)計的方法很簡單,但是問題也比較顯著,因為 arm 的收益會跟多個因素有關(guān)(比如說某個 arm 在早上選擇時沒有收益,但是晚上就有了),利用這些信息可以預(yù)估得更準(zhǔn)確;而基于統(tǒng)計的方法則忽略了這一點。區(qū)別于 Bernoulli Bandit,這類利用了上下文信息的問題就是上面提到的 Contextual Bandit 問題,而 LinUCB 就是要解決這個問題的。
小結(jié)
UCB 采用的是頻率學(xué)派的思想,計算的收益值是歷史收益加上一個 bound,可以認(rèn)為歷史收益是 Exploitation,而 bound 則是 ExplorationUCB 采用的是頻率學(xué)派的思想,計算的收益值是歷史收益加上一個 bound,可以認(rèn)為歷史收益是 Exploitation,而 bound 則是 Exploration。
Reference:
1.https://zhuanlan.zhihu.com/p/38875010
2.http://wulc.me/2019/01/05/EE(Exploitation%20Exploration)%20%E9%97%AE%E9%A2%98%E6%A6%82%E8%BF%B0/
[First Edition at 2020-06-21]