1. 程式人生 > 其它 >TensorFlow強化學習入門(1)——雙臂賭博機

TensorFlow強化學習入門(1)——雙臂賭博機

簡介

強化學習不僅僅賦予了我們教會人工agent如何行動的能力,還使得agent可以通過我們提供的互動式環境進行學習。通過結合深度神經網路習得的複雜表示和RL agent的目標驅動型學習,計算機取得了很多令人驚歎的成績:在很多中雅達利遊戲中擊敗人類,打敗圍棋世界冠軍等等。

要理解這種agent的構建方式,我們要在監督學習的思維方式上作出一點轉變。與監督學習不同,輸入訊號不能立刻得到響應,因此監督學習中結合激勵和響應設計的演算法不再適用,取而代之的是強化學習通過 觀測(observation)收益(rewards)行動(actions) 的組合來自主學習正確的組合。由於我們不能在任意場景下告訴agent什麼才是“真正”正確的行動,所以我們需要一些技巧。在本篇和後面的文章中我會分享強化學習agent建立和訓練的整個流程。為了概念的清晰,我們將從簡單的agent和任務出發,隨後再進行完善使其可以工作在複雜的環境下。

雙臂賭博機

n臂賭博機是最簡單的強化學習問題。從本質上來說,這個問題中我們要從n個具有不同固定賠率的老虎機當中找出收益率最高的一臺並通過一直使用這臺老虎機來達到最大的收益率。為了簡化這一問題,我們假設只有兩個老虎機以供選擇。事實上簡化後的問題嚴格來講只能算是強化學習的前導,下面讓我們來看一下一個問題要成為強化學習問題應當具備的條件:

  • 不同的行動將帶來不同的收益。舉例來說,假設我們在迷宮中尋寶,現在位於一個岔路口,此時選擇向左可能能夠獲得寶藏,而向右會掉入有蛇的陷阱當中。
  • 收益是延遲發放的。在上面的例子中,我們即使左拐了也不能馬上得到收益,只有再經過一系列決策之後才能得到結果。
  • 能夠得到獎勵的行動取決於當前環境的狀態。還以迷宮為例,在上面的假設中是左拐才能得到收益,但在別的岔路口可能需要右拐才能得到收益。

由於n臂賭博機問題中不需要考慮上述的第二點和第三點,所以這是一個很好的出發點。我們只需要掌握任何可能的行動可能帶來的收益從而確保當前的行動時最優的即可。在強化學習的行話當中,我們稱這一過程在學習一個策略(policy)。下面我們將使用策略梯度的方法來解決這個問題,在這個方法當中我們的簡易神經網路通過將環境中得到的反饋與梯度下降演算法結合從而調整網路權重,據此來習得行動的策略。強化學習中agent學習的另一種方法稱為價值函式。在這些方法中,agent不再是學習某個給定狀態下的最優決策,而是去學習預測當前狀態和行動的優劣。上面提到的兩種方法都可以得到表現良好的agent,不過策略梯度方法會更直接一點。

策略梯度

簡單來說,策略梯度網路可以產生直接的輸出。在我們的賭博機問題當中,我們不希望用條件判斷的方式得到任意狀態下的輸出。因此我們的網路需要包含一系列權重,從而使它可以對當前所有的賭博機臂作出響應,從而告訴我們各個賭博機臂的優劣。如果我們將這些權重全部初始化為1,那麼我們的agent會對所有的賭博機的收益持樂觀態度。

為了更新網路,我們使用e-greedy策略來選取賭博機臂(在第7部分我們會講解行動選擇策略)。這意味著我們的網路在大多數情況下會選擇價值期望最大的決策,但是偶爾(與e相關)也會隨機決策。通過這種方式可以確保網路嘗試所有的決策,從而學到更多。一旦我們的網路作出決策之後,它就可以受到一個收益值(-1或1)。得到這個值之後,我們就可以使用策略損失函式來更新我們的網路。

Loss = -log(n)*A

A代表收益,它是所有強化學習演算法中的必不可少的概念。它直觀地反映了每個決策和參考值相比的優劣。本節中我們先假設參考基線為0,於此進行對比可以直接得到我們每個行動的收益,後面的文章中我們會開發更復雜的參考基線與我們的收益進行比較。

n代表策略。在本例當中其值會隨著選定行動的權重值的變化而變化。

直觀地來說,這個損失函式會增大帶來正收益的行為的權重,減小帶來負收益的行動的權重,長此以往agent的選擇就具有了更強的偏向性。通過決策=>獲得收益=>更新網路這樣的迴圈過程,我們可以迅速得到一個可以幫我們解決老虎機問題的agent!儘管我這麼說了,但是你更應該親自嘗試一下再做判斷,下面給出實現的程式碼:

import tensorflow as tf
import numpy as np
# 定義一個四臂賭博機
# pullBandit函式會根據均值為0的正態分佈來生成隨機數,輸入的bandit數越小,得到正收益的概率越大
# 我們的目標是agent可以一直選擇帶來正收益的賭博機
# 列出我們的賭博機bandit值,按照下面的設定,第四個機臂(index為3)帶來正收益的可能性最大。
bandits = [0.2, 0, -0.2, -5]
num_bandits = len(bandits)
def pullBandit(bandit):
    # 獲取隨機數
    result = np.random.randn(1)
    if result > bandit:
        # 返回正收益
        return 1
    else:
        return -1

# 建立agent,包含了對每個賭博機的價值預估,使用策略梯度方法進行更新
tf.reset_default_graph()
# 建立網路的前饋部分,通過它可以實現決策
weights = tf.Variable(tf.ones([num_bandits]))
chosen_action = tf.argmax(weights, 0)
# 網路訓練部分,通過計算損失值來更新網路
reward_holder = tf.placeholder(shape=[1], dtype=tf.float32)
action_holder = tf.placeholder(shape=[1], dtype=tf.int32)
responsible_weight = tf.slice(weights, action_holder, [1])
loss = -(tf.log(responsible_weight)*reward_holder)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
update = optimizer.minimize(loss)

# 訓練agent
total_episodes = 1000
total_reward = np.zeros(num_bandits)
e = 0.1 # 隨機決策概率
init = tf.initialize_all_variables()
# 啟動TensorFlow計算圖
with tf.Session() as sess:
    sess.run(init)
    i = 0
    while i < total_episodes:
        # 根據價值決策或隨機決策
        if np.random.rand(1) < e:
            action = np.random.randint(num_bandits)
        else:
            action = sess.run(chosen_action)
        reward = pullBandit(bandits[action]) # 得到所選賭博機的收益
        # 更新網路
        _, resp, ww = sess.run([update, responsible_weight, weights], feed_dict={reward_holder:[reward], action_holder:[action]})
        # 更新決策分值
        total_reward[action] += reward
        if i % 50 == 0:
            print(str(num_bandits) + "個老虎機的實時收益為:" + str(total_reward))
        i += 1
print("agent認為" + str(np.argmax(ww)+1) + "號老虎機的收益最高")
if np.argmax(ww) == np.argmax(-np.array(bandits)):
    print("經驗證正確!")
else:
    print("經驗證錯誤!")
4個機臂的實時收益為:[1. 0. 0. 0.]
4個機臂的實時收益為:[-2. -1.  1. 31.]
4個機臂的實時收益為:[-2. -1.  2. 78.]
4個機臂的實時收益為:[ -1.   0.   2. 126.]
4個機臂的實時收益為:[ -1.   0.   3. 175.]
4個機臂的實時收益為:[  0.   0.   3. 222.]
4個機臂的實時收益為:[ -1.   0.   3. 269.]
4個機臂的實時收益為:[ -2.   0.   2. 315.]
4個機臂的實時收益為:[ -2.   0.   1. 364.]
4個機臂的實時收益為:[ -1.   3.   0. 409.]
4個機臂的實時收益為:[ -1.   3.   0. 453.]
4個機臂的實時收益為:[ -2.   1.   1. 499.]
4個機臂的實時收益為:[ -3.   0.   0. 544.]
4個機臂的實時收益為:[ -3.   1.   0. 591.]
4個機臂的實時收益為:[ -3.   0.  -1. 639.]
4個機臂的實時收益為:[ -2.  -1.   0. 684.]
4個機臂的實時收益為:[ -1.  -1.   0. 731.]
4個機臂的實時收益為:[ -1.  -1.   0. 779.]
4個機臂的實時收益為:[ -2.   2.   0. 823.]
4個機臂的實時收益為:[ -2.   1.   2. 870.]
agent認為4號機臂的收益最高
經驗證正確!

譯者計劃翻譯的系列文章:

  1. (0) Q-Learning的查詢表實現和神經網路實現
  2. (1) 雙臂賭博機
  3. Part 1.5 — Contextual Bandits
  4. Part 2 — Policy-Based Agents
  5. Part 3 — Model-Based RL
  6. Part 4 — Deep Q-Networks and Beyond
  7. Part 5 — Visualizing an Agent’s Thoughts and Actions
  8. Part 6 — Partial Observability and Deep Recurrent Q-Networks
  9. Part 7 — Action-Selection Strategies for Exploration
  10. Part 8 — Asynchronous Actor-Critic Agents (A3C)