日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Keras+OpenAI強(qiáng)化學(xué)習(xí)實踐:深度Q網(wǎng)絡(luò)

在之前的 Keras/OpenAI 教程中,我們討論了一個將深度學(xué)習(xí)應(yīng)用于強(qiáng)化學(xué)習(xí)環(huán)境的基礎(chǔ)案例,它的效果非常顯著。想象作為訓(xùn)練數(shù)據(jù)的完全隨機(jī)序列(series)。任何兩個序列都不可能高度彼此重復(fù),因為這些都是隨機(jī)產(chǎn)生的。然而,成功的試驗之間存在相同的關(guān)鍵特征,例如在 CartPole 游戲中,當(dāng)桿往右靠時需要將車向右推,反之亦然。因此,通過在所有這些試驗數(shù)據(jù)上訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò),我們提取了有助于成功的共同模式(pattern),并能夠平滑導(dǎo)致其產(chǎn)生獨立故障的細(xì)節(jié)。

成都創(chuàng)新互聯(lián)公司是專業(yè)的淮安區(qū)網(wǎng)站建設(shè)公司,淮安區(qū)接單;提供成都網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行淮安區(qū)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

話雖如此,我們認(rèn)為這次的環(huán)境比上次要困難得多,即游戲:MountainCar。

一、更復(fù)雜的環(huán)境

即使看上去我們應(yīng)該能夠應(yīng)用與上周相同的技術(shù),但是有一個關(guān)鍵特征使它變得不可能:我們無法生成訓(xùn)練數(shù)據(jù)。與簡單的 CartPole 例子不同,采取隨機(jī)移動通常只會導(dǎo)致實驗的結(jié)果很差(谷底)。也就是說,我們的實驗結(jié)果***都是相同的-200。這用作訓(xùn)練數(shù)據(jù)幾乎沒有用。想象一下,如果你無論在考試中做出什么答案,你都會得到 0%,那么你將如何從這些經(jīng)驗中學(xué)習(xí)?

「MountainCar-v0」環(huán)境的隨機(jī)輸入不會產(chǎn)生任何對于訓(xùn)練有用的輸出。

由于這些問題,我們必須找出一種能逐步改進(jìn)以前實驗的方法。為此,我們使用強(qiáng)化學(xué)習(xí)最基本的方法:Q-learning!

二、DQN 的理論背景

Q-learning 的本質(zhì)是創(chuàng)建一個「虛擬表格」,這個表格包含了當(dāng)前環(huán)境狀態(tài)下每個可能的動作能得到多少獎勵。下面來詳細(xì)說明:

網(wǎng)絡(luò)可以想象為內(nèi)生有電子表格的網(wǎng)絡(luò),該表格含有當(dāng)前環(huán)境狀態(tài)下可能采取的每個可能的動作的值。

「虛擬表格」是什么意思?想像一下,對于輸入空間的每個可能的動作,你都可以為每個可能采取的動作賦予一個分?jǐn)?shù)。如果這可行,那么你可以很容易地「打敗」環(huán)境:只需選擇具有***分?jǐn)?shù)的動作!但是需要注意 2 點:首先,這個分?jǐn)?shù)通常被稱為「Q-分?jǐn)?shù)」,此算法也由此命名。第二,與任何其它得分一樣,這些 Q-分?jǐn)?shù)在其模擬的情境外沒有任何意義。也就是說,它們沒有確定的意義,但這沒關(guān)系,因為我們只需要做比較。

為什么對于每個輸入我們都需要一個虛擬表格?難道沒有統(tǒng)一的表格嗎?原因是這樣做不和邏輯:這與在谷底談采取什么動作是***的,及在向左傾斜時的***點討論采取什么動作是***的是一樣的道理。

