推薦系統(tǒng)之EE問題

推薦中大部分算法會根據(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)的選擇。

MAB示意圖

數(shù)學(xué)上可表示為一個二元組<A, R>

1. A 為一系列可能的動作, R(r|a)則表示給定動作下的獎賞的分布。
2. 每一時刻根據(jù)給定策略從 A 選擇動作 a_t, 同時環(huán)境根據(jù)分布 R(r|a) 生成獎賞 r_t
3. 目標(biāo)是最大化獎賞之和 \sum_{t=1}^T r_t

如何在每一刻根據(jù)給定策略從A里面選擇動作獲取獎賞呢?

除去隨機方法,下面要介紹的兩種方法,UCBThompson 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 策略運行一段時間后,選擇出收益最高的前 n 個 arm,然后 exploration 時從這 n 個 arm 中隨機選擇。
針對第 3 個問題,可以設(shè)置進(jìn)行 exploration 的概率 ? 隨著策略進(jìn)行的次數(shù)而逐漸下降,比如說可以取對數(shù)形式\epsilon = \frac{1}{1 + \log(m+1)}, m表示目前進(jìn)行了 m 次的決策。

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è) X_1, X_2…X_n 是同一個分布產(chǎn)生的 n 個獨立變量,其均值為 \overline{X} = \frac{1}{n}\sum_{i=1}^n X_i, 則如下公式成立p(|E[X] - \overline{X}| \le \delta) \ge 1 - 2e^{-2n\delta^2}

更直觀地說,該不等式表明了n 個獨立同分布的變量的均值與該變量的真實期望的誤差小于某個預(yù)設(shè)的閾值 u 會以概率 1 - e^{-2nu^2} 恒成立。

所以我們可以將 X_1, X_2…X_n 看做某個 arm 在 n 次試驗中獲得的收益,則通過上面的式子可以設(shè)定一個 \delta 使得公式成立, 然后用\overline{X} + \delta 來近似真實的收益 E(X);理論上也可用 \overline{X} - \delta,但是 UCB 方法會用上界,這也是 UCB 中 U(upper) 的含義。那么\delta該選多大呢?

UCB1 方法認(rèn)為\delta如下公式,公式中的N表示目前所有arm試驗的總次數(shù),n表示某個arm的實驗次數(shù),
\delta = \sqrt{\frac{2\ln{N}}{n}}

直觀地看上面定義的\delta, 分子N 對所有的 arm 是相同的,分母的 n 則表示某個 arm 目前為止試驗的次數(shù),如果這個值越小,那么\delta便越大,相當(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ù)歷史記錄計算出的 \overline {x}_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]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容