官术网_书友最值得收藏!

7.2 PTAN庫

該庫位于GitHub(https://github.com/Shmuma/ptan)。所有后續(xù)的示例均使用PTAN 0.6版本實現(xiàn),通過運行下面的命令,就可以在你的虛擬環(huán)境安裝PTAN 0.6:

142-01

PATN最初的目標(biāo)是簡化我的RL實驗,并試圖在兩個極端情況之間保持平衡:

  • 導(dǎo)入庫之后,只需要編寫一行帶有大量參數(shù)的代碼,就能訓(xùn)練提供的方法,比如DQN(一個非常生動的例子就是OpenAI Baselines項目)。
  • 從頭開始實現(xiàn)一切。

第一個極端情況的方法非常不靈活。當(dāng)你使用庫支持的一些方法的時候,它能很好地工作。但是如果你想要實現(xiàn)一些酷炫的功能,你很快就會發(fā)現(xiàn)必須用一些hack的方法同庫作者施加的限制做斗爭,而不是解決想解決的問題。

第二個極端情況則給了太多的自由,需要用戶自己一遍又一遍地實現(xiàn)回放緩沖區(qū)、軌跡處理,這些都很容易出錯,且很無聊、低效。

PTAN試圖平衡這兩個極端情況,提供高質(zhì)量的構(gòu)建塊來簡化RL代碼,同時盡量提供足夠的靈活度,并保證不會限制創(chuàng)造力。

宏觀來講,PTAN提供了下面的實體:

  • Agent:知道如何將一批觀察轉(zhuǎn)換成一批需要執(zhí)行的動作的類。它還可以包含可選狀態(tài),當(dāng)需要在一個片段中為后續(xù)動作記錄一些信息的時候可以用到。(我們會在第17章用到這個方法,在深度確定性策略梯度(Deep Deterministic Policy Gradient,DDPG)中,需要在探索的時候包含奧恩斯坦–烏倫貝克隨機(jī)過程)。本庫提供了好幾個智能體用于最常見的一些RL場景,你也完全可以編寫自己的BaseAgent子類。
  • ActionSelector:一小段與Agent協(xié)同工作的邏輯,它知道如何從網(wǎng)絡(luò)的輸出中選擇動作。
  • ExperienceSource和它的變體:Agent的實例和Gym環(huán)境對象可以提供關(guān)于片段軌跡的信息。它最簡單的形式就是每次一個(a, r, s')狀態(tài)轉(zhuǎn)移,但其功能遠(yuǎn)不止如此。
  • ExperienceSourceBuffer和它的變體:具有各種特性的回放緩沖區(qū)。包含一個簡單的回放緩沖區(qū)和兩個版本的帶優(yōu)先級的回放緩沖區(qū)。
  • 各種工具類,比如TargetNet和用于時間序列預(yù)處理的包裝器(用于在TensorBoard中追蹤訓(xùn)練進(jìn)度)。
  • PyTorch Ignite幫助類可以將PTAN集成到Ignite框架中去。
  • Gym環(huán)境包裝器,例如Atari游戲的包裝器(從OpenAI Baselines復(fù)制而來,并做了一些調(diào)整)。

基本上就是這些了。在下面的幾節(jié)中,我們將詳細(xì)介紹這些內(nèi)容。

7.2.1 動作選擇器

用PTAN的術(shù)語來說,動作選擇器是可以幫忙將網(wǎng)絡(luò)的輸出轉(zhuǎn)換成具體動作值的對象。最常見的場景包括:

  • argmax:常被用在Q值方法中,也就是當(dāng)用神經(jīng)網(wǎng)絡(luò)預(yù)測一組動作的Q值并需要一個Q(s, a)最大的動作時。
  • 基于策略的:網(wǎng)絡(luò)的輸出是概率分布(以logits的形式或歸一化分布的形式),并且動作需要從這個分布采樣。第4章已提到過這種情況,也就是討論交叉熵方法的時候。

動作選擇器會被Agent使用,基本上不需要自定義(當(dāng)然你有權(quán)利自定義)。庫中提供了幾個具體類:

  • ArgmaxActionSelector:對傳入張量的第二維執(zhí)行argmax。(它假設(shè)參數(shù)是一個矩陣,并且它的第一維為批維度。)
  • ProbabilityActionSeletor:從離散動作集的概率分布中采樣。
  • EpsilonGreedyActionSelector:具有epsilon參數(shù),用來指定選擇隨機(jī)動作的概率。

所有的類都假設(shè)傳入的是一個NumPy數(shù)組。這一節(jié)的具體例子可以在Chapter07/01_actions.py中找到。

143-01

如你所見,選擇器返回價值最大的那個動作的索引。

144-01

如果epsilon0.0的話,EpsilonGreedyActionSelector的結(jié)果總是一樣的,這意味著沒有采取隨機(jī)動作。如果將epsilon改成1,則動作的選擇是全隨機(jī)的:

144-02

ProbabilityActionSelector的用法是一樣的,但是要求輸入是歸一化概率分布:

144-03

在前面的示例中,我們從三個分布中進(jìn)行采樣:第一個分布選擇的動作的索引為1的概率為80%,第二個分布總是選擇2號動作,而第三個分布中動作0和動作1被選到的概率相等。

7.2.2 智能體

智能體實體提供了統(tǒng)一的方式來連接從環(huán)境中得到的觀察和我們希望執(zhí)行的動作。到目前為止,只介紹過簡單的、無狀態(tài)的DQN智能體,它可以使用神經(jīng)網(wǎng)絡(luò)(NN)從當(dāng)前的觀察中獲取動作的價值,并貪婪地使用這些值。我們已經(jīng)使用ε-greedy的方式探索了環(huán)境,但是它并不能提升很多。

在RL領(lǐng)域,智能體還能變得更加復(fù)雜。例如,除了可以預(yù)測動作的價值之外,智能體還可以預(yù)測動作的概率分布。這樣的智能體稱為策略智能體,我們將會在本書的第三部分進(jìn)行討論。

另外一種情況是智能體需要在觀察之間保持狀態(tài)。例如,常常一個觀察(甚至是最近k個觀察)不足以決定動作的選取,因此要讓智能體保存一些記憶來捕獲必要的信息。RL有一個完整的子領(lǐng)域,可以通過部分可觀察的馬爾可夫決策過程(POMDP)來處理這類復(fù)雜問題,這在本書中并不涉及。

智能體的第三種變體在連續(xù)控制問題中很常見,這會在本書的第四部分討論。目前只需要了解,在這種情況下,動作將不再是離散的值,而是一些連續(xù)值,而智能體需要從觀察中預(yù)測這些動作。

為了能覆蓋所有的變體并讓代碼足夠靈活,在PTAN中,智能體被實現(xiàn)為可擴(kuò)展的類層次結(jié)構(gòu),最頂部就是一個ptan.agent.BaseAgent抽象類。宏觀來講,智能體需要接受一批觀察(以NumPy數(shù)組的形式)并返回一批它想執(zhí)行的動作。按批處理可以加速計算,因為將好幾個觀察一次傳給圖形處理單元(GPU)處理比一個個處理要高效得多。

抽象基類并沒有定義輸入輸出的類型,因此很容易擴(kuò)展。例如,在連續(xù)域中,智能體將不再使用離散動作的索引,而是使用浮點數(shù)。

任何情況下,智能體都能視為知道如何將觀察轉(zhuǎn)換為動作的某樣?xùn)|西,并且智能體可以決定如何轉(zhuǎn)換。通常我們不會假設(shè)觀察或動作的類型,但是實現(xiàn)智能體的具體類的時候就會有限制了。PTAN提供了兩個最常見的將觀察轉(zhuǎn)換成動作的方式:DQNAgentPolicyAgent

在實際問題中,通常需要定制智能體。原因包括:

  • NN的架構(gòu)很酷炫,它的動作空間可以同時包含連續(xù)和離散值,它可以包含多種觀察(例如,文本和像素)或類似的東西。
  • 你可能想要使用非標(biāo)準(zhǔn)的探索策略,例如奧恩斯坦–烏倫貝克過程(在連續(xù)控制領(lǐng)域非常流行的探索策略)。
  • 你有POMDP環(huán)境,智能體的動作不是完全根據(jù)觀察來決定的,而會適當(dāng)包含一些智能體內(nèi)部的狀態(tài)(奧恩斯坦–烏倫貝克探索也是如此)。

所有的這些情況都可以通過BaseAgent類的子類來實現(xiàn),在本書的其余部分,將會給出幾個這種重定義的示例。

現(xiàn)在可以研究一下庫里提供的標(biāo)準(zhǔn)智能體:DQNAgentPolicyAgent。完整的示例見Chapter07/02_agents.py

DQNAgent

當(dāng)動作空間不是非常大的時候,這個類可以適用于Q-learning,包括Atari游戲和很多經(jīng)典的問題。這個方法不是很通用,但本書的后面將介紹如何解決這個問題。DQNAgent需要一批觀察(NumPy數(shù)組)作為輸入,使用網(wǎng)絡(luò)來獲得Q值,然后使用提供的ActionSelectorQ值轉(zhuǎn)換成動作的索引。

我們來看一個小例子。為簡單起見,假設(shè)網(wǎng)絡(luò)始終為輸入的批產(chǎn)生相同的輸出。

146-01

一旦定義了上面的類,就可以將它用作DQN模型:

146-02

我們從簡單的argmax策略開始,智能體將總是返回神經(jīng)網(wǎng)絡(luò)輸出結(jié)果是1的那些動作。

146-03

輸入的批會包含兩個觀察,分別有5個值,而輸出則是智能體返回的兩個對象:

  • 每個批對應(yīng)要執(zhí)行的動作的數(shù)組。在本示例中,第一批對應(yīng)動作0,第二批對應(yīng)動作1。
  • 智能體內(nèi)部狀態(tài)的列表。這用于有狀態(tài)的智能體,本示例中則是一個None的列表。因為本例中智能體是無狀態(tài)的,所以可以忽略該參數(shù)。

現(xiàn)在我們給智能體加上ε-greedy的探索策略。為此,只需要傳入一個不同的動作選擇器即可:

146-04

因為epsilon1.0,所以不管神經(jīng)網(wǎng)絡(luò)的輸出是什么,所有的動作都是隨機(jī)選擇的。但是我們可以隨時改變epsilon的值,當(dāng)需要在訓(xùn)練的時候隨著時間減小epsilon時,這個特性會很有用。

147-01

PolicyAgent

PolicyAgent需要神經(jīng)網(wǎng)絡(luò)生成離散動作集的策略分布。策略分布可以是logits(未歸一化的)分布,也可以是歸一化分布。實踐中,最好都是用logits分布以提升訓(xùn)練過程的數(shù)值穩(wěn)定性。

我們來重新實現(xiàn)上面的例子,只不過這次讓神經(jīng)網(wǎng)絡(luò)生成概率:

147-02

上面的類可以用來獲取一批觀察(在本示例中被忽略了)的動作logits:

147-03

現(xiàn)在我們可以將PolicyAgentProbabilityActionSelector組合起來。由于后者需要歸一化的概率,因此需要讓PolicyAgent對神經(jīng)網(wǎng)絡(luò)的輸出應(yīng)用一個softmax。

147-04

請注意softmax操作會為0 logits生成非0的概率,所以智能體仍然可以選到下標(biāo)大于1的動作。

147-05

7.2.3 經(jīng)驗源

上一節(jié)描述的智能體的抽象方式允許我們用通用的方式來實現(xiàn)和環(huán)境的交互。這些交互會以軌跡的形式發(fā)生,而軌跡是通過將智能體的動作應(yīng)用于Gym環(huán)境而產(chǎn)生的。

宏觀上來說,經(jīng)驗源類通過使用智能體實例和環(huán)境實例提供軌跡的每一步數(shù)據(jù)。這些類的功能包括:

  • 支持多個環(huán)境同時交互。通過讓智能體一次處理一批觀察來高效地利用GPU。
  • 預(yù)處理軌跡,并以對之后訓(xùn)練有利的方式來表示。例如,實現(xiàn)一個帶累積獎勵的子軌跡rollout的方法。當(dāng)我們不關(guān)心子軌跡的各個中間步時,可以將其刪除,這樣的預(yù)處理對DQN和n步DQN都很方便。它節(jié)約了內(nèi)存并減少了需要編寫的代碼量。
  • 支持來自O(shè)penAI Universe的向量化環(huán)境。我們會在第17章Web自動化和MiniWoB環(huán)境中介紹它。

所以,經(jīng)驗源類充當(dāng)“魔力黑盒”,向庫的用戶隱藏了環(huán)境交互和軌跡處理的復(fù)雜性。但是PTAN的設(shè)計理念是靈活性和可擴(kuò)展性,所以,如果需要,你可以繼承已有的類,也可以根據(jù)需要實現(xiàn)自己的版本。

系統(tǒng)提供了三個類:

  • ExperienceSource:使用智能體和一組環(huán)境,它可以產(chǎn)生帶所有中間步的n步子軌跡。
  • ExperienceSourceFirstLast:和ExperienceSource一樣,只不過將完整的子軌跡(帶所有中間步)替換成了只帶第一和最后一步的子軌跡,同時會將中間的獎勵累積起來。這樣可以節(jié)約很多內(nèi)存,在n步DQN或advantage actor-critic(A2C)rollout中就會用到。
  • ExperienceSourceRollouts:遵循Mnih關(guān)于Atari游戲的論文中描述的asynchronous advantage actor-critic(A3C)rollout方案(參見第12章)。

所有類被設(shè)計成能高效地運行在中央處理器(CPU)和內(nèi)存上,這對于玩具問題不是很重要,但是當(dāng)你要解決Atari游戲問題,并需要用商用硬件在回放緩沖區(qū)保留1000萬個樣本時,這可能會是個大問題。

玩具環(huán)境

為了演示,我們將實現(xiàn)一個非常簡單的Gym環(huán)境,并用一個小量級的可預(yù)測觀察狀態(tài)來展示經(jīng)驗源類怎么工作。這個環(huán)境擁有從0~4的整數(shù)形式的觀察、整數(shù)形式的動作,以及和動作對應(yīng)的獎勵:

148-01

除了環(huán)境外,我們還會使用一個不管觀察是什么都產(chǎn)生同樣動作的智能體。

149-01

ExperienceSource類

第一個類是ptan.experience.ExperienceSource,它會產(chǎn)生給定長度的智能體軌跡。它會自動處理片段的結(jié)束情況(當(dāng)環(huán)境的step()方法返回is_done=True時)并重置環(huán)境。

構(gòu)造函數(shù)接受幾個參數(shù):

  • 要使用的Gym環(huán)境。或者也可以是環(huán)境列表。
  • 智能體實例。
  • steps_count=2:產(chǎn)生的軌跡長度。
  • vectorized=False:如果設(shè)成True,環(huán)境需要是一個OpenAI Universe的向量化環(huán)境。我們會在第16章詳細(xì)討論這類環(huán)境。

這個類提供了標(biāo)準(zhǔn)的Python迭代器接口,所以可以直接通過迭代它來獲得子軌跡:

149-02

每次迭代,ExperienceSource都返回智能體在與環(huán)境交互時的軌跡。這可能看起來很簡單,但是在示例的背后還發(fā)生了幾件事情:

1)環(huán)境的reset()被調(diào)用了,用來獲得初始狀態(tài)。

2)智能體被要求從返回的狀態(tài)中選擇要執(zhí)行的動作。

3)step()方法被執(zhí)行,以獲得獎勵和下一個狀態(tài)。

4)下一個狀態(tài)被傳給智能體以獲得下一個動作。

5)從一個狀態(tài)轉(zhuǎn)移到下一個狀態(tài)的相關(guān)信息被返回了。

6)重復(fù)該過程(從步驟3開始),一直到經(jīng)驗源被遍歷完。

如果智能體改變了產(chǎn)生動作的方式(通過改變神經(jīng)網(wǎng)絡(luò)的權(quán)重、減少epsilon或一些其他手段),它會立即影響我們獲取到的經(jīng)驗軌跡。

ExperienceSource實例返回的是元組,它的長度等于或小于傳給構(gòu)造函數(shù)的step_count參數(shù)。在本例中,我需要2步子軌跡,所以元組的長度不是2就是1(片段在第1步的時候就結(jié)束了)。元組中的所有對象都是ptan.experience.Experience類的實例,它是一個namedtuple,包含下列字段:

  • state:在執(zhí)行動作前觀察到的狀態(tài)。
  • action:執(zhí)行的動作。
  • reward:從env中得到的立即獎勵。
  • done:片段是否結(jié)束。

如果片段結(jié)束了,子軌跡會更短,底層的環(huán)境也會被自動重置,所以我們無須關(guān)心它,只要繼續(xù)迭代就好了。

150-01

我們能讓ExperienceSource返回任意長度的子軌跡。

151-01

我們能傳入好幾個gym.Env實例。在這種情況下,它們會以round-robin的方式被調(diào)用。

151-02

ExperienceSourceFirstLast

ExperienceSource類提供了給定長度的完整的子軌跡,會返回(s, a, r)對象列表。下一個狀態(tài)s'會在下一個元組返回,這種方式不是很方便。例如,在DQN的訓(xùn)練中,我們想要一個(s, a, r, s')的元組來一次完成1步Bellman近似。此外,還有一些DQN的擴(kuò)展,例如n步DQN,可能想要將較長的觀察序列壓縮成(狀態(tài),動作,n步的總獎勵,n步之后的狀態(tài))元組。

為了以通用的方式支持此功能,實現(xiàn)了ExperienceSource類的一個簡單子類:Experience-SourceFirstLast。它的構(gòu)造函數(shù)的參數(shù)和父類差不多,但是返回的數(shù)據(jù)不同。

151-03

現(xiàn)在,每次迭代它都會返回一個對象,這個對象也是一個namedtuple,包含下列字段:

  • state:用來決定動作的狀態(tài)。
  • action:在這一步執(zhí)行的動作。
  • rewardsteps_count步累積的獎勵(在本例中,steps_count=1,所以它等同于立即獎勵)。
  • last_state:在執(zhí)行完動作后,得到的狀態(tài)。如果片段結(jié)束了,這個值就為None

這個數(shù)據(jù)用在DQN的訓(xùn)練中就十分方便了,我們可以直接對它應(yīng)用Bellman近似方法。

我們來嘗試一下更多步的情況:

152-01

我們現(xiàn)在可以將每個迭代中的2步壓縮在一起了,并計算立即獎勵(這就是為什么大多數(shù)的樣本都是reward=2.0)。更有趣的是在片段末尾的樣本:

152-02

片段末尾的樣本會帶有last_state=None,但是我們還額外計算了片段剩余步數(shù)的累積獎勵。這些小細(xì)節(jié)在你自己實現(xiàn)并處理所有軌跡的時候很容易出錯。

7.2.4 經(jīng)驗回放緩沖區(qū)

在DQN中,我們很少直接處理經(jīng)驗樣本,因為它們之間存在高度相關(guān)性,這會導(dǎo)致訓(xùn)練不穩(wěn)定。我們通常會有一個很大的回放緩沖區(qū),其中存有大量經(jīng)驗。然后從緩沖區(qū)采樣(隨機(jī)或帶有優(yōu)先級權(quán)重)來獲得訓(xùn)練批。回放緩沖區(qū)通常有一個最大容量,所以當(dāng)回放緩沖區(qū)添滿后,舊樣本會被剔除。

有好幾個實現(xiàn)方面的技巧可以使用,當(dāng)需要處理大問題的時候,這些技巧就顯得尤為重要:

  • 如何從大緩沖區(qū)高效采樣。
  • 如何從緩沖區(qū)中剔除舊樣本。
  • 對于帶優(yōu)先級的緩沖區(qū),如何以最有效的方式維護(hù)和處理優(yōu)先級。

如果你想要解決Atari問題并保留100~1000萬的樣本(其中每個樣本都是游戲中的圖片),一切就都變得不簡單了。一個小失誤可能就會導(dǎo)致內(nèi)存增加10~100倍,并嚴(yán)重降低訓(xùn)練的速度。

PTAN提供了好幾類回放緩沖區(qū),它們集成了ExperienceSourceAgent的機(jī)制。通常,你需要做的就是要求緩沖區(qū)從數(shù)據(jù)源那獲取新樣本,然后采樣訓(xùn)練批。提供的類包含:

  • ExperienceReplayBuffer:一個簡單的有預(yù)定義大小的回放緩沖區(qū),使用均勻采樣。
  • PrioReplayBufferNaive:一個簡單卻不高效的帶優(yōu)先級的回放緩沖區(qū)實現(xiàn)。采樣的復(fù)雜度為O(n),對于大緩沖區(qū)來說會是一個大問題。這個版本相比優(yōu)化過后的類來說有一個優(yōu)勢:它的代碼更簡單。
  • PrioritizedReplayBuffer:使用區(qū)間樹進(jìn)行采樣,這使得代碼變得比較晦澀,但是采樣復(fù)雜度降低到了O(log(n))。

下面的代碼展示了回放緩沖區(qū)是如何使用的:

153-01

所有的回放緩沖區(qū)都提供了以下接口:

  • Python迭代器接口,用于遍歷緩沖區(qū)中的所有樣本。
  • populate(N)方法,用于從經(jīng)驗源中獲取N個樣本并將其放入緩沖區(qū)。
  • sample(N)方法,用于獲取包含N個經(jīng)驗對象的批。

所以,DQN常規(guī)的訓(xùn)練循環(huán)看起來像是下列步驟的無限重復(fù):

1)調(diào)用buffer.populate(1)從環(huán)境中獲取一個新樣本。

2)用batch = buffer.sample(BATCH_SIZE)從緩沖區(qū)中獲取批。

3)計算采樣到的批的損失。

4)反向傳播。

5)重復(fù)執(zhí)行直到收斂。

剩下的事情(重置環(huán)境、處理子軌跡、維護(hù)緩沖區(qū)大小等)都是自動進(jìn)行的。

154-01

7.2.5 TargetNet類

TargetNet是一個很小但很有用的類,利用它我們可以同步相同結(jié)構(gòu)的兩個NN。上一章描述了它的目的:提高訓(xùn)練穩(wěn)定性。TargetNet支持兩種同步模式:

  • sync():源神經(jīng)網(wǎng)絡(luò)的權(quán)重被復(fù)制到了目標(biāo)神經(jīng)網(wǎng)絡(luò)。
  • alpha_sync():源神經(jīng)網(wǎng)絡(luò)的權(quán)重被以某alpha的比重(在0~1之間)混合到了目標(biāo)神經(jīng)網(wǎng)絡(luò)。

第一種模式是在離散空間問題(例如Atari和CartPole)中同步目標(biāo)神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn)方法。我們在第6章就用了這個方法。后一種模式用于連續(xù)控制問題,它會在本書第四部分的幾章中介紹。在此類問題中,兩個神經(jīng)網(wǎng)絡(luò)之間的參數(shù)過渡應(yīng)該平滑,所以使用了alpha混合策略,公式為wi=wiα+si(1–α),wi是目標(biāo)神經(jīng)網(wǎng)絡(luò)的第i個參數(shù),si是源神經(jīng)網(wǎng)絡(luò)的權(quán)重。下面用一個小示例來展示TargetNet如何在代碼中使用。

假設(shè)我們有下面的神經(jīng)網(wǎng)絡(luò):

154-02

目標(biāo)神經(jīng)網(wǎng)絡(luò)可以這樣創(chuàng)建:

155-01

目標(biāo)神經(jīng)網(wǎng)絡(luò)包含兩個字段:model(對源神經(jīng)網(wǎng)絡(luò)的引用)和target_model(源神經(jīng)網(wǎng)絡(luò)的深復(fù)制)。如果檢查兩個神經(jīng)網(wǎng)絡(luò)的權(quán)重,它們會是相同的:

155-02

它們彼此獨立,但是擁有同樣的結(jié)構(gòu):

155-03

如果要再次同步,可以使用sync()方法:

155-04

7.2.6 Ignite幫助類

PyTorch Ignite在第3章中簡單地進(jìn)行了介紹,它會在本書的其余部分大量使用以減少訓(xùn)練循環(huán)的代碼數(shù)量。PTAN提供了幾個小的幫助類來簡化同Ignite的集成,它們都在ptan.ignite包中:

  • EndOfEpisodeHandler:它附加在ignite.Engine,會發(fā)布EPISODE_COMPLETED事件,并在引擎的指標(biāo)中跟蹤該事件的獎勵和步數(shù)。它還可以在最后幾個片段的平均獎勵達(dá)到預(yù)定義邊界時發(fā)布事件,此事件應(yīng)該用在某些有目標(biāo)獎勵值的訓(xùn)練。
  • EpisodeFPSHandler:記錄智能體和環(huán)境之間的交互數(shù),并以每秒幀數(shù)的形式計算性能指標(biāo)。它還可以緩存自訓(xùn)練開始以來經(jīng)過的秒數(shù)。
  • PeriodicEvents:每10、100或1000個訓(xùn)練迭代發(fā)布一次相應(yīng)的事件。這對于減少寫入TensorBoard的數(shù)據(jù)量很有幫助。

下一章會詳細(xì)說明前面的這些類要如何使用,那時將使用它們來重新實現(xiàn)第6章中的DQN訓(xùn)練,然后嘗試一些DQN的擴(kuò)展并做一些調(diào)整以改善基本DQN的收斂性。

主站蜘蛛池模板: 册亨县| 阳新县| 固阳县| 九龙县| 怀来县| 茂名市| 浦江县| 神池县| 瑞丽市| 平舆县| 鹤庆县| 乐东| 桂林市| 资兴市| 玉山县| 泾川县| 涿州市| 洞口县| 怀安县| 永安市| 密云县| 普兰县| 镇远县| 孙吴县| 称多县| 闽侯县| 武鸣县| 景洪市| 黄骅市| 广水市| 永昌县| 乌拉特前旗| 承德县| 保德县| 泽普县| 高雄市| 汝南县| 淮安市| 寿阳县| 南丰县| 磐安县|