天天看點

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

我們這裡要簡要介紹一下增強學習(rl)——一種為了提高玩遊戲效率的訓練程式的通用技術。我們的目标是解釋其實際實作:我們講述一些基本理論,然後走馬觀花地看一下為玩《戰艦》遊戲而訓練神經網絡的最小python程式。

<b>導言</b>

增強學習[rl]技術是一種可用于提高效玩遊戲效率的學習算法。與督導機器學習[ml]方法一樣,增強學習是從資料——這裡是指過去玩遊戲的資料——中進行學習。然而,盡管督導學習算法隻是根據現有的資料進行訓練,但rl還挑戰如何在收集資料的過程中表現良好性能。具體地說,我們所追求的設計原則是

讓程式從過去執行個體中識别好的戰略,

通過連續地玩遊戲快速地學習新的戰略。

我們在這裡特想讓我們的算法快速學習的理由是在教育訓練資料有限或者戰略空間太大而難以進行窮盡搜尋的情況下最富有成果地運用rl。正是在這種體制下督導技術面臨困境而rl則閃耀着光芒。

我們在本貼中要回顧一般性的rl教育訓練程式:政策梯度、深度學習方案。我們下一節要回顧一下這種辦法背後的理論。随後,我們将粗略地示範一下教育訓練神經網絡來玩戰艦遊戲的 python 實作。

我們的python碼可以從我們的github網頁這裡下載下傳。它需要 jupyter, tensorflow, numpy, 和 matplotlib包。

<b>政策梯度,深度rl</b>

政策深度和深度rl有兩個主要構件。下面我們要詳述二者并描述它們是如何協作訓練好的模型的。

<b>政策網絡</b>

一定深度rl算法的政策是一種神經網絡,它将狀态值ss映射為一定遊戲行為 aa的機率。 換句話說,該網絡的輸入層接受環境的數字編碼——遊戲在特定時刻的狀态。當輸入通過網絡饋送後,其輸出層的值對應着我們現有每個行動可選的對數機率——我們可供選擇的每個可能的行動都有一個輸出節點。請注意如果我們肯定知道我們應采取的步驟,隻有一個輸出節點有一定的機率。但如果我們的網絡不能肯定哪種行動最優時,那麼就不隻一個節點有一定的權值。

為了說明這一點,我們來圖示一下下面“戰艦”程式中所用的網絡。(要回顧“戰艦”的遊戲規則請看注[1])簡明起見,我們隻用一維戰艦網格。我們然後對我們對手的每個網格位置用一個輸入神經元将我們對目前的環境知識進行編碼。具體地說,我們對于每個神經元/下标運用下列編碼:

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

在下面例圖中,我們有五個輸入神經元,是以遊戲盤的大小是五。前三個神經元的值是−1−1 表明我們尚未轟炸這些網格點。最後兩個分别是+1+1 和 00, 意味着戰艦位于第四而不是第五的位置。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

需要注意的是,在所顯示的政策網輸出層中,前三項值标為對數機率。這些值對應着每個下标的下次轟炸的機率。我們不能再次轟炸第四和第五個網格點,是以,盡管網絡可能對這些神經元輸出一些值,我們會忽略它們。

需要注意的是,在所顯示的政策網輸出層中,前三項值标為對數機率。這些值對應着每個下标的下次轟炸的機率。我們不能再次轟炸第四和第五個網格點,是以,盡管網絡可能對這些神經元輸出一些值,我們會忽略它們。 在我們繼續前,我們注意到我們對我們的政策運用神經網絡的理由是進行有效地歸納:對于象圍棋這樣有大量狀态值的遊戲來說,收集每個可能的遊戲盤位置的資料并不可行。這正是ml算法所擅長的場合——根據過去的觀測進行歸納進而對新局面做出很好的預測。為了将注意力放在rl上,我們不想在本貼中回顧ml算法(但你可以看看我們的庫中的入門章節)。我們隻是提請注意——利用這些工具,我們通過隻教育訓練遊戲中有代表性的子集就能獲得良好的性能而不必研究會非常龐大的整個集合。

<b>收益函數</b>

為了訓練rl算法,我們必須反複地進行遊戲/得分過程:我們根據目前的政策玩遊戲,根據與該網絡輸出的機率成比例的頻率做出移動選擇。如果所采取的行動得到好的結果,我們就要在往後提高這些行動的機率。

收益函數是我們用于對我們以前遊戲的結果進行正式打分的工具——我們将鼓勵我們的算法在遊戲期間努力将該量最大化。它其實是rl算法的超級參數:可以使用許多不同的函數,并每個都得出不同的學習特征。對于我們的戰艦程式來說,我們用下列函數

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

隻要遊戲日志完備,該函數考查在時間t0時所采取的行動a并傳回命中值h(t)的權重和,以及該遊戲所有未來步驟。在這裡,如果我們在步驟t時命中,h(t)則為1,否則為0。

在到達(2)時, 我們承認并不對所有可能的收益函數集合進行仔細搜尋。但我們肯定這一選擇會有很好的遊戲效果,它們有良好的目的性:具體地說,我們注意到權重項(0.5)t−t0(0.5)t−t0 能強烈地激發目前步驟的命中率 (對于在t0時命中,我們得到的收益為11 ), 但在(t0+1)(t0+1)時命中的行為在 t0t0 時也有收益—— 其值為0.50.5。同樣,在 (t0+2)(t0+2) 時命中收益為0.250.25, 依此類推。 (2)的這種超前權重起到了鼓勵有效探索棋局的作用:它迫使程式顧及有利于未來命中的步驟。 (2) 中出現的其他要素是減去h(t)¯¯¯¯¯¯¯¯¯h(t)¯。 這是随機網絡會獲得的預期收益。通過将該項除去,我們的網絡隻有表現超過随機選擇才有收益——該收益是這一學習過程的淨加速。

<b>随機遞減</b>

為了訓練我們的算法在遊玩期間收益最大化,我們運用了遞減法。為了表現這一點,我們設想讓我們的網絡參數 θθ 在遊戲的某些特定步驟發生改變。對所有可能的步驟進行平均,于是有了預期收益的梯度公式,

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

這裡, p(a)p(a) 的值是我們網絡行動的機率輸出。

不過,我們通常無法求得上述最後一行的值。但我們可以用抽樣值進行迫近:我們隻是用我們目前網絡玩遊戲,是以我們用在第 ii次移動時所獲得的實際收益取代上述的預期收益,

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

這裡aiai 是所采取的行動, r(ai)r(ai)是獲得的收益,可以通過反向傳播求該對數的導數(對于那些熟悉神經網絡的人來說:這是叉熵損失函數的導數,當你處理類似督導學習訓練事例的事件時,可以用所選擇行動 aiai 做為标記以應用該函數)。函數g^ig^i 提供理想梯度的噪聲估計,但步驟多了會導緻“随機”遞減,一般推動我們朝着正确的收益最大化前進。

<b>訓練過程總結</b>

總之,rl訓練是疊代進行:要起動疊代步驟,首先我們用我們目前的政策網絡玩遊戲,随機地根據網絡輸出選擇移動步驟。在遊戲結束後,我們通過計算每次移動所獲得的收益來對結果打分,例如在戰艦遊戲中,我們用(22)。 一旦完成這一步,我們就用 (44)來估計收益函數的梯度。最後,我們用αα小步長步驟參數更新網絡參數 θ→θ+α∑g^iθ→θ+α∑g^i,  接着,我們用經過更新的網絡繼續玩新的遊戲,依此類推。

要明白這一過程實際上是鼓勵在練習中産生良好結果的行動,注意 (44) 與在步驟 ii中所獲收益成比例的。是以,我們在 (44)的方向上調整參數,我們極力鼓勵那些産生很大收益結果的行動。另外,收益為負的步驟受到抑制。網絡按這種方式經過一段時間後将學會考察這一系統并提出可能産生最佳結果的步驟。

這說的是深度政策梯度rl的基礎。我們現在回到我們戰艦python示例上來。

python 代碼流程 — 戰艦 rl

加載所需的包。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

定義我們的網絡——一個全面相聯的三層系統。下面代碼基本上是 tensorflow 标準本,通過了其第一教程就可得出。有一項非同凡響的事是我們已将(26)集的學習速度定為占位符值 (9) 。這将讓我們用下列所觀察到的捕獲收益改變我們的步長。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

其次,我們定義了讓我們用我們的網絡玩遊戲的方法。變量trainning決定了我們是否采取理想步驟或選擇随機步驟。請注意該方法傳回一組記錄遊戲過程的日志集。這些是訓練所需要的。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

我們收益函數的實作(2):

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

最後是我們的訓練循環。我們反複地玩多次遊戲,每次都記分,然後調整參數——用阿爾法乘以所獲得收益得出學習速度。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

運作上一單元,我們看到訓練起作用了!下面例子通過将trainning設為false跟蹤play_game()方法。這展示了一種智能步驟選擇過程。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

這裡前五行是遊戲盤編碼——每一步都用(11)來填充網絡。第二至最後一行是所選擇的系列網絡選擇。最後一行是命中日志。請注意前兩步很好地抽樣了遊戲盤不同地區。此後,所記錄命中為 66。該算法然後智能地選擇 77和 88,它能推斷它們一定是戰艦的最後位置。

下圖進一步地描述了學習過程的特征。它将遊戲平均長度(完全轟炸戰艦所需步驟)與訓練時間進行對照。該程式非常迅速地學到基礎知識并随着時間推進而持續進步。

深度增強學習實踐:讓Python小程式玩一款遊戲,來訓練神經網絡

<b>小結</b>

在本貼中,我們講到rl的一種——即政策梯度、深度rl方案。該方法一般是目前最知名戰略 ,偶爾也從其他方法中取樣,最終實作政策的疊加改進。其兩個主要成份是政策網絡和收益函數。盡管網絡結構設計通常是督導學習考慮得最多的地方,但在rl的情況下最費神的是收益函數。為了友善訓練(依靠長遠預測會放慢學習過程),好的選擇應該是時間上盡可能地靠近。然而,收益函數常常也會損害到這一過程的最終目标(“赢”這場遊戲——鼓勵側向追求,而一些側向追求是不必要的,但如果不加注意會時常出現)。要在這兩種互相競争的要求間進行權衡并不容易。是以收益函數設計在某種程度上說是一種藝術。

我們這個簡短的介紹隻想說明rl實際上是如何實行的。更多細節,我們推薦兩個來源:sutton 和barto的文本書[3]和最近john schulman的談話[4]。

注釋和參考資料

[1]遊戲規則:(常見的簡單遊戲:略)

[2] 我有位同僚(hc)提出,該程式可能在某個點上開始拟合過度。但這種一維遊戲戰艦的位點太少,訓練集分割似乎不太合适。不過,如果我們轉移到更高次元并加入更多戰艦時會管用。

<b>本文譯者為:kundogma</b>