基于tensorflow的最簡單的強(qiáng)化學(xué)習(xí)入門-part0:Q-learning和神經(jīng)網(wǎng)絡(luò)

基于tensorflow的最簡單的強(qiáng)化學(xué)習(xí)入門-part0:Q學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)

本文翻譯自 Simple Reinforcement Learning with Tensorflow Part 0: Q-Learning with Tables and Neural Networks甩骏, 作者是 Arthur Juliani帜羊, 原文鏈接

在這個增強(qiáng)學(xué)習(xí)系列的教程中晴玖,我們打算探索一些列稱為==Q-learning==的增強(qiáng)學(xué)習(xí)算法,它和之前教程介紹過的基于==策略梯度policy-base==的增強(qiáng)算法有所不同崎脉。

我們將從實現(xiàn)一個簡單的查找表算法開始罪治,然后展示如何使用tensorflow實現(xiàn)神經(jīng)網(wǎng)絡(luò)算法『醭危考慮到上述安排,我們從基礎(chǔ)開始测摔,所以這篇教程作為整個系列的part-0置济。希望通過這個系列的教程,我們在理解Q-learning之后锋八,能夠結(jié)合policy gradient和Q-learning方法構(gòu)建更好的增強(qiáng)學(xué)習(xí)網(wǎng)絡(luò)浙于。(如果你對策略網(wǎng)絡(luò)更感興趣或者你已經(jīng)有一些Q-learning的經(jīng)驗,那么你可以從這里開始閱讀)

策略梯度算法(policy gradient)試著學(xué)習(xí)某個函數(shù)挟纱,該函數(shù)可以直接把==狀態(tài)(state)映射為動作(action)的概率分布==路媚。Q-learning和策略梯度算法不一樣,它試著學(xué)習(xí)在每個狀態(tài)下對應(yīng)的值樊销,并且依賴該狀態(tài)執(zhí)行某一個動作整慎。雖然兩種方法最終都允許我們給定情況下采取特定的行動,但是實現(xiàn)該目的的方法是不相同的围苫。你也許已經(jīng)聽說深度Q-learning可以玩atari游戲裤园,我們將要在這里討論和實現(xiàn)這些更復(fù)雜和強(qiáng)大的Q-learning算法。

譯者注:如果要深入了解基于策略梯度的增強(qiáng)學(xué)習(xí)算法剂府,可以參考Andrej Karpathy的文章拧揽,Deep Reinforcement Learning: Pong from Pixels

Tabular Approaches for Tabular Environment(表格算法)

FrozenLake環(huán)境的規(guī)則

在本篇教程中,我們將要試著去解決來自于OpenAI gymFrozenLake問題腺占。OpenAI gym提供了一種簡單的環(huán)境淤袜,讓研究者在一些簡單的游戲中試驗他們的方法。比如FrozenLake衰伯,該游戲包括一個4*4的網(wǎng)絡(luò)格子铡羡,每個格子可以是==起始塊,目標(biāo)塊意鲸、凍結(jié)塊或者危險塊==烦周。我們的目標(biāo)是讓agent學(xué)習(xí)從開始塊如何行動到目標(biāo)塊上,而不是移動到危險塊上怎顾。agent可以選擇向上读慎、向下、向左或者向右移動槐雾,同時游戲中還有可能吹來一陣風(fēng)夭委,將agent吹到任意的方塊上。在這種情況下募强,每個時刻都有完美的策略是不能的株灸,但是如何避免危險洞并且到達(dá)目標(biāo)洞肯定是可行的。

增強(qiáng)學(xué)習(xí)需要我們定義==獎勵函數(shù)(reward function)==钻注,那么定義每一步的獎勵是0蚂且,如果進(jìn)入目標(biāo)快則獎勵為1。因此我們需要一種算法能夠?qū)W習(xí)到長期的期望獎勵幅恋,而本教程要講的Q-learning提供了這種機(jī)制杏死。

Q-learning最簡單的實現(xiàn)方式是一個基于所有可能的狀態(tài)和執(zhí)行動作的查找表。在表中的每個單元格中捆交,我們學(xué)習(xí)到在給定狀態(tài)下執(zhí)行特定動作的是否有效的值淑翼。在FrozenLake游戲中,我們有16種可能的狀態(tài)和4種可能的動作品追,給出了16*4的Q值表玄括。我們一開始初始化表格中的所有值為0,然后根據(jù)我們觀察到的各種動作獲得的獎勵肉瓦,相應(yīng)地更新表格遭京。

我們使用稱為貝爾曼方程(bellman equation)的更新來對Q表進(jìn)行更新胃惜。==該方程表明,給定動作的長期預(yù)期獎勵來自于當(dāng)前動作的即時獎勵哪雕,以及來自未來最佳動作的預(yù)期獎勵==船殉。公式如下:

Eq 1. Q(s,a)=r+\lambda(maxQ(s'+a'))

這個公式說明,給定動作a和狀態(tài)s的q值斯嚎,等于當(dāng)前的獎勵r加上未來預(yù)期的q值利虫。$\lambda$可以看作未來期望q值和當(dāng)前獎勵相比的權(quán)重。以這種方式更新堡僻,q表就會慢慢的收斂到在給定狀態(tài)下和動作下的期望收益糠惫。下面一段python代碼就是基于FrozenLake游戲的Q-table的算法實現(xiàn)。

import gym
import numpy as np
#Load the environment
env = gym.make('FrozenLake-v0')
#Implement Q-Table learning algorithm
#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .85
y = .99
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):
    #Reset environment and get first new observation
    s = env.reset()
    rAll = 0
    d = False
    j = 0
    #The Q-Table learning algorithm
    while j < 99:
        j+=1
        #Choose an action by greedily (with noise) picking from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        #Get new state and reward from environment
        s1,r,d,_ = env.step(a)
        #Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    #jList.append(j)
    rList.append(rAll)
print "Score over time: " +  str(sum(rList)/num_episodes)
print "Final Q-Table Values"
print Q

神經(jīng)網(wǎng)絡(luò)和Q-learning

現(xiàn)在你可能會想钉疫,q-table方法效果不錯硼讽,但是很難擴(kuò)展。雖然很容易為一個簡單的游戲建立16*4的表陌选,但是在任何現(xiàn)代游戲或者現(xiàn)實世界環(huán)境中可能的狀態(tài)數(shù)量幾乎都是無限大的理郑。對于大多數(shù)有趣的問題,q-table方法太簡單了咨油。所以我們需要另一種方法能夠描述狀態(tài)您炉,并且生成Q值。這就是為什么我們需要神經(jīng)網(wǎng)絡(luò)役电,我們可以將任意數(shù)量的可能狀態(tài)表示為向量赚爵,并學(xué)習(xí)將它們映射為Q值。

在FrozenLake例子中法瑟,我們將采用單層網(wǎng)絡(luò)冀膝,該網(wǎng)絡(luò)會將狀態(tài)編碼為獨(dú)熱碼(one-hot vector),并且生成一個四維的Q值向量霎挟。我們可以使用Tensorflow來選擇網(wǎng)絡(luò)的層數(shù)窝剖,激活函數(shù)和輸入類型,這都上文中Q表格方法辦不到的酥夭。使用神經(jīng)網(wǎng)絡(luò)時赐纱,更新的方法和Q表是不同的,我們將使用反向傳播算法更新?lián)p失函數(shù)熬北。

Eq 2. Loss=\sum(Qtarget-Q)^2

如果讀者不熟悉深度學(xué)習(xí)/神經(jīng)網(wǎng)絡(luò)疙描,可以從這里開始學(xué)習(xí)。

這里給出基于tensorflow實現(xiàn)的簡單Q網(wǎng)絡(luò):

import gym
import numpy as np
import random
import tensorflow as tf
import matplotlib.pyplot as plt
#Load the environment
env = gym.make('FrozenLake-v0')
#The Q-Network Approach
#Implementing the network itself

tf.reset_default_graph()
These lines establish the feed-forward part of the network used to choose actions
inputs1 = tf.placeholder(shape=[1,16],dtype=tf.float32)
W = tf.Variable(tf.random_uniform([16,4],0,0.01))
Qout = tf.matmul(inputs1,W)
predict = tf.argmax(Qout,1)

#Below we obtain the loss by taking the sum of squares difference between the target and prediction Q values.
nextQ = tf.placeholder(shape=[1,4],dtype=tf.float32)
loss = tf.reduce_sum(tf.square(nextQ - Qout))
trainer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
updateModel = trainer.minimize(loss)

#Training the network
init = tf.initialize_all_variables()

# Set learning parameters
y = .99
e = 0.1
num_episodes = 2000
#create lists to contain total rewards and steps per episode
jList = []
rList = []
with tf.Session() as sess:
    sess.run(init)
    for i in range(num_episodes):
        #Reset environment and get first new observation
        s = env.reset()
        rAll = 0
        d = False
        j = 0
        #The Q-Network
        while j < 99:
            j+=1
            #Choose an action by greedily (with e chance of random action) from the Q-network
            a,allQ = sess.run([predict,Qout],feed_dict={inputs1:np.identity(16)[s:s+1]})
            if np.random.rand(1) < e:
                a[0] = env.action_space.sample()
            #Get new state and reward from environment
            s1,r,d,_ = env.step(a[0])
            #Obtain the Q' values by feeding the new state through our network
            Q1 = sess.run(Qout,feed_dict={inputs1:np.identity(16)[s1:s1+1]})
            #Obtain maxQ' and set our target value for chosen action.
            maxQ1 = np.max(Q1)
            targetQ = allQ
            targetQ[0,a[0]] = r + y*maxQ1
            #Train our network using target and predicted Q values
            _,W1 = sess.run([updateModel,W],feed_dict={inputs1:np.identity(16)[s:s+1],nextQ:targetQ})
            rAll += r
            s = s1
            if d == True:
                #Reduce chance of random action as we train the model.
                e = 1./((i/50) + 10)
                break
        jList.append(j)
        rList.append(rAll)
print "Percent of succesful episodes: " + str(sum(rList)/num_episodes) + "%"

當(dāng)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)解決FrozenLake問題時讶隐,結(jié)果證明它并不像Q-table方法一樣有效起胰。==雖然神經(jīng)網(wǎng)絡(luò)允許更大的靈活性,但是它們以Q-learning的穩(wěn)定性為代價==巫延。我們簡單的Q網(wǎng)絡(luò)還可以有很多的期繳來達(dá)到更好的效果效五,==一個稱為經(jīng)驗回放(Experience Replay)另一個稱為目標(biāo)網(wǎng)絡(luò)凍結(jié)(Freezing Target Networks)==地消。這些改進(jìn)方法和其他的調(diào)整方法是深度增強(qiáng)學(xué)習(xí)能夠起作用的關(guān)鍵,我們回來后續(xù)的章節(jié)中更詳細(xì)的探討有關(guān)理論畏妖。

如果你覺得這篇文章對你有幫助犯建,可以關(guān)注原作者,或者打賞作者瓜客。

如果你想要繼續(xù)看到我翻譯的文章,也可以專注專欄竿开。第一次翻譯谱仪,希望能和大家一起交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末否彩,一起剝皮案震驚了整個濱河市疯攒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌列荔,老刑警劉巖敬尺,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贴浙,居然都是意外死亡砂吞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門崎溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜻直,“玉大人,你說我怎么就攤上這事袁串「哦” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵囱修,是天一觀的道長赎瑰。 經(jīng)常有香客問我,道長破镰,這世上最難降的妖魔是什么餐曼? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮啤咽,結(jié)果婚禮上晋辆,老公的妹妹穿的比我還像新娘。我一直安慰自己宇整,他們只是感情好瓶佳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳞青,像睡著了一般霸饲。 火紅的嫁衣襯著肌膚如雪为朋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天厚脉,我揣著相機(jī)與錄音习寸,去河邊找鬼。 笑死傻工,一個胖子當(dāng)著我的面吹牛霞溪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播中捆,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼鸯匹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泄伪?” 一聲冷哼從身側(cè)響起殴蓬,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蟋滴,沒想到半個月后染厅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡津函,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年肖粮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球散。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡尿赚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕉堰,到底是詐尸還是另有隱情凌净,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布屋讶,位于F島的核電站冰寻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏皿渗。R本人自食惡果不足惜斩芭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乐疆。 院中可真熱鬧划乖,春花似錦、人聲如沸挤土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迷殿,卻和暖如春儿礼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庆寺。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工蚊夫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懦尝。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓知纷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陵霉。 傳聞我的和親對象是個殘疾皇子屈扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容