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

8.4 噪聲網(wǎng)絡(luò)

下一個(gè)將要研究的改進(jìn)解決了RL的另一個(gè)問題:環(huán)境探索。我們要借鑒的論文為“Noisy Networks for Exploration”[4],它有一個(gè)非常簡(jiǎn)單的思想,即在訓(xùn)練過程中學(xué)習(xí)探索特征,而不是單獨(dú)定制探索的策略。

基礎(chǔ)DQN通過選擇隨機(jī)動(dòng)作來完成探索,隨機(jī)選取會(huì)依據(jù)特定的超參數(shù)epsilon,它會(huì)隨著時(shí)間的增長(zhǎng)慢慢地從1.0(完全隨機(jī)選擇動(dòng)作)降至一個(gè)小比例0.1或0.02。這個(gè)流程適用于片段較短的簡(jiǎn)單環(huán)境,在游戲過程中不會(huì)有太多不穩(wěn)定的情況,但是即使是在這樣簡(jiǎn)單的情況下,它也需要調(diào)優(yōu)參數(shù)來讓訓(xùn)練更高效。

在“Noisy Networks for Exploration”論文中,作者提出了一個(gè)非常簡(jiǎn)單的解決方案,但是效果很好。他們?cè)谌B接層中加入噪聲,并通過反向傳播在訓(xùn)練過程中調(diào)整噪聲參數(shù)。當(dāng)然了,不要將這個(gè)方法和“用網(wǎng)絡(luò)來決定在哪里進(jìn)行探索”相混淆,后者是一種更為復(fù)雜的方法,也得到了廣泛的支持(例如,請(qǐng)參見關(guān)于內(nèi)在動(dòng)機(jī)和基于計(jì)數(shù)的探索方法[5-6])。我們會(huì)在第21章討論高級(jí)探索技術(shù)。

論文作者提出了兩種添加噪聲的方法,根據(jù)他們的實(shí)驗(yàn)這兩種方法都有效,但是它們具有不同的計(jì)算開銷:

1)獨(dú)立高斯噪聲:對(duì)于全連接層中的每個(gè)權(quán)重,都加入一個(gè)從正態(tài)分布中獲取的隨機(jī)值。噪聲的參數(shù)μσ被存在層中并使用反向傳播訓(xùn)練,如同我們訓(xùn)練標(biāo)準(zhǔn)的線性層中的權(quán)重一樣。以與線性層相同的方式計(jì)算這種“噪聲層”的輸出。

2)分解高斯噪聲:為了最小化采樣的隨機(jī)數(shù)數(shù)量,作者提出只保留兩個(gè)隨機(jī)向量:一個(gè)和輸入的大小一樣,另一個(gè)和層的輸出大小一樣。然后,通過計(jì)算向量的外積來創(chuàng)建該層的一個(gè)隨機(jī)矩陣。

8.4.1 實(shí)現(xiàn)

在PyTorch中,兩種方法都可以以非常簡(jiǎn)單直接的方式來實(shí)現(xiàn)。我們需要做的就是創(chuàng)建一個(gè)和nn.Linear層等價(jià)的層,并在每次forward()被調(diào)用時(shí)隨機(jī)采樣一些額外的值。兩種噪聲層的實(shí)現(xiàn)在Chapter08/lib/dqn_extra.pyNoisyLinear類(獨(dú)立高斯噪聲)和NoisyFactorizedLinear類(分解高斯噪聲)中。

174-01

在構(gòu)造函數(shù)中,我們創(chuàng)建了σ的矩陣。(μ值被存在從nn.Linear繼承過來的矩陣中[1]。)為了讓σ可訓(xùn)練,需要將張量包裝在nn.Parameter里。

register_buffer方法在神經(jīng)網(wǎng)絡(luò)中創(chuàng)建一個(gè)張量,它在反向傳播時(shí)不會(huì)更新,但是會(huì)被nn.Module的機(jī)制處理(例如,當(dāng)cuda()被調(diào)用時(shí)它會(huì)被復(fù)制到GPU)。為了層中的偏差需要?jiǎng)?chuàng)建一個(gè)額外的參數(shù)和緩沖區(qū)。使用的σ的初始值(0.017)取自本節(jié)開頭引用的“Noisy Networks for Exploration”論文。最后,我們調(diào)用reset_parameters()方法,它重寫了父類nn.Linearreset_parameters()方法,用來支持層的初始化。

175-01

reset_parameters()方法中,參考論文對(duì)nn.Linear的權(quán)重和偏差進(jìn)行了初始化處理。

175-02

forward()方法中,從權(quán)重和偏差緩沖區(qū)中隨機(jī)采樣噪聲,并以與nn.Linear相同的方式對(duì)輸入的數(shù)據(jù)執(zhí)行線性轉(zhuǎn)換。

分解高斯噪聲的工作方式也類似,并且其結(jié)果相差不大,所以為了完整性這里只貼出代碼。如果你對(duì)這個(gè)方法好奇,可以在論文[4]中查找它的詳細(xì)信息和方程。

175-03

從實(shí)現(xiàn)的角度看,這就結(jié)束了。我們現(xiàn)在要做的就是將nn.Linear(這是DQN神經(jīng)網(wǎng)絡(luò)中的最后兩層)換成NoisyLinear層(如果需要,也可以替換成NoisyFactorized-Linear),讓基礎(chǔ)DQN轉(zhuǎn)變成噪聲網(wǎng)絡(luò)版本。當(dāng)然,你必須要把ε-greedy策略相關(guān)的代碼都移除掉。

為了檢查訓(xùn)練時(shí)內(nèi)部的噪聲級(jí)別,我們可以顯示噪聲層的噪聲信噪比(Signal-to-Noise Ratio,SNR),表示成RMS(μ)/RMS(σ)的比,RMS是相應(yīng)權(quán)重的均方根。在本例中,SNR展示了噪聲層中的穩(wěn)定部分比注入的噪聲大多少倍。

8.4.2 結(jié)果

訓(xùn)練之后,TensorBoard的圖表展示了更好的訓(xùn)練動(dòng)態(tài)(見圖8.8)。模型可以在少于60萬幀的情況下達(dá)到18的平均分。

176-01

圖8.8 Noisy netwok和基礎(chǔ)DQN的對(duì)比

在檢查SNR圖(見圖8.9)之后,你可能注意到兩層的噪聲級(jí)別都下降得很快。第一層從1降到了1/2.5的噪聲比率。第二層則更有意思,它的噪聲級(jí)別從1/3下降到1/15,但是在25萬幀之后(基本和原始獎(jiǎng)勵(lì)提升至20分的時(shí)間差不多),最后一層的噪聲級(jí)別開始回升了,迫使智能體更多地探索環(huán)境。這很有道理,因?yàn)樵谶_(dá)到高分之后,智能體基本知道如何發(fā)揮出良好的水平,但還是需要“磨煉”它的動(dòng)作以進(jìn)一步提高分?jǐn)?shù)。

177-01

圖8.9 訓(xùn)練過程中噪聲級(jí)別的變化


[1]nn.Linear.weightnn.Linear.bias

主站蜘蛛池模板: 贞丰县| 曲阜市| 和平县| 普宁市| 福州市| 葵青区| 四子王旗| 理塘县| 武清区| 衡南县| 根河市| 麦盖提县| 衡东县| 呼伦贝尔市| 吉木萨尔县| 蓬莱市| 吕梁市| 庆云县| 潜江市| 全州县| 怀集县| 镇安县| 永新县| 砚山县| 六枝特区| 雷山县| 科技| 罗田县| 文化| 公主岭市| 曲水县| 延安市| 和平县| 湖州市| 萍乡市| 安塞县| 习水县| 仁化县| 贵溪市| 辽阳县| 碌曲县|