1. 程式人生 > >強化學習之六:Deep Q-Network and Beyond

強化學習之六:Deep Q-Network and Beyond

本文是對Arthur Juliani在Medium平臺釋出的強化學習系列教程的個人中文翻譯,該翻譯是基於個人分享知識的目的進行的,歡迎交流!(This article is my personal translation for the tutorial written and posted by Arthur Juliani on Medium.com. And my work is completely based on aim of sharing knowledges and welcome communicating!)

純屬自願翻譯,只為學習與分享知識。所以如果本系列教程對你有幫助,麻煩不吝在

github的專案上點個star吧!非常感謝!


一個聰明的agent會學會避免地面上的危險坑洞。

歡迎來到我的強化學習系列教程的最新部分,我們將經歷一次創造一個深度Q網路的全過程。它將基於Part 0中我們已經創造過的簡單單層Q網路,所以如果你對於強化學習還很陌生,強烈建議你先讀一下之前的章節。雖然在相同的簡單遊戲環境中,我們普通的Q網路比較勉強地才能達到和Q表一樣的效果,但是深度Q網路就強大多了。為了把普通的Q網路轉換成一個DQN,我們將做以下改進:

  1. 從單層網路到多層卷積網路。
  2. 實現經驗回放(Experience Replay ),這將使我們的網路能夠用來自自身經驗中的記憶來訓練自己。
  3. 啟用另一個“目標”網路,我們將在更新過程中用它來計算目標Q值。

就是這三個改進使得Google DeepMind團隊能夠在幾十個Atari遊戲中用它們的agent實現超人的表現。我們將逐一看這每條改進,並向你展示如何實現它。然而我們也不會止步於此。深度學習研究的進步速度非常快,2014年的DQN技術早就不是最先進的agent型別了。我將介紹兩個簡單的額外DQN架構改進方法,雙子DQN(Double DQN)競爭DQN(Dueling DQN),它們可以達到更好的表現,穩定性和更快的訓練時間。最後,我們將獲得一個可以搞定一系列具有挑戰性的Atari遊戲的網路,並且我們將闡釋如何訓練DQN去學習一個基本的導航任務。

從Q網路到深度Q網路(Getting from Q-Network to Deep Q-Network)

改進1:卷積層(Addition 1: Convolutional Layers)

既然我們的agent將要學習玩電腦遊戲,它就需要能夠理解遊戲在螢幕上的輸出,而且至少應該以和人類或者其它智慧動物相近的方式來做到。相比於獨立考慮每個畫素,卷積層使我們能夠考慮一個圖片的某個區域範圍,並且在我們把資訊傳輸到網路更後面的層時,也能維持影象中的物體在空間上的聯絡。通過這種方式,它們能表現得和人類相近。確實有一些研究表明卷積神經網路學習到了和原始視覺皮層相似的表徵。如此,卷積神經網路就有理由成為我們網路最開始的構成元素之一。

在Tensorflow裡面,我們可以用tf.contrib.layers.convolution2d函式來輕鬆地構造一個卷積層,呼叫方法如下:

convolution_layer = tf.contrib.layers.convolution2d(inputs,num_outputs,kernel_size,stride,padding)

這裡的num_outs指的是要對前一層使用多少過濾器(filters)。kernel_size指的是我們要用多大的視窗來在前一層上進行滑動。stride指的是每一次我們在層上滑動視窗時跳過多少個畫素。最後,padding指定的是我們是否讓我們的視窗只在底層(“VALID”)進行滑動,還是在周圍加上“襯墊(padding)”以保證卷積層和之前的層有相同的維度。更多資訊請參照Tensorflow文件

改進2:經驗回放(Addition 2: Experience Replay)

第二個讓DQN能夠執行起來的主要改進是經驗回放。這個做法的基本思想是:通過儲存agent的經驗,並隨機從中提取一部分(batches)來訓練網路,我們可以學到如何更穩健地在解決任務。通過儲存經驗,我們避免了網路只學習到它當前在這個環境中正在做的相關知識,並使得它能從各種各樣的過去經驗中也學習一些東西出來(所謂“溫故而知新”)。這些經驗都在<state,action,reward,next state>為元素的元組儲存起來。經驗回放緩衝區存放了固定數量的最近記憶,當新的記憶進來,舊的記憶就會溢位。當到達訓練時機,我們就簡單地從緩衝區中提取出一單位的批(a uniform batch)隨機記憶,並用它們訓練網路。對DQN來說,我們相當於為它建立了一個類來處理儲存和檢索記憶。

改進3:分離目標網路(Addition 3: Separate Target Network)

第三個使得DQN獨一無二的改進是對於訓練過程中的第二個網路的啟用。這個網路用來生成目標Q值,這個目標Q值將用來在在訓練過程中,針對每個行動計算相應的損失。為什麼不只用一個網路來進行兩種估計呢(狀態對應當前Q值的估計和目標Q值的估計)?問題關鍵在於在訓練的每一步,Q網路的值都在變,如果我們用一直在保持變化的一系列值來調整我們的網路值,那麼值估計很有可能輕易失去控制。網路可能無法工作,因為它掉進了目標Q值和估計Q值之間的反饋迴圈。為了消除這個風險,目標網路的權重是固定的,只會週期性地或者很慢地對主要Q網路的值進行更新。訓練得此能夠以更穩定的方式進行。

相比於週期性且一次性地更新目標網路,我們將更頻繁地更新它,但是是比較慢地。這種技術在今年伊始的DeepMind一篇論文中提到,論文中談到發現這樣可以使訓練過程更穩定。

超越DQN(Going Beyond DQN)

有了以上的改進,我們已經具備了重現2014年的DQN所需要的一切。但是世界總是日新月異的,早就有一堆針對DQN的改進被DeepMind提出,使得DQN的效能與穩定性越來越強。在你最喜歡的Atari遊戲上訓練你的DQN之前,我會建議先看一下更新的一些已經公佈的改進。我將給你簡單介紹一下其中兩種改進成果:雙子DQN與競爭DQN。這兩個都很容易實現,並且如果結合這兩種技術,我們可以在更快的訓練基礎上,實現更強的效能。

雙子DQN(Double DQN)

雙子DQN的主要直覺是:一般的DQN總是高估了在給定狀態下采取潛在行動的Q值,而如果所有的行動都被同等級別地高估,這也不算什麼問題,但是事實並不是這樣。你可以很容易想象到如果某個次優的行動總是比最優的行動被給予更高的Q值,agent將很難學習到理想的策略。為了糾正這個問題,DDQN論文的作者提出了一個簡單的技巧:相比於為了訓練的每一步都計算目標Q值時都選擇最大值,我們用我們的主要網路來選擇一個行動,而我們的目標網路來生成那個行動對應的Q值。通過分離行動選擇與目標Q值生成,我們得以相當程度上減弱過度估計的問題,並且使訓練更快更可信。下面是新的DDQN更新目標值時所用的方程。

QTarget=r+γQ(s,argmax(Q(s,a,θ),θ))Q-Target = r +\gamma Q(s&#x27;,argmax(Q(s&#x27;,a,\theta),\theta&#x27;))

Q-Target = r + γQ(s’,argmax(Q(s’,a,ϴ),ϴ’))

競爭DQN(Dueling DQN)

上圖:常規的單一Q值流動的DQN。下圖:競爭DQN,優勢是分開計算,並在最後一層結合為Q值。

為了解釋競爭DQN在架構上做的變化,我們需要首先解釋一些額外的強化學習術語。我們到目前一直所討論的Q值的含義都是:在給定狀態下,採取一個行動有多麼好。這可以寫作Q(s,a)。這個給定狀態下的行動實際上可以分解成值的兩個方面。第一方面是值函式V(s),它簡單地給出在一個給定狀態下有多麼好。第二個是優勢函式A(a),它給出採取某個行動相比其它的行動會有多麼更好。我們可以將Q視作V和A的結合。更標準化來表示:

Q(s,a)=V(s)+A(a)Q(s,a) =V(s) + A(a)

競爭DQN的目標是讓一個網路分離地計算優勢函式和值函式,並只在最後一層將兩者結合。乍看起來,這樣做貌似沒什麼意義。為什麼要把一個我們之後要組裝起來的函式分離呢?關鍵是認識到這樣做的好處是:能夠認識到我們的強化學習agent可能不需要在任何時候同同時關注值和優勢。比如說,想想在一個戶外公園裡坐著看日落。日落很美,坐在這裡感覺很享受,回報很大。不需要採取任何行動,基於任何你所在的環境狀態以外的東西去考慮你坐在那裡的價值看起來也沒什麼意義。我們可以完成更穩健的狀態值估計,只要把它和與特定行動繫結的必要性分離就行。

全部組裝(Putting it all together)

簡單的方塊世界環境,目標是移動藍色方塊到綠色方塊的位置,過程中不能碰到紅色方塊。

現在我們已經知道了所有創造DQN所需的技巧,讓我們在一個遊戲環境中來實際嘗試一下!我們在上面描述的DQN可以在訓練足夠時間後玩Atari遊戲,讓網路能夠在那些遊戲上表現不錯需要在一個性能好的機器上訓練至少一天。為了教學目的,我已經建立了一個簡單的遊戲環境,在這個環境中,我們的DQN在一箇中等強勁效能的機器上(GTX970)訓練幾個小時。在環境當中,agent控制藍色方塊,它的目標是去向綠色方塊(回報+1)並避免紅色方塊(回報-1)。在每一輪開始的時候,agent被隨機放入5*5的網格世界裡。agent只能再50步內嘗試實現最大化的彙報。因為是隨機放置,agent需要做的不只僅僅學習一個簡單的固定路線(在Tutorial 0的FrozenLake環境中,就這麼簡單)。相反,agent必須學習方格之間的空間關係。而事實上,它也確實可以做到。

遊戲環境會生成一個84843的彩色圖片,並且用盡可能和OpenAI gym相似的方式呼叫函式。通過這樣做,將會比較容易調整程式碼使其適配到任何OpenAI的atari遊戲上。我鼓勵有時間和計算資源的小夥伴們一定要試一下讓agent玩好Atari遊戲。超引數可能要花點功夫調,但是絕對是有可能實現的。好運!

如果這篇博文對你有幫助,你可以考慮捐贈以支援未來更多的相關的教程、文章和實現。對任意的幫助與貢獻都表示非常感激!

如果你想跟進我在深度學習、人工智慧、感知科學方面的工作,可以在Medium上follow我 @Arthur Juliani,或者推特@awjliani。

用Tensorflow實現簡單強化學習的系列教程: