華文網

「強化學習實戰」基於gym和tensorflow的強化學習演算法實現

基於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])

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,

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、程式設計指導、答疑、交流。

報名請掃海報中的二維碼。

點擊閱讀原文可查看職位詳情,期待你的加入~

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,

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、程式設計指導、答疑、交流。

報名請掃海報中的二維碼。

點擊閱讀原文可查看職位詳情,期待你的加入~