【强化学习实战】基于gym和tensorflow的强化学习算法实现
【新智元導讀】知乎專欄強化學習大講堂作者郭憲博士開講《強化學習從入門到進階》,我們為您節選了其中的第二節《基于gym和tensorflow的強化學習算法實現》,希望對您有所幫助。同時,由郭憲博士等擔任授課教師的深度強化學習國慶集訓營也將于 10 月 2 日— 6 日在北京舉辦。
基于gym和tensorflow的強化學習算法實現
上一講已經深入剖析了 gym 環境的構建強化學習實戰《第一講 gym學習及二次開發 - 知乎專欄》。這一講,我們將利用gym和tensorflow來實現兩個最經典的強化學習算法qleanring 和基于策略梯度的方法。本節課參考了莫煩的部分代碼(見知乎問答《強化學習(reinforcement learning)有什么好的開源項目、網站、文章推薦一下?》),在此對其表示感謝。這一講分為兩個小節,2.1小節講講用qlearning的方法解決機器人找金幣(該環境已經在上一節給出);2.2 小節以小車倒立擺為例子,詳細講解基于策略梯度的強化學習方法。之所以選擇這兩個方法,一是因為兩者都是經典算法,還有是考慮到機器人找金幣是典型的表格型強化學習問題,而小車倒立擺是典型的狀態空間連續型強化學習問題。
第1小節 qlearning算法實現
1.1 qlearning偽代碼
qlearning算法是off-policy的基于值函數的TD(0)強化學習算法。基于值函數的強化學習算法的本質是更新值函數。其理論和偽代碼已經在第四講給出。現在我們回顧一下:
圖2.1 qlearning 算法偽代碼
從圖2.1中我們看到,qlearning算法的實現可以分為以下關鍵點:行為值函數的表示,探索環境的策略,epsilon貪婪策略,值函數更新時選擇動作的貪婪策略,值函數更新。下面,我就逐個講解一下。
1.2 qlearning的行為值函數表示
對于表格型強化學習算法,值函數是一張表格。對于行為值函數,這張表可以看成是兩維表,其中一維為狀態,另外一維為動作。對于機器人找金幣的例子:
狀態空間為:[1,2,3,4,5,6,7,8]
動作空間為:[‘n’, ‘e’, ’s’, ’w’]
行為值函數可以用字典數據類型來表示,其中字典的索引由狀態-動作對來表示。因此行為值函數的初始化為:
qfunc = dict() #行為值函數為qfun
for s in states:
for a in actions:
key = “d%_s%”%(s,a)
qfun[key] = 0.0
1.3 探索環境的策略:epsilon貪婪策略
智能體通過eplilon貪婪策略來探索環境,epsilon貪婪策略的數學表達式為:
該式子的python代碼實現為:
def epsilon_greedy(qfunc, state, epsilon):
#先找到最大動作
amax = 0
key = "%d_%s"%(state, actions[0])
qmax = qfunc[key]
for i in range(len(actions)): #掃描動作空間得到最大動作值函數
key = "%d_%s"%(state, actions[i])
q = qfunc[key]
if qmax < q:
qmax = q
amax = i
#概率部分
pro = [0.0 for i in range(len(actions))]
pro[amax] += 1-epsilon
for i in range(len(actions)):
pro[i] += epsilon/len(actions)
##根據上面的概率分布選擇動作
r = random.random()
s = 0.0
for i in range(len(actions)):
s += pro[i]
if s>= r: return actions[i]
return actions[len(actions)-1]
從上面的代碼注釋可以看到,該代碼可分成3小段:第1小段是先找到當前狀態下最大的動作;第2小段給每個動作分配概率;第3小段是根據概率分布采樣一個動作。
1.4 值函數更新時,選擇動作的貪婪策略
選擇動作的貪婪策略就是選擇狀態為s’時,值函數最大的動作。其python實現為:
def greedy(qfunc, state):
amax = 0
key = "%d_%s" % (state, actions[0])
qmax = qfunc[key]
for i in range(len(actions)): # 掃描動作空間得到最大動作值函數
key = "%d_%s" % (state, actions[i])
q = qfunc[key]
if qmax < q:
qmax = q
amax = i
return actions[amax]
該段代碼與上段代碼幾乎一樣,不同的是所取的狀態值不一樣。該段代碼的狀態是當前狀態s的下一個狀態s’. 另外,DQN所做的改變是用來選擇行為的值函數網絡稱為目標值函數網絡,跟當前值函數網絡不同。
1.5 值函數更新
值函數更新公式為:
代碼實現為:
key = "%d_%s"%(s, a)
#與環境進行一次交互,從環境中得到新的狀態及回報
s1, r, t1, i =grid.step(a)
key1 = ""
#s1處的最大動作
a1 = greedy(qfunc, s1)
key1 = "%d_%s"%(s1, a1)
#利用qlearning方法更新值函數
qfunc[key] = qfunc[key] + alpha*(r + gamma * qfunc[key1]-qfunc[key])
評論:對于表格型值函數更新過程,我們看到每次更新只影響表格中的一個值,而不會影響行為值函數的其他值,這與行為值函數逼近方法不同。表格型強化學習算法效率很高,一般經過幾次迭代后便能收斂。全部代碼請參看github.gxnk中的qlearning。qlearning 算法的測試在文件learning_and_test.py中
第2小節:基于策略梯度算法實現詳解
該部分需要用到tensorflow和畫圖庫,所以大家先安裝一下cpu版的tensorflow。
2.1 Tensorflow的安裝:
Step1: 在終端激活虛擬環境(如何安裝在上一講):source activate gymlab
Step2: 安裝的tensorflow版本為1.0.0, python=3.5如下命令:
根據該命令所安裝的tensorflow是無gpu的,無gpu的tensorflow對于學習毫無障礙。當然,如果大家做項目,建議安裝gpu版的tensorflow.
Step3: 安裝一個繪圖模塊, 命令為:
pip3 install matplotlib
2.2 策略梯度算法理論基礎
本專欄的第六講已經給出了策略梯度的理論推導,策略梯度理論表明隨機策略的梯度由下式給出:
當隨機策略是高斯策略的時候,第六講已經給出了隨機梯度的計算公式。當隨機策略并非高斯策略時,如何優化參數?
對于小車倒立擺系統如下圖2.2所示。
圖2.2 小車倒立擺系統
上一節我們已經深入剖析了gym環境的構建。從小車倒立擺的環境模型中,我們不難看到,小車倒立擺的狀態空間為
,動作空間為
,當動作為1時,施加正向的力10N;當動作為0時,施加負向的力-10N。
因為動作空間是離散的,因此我們設計隨機策略為softmax策略。Softmax策略如何構建,以及如何構建損失函數,從而將強化學習問題變成一個優化問題。
2.3 soft策略及其損失函數
我們設計一個前向神經網絡策略,如圖2.3所示。
圖2.3 softmax策略
該神經softmax策略的輸入層是小車倒立擺的狀態,維數為4;最后一層是softmax層,維數為2。有機器學習的同學都很清楚,softmax常常作為多分類器的最后一層。
一個最基本的概念是何為softmax層?
如圖2.3,設layer2的輸出為z, 所謂softmax層是指對z作用一個softmax函數。即:
對于softmax策略,策略梯度理論中的隨機策略為:
如圖2.3所示,對應著 layer2 的輸出。
表示動作 a 所對應的softmax輸出。上面的式子便給出了智能體在狀態s處采用動作a的概率。該式是關于的函數,可直接對其求對數,然后求導帶入到策略梯度公式,利用策略梯度的理論更新參數。然而,在這里我們將問題轉化一下,對于一個episode,策略梯度理論的一步更新,其實是對損失函數為
的一步更新。
而損失函數可寫為:
其中
為交叉熵。
在實際計算中,
由未更新的參數策略網絡進行采樣,
則是將狀態直接帶入,是參數?的一個函數。比如,當前動作由采樣網絡
,產生為 a=1; 則
,
,則
這是從信息論中交叉熵的角度來理解softmax層。理論部分就暫時介紹到這,接下來我們關心的是如何將理論變成代碼。
上面,我們已經將策略梯度方法轉化為一個分類問題的訓練過程,其中損失函數為:
那么該網絡的輸入數據是什么呢?
輸入數據有三個:
第一:小車倒立擺的狀態s
第二:作用在小車上的動作a
第三:每個動作對應的累積回報v
我們一一解釋,這些輸入如何獲得。
首先,小車倒立擺的狀態s,這是與環境交互得到的;其次,作用在小車上的動作a,是由采樣網絡得到的,在訓練過程中充當標簽的作用;最后,每個動作的累積回報是由該動作后的累積回報累積并進行歸一化處理得到的。
因此,該代碼可以分為幾個關鍵的函數:策略神經網絡的構建,動作選擇函數,損失函數的構建,累積回報函數v的處理。下面我們一一介紹如何實現。
2.4 基于 tensorflow 的策略梯度算法實現
策略網絡的構建
構建一個神經網絡,最簡單的方法就是利用現有的深度學習軟件,由于兼容性和通用性,這里我們選擇了tensorflow。我們要構建的策略網絡結構為如圖2.4:
圖2.4 策略神經網絡
該神經網絡是最簡單的前向神經網絡,輸入層為狀態s,共4個神經元,第一個隱藏層包括為10個神經元,激活函數為relu。因為輸出為動作的概率,而動作有兩個,因此第二層為2個神經元,沒有激活函數,最后一層為softmax層。
將這段代碼翻譯成tensorflow語言則為:
def _build_net(self):
with tf.name_scope('input'):
#創建占位符作為輸入
self.tf_obs = tf.placeholder(tf.float32, [None, self.n_features], name="observations")
self.tf_acts = tf.placeholder(tf.int32, [None, ], name="actions_num")
self.tf_vt = tf.placeholder(tf.float32, [None, ], name="actions_value")
#第一層
layer = tf.layers.dense(
inputs=self.tf_obs,
units=10,
activation=tf.nn.tanh,
kernel_initializer=tf.random_normal_initializer(mean=0, stddev=0.3),
bias_initializer=tf.constant_initializer(0.1),
name='fc1',
)
#第二層
all_act = tf.layers.dense(
inputs=layer,
units=self.n_actions,
activation=None,
kernel_initializer=tf.random_normal_initializer(mean=0, stddev=0.3),
bias_initializer=tf.constant_initializer(0.1),
name='fc2'
)
#利用softmax函數得到每個動作的概率
self.all_act_prob = tf.nn.softmax(all_act, name='act_prob')
全部代碼可去github上看,在policynet.py文件中。
動作選擇函數:
動作選擇函數是根據采樣網絡生成概率分布,利用該概率分布去采樣動作,具體代碼為:
#定義如何選擇行為,即狀態s處的行為采樣.根據當前的行為概率分布進行采樣
def choose_action(self, observation):
prob_weights = self.sess.run(self.all_act_prob, feed_dict={self.tf_obs:observation[np.newaxis,:]})
#按照給定的概率采樣
action = np.random.choice(range(prob_weights.shape[1]), p=prob_weights.ravel())
return action
其中函數np.random.choice是按照概率分布p=prob_weights.ravel()進行采樣的函數。
損失函數的構建:
在理論部分我們已經說明了損失函數為
即交叉熵乘以累積回報函數。以下為代碼部分:
#定義損失函數
with tf.name_scope('loss'):
neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=all_act,labels=self.tf_acts)
loss = tf.reduce_mean(neg_log_prob*self.tf_vt)
累積回報函數v的處理:
def _discount_and_norm_rewards(self):
#折扣回報和
discounted_ep_rs =np.zeros_like(self.ep_rs)
running_add = 0
for t in reversed(range(0, len(self.ep_rs))):
running_add = running_add * self.gamma + self.ep_rs[t]
discounted_ep_rs[t] = running_add
#歸一化
discounted_ep_rs-= np.mean(discounted_ep_rs)
discounted_ep_rs /= np.std(discounted_ep_rs)
return discounted_ep_rs
有了策略神經網絡,動作選擇函數,損失函數,累積回報函數之后,學習的過程就簡單了,只需要調用一個語句即可:
#定義訓練,更新參數
with tf.name_scope('train'):
self.train_op = tf.train.AdamOptimizer(self.lr).minimize(loss)
該訓練過程為采用自適應動量的優化方法。學習優化的過程如下:
#學習,以便更新策略網絡參數,一個episode之后學一回
def learn(self):
#計算一個episode的折扣回報
discounted_ep_rs_norm = self._discount_and_norm_rewards()
#調用訓練函數更新參數
self.sess.run(self.train_op, feed_dict={
self.tf_obs: np.vstack(self.ep_obs),
self.tf_acts: np.array(self.ep_as),
self.tf_vt: discounted_ep_rs_norm,
})
#清空episode數據
self.ep_obs, self.ep_as, self.ep_rs = [], [],[]
return discounted_ep_rs_norm
2.5 基于策略梯度算法的小車倒立擺問題
有了策略網絡和訓練過程,對于解決小車的問題就很簡單了。基本的框架為:
1. 創建一個環境
2. 生成一個策略網絡
3. 迭代學習
通過與環境交互,學習更新策略網絡參數
4. 利用學到的策略網絡對小車倒立擺系統進行測試
利用softmax策略定義一個貪婪策略。
具體代碼在github上的learning_cartpole.py文件中。
本講結束。
PS:該部分講得有點亂,強烈建議大家去github上下載代碼,我已經做好了中文注釋,大家可以改改參數,親自體會下。所有代碼都在github的第一講文件夾中gxnk/reinforcement-learning-code。
國慶深度強化學習實戰特訓營
由郭博士和香港理工大學增強學習方向博士 Traffas 擔任授課教師的深度強化學習國慶集訓營將于 10 月 2 日— 6 日在北京舉辦。
報名請掃上圖中的二維碼。
探靈教育科技在8月初已經成功舉辦第一期強化學習入門進階培訓課程,受到學員一致好評。根據學員的反饋以及我們最新的教研成果,我們進一步對課程進行了升級、完善。國慶期間,特別推出為期五天的強化學習特訓營活動,通過五天的理論講解以及編程實戰,幫助大家全面、系統的了解、掌握強化學習技術。
面向對象:強化學習的小白、初學者、自己已有一定基礎但是沒有建立系統知識體系的以及其他對于強化學習感興趣的人士。有一定的微積分、線線性代數、概率論基礎,有python編程基礎。學員上課需要自帶電腦。
授課時間地點:10.2-10.6日 北京海淀區(具體地點另行通知)
招生人數:精品小班制,上限 30 人,報名15 人以上開班。
學費:7999 早鳥票 7499(9.24日之前報名)
特別聲明:凡報名參加本次國慶特訓營的學員,一年之內可以免費參加兩次由我公司主辦的為期兩天的線下課程(價值5999元)。
講師介紹:
郭憲,南開大學計算機與控制工程學院博士后。2009年畢業于華中科技大學機械設計制造及自動化專業,同年保送到中國科學院沈陽自動化研究所進行碩博連讀,主攻機器人動力學建模與控制,于2016年1月獲得工學博士學位,期間在國內外知名雜志和會議發表論文數10篇。2016年以來,郭博士主攻方向為機器人智能感知和智能決策,目前主持兩項國家級課題,內容涉及深度學習,深度強化學習等智能算法在機器人領域中的應用。郭博士于2017年3月開始在知乎專欄強化學習知識大講堂,其深入淺出的講解收到廣大知友一致好評。即將出版《強化學習深入淺出完全教程》一書。
知乎鏈接:https://zhuanlan.zhihu.com/sharerl
Traffas,于2014年7月在瑞典皇家理工學院獲得碩士學位,曾在瑞典Accedo公司做程序開發,現在在香港理工大學計算機系攻讀博士學位,任研究助理。Traffas 的研究方向為機器學習、增強學習。目前已發表六篇論文,其中包括中國計算機學會(CCF)推薦的B類論文1篇,C類會議論文1篇.
日程安排:
第一天:授課老師 Traffas
1. 什么是強化學習以及強化學習的方法匯總?
強化學習可以讓AlphaGo無需人類的指導,自己‘左右互搏’,就能悟到更佳出奇制勝的圍棋技巧;可以讓機器人的行動不再需要人類繁雜的編程,自己就可以適應所處的環境。為什么強化學習有如此神奇的功能?到底什么是強化學習?本課將為你娓娓道來....
2. 強化學習領域的基礎概念。
解鎖強化學習領域的術語。介紹增強學習可以解決的問題。介紹Bellman Equation原理,介紹RL和動態規劃的異同點。介紹傳統的tubular based RL。
3. 介紹安裝Python2.7+Anconda+jupyter Notebook
4. 動手編寫第一個增強學習的python 程序(30分鐘),找到玩老虎機的最優策略。
5.基于蒙特卡羅強化學習介紹、同策略、異策略強化學習算法介紹。
6. 答疑、交流
第二天:授課老師 Traffas
1、 強化學習算法實踐,基于強化學習玩21點游戲以及gridworld游戲。
2、 強化學習時間差分算法。介紹同策略Q-learning強化學習方法以及異策略Sara算法。比較和蒙特卡洛算法異同點。介紹eligibility Tree以及TD(lamda)算法。
3、 Gym環境構建以及強化學習算法實現。包括Gym環境的安裝、測試,Gym環境關鍵函數講解以及如何創建自定義Gym環境。
4、 學員動手實踐
5、 老師答疑、交流。
第三天:授課老師 Traffas
1、DQN詳解
DQN是深度強化學習中的強大武器,DeepMind團隊就是利用DQN技術使得計算機在Atari電子游戲中的表現超過了人類的頂級玩家。同時,我們會講解DQN的變種Double DQN、Prioritized Replay,Dual DQN。
2、實踐準備
介紹深度神經網絡DNN以及RNN。Keras安裝,動手設計RNN網絡,解決分類問題。
3、深度強化學習實戰,親自動手編寫一個可以打敗游戲高手的AI。
4、Bug調試、老師答疑、指導、交流。
第四天:授課老師 郭憲
1、策略梯度方法:
教學內容包括:策略梯度方法介紹,似然率策略梯度推導及重要性采樣視角推導,似然率策略梯度的直觀理解,常見的策略表示,常見的減小方差的方法:引入基函數法,修改估計值函數法
2、編程實踐課:基于tensorflow和gym實現小車倒立擺系統、乒乓球游戲
3、TRPO方法介紹及推導:具體包括替代回報函數的構建,單調的改進策略,TRPO實用算法介紹,共軛梯度法搜索可行方向,PPO方法,基于python 的TRPO 方法實現
4、編程指導、交流、答疑。
第五天:主講老師 郭憲
1、AC方法,具體內容包括隨機策略與確定性策略比較、隨機策略 AC 的方法、確定性策略梯度方法、DDPG方法及實現、A3C方法講解、基于python 的 DDPG 方法實現。
2、AC方法及DDPG、A3C實現。
3、逆向強化學習介紹,包括逆向強化學習分類、學徒學習、MMP 方法、結構化分類方法、 神經逆向強化學習、最大熵逆向強化學習、相對熵逆向強化學習、深度逆向強化學習。
4、編程指導、答疑、交流。
總結
以上是生活随笔為你收集整理的【强化学习实战】基于gym和tensorflow的强化学习算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go第三篇之大话容器
- 下一篇: 网站消息通知设计