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

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

Thompson抽樣算法基本原理

咱們依然使用以前的多臂老虎機的問題。如圖所示,橫軸表明獎勵,越往右邊表示獎勵越多。三條豎線表明三個不一樣的老虎機它們的平均獎勵。算法

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

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

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

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

當這個遊戲進行到不少步驟以後,這些分佈都會變得很是窄,尤爲是黃色的基本會和實際指望吻合.spa

這時因爲咱們一直選擇獎勵值最高的機器,所以按下黃色的機率會比較高,致使黃色的會愈來愈窄,而藍色的不多玩到,所以相對要寬一點。code

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抽樣算法的基礎知識。

相關文章
相關標籤/搜索