現(xiàn)在,我們的主要問題(為每個輸入建立虛擬表格)是不可能的:我們有一個連續(xù)的(***)輸入空間!我們可以通過離散化輸入空間來解決這個問題,但是對于本問題來說,這似乎是一個非常棘手的解決方案,并且在將來我們會一再遇到。那么,我們?nèi)绾谓鉀Q呢?那就是通過將神經(jīng)網(wǎng)絡(luò)應(yīng)用于這種情況:這就是 DQN 中 D 的來歷!

三、DQN agent

現(xiàn)在,我們現(xiàn)在已經(jīng)將問題聚焦到:找到一種在給定當(dāng)前狀態(tài)下為不同動作賦值 Q-分?jǐn)?shù)的方法。這是使用任何神經(jīng)網(wǎng)絡(luò)時遇到的非常自然的***個問題的答案:我們模型的輸入和輸出是什么?本模型中你需要了解的數(shù)學(xué)方程是以下等式(不用擔(dān)心,我們會在下面講解):

如上所述,Q 代表了給定當(dāng)前狀態(tài)(s)和采取的動作(a)時我們模型估計的價值。然而,目標(biāo)是確定一個狀態(tài)價值的總和。那是什么意思?即從該位置獲得的即時獎勵和將來會獲得的預(yù)期獎勵之和。也就是說,我們要考慮一個事實,即一個狀態(tài)的價值往往不僅反映了它的直接收益,而且還反映了它的未來收益。在任何情況下,我們會將未來的獎勵折現(xiàn),因為對于同樣是收到$100 的兩種情況(一種為將來,一種為現(xiàn)在),我會永遠(yuǎn)選擇現(xiàn)在的交易,因為未來是會變化的。γ因子反映了此狀態(tài)預(yù)期未來收益的貶值。

這就是我們需要的所有數(shù)學(xué)!下面是實際代碼的演示!

四、DQN agent 實現(xiàn)

深度 Q 網(wǎng)絡(luò)為持續(xù)學(xué)習(xí)(continuous learning),這意味著不是簡單地累積一批實驗/訓(xùn)練數(shù)據(jù)并將其傳入模型。相反,我們通過之前運行的實驗創(chuàng)建訓(xùn)練數(shù)據(jù),并且直接將運行后創(chuàng)建的數(shù)據(jù)饋送如模型。如果現(xiàn)在感到好像有些模糊,別擔(dān)心,該看看代碼了。代碼主要在定義一個 DQN 類,其中將實現(xiàn)所有的算法邏輯,并且我們將定義一組簡單的函數(shù)來進(jìn)行實際的訓(xùn)練。

1. DQN 超參數(shù)

首先,我們將討論一些與 DQN 相關(guān)的參數(shù)。它們大多數(shù)是實現(xiàn)主流神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn)參數(shù):

 
 
 
 
  1. class DQN: 
  2.     def __init__(self, env): 
  3.         self.env     = env 
  4.         self.memory  = deque(maxlen=2000) 
  5.          
  6.         self.gamma = 0.95 
  7.         self.epsilon = 1.0 
  8.         self.epsilon_min = 0.01 
  9.         self.epsilon_decay = 0.995 
  10.         self.learning_rate = 0.01 

讓我們來一步一步地講解這些超參數(shù)。***個是環(huán)境(env),這僅僅是為了在建立模型時便于引用矩陣的形狀?!赣洃?memory)」是 DQN 的關(guān)鍵組成部分:如前所述,我們不斷通過實驗訓(xùn)練模型。然而與直接訓(xùn)練實驗的數(shù)據(jù)不同,我們將它們先添加到內(nèi)存中并隨機(jī)抽樣。為什么這樣做呢,難道僅僅將*** x 個實驗數(shù)據(jù)作為樣本進(jìn)行訓(xùn)練不好嗎?原因有點微妙。設(shè)想我們只使用最近的實驗數(shù)據(jù)進(jìn)行訓(xùn)練:在這種情況下,我們的結(jié)果只會學(xué)習(xí)其最近的動作,這可能與未來的預(yù)測沒有直接的關(guān)系。特別地,在本環(huán)境下,如果我們在斜坡右側(cè)向下移動,使用最近的實驗數(shù)據(jù)進(jìn)行訓(xùn)練將需要在斜坡右側(cè)向上移動的數(shù)據(jù)上進(jìn)行訓(xùn)練。但是,這與在斜坡左側(cè)的情景需決定采取的動作無關(guān)。所以,通過抽取隨機(jī)樣本,將保證不會偏離訓(xùn)練集,而是理想地學(xué)習(xí)我們將遇到的所有環(huán)境。

我們現(xiàn)在來討論模型的超參數(shù):gamma、epsilon 以及 epsilon 衰減和學(xué)習(xí)速率。***個是前面方程中討論的未來獎勵的折現(xiàn)因子(<1),***一個是標(biāo)準(zhǔn)學(xué)習(xí)速率參數(shù),我們不在這里討論。第二個是 RL 的一個有趣方面,值得一談。在任何一種學(xué)習(xí)經(jīng)驗中,我們總是在探索與利用之間做出選擇。這不僅限于計算機(jī)科學(xué)或?qū)W術(shù)界:我們每天都在做這件事!

考慮你家附近的飯店。你***一次嘗試新飯店是什么時候?可能很久以前。這對應(yīng)于你從探索到利用的轉(zhuǎn)變:與嘗試找到新的更好的機(jī)會不同,你根據(jù)自己以往的經(jīng)驗找到***的解決方案,從而***化效用。對比當(dāng)你剛搬家時:當(dāng)時你不知道什么飯店是好的,所以被誘惑去探索新選擇。換句話說,這時存在明確的學(xué)習(xí)趨勢:當(dāng)你不了解它們時,探索所有的選擇,一旦你對其中的一些建立了意見,就逐漸轉(zhuǎn)向利用。以同樣的方式,我們希望我們的模型能夠捕捉這種自然的學(xué)習(xí)模型,而 epsilon 扮演著這個角色。

Epsilon 表示我們將致力于探索的時間的一小部分。也就是說,實驗的分?jǐn)?shù) self.epsilon,我們將僅僅采取隨機(jī)動作,而不是我們預(yù)測在這種情況下***的動作。如上所述,我們希望在開始時形成穩(wěn)定評估之前更經(jīng)常地采取隨機(jī)動作:因此開始時初始化ε接近 1.0,并在每一個連續(xù)的時間步長中以小于 1 的速率衰減它。

2. DQN 模型

在上面的 DQN 的初始化中排除了一個關(guān)鍵環(huán)節(jié):用于預(yù)測的實際模型!在原來的 Keras RL 教程中,我們直接給出數(shù)字向量形式的輸入和輸出。因此,除了全連接層之外,不需要在網(wǎng)絡(luò)中使用更復(fù)雜的層。具體來說,我們將模型定義為:

 
 
 
 
  1. def create_model(self): 
  2.         model   = Sequential() 
  3.         state_shape  = self.env.observation_space.shape 
  4.         model.add(Dense(24, input_dim=state_shape[0],  
  5.             activation="relu")) 
  6.         model.add(Dense(48, activation="relu")) 
  7.         model.add(Dense(24, activation="relu")) 
  8.         model.add(Dense(self.env.action_space.n)) 
  9.         model.compile(loss="mean_squared_error", 
  10.             optimizer=Adam(lr=self.learning_rate)) 
  11.         return model 

并用它來定義模型和目標(biāo)模型(如下所述):

 
 
 
 
  1. def __init__(self, env): 
  2.         self.env     = env 
  3.         self.memory  = deque(maxlen=2000) 
  4.          
  5.         self.gamma = 0.95 
  6.         self.epsilon = 1.0 
  7.         self.epsilon_min = 0.01 
  8.         self.epsilon_decay = 0.995 
  9.         self.learning_rate = 0.01 
  10.         self.tau = .05 
  11.         selfself.model = self.create_model() 
  12.         # "hack" implemented by DeepMind to improve convergence 
  13.         selfself.target_model = self.create_model() 

