Q-learning演算法實踐
我們將會應用 Q-learning 演算法完成一個經典的 Markov 決策問題 -- 走迷宮!
專案描述:
在該專案中,你將使用強化學習演算法,實現一個自動走迷宮機器人。
-
如上圖所示,智慧機器人顯示在右上角。在我們的迷宮中,有陷阱(紅色炸彈)及終點(藍色的目標點)兩種情景。機器人要儘量避開陷阱、儘快到達目的地。
-
小車可執行的動作包括:向上走 u、向右走 r、向下走 d、向左走 l。
-
執行不同的動作後,根據不同的情況會獲得不同的獎勵,具體而言,有以下幾種情況。
-
撞到牆壁:-10
-
走到終點:50
-
走到陷阱:-30
-
其餘情況:-0.1
-
-
我們需要通過修改 robot.py 中的程式碼,來實現一個 Q Learning 機器人,實現上述的目標。
Section 1 演算法理解
1. 1 強化學習總覽
強化學習作為機器學習演算法的一種,其模式也是讓智慧體在“訓練”中學到“經驗”,以實現給定的任務。但不同於監督學習與非監督學習,在強化學習的框架中,我們更側重通過智慧體與環境的互動來學習。通常在監督學習和非監督學習任務中,智慧體往往需要通過給定的訓練集,輔之以既定的訓練目標(如最小化損失函式),通過給定的學習演算法來實現這一目標。然而在強化學習中,智慧體則是通過其與環境互動得到的獎勵進行學習。這個環境可以是虛擬的(如虛擬的迷宮),也可以是真實的(自動駕駛汽車在真實道路上收集資料)。
在強化學習中有五個核心組成部分,它們分別是:環境(Environment)、智慧體(Agent)、狀態(State)、動作(Action)和獎勵(Reward)。在某一時間節點t:
-
智慧體在從環境中感知其所處的狀態
-
智慧體根據某些準則選擇動作
-
環境根據智慧體選擇的動作,向智慧體反饋獎勵
通過合理的學習演算法,智慧體將在這樣的問題設定下,成功學到一個在狀態 選擇動作 的策略 。
1.2 計算Q值
在我們的專案中,我們要實現基於 Q-Learning 的強化學習演算法。Q-Learning 是一個值迭代(Value Iteration)演算法。與策略迭代(Policy Iteration)演算法不同,值迭代演算法會計算每個”狀態“或是”狀態-動作“的值(Value)或是效用(Utility),然後在執行動作的時候,會設法最大化這個值。因此,對每個狀態值的準確估計,是我們值迭代演算法的核心。通常我們會考慮最大化動作的長期獎勵,即不僅考慮當前動作帶來的獎勵,還會考慮動作長遠的獎勵。
在 Q-Learning 演算法中,我們把這個長期獎勵記為 Q 值,我們會考慮每個 ”狀態-動作“ 的 Q 值,具體而言,它的計算公式為:
也就是對於當前的“狀態-動作” ,我們考慮執行動作後環境給我們的獎勵 ,以及執行動作 到達 後,執行任意動作能夠獲得的最大的Q值,為折扣因子。
不過一般地,我們使用更為保守地更新 Q 表的方法,即引入鬆弛變數 alpha,按如下的公式進行更新,使得 Q 表的迭代變化更為平緩。
根據已知條件求。
已知:如上圖,機器人位於 s1,行動為 u,行動獲得的獎勵與題目的預設設定相同。在 s2 中執行各動作的 Q 值為:u: -24,r: -13,d: -0.29、l: +40,γ取0.9。
1.3如何選擇動作
在強化學習中,「探索-利用」問題是非常重要的問題。具體來說,根據上面的定義,我們會盡可能地讓機器人在每次選擇最優的決策,來最大化長期獎勵。但是這樣做有如下的弊端:
-
在初步的學習中,我們的 Q 值會不準確,如果在這個時候都按照 Q 值來選擇,那麼會造成錯誤。
-
學習一段時間後,機器人的路線會相對固定,則機器人無法對環境進行有效的探索。
因此我們需要一種辦法,來解決如上的問題,增加機器人的探索。由此我們考慮使用 epsilon-greedy 演算法,即在小車選擇動作的時候,以一部分的概率隨機選擇動作,以一部分的概率按照最優的 Q 值選擇動作。同時,這個選擇隨機動作的概率應當隨著訓練的過程逐步減小。
在如下的程式碼塊中,實現 epsilon-greedy 演算法的邏輯,並執行測試程式碼。
1. import random
2. import operator
3.
4. actions = ['u','r','d','l']
5. qline = {'u':1.2, 'r':-2.1, 'd':-24.5, 'l':27}
6. epsilon = 0.3 # 以0.3的概率進行隨機選擇
7.
8. def choose_action(epsilon):
9.
10. action = None
11. if random.uniform(0,1.0) <= epsilon: # 以某一概率
12. action = random.choice(actions)# 實現對動作的隨機選擇
13. else:
14. action = max(qline.items(), key=operator.itemgetter(1))[0] # 否則選擇具有最大 Q 值的動作
15. return action
1. range(100):
2. res += choose_action(epsilon)
3. print(res)
4. res = ''
5. for i in range(100):
6. res += choose_action(epsilon)
7. print(res)
8. ldllrrllllrlldlldllllllllllddulldlllllldllllludlldllllluudllllllulllllllllllullullllllllldlulllllrlr
Section 2 程式碼實現
2.1. Maze
類理解
我們首先引入了迷宮類 Maze
,這是一個非常強大的函式,它能夠根據你的要求隨機建立一個迷宮,或者根據指定的檔案,讀入一個迷宮地圖資訊。
-
使用
Maze("file_name")
根據指定檔案建立迷宮,或者使用Maze(maze_size=(height, width))
來隨機生成一個迷宮。 -
使用
trap number
引數,在建立迷宮的時候,設定迷宮中陷阱的數量。 -
直接鍵入迷宮變數的名字按回車,展示迷宮影象(如
g=Maze("xx.txt")
,那麼直接輸入g
即可。 -
建議生成的迷宮尺寸,長在 6~12 之間,寬在 10~12 之間。
在如下的程式碼塊中,建立你的迷宮並展示。
1. from Maze import Maze
2. %matplotlib inline
3. %confer InlineBackend.figure_format = 'retina'
4.
5. ## to-do: 建立迷宮並展示
6. g=Maze(maze_size=(6,8), trap_number=1)
7. g
Maze of size (12, 12
)
你可能已經注意到,在迷宮中我們已經預設放置了一個機器人。實際上,我們為迷宮配置了相應的 API,來幫助機器人的移動與感知。其中你隨後會使用的兩個 API 為 maze.sense_robot() 及 maze.move_robot()。
-
maze.sense_robot() 為一個無引數的函式,輸出機器人在迷宮中目前的位置。
-
maze.move_robot(direction) 對輸入的移動方向,移動機器人,並返回對應動作的獎勵值。
隨機移動機器人,並記錄下獲得的獎勵,展示出機器人最後的位置。
1. rewards = []
2.
3. ## 迴圈、隨機移動機器人10次,記錄下獎勵
4. for i in range(10):
5. res = g.move_robot(random. Choice(actions))
6. rewards.append(res)
7.
8. ## 輸出機器人最後的位置
9. print(g.sense_robot())
10.
11. ## 列印迷宮,觀察機器人位置
12. g
(0,9)
2.2. Robot
類實現
Robot
類是我們需要重點實現的部分。在這個類中,我們需要實現諸多功能,以使得我們成功實現一個強化學習智慧體。總體來說,之前我們是人為地在環境中移動了機器人,但是現在通過實現 Robot
這個類,機器人將會自己移動。通過實現學習函式,Robot
類將會學習到如何選擇最優的動作,並且更新強化學習中對應的引數。
首先 Robot
有多個輸入,其中 alpha=0.5, gamma=0.9, epsilon0=0.5
表徵強化學習相關的各個引數的預設值,這些在之前你已經瞭解到,Maze
應為機器人所在迷宮物件。
隨後觀察 Robot.update
函式,它指明瞭在每次執行動作時,Robot
需要執行的程式。按照這些程式,各個函式的功能也就明瞭了。
執行如下程式碼檢查效果(記得將 maze
變數修改為你建立迷宮的變數名)。
1. import random
2. import operator
3.
4.
5. class Robot(object):
6.
7. def __init__(self, maze, alpha=0.5, gamma=0.9, epsilon0=0.5):
8.
9. self. Maze = maze
10. self.valid_actions = self.maze.valid_actions
11. self.state = None
12. self.action = None
13.
14. # Set Parameters of the Learning Robot
15. self.alpha = alpha
16. self.gamma = gamma
17.
18. self.epsilon0 = epsilon0
19. self. Epsilon = epsilon0
20. self.t = 0
21.
22. self.Qtable = {}
23. self. Reset()
24.
25. def. reset(self):
26. """
27. Reset the robot
28. """
29. self.state = self.sense_state()
30. self.create_Qtable_line(self.state)
31.
32. def. set status(self, learning=False, testing=False):
33. """
34. Determine whether the robot is learning its q table, or
35. executing the testing procedure.
36. """
37. self. Learning = learning
38. self.testing = testing
39.
40. def. update_parameter(self):
41. """
42. Some of the paramters of the q learning robot can be altered,
43. update these parameters when necessary.
44. """
45. if self.testing:
46. # TODO 1. No random choice when testing
47. self. Epsilon = 0
48. else:
49. # TODO 2. Update parameters when learning
50. self. Epsilon *= 0.95
51.
52. return self. Epsilon
53.
54. def. sense_state(self):
55. """
56. Get the current state of the robot. In this
57. """
58.
59. # TODO 3. Return robot's current state
60. return self.maze.sense_robot()
61.
62. def. create_Qtable_line(self, state):
63. """
64. Create the qtable with the current state
65. """
66. # TODO 4. Create qtable with current state
67. # Our qtable should be a two level dict,
68. # Qtable[state] ={'u':xx, 'd':xx, ...}
69. # If Qtable[state] already exits, then do
70. # not change it.
71. self.Qtable.setdefault(state, {a: 0.0 for a in self.valid_actions})
72.
73. def. choose_action(self):
74. """
75. Return an action according to given rules
76. """
77.
78. def. is_random_exploration():
79.
80. # TODO 5. Return whether do random choice
81. # hint: generate a random number, and compare
82. # it with epsilon
83. return random.uniform(0, 1.0) <= self. Epsilon
84.
85. if self. Learning:
86. if is_random_exploration():
87. # TODO 6. Return random choose aciton
88. return random. Choice(self.valid_actions)
89. else:
90. # TODO 7. Return action with highest q value
91. return max(self.Qtable[self.state].items(), key=operator.itemgetter(1))[0]
92. elif self.testing:
93. # TODO 7. choose action with highest q value
94. return max(self.Qtable[self.state].items(), key=operator.itemgetter(1))[0]
95. else:
96. # TODO 6. Return random choose aciton
97. return random. Choice(self.valid_actions)
98.
99. def. update_Qtable(self, r, action, next_state):
100. """
101. Update the qtable according to the given rule.
102. """
103. if self. Learning:
104. # TODO 8. When learning, update the q table according
105. # to the given rules
106. self.Qtable[self.state][action] = (1 - self.alpha) * self.Qtable[self.state][action] + self.alpha * (
107. r + self.gamma * max(self.Qtable[next_state].values()))
108.
109.
110.
111. def. update(self):
112. """
113. Describle the procedure what to do when update the robot.
114. Called every time in every epoch in training or testing.
115. Return current action and reward.
116. """
117. self.state = self.sense_state() # Get the current state
118. self.create_Qtable_line(self.state) # For the state, create q table line
119.
120. action = self.choose_action() # choose action for this state
121. reward = self.maze.move_robot(action) # move robot for given action
122.
123. next_state = self.sense_state() # get next state
124. self.create_Qtable_line(next_state) # create q table line for next state
125.
126. if self. Learning and not self.testing:
127. self.update_Qtable(reward, action, next_state) # update q table
128. self.update_parameter() # update parameters
129.
130. return action, reward
131.
132. # from Robot import Robot
133. # g=Maze(maze_size=(6,12), trap_number=2)
134. g=Maze("test_world\maze_01.txt")
135. robot = Robot(g) # 記得將 maze 變數修改為你建立迷宮的變數名
136. robot.set_status(learning=True,testing=False)
137. print(robot.update())
138.
139. g
('d', -0.1)
Maze of size (12, 12)
2.3 用 Runner
類訓練 Robot
在完成了上述內容之後,我們就可以開始對我們 Robot
進行訓練並調參了。我們準備了又一個非常棒的類 Runner
,來實現整個訓練過程及視覺化。使用如下的程式碼,你可以成功對機器人進行訓練。並且你會在當前資料夾中生成一個名為 filename
的視訊,記錄了整個訓練的過程。通過觀察該視訊,你能夠發現訓練過程中的問題,並且優化你的程式碼及引數。
嘗試利用下列程式碼訓練機器人,並進行調參。可選的引數包括:
-
訓練引數
-
訓練次數
epoch
-
-
機器人蔘數:
-
epsilon0
(epsilon 初值) -
epsilon
衰減(可以是線性、指數衰減,可以調整衰減的速度),你需要在 Robot.py 中調整 -
alpha
-
gamma
-
-
迷宮引數:
-
迷宮大小
-
迷宮中陷阱的數量
-
-
## 可選的引數:
-
epoch = 20
-
epsilon0 = 0.5
-
alpha = 0.5
-
gamma = 0.9
-
maze_size = (6,8)
-
trap_number = 2
1. from Runner import Runner
2.
3. g = Maze(maze_size=maze_size,trap_number=trap_number)
4. r = Robot(g,alpha=alpha, epsilon0=epsilon0, gamma=gamma)
5. r.set_status(learning=True)
6.
7. runner = Runner(r, g)
8. runner.run_training(epoch, display_direction=True)
9. #runner.generate_movie(filename = "final1.mp4") # 你可以註釋該行程式碼,加快執行速度,不過你就無法觀察到視訊了。
10. g
使用 runner.plot_results() 函式,能夠印表機器人在訓練過程中的一些引數資訊。
-
Success Times 代表機器人在訓練過程中成功的累計次數,這應當是一個累積遞增的影象。
-
Accumulated Rewards 代表機器人在每次訓練 epoch 中,獲得的累積獎勵的值,這應當是一個逐步遞增的影象。
-
Running Times per Epoch 代表在每次訓練 epoch 中,小車訓練的次數(到達終點就會停止該 epoch 轉入下次訓練),這應當是一個逐步遞減的影象。
使用 runner.plot_results() 輸出訓練結果。
1. runner.plot_results()
相關推薦
Q-learning演算法實踐
我們將會應用 Q-learning 演算法完成一個經典的 Markov 決策問題 -- 走迷宮! 專案描述: 在該專案中,你將使用強化學習演算法,實現一個自動走迷宮機器人。 如上圖所示,智慧機器人顯示在右上角。在我們的迷宮中,有陷阱(紅色炸彈)及終點(藍色的目標
強化學習之Q-learning演算法
Q-learning演算法 以前在阿里雲上面搭了一個wordpress部落格,最近快畢業了,阿里雲真的很貴,所以轉到CSDN上寫部落格,主要是為了方便以後查詢。 Q-learning演算法是強化學習的一種演
用Q-Learning演算法實現無人車智慧代理程式
優達學城的第四個專案,通過Q-Learning演算法來實現一個簡單的無人車代駕程式。 先來一張訓練過程的動圖。 需求分析 一個無人車需要滿足的最基本需求就是安全性和可靠性。安全性用來保證使用者安全,可靠性用來保證在限定時間內將使用者送達目的地。安全
強化學習(五):Sarsa演算法與Q-Learning演算法
上一節主要講了Monte-Carlo learning,TD learning,TD(λ)。這三個方法都是為了在給定策略下來估計價值函式V(s)。只不過Monte-Carlo learning需要得到一個完整的episode才能進行一次v值更新,而TD lear
Q-learning演算法實現1(matlab)
演算法虛擬碼: 得到Q表後,根據如下演算法選擇最優策略: 以機器人走房間為例,程式碼實現如下: 注:原文中的房間狀態0-5分別對應程式碼中1-6 %機器人走房間Q-learning的實現 %% 基本引數 episode=100; %探索的迭代次數 alph
Q-learning演算法實現
create grids for c in range(0, MAZE_W * UNIT, UNIT): x0, y0, x1, y1 = c, 0, c, MAZE_H * UNIT self.canvas.create_line(x0, y0
用Q-learning演算法實現自動走迷宮機器人
專案描述: 在該專案中,你將使用強化學習演算法,實現一個自動走迷宮機器人。 如上圖所示,智慧機器人顯示在右上角。在我們的迷宮中,有陷阱(紅色炸彈)及終點(藍色的目標點)兩種情景。機器人要儘量避開陷阱、儘快到達目的地。 小車可執行的動作包括:向上走 u、向右走 r、
DQN(Deep Q-learning)入門教程(三)之蒙特卡羅法演算法與Q-learning演算法
## 蒙特卡羅法 在介紹Q-learing演算法之前,我們還是對蒙特卡羅法(MC)進行一些介紹。MC方法是一種無模型(model-free)的強化學習方法,目標是得到最優的行為價值函式$q_*$。在前面一篇[部落格](https://www.cnblogs.com/xiaohuiduan/p/1297330
強化學習(七)時序差分離線控制演算法Q-Learning
在強化學習(六)時序差分線上控制演算法SARSA中我們討論了時序差分的線上控制演算法SARSA,而另一類時序差分的離線控制演算法還沒有討論,因此本文我們關注於時序差分離線控制演算法,主要是經典的Q-Learning演算法。 Q-Learning這一篇對應Sutton書的第六章部分和UCL強化學
【強化學習】用pandas 與 numpy 分別實現 q-learning, saras, saras(lambda)演算法
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10159331.html 特別感謝:本文的三幅圖皆來自莫凡的教程 https://morvanzhou.github.io/ pandas是基於numpy的,但是兩者之間的操作有區別
Reinforcement Learning Q-learning 算法學習-2
action 結果 最小 clas gamma -1 文章 距離 blog 在閱讀了Q-learning 算法學習-1文章之後。 我分析了這個算法的本質。 算法本質個人分析。 1.算法的初始狀態是隨機的,所以每個初始狀態都是隨機的,所以每個初始狀態出現的概率都一樣的。如果訓
Q-learning簡明實例Java代碼實現
day [0 pub and out ons value java代碼 company 在《Q-learning簡明實例》中我們介紹了Q-learning算法的簡單例子,從中我們可以總結出Q-learning算法的基本思想 本次選擇的經驗得分 = 本次選擇的反饋得分 + 本
CS294-112 深度強化學習 秋季學期(伯克利)NO.6 Value functions introduction NO.7 Advanced Q learning
ted 分享圖片 enc cti solution function part related ons -------------------------------------------------------------------------------
強化學習(八)價值函數的近似表示與Deep Q-Learning
learning 步驟 狀態更新 任務 eva 學習 max wid 表示 在強化學習系列的前七篇裏,我們主要討論的都是規模比較小的強化學習問題求解算法。今天開始我們步入深度強化學習。這一篇關註於價值函數的近似表示和Deep Q-Learning算法。 De
強化學習(九)與Deep Q-Learning進階之Nature DQN
cal variable 模型 基礎 討論 比較 .com 回放 均方差 在強化學習(八)價值函數的近似表示與Deep Q-Learning中,我們講到了Deep Q-Learning(NIPS 2013)的算法和代碼,在這個算法基礎上,有很多Deep Q-Lear
工作中加密演算法實踐
遊戲中需要對接銀聯渠道 對方需求是需要使用非對稱加密演算法 簽名機制: 對於報文的簽名處理機制如下:首先,對報文中出現簽名域(sign)之外的所有資料元採用key=value的形式按照名稱排序,然後以&作為連線符拼接成待簽名串。其次,對待簽名串使用SHA-1演算法做摘要,再使用接入
時間差分方法Q-learning和sarsa的區別
原文連結:https://blog.csdn.net/qq_27514521/article/details/81146632 Q-learning和sarsa都是利用時間差分目標來更新當前行為值函式的。唯一不同的是在Q-learning中,行動策略(產生資料的策略)和要評估的策略不
強化學習(五) - 無模型學習(Sarsa、Q-Learning)
上一節主要講了Monte-Carlo learning,TD learning。這兩個方法都是在給定策略下來估計價值函式V(s)。 但是我們的目標是想得到最優策略。 基於模型的策略優化過程分為策略評估和策略改進。從一個策略 π 和 v(s) 函式開始,先利用當前
Deep Reinforcement Learning with Double Q-learning
轉載至:https://www.cnblogs.com/wangxiaocvpr/p/5620365.html Deep Reinforcement Learning with Double Q-learning Google DeepMind Abstract 主流的 Q-
【李巨集毅深度強化學習2018】P3 Q-learning(Basic Idea)
第三講 Q-learning(Basic Idea) 視訊地址:http