機器學習A-Z~Thompson抽樣算法

本文繼續講一個強化學習的算法,叫做Thompson抽樣算法。這個算法的數學理論基礎要用到的是貝葉斯推斷(Bayesian Inference)。我們先談談這個算法的基本原理。

Thompson抽樣算法基本原理

我們依然使用之前的多臂老虎機的問題。如圖所示,橫軸代表獎勵,越往右邊表示獎勵越多。三條豎線代表三個不同的老虎機它們的平均獎勵。

在算法開始前,我們是什麼都不知道的,因此需要得到一些基礎數據。圖中有四個藍色的數據,表示按下藍色老虎機得到的獎勵,根據這幾個得到的獎勵,可以得到一個數學分佈。同樣綠色的老虎機也能得到一個分佈,黃色同理。

這三個分佈預測的是這三個機器給我們帶來獎勵實際上可能的數學期望的概率分佈。接下來基於這三個隨機分佈,我們得到幾個隨機抽樣,選擇獲得最大抽樣值的機器按下去。但由於是隨機的,雖然黃色的實際期望是最高的,但我們依然可能會選出一個綠色大於黃色數據結果。

按下去後我們會得到一個新的觀察到的獎勵值,得到新的獎勵值後就要調整綠色機器的分佈。

顯然這個綠色的分佈變得更高更窄了,後面的步驟和這裏其實是一樣的,也是依然選擇獎勵值最高的機器按下去,通過得到的結果繼續調整分佈。

當這個遊戲進行到很多步驟之後,這些分佈都會變得非常窄,尤其是黃色的基本會和實際期望吻合.

這時由於我們一直選擇獎勵值最高的機器,因此按下黃色的概率會比較高,導致黃色的會越來越窄,而藍色的很少玩到,因此相對要寬一點。

Thompson抽樣算法 vs. 置信區間上界算法

我們使用Thompson抽樣算法和ucb算法都處理了多臂老虎機問題,那麼現在來比較下兩個算法。來看看這兩個算法的基本原理圖。

首先這個UCB算法,它是一個確定性算法,當我們得到相同的獎勵時,我們作出的決策時確定,因此我們每一輪的總收益和總收益都是確定的。每一輪中作出的決策只和置信區間的上界有關,而這個上界只和這個機器所有的觀察值有關。所以說當所有機器的觀察值相同時,我們永遠會做相同的決策。對於Thompson算法,它是個隨機性算法,它的某一步或者某幾步是在一個隨機函數控制下,跟運氣是有關係的。它依賴於一些隨機事件,就像我們上面選擇點的時候,雖然黃色的實際期望大於綠色,但我們還是可能會選出綠色大於黃色的數據點。因此說它是個隨機性的算法。

那麼對於UCB,它還有個特點,就是需要實時更新上界,這個在之前的文章描述UCB算法原理的時候可以看出來。對於Thompson抽樣算法,它是允許延遲更新甚至批量更新的,比如我們往網上投放一批廣告,這裏是允許它得到的結果是有延遲的。最後一點,在近些年的實際應用和研究中發現,Thompson抽樣算法相對於置信區間算法,它是有更好的實際應用效果的。

代碼實現

首先看看Thompson抽樣算法的計算邏輯:

代碼這裏就直接貼出來了:

import matplotlib.pyplot as plt
import pandas as pd
import random

# import the dataset
dataset = pd.read_csv('Ads_CTR_Optimisation.csv')

# Implementing Thompson Sampling
N = 10000
d = 10
ads_selected = []
numbers_of_rewards_1 = [0] * d
numbers_of_rewards_0 = [0] * d
total_reward = 0
for n in range(0, N):
    ad = 0
    max_random = 0
    for i in range(0, d):
        random_beta = random.betavariate(numbers_of_rewards_1[i] + 1, numbers_of_rewards_0[i] + 1)
        if random_beta > max_random:
            max_random = random_beta
            ad = i
    ads_selected.append(ad)
    reward = dataset.values[n, ad]
    if reward == 1:
        numbers_of_rewards_1[ad] = numbers_of_rewards_1[ad] + 1
    else:
        numbers_of_rewards_0[ad] = numbers_of_rewards_0[ad] + 1
    total_reward = total_reward + reward

# Visualising the results
plt.hist(ads_selected)
plt.title('Histogram of ads selections')
plt.xlabel('Ads')
plt.ylabel('Number of times each ad was selected')
plt.show()

最終得到總獎勵數相對於之前的置信區間算法要高很多,而且得到的圖像很明顯能看到最佳的廣告是ad5,因此Thompson抽樣算法的實際效果的確要優於置信區間算法。

以上,就是強化學習中的Thompson抽樣算法的基礎知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章