事實上,有兩個單獨的模型,一個用于做預(yù)測,一個用于跟蹤「目標(biāo)值」,這是反直覺的。明確地說,模型(self.model)的作用是對要采取的動作進(jìn)行實際預(yù)測,目標(biāo)模型(self.target_model)的作用是跟蹤我們想要模型采取的動作。

為什么不用一個模型做這兩件事呢?畢竟,如果預(yù)測要采取的動作,那不會間接地確定我們想要模型采取的模式嗎?這實際上是 DeepMind 發(fā)明的深度學(xué)習(xí)的「不可思議的技巧」之一,它用于在 DQN 算法中獲得收斂。如果使用單個模型,它可以(通常會)在簡單的環(huán)境(如 CartPole)中收斂。但是,在這些更為復(fù)雜的環(huán)境中并不收斂的原因在于我們?nèi)绾螌δP瓦M(jìn)行訓(xùn)練:如前所述,我們正在對模型進(jìn)行「即時」訓(xùn)練。

因此,在每個時間步長進(jìn)行訓(xùn)練模型,如果我們使用單個網(wǎng)絡(luò),實際上也將在每個時間步長時改變「目標(biāo)」。想想這將多么混亂!那就如同,開始老師告訴你要完成教科書中的第 6 頁,當(dāng)你完成了一半時,她把它改成了第 9 頁,當(dāng)你完成一半的時候,她告訴你做第 21 頁!因此,由于缺乏明確方向以利用優(yōu)化器,即梯度變化太快難以穩(wěn)定收斂,將導(dǎo)致收斂不足。所以,作為代償,我們有一個變化更慢的網(wǎng)絡(luò)以跟蹤我們的最終目標(biāo),和一個最終實現(xiàn)這些目標(biāo)的網(wǎng)絡(luò)。

3. DQN 訓(xùn)練

訓(xùn)練涉及三個主要步驟:記憶、學(xué)習(xí)和重新定位目標(biāo)。***步基本上只是隨著實驗的進(jìn)行向記憶添加數(shù)據(jù):

 
 
 
 
  1. def remember(self, state, action, reward, new_state, done): 
  2.         self.memory.append([state, action, reward, new_state, done]) 

這里沒有太多的注意事項,除了我們必須存儲「done」階段,以了解我們以后如何更新獎勵函數(shù)。轉(zhuǎn)到 DQN 主體的訓(xùn)練函數(shù)。這是使用存儲記憶的地方,并積極從我們過去看到的內(nèi)容中學(xué)習(xí)。首先,從整個存儲記憶中抽出一個樣本。我們認(rèn)為每個樣本是不同的。正如我們在前面的等式中看到的,我們要將 Q-函數(shù)更新為當(dāng)前獎勵之和與預(yù)期未來獎勵的總和(貶值為 gamma)。在實驗結(jié)束時,將不再有未來的獎勵,所以該狀態(tài)的價值為此時我們收到的獎勵之和。然而,在非終止?fàn)顟B(tài),如果我們能夠采取任何可能的動作,將會得到的***的獎勵是什么?我們得到:

 
 
 
 
  1. def replay(self): 
  2.         batch_size = 32 
  3.         if len(self.memory) < batch_size:  
  4.             return 
  5.         samples = random.sample(self.memory, batch_size) 
  6.         for sample in samples: 
  7.             state, action, reward, new_state, done = sample 
  8.             target = self.target_model.predict(state) 
  9.             if done: 
  10.                 target[0][action] = reward 
  11.             else: 
  12.                 Q_future = max( 
  13.                     self.target_model.predict(new_state)[0]) 
  14.                 target[0][action] = reward + Q_future * self.gamma 
  15.             self.model.fit(state, target, epochs=1, verbose=0) 

***,我們必須重新定位目標(biāo),我們只需將主模型的權(quán)重復(fù)制到目標(biāo)模型中。然而,與主模型訓(xùn)練的方法不同,目標(biāo)模型更新較慢:

 
 
 
 
  1. def target_train(self): 
  2.         weights = self.model.get_weights() 
  3.         target_weights = self.target_model.get_weights() 
  4.         for i in range(len(target_weights)): 
  5.             target_weights[i] = weights[i] 
  6.         self.target_model.set_weights(target_weights) 

4. DQN 動作

***一步是讓 DQN 實際執(zhí)行希望的動作,在給定的 epsilon 參數(shù)基礎(chǔ)上,執(zhí)行的動作在隨機(jī)動作與基于過去訓(xùn)練的預(yù)測動作之間選擇,如下所示:

 
 
 
 
  1. def act(self, state): 
  2.         self.epsilon *= self.epsilon_decay 
  3.         self.epsilon = max(self.epsilon_min, self.epsilon) 
  4.         if np.random.random() < self.epsilon: 
  5.             return self.env.action_space.sample() 
  6.         return np.argmax(self.model.predict(state)[0]) 

5. 訓(xùn)練 agent

現(xiàn)在訓(xùn)練我們開發(fā)的復(fù)雜的 agent。將其實例化,傳入經(jīng)驗數(shù)據(jù),訓(xùn)練 agent,并更新目標(biāo)網(wǎng)絡(luò):

 
 
 
 
  1. def main(): 
  2.     env     = gym.make("MountainCar-v0") 
  3.     gamma   = 0.9 
  4.     epsilon = .95 
  5.     trials  = 100 
  6.     trial_len = 500 
  7.     updateTargetNetwork = 1000 
  8.     dqn_agent = DQN(envenv=env) 
  9.     steps = [] 
  10.     for trial in range(trials): 
  11.         cur_state = env.reset().reshape(1,2) 
  12.         for step in range(trial_len): 
  13.             action = dqn_agent.act(cur_state) 
  14.             env.render() 
  15.             new_state, reward, done, _ = env.step(action) 
  16.             rewardreward = reward if not done else -20 
  17.             print(reward) 
  18.             new_statenew_state = new_state.reshape(1,2) 
  19.             dqn_agent.remember(cur_state, action,  
  20.                 reward, new_state, done) 
  21.              
  22.             dqn_agent.replay() 
  23.             dqn_agent.target_train() 
  24.             cur_state = new_state 
  25.             if done: 
  26.                 break 
  27.         if step >= 199: 
  28.             print("Failed to complete trial") 
  29.         else: 
  30.             print("Completed in {} trials".format(trial)) 
  31.             break 

五、完整的代碼

這就是使用 DQN 的「MountainCar-v0」環(huán)境的完整代碼!

 
 
 
 
  1. import gym 
  2. import numpy as np 
  3. import random 
  4. from keras.models import Sequential 
  5. from keras.layers import Dense, Dropout 
  6. from keras.optimizers import Adam 
  7.  
  8. from collections import deque 
  9.  
  10. class DQN: 
  11.    def __init__(self, env): 
  12.        self.env     = env 
  13.        self.memory  = deque(maxlen=2000) 
  14.         
  15.        self.gamma = 0.85 
  16.        self.epsilon = 1.0 
  17.        self.epsilon_min = 0.01 
  18.        self.epsilon_decay = 0.995 
  19.        self.learning_rate = 0.005 
  20.        self.tau = .125 
  21.  
  22.        selfself.model        = self.create_model() 
  23.        selfself.target_model = self.create_model() 
  24.  
  25.    def create_model(self): 
  26.        model   = Sequential() 
  27.        state_shape  = self.env.observation_space.shape 
  28.        model.add(Dense(24, input_dim=state_shape[0], activation="relu")) 
  29.        model.add(Dense(48, activation="relu")) 
  30.        model.add(Dense(24, activation="relu")) 
  31.        model.add(Dense(self.env.action_space.n)) 
  32.        model.compile(loss="mean_squared_error", 
  33.            optimizer=Adam(lr=self.learning_rate)) 
  34.        return model 
  35.  
  36.    def act(self, state): 
  37.        self.epsilon *= self.epsilon_decay 
  38.        self.epsilon = max(self.epsilon_min, self.epsilon) 
  39.        if np.random.random() < self.epsilon: 
  40.            return self.env.action_space.sample() 
  41.        return np.argmax(self.model.predict(state)[0]) 
  42.  
  43.    def remember(self, state, action, reward, new_state, done): 
  44.        self.memory.append([state, action, reward, new_state, done]) 
  45.  
  46.    def replay(self): 
  47.        batch_size = 32 
  48.        if len(self.memory) < batch_size:  
  49.            return 
  50.  
  51.        samples = random.sample(self.memory, batch_size) 
  52.        for sample in samples: 
  53.            state, action, reward, new_state, done = sample 
  54.            target = self.target_model.predict(state) 
  55.            if done: 
  56.                target[0][action] = reward 
  57.            else: 
  58.                Q_future = max(self.target_model.predict(new_state)[0]) 
  59.                target[0][action] = reward + Q_future * self.gamma 
  60.            self.model.fit(state, target, epochs=1, verbose=0) 
  61.  
  62.    def target_train(self): 
  63.        weights = self.model.get_weights() 
  64.        target_weights = self.target_model.get_weights() 
  65.        for i in range(len(target_weights)): 
  66.            target_weights[i] = weights[i] * self.tau + target_weights[i] * (1 - self.tau) 
  67.        self.target_model.set_weights(target_weights) 
  68.  
  69.    def save_model(self, fn): 
  70.        self.model.save(fn) 
  71.  
  72. def main(): 
  73.    env     = gym.make("MountainCar-v0") 
  74.    gamma   = 0.9 
  75.    epsilon = .95 
  76.  
  77.    trials  = 1000 
  78.    trial_len = 500 
  79.  
  80.    # updateTargetNetwork = 1000 
  81.    dqn_agent = DQN(envenv=env) 
  82.    steps = [] 
  83.    for trial in range(trials): 
  84.        cur_state = env.reset().reshape(1,2) 
  85.        for step in range(trial_len): 
  86.            action = dqn_agent.act(cur_state) 
  87.            new_state, reward, done, _ = env.step(action) 
  88.  
  89.            # rewardreward = reward if not done else -20 
  90.            new_statenew_state = new_state.reshape(1,2) 
  91.            dqn_agent.remember(cur_state, action, reward, new_state, done) 
  92.             
  93.            dqn_agent.replay()       # internally iterates default (prediction) model 
  94.            dqn_agent.target_train() # iterates target model 
  95.  
  96.            cur_state = new_state 
  97.            if done: 
  98.                break 
  99.        if step >= 199: 
  100.            print("Failed to complete in trial {}".format(trial)) 
  101.            if step % 10 == 0: 
  102.                dqn_agent.save_model("trial-{}.model".format(trial)) 
  103.        else: 
  104.            print("Completed in {} trials".format(trial)) 
  105.            dqn_agent.save_model("success.model") 
  106.            break 
  107.  
  108. if __name__ == "__main__": 
  109.    main() 

原文:

https://medium.com/towards-data-science/reinforcement-learning-w-keras-openai-dqns-1eed3a5338c

【本文是專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】


標(biāo)題名稱:Keras+OpenAI強(qiáng)化學(xué)習(xí)實踐:深度Q網(wǎng)絡(luò)
分享URL:http://www.dlmjj.cn/article/dheecii.html