強化學習隨筆(2)

<img src="./images/rl_gambling.jpg">

  • 狀態
    State = (item_1,item_2,item_3,item_4)

  • 行爲
    Action = (0,1,0,0)

  • 獎勵
    Reward = (0,1)

  • 狀態到動作
    S = \pi(a|s)

  • 狀態、動作到獎勵關係
    R = \pi(S,A)

  • 動作到狀態
    S^{\prime} = \pi(S,A)

  • S^{\prime},A,R 都是隨機變量

目標函數

通過調整參數更新參數,讓模型的參數最小。

我們需要將問題變爲一個優化問題,
\max \sum R

調整的\pi(s|a),在系統中,可以改變就是策略,所以能夠改變,
這裏有一個問題,這個問題是什麼,如果要優化策略時間點和最大目標時間點是否一致,這個是需要考慮,我們那 alphaGo 來解釋這個問題,在 alphaGo 每下一局會得到 reward,但是對於每一步是沒有 reward 的。但是我們在 AlphaGo 優化策略是每一步上,這也就是優化難點,

例如現在努力學習,要考研,就要放下當前找工作來獲得 reward ,探索與利用之間矛盾。

N \max(P_1,\cdots,P_{10})

E = \sum P_i

湯普森採樣

Beta 分佈

Beta 布可以看作是一個概率的分佈,當我們不知道一個東西的具體概率是多少時,給出了所有概率出現的可能性大小,可以理解爲概率的概率分佈。

棒球運動的一個指標就是棒球擊球率,就是用一個運動員擊中的球數除以總的擊球數,一般認爲 0.27 是一個平均的擊球水平,如果擊球率達到 0.3 就會認爲非常優秀了。如果我們要預測一個棒球運動員,他整個賽季的棒球擊球率,怎麼做呢?你可以直接計算他目前的棒球擊球率,用擊中數除以擊球數。但是,這在賽季開始階段時是很不合理的。假如這個運動員就打了一次,還中了,那麼他的擊球率就是100%;如果沒中,那麼就是 0%,甚至打 5、6 次的時候,也可能運氣爆棚全中擊球率 100%,或者運氣很糟擊球率 0%,所以這樣計算出來的擊球率是不合理也是不準確的。

當運動員首次擊球沒中時,沒人認爲他整個賽季都會一次不中,所以擊球率不可能爲 0。因爲我們有先驗期望,根據歷史信息,我們知道擊球率一般會在 0.215到0.36之間。如果一個運動員一開始打了幾次沒中,那麼我們知道他可能最終成績會比平均稍微差一點,但是一般不可能會偏離上述區間,更不可能爲 0。

一個最好的方法來表示這些先驗期望(統計中稱爲先驗(prior))就是beta,表示在運動員打球之前,我們就對他的擊球率有了一個大概範圍的預測。假設我們預計運動員整個賽季的擊球率平均值大概是 0.27左右,範圍大概是在 0.21 到0.35之間。那麼用 Beta 分佈來表示,我們可以取參數 \alpha=81\beta=219,因爲 \frac{\alpha}{\alpha + \beta}=0.27,圖形分佈也主要集中在0.21~0.35之間,非常符合經驗值,也就是我們在不知道這個運動員真正擊球水平的情況下,我們先給一個平均的擊球率的分佈。

假設運動員一次擊中,那麼現在他本賽季的記錄是“1次打中;1次打擊”。那麼我們更新我們的概率分佈,讓概率曲線做一些移動來反應我們的新信息。

湯普森採樣

湯普森採樣的背後原理正是上述所講的 Beta 分佈,把 Beta 分佈的 a 參數看成是推薦後用戶點擊的次數,把分佈的 b 參數看成是推薦後用戶未點擊的次數,則湯普森採樣過程如下

  • 取出每一個候選對應的參數 a 和 b
  • 爲每個候選用 a 和 b 作爲參數,用 Beta 分佈產生一個隨機數
  • 按照隨機數排序,輸出最大值對應的候選
  • 觀察用戶反饋,如果用戶點擊則將對應候選的 a 加 1,否則 b 加 1

實際上在推薦系統中,要爲每一個用戶都保存一套參數,比如候選有 m 個,用戶有 n 個,那麼就要保存 2 \times m \times n 個參數。

1)如果一個候選被選中的次數很多,也就是 a+b 很大了,他的分佈會很窄,換句話說這個候選的收益已經非常確定了,就是說不管分佈中心接近 0 還是 1 都幾乎比較確定了。用他產生隨機數,基本上就在中心位置附近,接近平均收益。

2)如果一個候選,不但 a+b 很大,即分佈很窄,而且 a/(a+b) 也很大,接近 1,那就確定這是個好的候選項,平均收益很好,每次選擇很佔優勢,就進入利用階段。反之則有可能平均分佈比較接近與0,幾乎再無出頭之日。

3)如果一個候選的 a+b 很小,分佈很寬,也就是沒有被選擇太多次,說明這個候選是好是壞還不太確定,那麼分佈就是跳躍的,這次可能好,下次就可能壞,也就是還有機會存在,沒有完全拋棄。那麼用它產生隨機數就有可能得到一個較大的隨機數,在排序時被優先輸出,這就起到了前面說的探索作用。

choice = numpy.argmax(pymc.rbeta(1 + self.wins, 1 + self.trials - self.wins))

首先我們有一個先驗概率,然後通過做實驗會有一個後驗概率,
P(x) = p^{k}q^{(N-k)}

具體來說,我們就考慮 Beta-Bernoulli Bandit,也就是說,對於 我們的先驗分佈(prior distribution)是 Beta 分佈,而每個 arm reward 的分佈是以 \theta 爲參數的 Bernoulli 分佈。容易知道,在這種情況下,的後驗分佈仍然是 Beta 分佈。

這裏只用到了最基本的概率論和統計的知識,以防大家有些失憶,我寫一些關鍵的公式出來。假設現在我們有 K 個機器,那麼平均的 reward \theta = (\theta_1,\theta_2,\cdots,\theta_K) 事先是不知道的。在一開始,算法會選擇一個 A 然後會觀察到 reward r_1 \in \{0,1\}這是一個從Bernoulli分佈進行 sample P(r_1 = 1|a_1,\theta) = \theta_{a1} P(r_1 = 0|a_1,\theta) = 1 -\theta_{a1}

此外對於 Bernoulli 的

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