淺談強化學習原理(附代碼&鏈接)

淺談強化學習原理(附代碼&鏈接)

翻譯:王琦

校對:王雨桐

本文約4900字,建議閱讀15分鐘。

本文介紹了強化學習的基本原理,並通過代碼實例來講解如何找到最優策略。

淺談強化學習原理(附代碼&鏈接)

Google在2017年年底發佈了AlphaZero,這個零基礎的AI系統能夠在4小時內自學並掌握國際象棋、圍棋和將棋。

極短的訓練時間是 AlphaZero擊敗世界頂級國際象棋程序的致命武器。

淺談強化學習原理(附代碼&鏈接)

Andriy Popov / Alamy Stock 照片

最近,OpenAI 展示了強化學習不是一個僅限於虛擬任務的工具。Dactyl的類人機械手已經學會了如何獨立解魔方(見下面鏈接)。

附鏈接:https://openai.com/blog/solving-rubiks-cube/

淺談強化學習原理(附代碼&鏈接)

Google AlphaZero和OpenAI Dactyl的本質都是強化學習算法,它不基於任何相關領域的知識,我們只需要給定遊戲的規則。一些AI專家認為這是實現人類或超人類的通用人工智能的最可行方法。

我們之前的文章介紹了強化學習的基礎概念(見下面鏈接)。

附鏈接:

https://towardsdatascience.com/dont-ever-ignore-reinforcement-learning-again-4d026ee81371

現在讓我們繼續深入AI智能體的工作原理, 探索它是如何通過自學來採取恰當的行動流程,從而實現全局最優的目標。

什麼是策略?

讓我們假設一個OpenAI冰湖的簡單情景,在此環境下智能體能夠控制一個人物在座標格上運動。網格里的一些是可走的,其他格子則意味著人物將掉進冰洞裡。 當智能體發現一條可走的並且能達到目標地點(圖中黃色星星)的路徑時,它就會得到獎勵。

淺談強化學習原理(附代碼&鏈接)

在這種很簡單的環境下,我們可以有很多策略。比如說,智能體可以一直向前移動,或者隨機選擇一個方向移動,還可以通過前車之鑑來學習如何繞過障礙,甚至可以原地轉圈來娛樂。

從直觀上來講,策略可以被定義為一些能夠控制智能體行為的規則集合。不同的策略會給我們不同的收益,因此找到一個好的策略很重要。

策略的正式定義是每個可能狀態下采取的行為的概率分佈:

淺談強化學習原理(附代碼&鏈接)

最優策略

淺談強化學習原理(附代碼&鏈接)

能夠最大化預期的值函數 V:

淺談強化學習原理(附代碼&鏈接)

區分於短期收益,值函數 V(s) 是狀態s下含折扣的預期長期收益,它表示智能體所處狀態的好壞。對一個從該狀態開始的智能體來說,這相當於預期的總收益。換言之,這就是在狀態s下采取行動a這一步的總收益,被定義為 V(s)。

如何選擇最好的行動?

值函數取決於智能體選擇行動所用的策略。學習最優策略需要使用所謂的Bellman方程。

讓我們通過下面的例子來直觀地瞭解一下Bellman方程。智能體能夠執行行動1, 2, …, N,這會讓它轉移到未來的狀態S1, S2, …, SN, 從而分別得到相應的收益 r1, r2, …, rN。對於未來各個狀態來說,預期的長期收益是V1, V2, …, VN。

淺談強化學習原理(附代碼&鏈接)

如果智能體採取行動 a=i,當其在狀態S0時,對狀態S0來說,預期的長期收益或價值可以用下面的方程來表示,方程中的γ 是常數。

淺談強化學習原理(附代碼&鏈接)

最優策略能夠幫助智能體選擇最佳的可能行動。為了達到目的,智能體需要計算每個可能行動 a=1, 2, …, N所產生的收益。然後,我們會選擇可能性最大的結果。

淺談強化學習原理(附代碼&鏈接)

上面的方程被稱為確定的Bellman方程。對一個給定的行動,如果智能體能夠以不同的概率轉移到多個未來狀態,它就變成了一個隨機方程。下圖解釋了這種情況。

淺談強化學習原理(附代碼&鏈接)

對於這種一般情況,所得的隨機Bellman方程如下所示。

淺談強化學習原理(附代碼&鏈接)

我們提供了一種對Bellman方程的實現,這種實現可以在給定的狀態 s 下選擇最好的可能行動。此函數計算了每個行動的所得值並選擇可能性最大的結果。在一切開始之前,你需要加載一些我們之前文章談到的庫(見下面鏈接)。

附鏈接:

https://towardsdatascience.com/dont-ever-ignore-reinforcement-learning-again-4d026ee81371

1. # using the Bellman equation, we find the action providing the highest value for the given state s. 2. # V is the list of values of all states 3. def choose_best_action(env, V, s, gamma): 4. a_best = None 5. q_best = float('-inf') 6. nb_actions = env.action_space.n 7. for a in range (0, nb_actions): 8. env.env.s = s # go to state s 9. s_next, r, done, info = env.step(a) #take the action a 10. q = r + gamma * V[s_next] # compute the value future value after taking action a 11. if q > q_best: 12. q_best = q 13. a_best = a 14. return a_best

AI智能體如何通過值迭代來學習?

我們已經解釋瞭如何找到獲得最大長期價值的最佳行為。如果我們對所有狀態使用這個方法,就會得到值函數。我們也能知道在每個狀態(最優狀態)下應該採取什麼行動。這個算法被稱為值迭代。

值迭代算法隨機選擇一個初始值函數。然後在迭代過程中計算新的改進值函數,直到找到一個最優的值函數。最後,我們可以從最優的值函數中得到最優的策略。

淺談強化學習原理(附代碼&鏈接)

在一個 4×4的冰湖環境下,值迭代算法會在16個狀態下進行循環並採取4個可能的行動來探索給定行動的收益。此外,它還會計算可能性最大的行動/收益並將其存儲在向量 V[s]中,持續迭代這個算法直到 V[s] 不再有顯著的改進。

最優策略 P 每次會採取能夠轉移到最大V值狀態的行動。

下面的函數實現了在 4×4的冰湖環境下的值迭代算法。

1. # value iteration algorithm 2. def compute_value_iteration(env = gym.make('FrozenLakeNotSlippery-v0'), 3. gamma=.9, v_delta_threshold=.01, 4. V = None, verbose=True): 5. env.reset() 6. nb_actions = env.action_space.n 7. nb_states = env.observation_space.n 8. # values vector 9. if V == None: 10. V = np.zeros([nb_states]) 11. # policy vector 12. P = np.zeros([nb_states], dtype=int) 13. iteration = 0 14. while True: 15. 16. v_delta = 0 17. for s in range (0, nb_states): 18. v_previous = V[s] 19. a_best = choose_best_action(env, V, s, gamma) # find an action with the highest future reward 20. env.env.s = s # go to the state s 21. s_next, r, done, info = env.step(a_best) #take the best action 22. V[s] = r + gamma * V[s_next] # update the value of the state 23. P[s] = a_best # store the best action in the policy vector for the state 24. v_delta = max(v_delta, np.abs(v_previous - V[s])) # calculate the rate of value improvment for the state 25. iteration += 1 26. if v_delta < v_delta_threshold: 27. if verbose: 28. print (iteration,' iterations done') 29. break 30. return V, P 31. 32.# compute values for a 4x4 board 33.V_4, P_4 = compute_value_iteration() 34.V_4 
淺談強化學習原理(附代碼&鏈接)

上面所得的數組解釋了值迭代函數是如何成功地計算出16個狀態的長期收益。此算法迭代了7次。

表示冰洞(H)的狀態值為0,那些表示冰面的格子(F)的狀態有更大的值,尤其是那些處在有希望到達目標G的路徑上的格子。

下面的函數繪製了熱力圖將結果可視化。箭頭展示了使用最優策略 P來獲得最佳總收益的行動流程。

1. # function for displaying a heatmap 2. def display_value_iteration(P, env = gym.make('FrozenLakeNotSlippery-v0')): 3. nb_states = env.observation_space.n 4. visited_states = np.zeros(nb_states).astype(bool) 5. visited_states[0] = 1 6. states_labels = np.where(P==0, '', 8. np.where(P==2, 'v', 9. np.where(P==3, '^', P) 10. ) 11. ) 12. ) 13. desc = env.unwrapped.desc.ravel().astype(str) 14. colors = np.where(desc=='S','y',np.where(desc=='F','b',np.where(desc=='H','r',np.where(desc=='G','g',desc)))) 15. states_labels = np.zeros(nb_states).astype(str) 16. states_labels[:] = '' 17. total_reward = 0 18. s = env.reset() 19. #env.render() 20. done = False 21. while done != True: 22. best_a = P[s] # select the best next action from the policy 23. states_labels[s] = '^' if best_a==0 else ('v' if best_a==1 else ('>' if best_a==2 else '
淺談強化學習原理(附代碼&鏈接)

下面我們在8×8的冰湖環境下運行了值迭代算法。

1. V_8, P_8 = compute_value_iteration(env = gym.make('FrozenLake8x8NotSlippery-v0')) 2. V_8 3. display_value_iteration(P_8, env = gym.make('FrozenLake8x8NotSlippery-v0'))
淺談強化學習原理(附代碼&鏈接)

淺談強化學習原理(附代碼&鏈接)

AI 智能體如何通過策略迭代來學習?

在前一小節,我們已經展示了值迭代算法並解釋了一個智能體如何走過一個有洞的冰湖來達到目標。

在策略迭代的算法中,一開始我們使用的是一個隨機策略而不是隨機值函數,得到了該策略的值函數。接下來,我們可以基於之前的值函數得到新的(改進的)策略。經過多次迭代後,我們會得到一個最優策略。

淺談強化學習原理(附代碼&鏈接)

下面的函數實現了策略迭代算法。

1. # function for performing policy iteration 2. def compute_policy_iteration(env = gym.make('FrozenLakeNotSlippery-v0'), 3. gamma=.9, v_delta_threshold=.01, 4. P = None, verbose=True): 5. env.reset() 6. nb_actions = env.action_space.n 7. nb_states = env.observation_space.n 8. # values vector 9. V = np.zeros([nb_states]) 10. # policy vector 11. if P == None: 12. P = np.random.choice(nb_actions, size=nb_states) 13. 14. max_iterations = 200000 15. iteration = 0 16. for i in range(max_iterations): 17. 18. # policy evaluation 19. while True: 20. v_delta = 0 21. for s in range (0, nb_states): 22. v_previous = V[s] 23. env.env.s = s # go to state s 24. s_next, r, done, info = env.step(P[s]) #take the action recommended by policy 25. V[s] = r + gamma * V[s_next] # update value after applying policy 26. v_delta = max(v_delta, np.abs(v_previous - V[s])) # calculate the rate of value improvment for the state 27. if v_delta < v_delta_threshold: 28. break 29. 30. # policy improvement 31. policy_stable = True 32. for s in range (0, nb_states): 33. a_old = P[s] # ask policy for action to perform 34. a_best = choose_best_action(env, V, s, gamma) # find an action with the highest future reward 35. P[s] = a_best # store the best action in the policy vector for the state 36. if a_old != a_best: 37. policy_stable = False 38. 39. if policy_stable: 40. break 41. 442. iteration += 1 43. if verbose: 44. print (iteration,' iterations done') 45. return V, P 46. 47. Vp_4, Pp_4 = compute_policy_iteration() 48. Vp_4 49. display_value_iteration(Pp_4) 
淺談強化學習原理(附代碼&鏈接)

淺談強化學習原理(附代碼&鏈接)

正如我們所看到的那樣,兩個算法的結果相同。值迭代算法在每次迭代中不斷地改進值

函數,直到值函數收斂。策略改進理論讓我們確信策略迭代算法發現的策略比最初的隨機策略要好。

兩種方法都能實現相同的目標,但策略迭代的計算效率更高。

如何調整 AI 智能體的學習率?

值迭代算法和策略迭代算法都依賴於超參數γ(gamma),γ定義了值更新或策略更新的學習率。

讓我們試試不同的gamma 值並討論一下gamma值對訓練的影響。

1. # function for performing value and policy iterations for given gamma 2. def gammas_training(method='value_iteration', 3. gammas = np.arange(0, 1, 0.1), 4. env=gym.make('FrozenLakeNotSlippery-v0')):5. df = pd.DataFrame(columns=['gamma','state','value']) 6. for gamma in gammas: 7. if method == 'value_iteration': 8. V, P = compute_value_iteration(env=env, gamma=gamma, verbose=False) 9. else: 10. V, P = compute_policy_iteration(env=env, gamma=gamma, verbose=False) 11. df = df.append(pd.DataFrame({'gamma':[gamma for i in range(0,env.observation_space.n)], 12. 'state':[i for i in range(0,env.observation_space.n)], 13. 'value': V})) 14. df.state=df.state.astype(int) 15. return df 16. 17. 18. # display the values for multiple gammas 19. 20. fig, ax = plt.subplots(2,2, figsize=(20,10)) 21. 22. df_4_v = gammas_training(method='value_iteration', env=gym.make('FrozenLakeNotSlippery-v0')) 23. sns.lineplot(data=df_4_v, x='gamma', y='value', hue='state', ax=ax[0][0]) 24. ax[0][0].set_title('4x4 - VALUE ITERATION - Values per gamma') 25. 26. df_4_i = gammas_training(method='policy_iteration', env=gym.make('FrozenLakeNotSlippery-v0')) 27. sns.lineplot(data=df_4_i, x='gamma', y='value', hue='state', ax=ax[0][1]) 28. ax[0][1].set_title('4x4 - POLICY ITERATION - Values per gamma') 29. 30. df_8_v = gammas_training(method='value_iteration', env=gym.make('FrozenLake8x8NotSlippery-v0')) 31. sns.lineplot(data=df_8_v, x='gamma', y='value', hue='state', ax=ax[1][0]) 32. ax[1][0].set_title('8x8 - VALUE ITERATION - Values per gamma') 33. 34. df_8_i = gammas_training(method='policy_iteration', env=gym.make('FrozenLake8x8NotSlippery-v0')) 35. sns.lineplot(data=df_8_i, x='gamma', y='value', hue='state', ax=ax[1][1]) 36. ax[1][1].set_title('8x8 - POLICY ITERATION - Values per gamma'); 
淺談強化學習原理(附代碼&鏈接)

這些圖展示了當gamma增加時,價值是如何增加的。不同的gamma值(0-10) 會產生不同的策略。較小的gamma值會賦予短期收益更多的權重,然而較大的gamma 值會給長期收益更多的權重。

Gamma的最優值取決於任務的領域。在冰湖的情況下,尋求短期收益是不合理的(例如:即使懲罰相同,但相比於走了很長的路但沒掉進冰洞,掉進洞裡導致的負面收益毫無意義)。因此,我們儘可能地將眼光放長遠。

結論

在這篇文章中,我們介紹了強化學習中能夠找到最優策略的值迭代和策略迭代算法的實踐技術。

Andrej Kaparthy寫的這個帖子提供了更好的見解(見下面鏈接)。

附鏈接:https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_dp.html

當智能體知道充足的與環境模型相關的信息時,值迭代算法和策略迭代算法都是有效的。在自動駕駛、醫療或股票交易等多種情況下,學習或提供一個轉移模型(transition model)可能會很困難。在這種情況下,免模型(model-free)方法更合適,本文不細談這個概念。

Q-學習是一種免模型學習,其適用於智能體不瞭解環境模型但又必須利用其與環境互動的歷史進行反覆試驗來發現策略的情況。

SARSA (State–action–reward–state–action)是另一種智能體能夠與環境互動並基於已採取的行動來更新策略的算法。這篇文章(見下面鏈接)提供了有關免模型算法的其他有趣見解。

附鏈接:

https://studywolf.wordpress.com/2013/07/01/reinforcement-learning-sarsa-vs-q-learning/

看得不過癮?你可以在下面鏈接中查看我對深度學習最全面,最簡單的介紹。

附鏈接:https://towardsdatascience.com/why-deep-learning-works-289f17cab01a

原文標題:

This Is How Reinforcement Learning Works

原文鏈接:

https://towardsdatascience.com/this-is-how-reinforcement-learning-works-5080b3a335d6

譯者簡介

淺談強化學習原理(附代碼&鏈接)

王琦,中國科學院大學研一在讀,研究方向是機器學習與數據挖掘。喜歡探索新事物,是一個熱愛學習的人。

— 完 —

關注清華-青島數據科學研究院官方微信公眾平臺“THU數據派”及姊妹號“數據派THU”獲取更多講座福利及優質內容。

— 完 —

關注清華-青島數據科學研究院官方微信公眾平臺“THU數據派”及姊妹號“數據派THU”獲取更多講座福利及優質內容。

"


分享到:


相關文章: