兩年前,倫敦的一家叫DeepMind的小公司在Arxiv上發表了一篇名為“Playing Atari with Deep Reinforcement Learning”的先驅性文章。這篇文章介紹瞭如何讓計算機學習翫Atari遊戲。文中計算機的學習方法僅限於觀察遊戲機螢幕以及分數獎勵。由於執行在Atari上的遊戲玩法各不相同,目標也不盡一致,這篇文章的過人之處在於採用完全相同的框架玩不同的遊戲,並且取得了非常好的成績。文中提到他們的演算法可以玩七種不同的遊戲,其中三種甚至好於人類水平。
作為通用人工智慧的第一步(具體指同一人工智慧程式可以適應不同環境,而非針對某些具體任務設計人工智慧程式),這篇文章受到了廣泛關注。DeepMind也不出意外地被谷歌公司收購併站在了深度學習研究的前沿。在2015年2月,他們的文章“Human-level control through deep reinforcement learning”被Nature雜誌以封面文章的形式發表。在這篇文章中,他們的人工智慧程式已經能玩49種不同的遊戲了。更激動人心的是,其中半數遊戲中的表現已經超越了人類的頂尖選手。
雖然在學術界,深度學習模型已經在監督學習和非監督學習問題上廣泛地使用,深度強化學習仍帶有神秘的色彩。在這篇文章中,我將試著揭掉它神秘的面紗並將背後的基本原理展示給讀者。這篇文章應該非常適合那些具備機器學習以及深度學習基礎,但還沒花時間仔細研究深度強化學習的讀者們。 在進入主題之前,首先簡要介紹一下本文的組織方式:
- 強化學習的主要挑戰是什麼?本節將用功勞分配問題作為例子並且介紹探索-利用困境。
- 如何對強化學習進行數學定義?本節將定義馬爾科夫決策過程並用他來定義強化學習。
- 強化學習中如何制定長期決策?本節將定義“打折的未來獎勵”,而這一定義是後續部分基礎。
- 強化學習中如何估計或者近似未來獎勵?本節將介紹一種簡單的基於表的Q-learning演算法
- 如果狀態過多(基於表的方法不可行時)如何估計或者近似未來獎勵?本節將介紹如何使用深度學習的方式替換Q表。
- 如何才能從資料中學習模型使其真正工作?本節將介紹一種能夠增強模型穩定性的技術——“經驗回放技術”。
- 未來工作,文章的最後將介紹一種探索-利用困境的簡易解決方案。
強化學習
首先,讓我們簡單介紹一下Breakout這個遊戲。在這個遊戲中,你需要控制螢幕底端的一根橫杆左右移動,將飛向底端的球反彈回去並清除螢幕上方的磚塊。每次你擊中並清除了磚塊,你的分數都會增加——你獲得了獎勵。
圖1,Atari Breakout遊戲,(圖片來源:DeepMind)
假設你想教神經網路模型玩這個遊戲,模型的輸入是遊戲機螢幕畫素所構成的圖片,輸出是三種動作:向左,向右以及開火(把球射出)。把這個問題建模為分類問題是很合理的——對於每個螢幕畫面,你都需要進行決策:是左移,右移,還是開火。分類的建模方法看起來很直接。不過,你需要大量訓練資料訓練你的分類模型。傳統的做法是找一些專家讓他們玩遊戲並且記錄他們的遊戲過程。但人類肯定不是這樣玩遊戲的。我們不需要有人站在我們背後告訴我們向左還是向右。我們只需要知道在某些情況下我們做了正確的動作並且得分了,其他的依靠我們自身的學習機制完成。 這個問題就是強化學習嘗試解決的問題。強化學習處於監督學習與無監督學習的中間地帶。在監督學習中,每個訓練例項都有一個正確標籤;在無監督學習中,訓練例項並沒有標籤。在強化學習中,訓練例項有稀疏並延時的標籤——獎勵。基於獎勵,強化學習中的智慧體可以學習如何對環境做出正確的反映。
上述的觀點看起來很直觀,但是實際存在很多挑戰。舉例來講,在Breakout這個遊戲中,擊中磚塊並且得分和前一時刻如何移動橫杆沒有直接關係。最相關的是前面如何將橫杆移動到正確位置並反彈球。這個問題叫做信用分配問題(credit assignment problem),即:建模獲得獎勵之前的哪些動作對獲得獎勵產生貢獻以及貢獻的大小。
如果你已經獲得了某種策略並且透過它得了不少獎勵,你應該繼續堅持這種策略還是試試其他的可能獲得更高分的策略?仍舉Breakout這個遊戲為例,在遊戲開始時,你把橫杆停在左邊並把球射出去,如果你不移動橫杆,你總是能得10分的(當然得分的下一秒,你就死了)。你滿足於這個得分嗎,或者你想不想再多得幾分?這種現象有一個專門的名詞——探索-利用困境(exploration-exploitation dilemma)。決策時應該一直延用現有的策略還是試試其他更好的策略?
強化學習是人類(或者更一般的講,動物)學習的一種重要模式。父母的鼓勵,課程的分數,工作的薪水——這些都是我們生活中的獎勵。功勞分配問題以及探索-利用困境在我們日常生活工作中經常發生。這就是我們研究強化學習的原因。而對於強化學習,遊戲是嘗試新方法的最佳的沙盒。
馬爾科夫決策過程
下面,我們的問題是如何形式化定義強化學習問題使其支援推斷。最常用的表示方式是馬爾科夫決策過程。
假想你是一個智慧體(agent),面對某種場景(比如說Breakout遊戲)。你所處的環境可以定義為狀態(state)(比如橫杆的位置,球的位置,球的方向,當前環境中的磚塊等等)。智慧體能夠在環境中採取一些動作(actions)(比如向左或向右移動橫杆)。這些動作會導致一些獎勵(reward)(比如分數的增加)。智慧體採取動作將導致新的環境,也就是新的狀態。在新的狀態下,智慧體能夠繼續採取動作,迴圈往復。你採取行動的原則叫做策略(policy)。通常來講,環境是很複雜的,智慧體的下一狀態可能帶有一定的隨機性(比如當你失去一個球發射另一個球時,它的方向是隨機的)。
圖2:左:強化學習問題,右:馬爾科夫決策過程
一系列的狀態、動作、以及採取動作的規則構成了一個馬爾科夫決策過程(Markov decision process)。一個馬爾科夫決策過程(比如一局遊戲)由一串有限個數的狀態、動作、反饋組成,形式化地表示為:
其中,si表示狀態,ai表示動作,ri+1是採取動作後的獎勵。當狀態序列達到終止狀態sn時(比如“Game Over”畫面),一個馬爾科夫決策過程結束。馬爾科夫決策過程服從馬爾科夫假設,也就是說,下一狀態si+1只與當前狀態si和ai有關,與之前的狀態或動作無關。
打折的未來獎勵
為了在長期決策過程中表現的更好,我們不但要考慮採取一個動作後的即時獎勵,也要考慮這個動作的未來獎勵。那麼問題來了,我們應該如何建模這個未來獎勵?
給定一個馬爾科夫決策過程,它對應的獎勵總和很容易用如下方式計算:
而t時刻的未來獎勵可以表示為:
由於智慧體所處的環境非常複雜,我們甚至無法確定在兩次採取相同動作,智慧體能夠獲得相同的獎勵。智慧體在未來進行的動作越多,獲得的獎勵越不相同。所以,我們一般採用一種“打折的未來獎勵”作為t時刻未來獎勵的代替。
這裡,gamma是一個0到1的值。這個gamma值使得我們更少地考慮哪些更長遠未來的獎勵。數學直覺好的讀者可以很快地看出Rt可以用Rt+1來表示,從而將上式寫成一種遞推的形式,即:
如果gamma是0,我們將會採取一種短視的策略。也就是說,我們只考慮即刻獎勵。如果我們希望在即刻獎勵與未來獎勵之間尋求一種平衡,我們應該使用像0.9這樣的引數。如果我們所處的環境對於動作的獎勵是固定不變的,也就是說相同的動作總會導致相同的獎勵,那麼gamma應該等於1。
好的策略應該是:智慧體在各種環境下采用最大(打折的)未來獎勵的策略。
Q-learning
在Q-learning中,我們定義一個Q(s, a)函式,用來表示智慧體在s狀態下采用a動作並在之後採取最優動作條件下的打折的未來獎勵。
直觀講,Q(s, a)是智慧體“在s狀態下采取a動作所能獲得的最好的未來獎勵”。由於這個函式反映了在s狀態下采取a動作的質量(Quality),我們稱之為Q-函式。
這個定義看起來特別奇怪。我們怎麼可能在遊戲進行的過程中,只憑一個狀態和動作估計出遊戲結束時的分數呢?實際上我們並不能估計出這個分數。但我們可以從理論上假設這樣函式的存在,並且把重要的事情說三遍,“Q-函式存在,Q-函式存在,Q-函式存在”。Q-函式是否存在呢?(笑)
如果你還不相信,我們可以在假設Q-函式存在的情況下想一想會發生什麼。假設智慧體處在某個狀態並且思考到底應該採用a動作還是b動作,你當然希望選取使遊戲結束時分數最大的動作。如果你有那個神奇的Q-函式,你只要選取Q-函式值最大的動作。
上式中,\pi表示在s狀態下選取動作的策略。
然後,我們應該如何獲得Q-函式呢?首先讓我們考慮一個轉移<s, a, r, s’>。我們可以採用與打折的未來獎勵相同的方式定義這一狀態下的Q函式。
這個公式叫貝爾曼公式。如果你再想一想,這個公式實際非常合理。對於某個狀態來講,最大化未來獎勵相當於最大化即刻獎勵與下一狀態最大未來獎勵之和。
Q-learning的核心思想是:我們能夠透過貝爾曼公式迭代地近似Q-函式。最簡單的情況下,我們可以採用一種填表的方式學習Q-函式。這個表包含狀態空間大小的行,以及動作個數大小的列。填表的演算法偽碼如下所示:
其中\alpha是在更新Q[s, a]時,調節舊Q[s, a]與新Q[s, a]比例的學習速率。如果\alpha=1,Q[s, a]就被消掉,而更新方式就完全與貝爾曼公式相同。
使用max_a’ Q[s’, a’]作為未來獎勵來更新Q[s, a]只是一種近似。在演算法執行的初期,這個未來獎勵可能是完全錯誤的。但是隨著演算法迭代,Q[s, a]會越來越準(它的收斂性已經被證明)。我們只要不斷迭代,終有一天它會收斂到真實的Q函式的。
Deep Q Network
Breakout遊戲的狀態可以用橫杆的位置,球的位置,球的方向或者每個磚塊是否存在來進行定義。然而,這些表示遊戲狀態的直覺只能在一款遊戲上發揮作用。我們要問:我們能不能設計一種通用的表示遊戲狀態的方法呢?最直接的方法是使用遊戲機螢幕的畫素作為遊戲狀態的表示。畫素可以隱式地表示出球速以及球的方向之外的所有遊戲狀態的資訊。而如果採用連續兩個遊戲機螢幕的畫素,球速和球的方向也可以得到表示。
如果DeepMind的論文采用離散的遊戲螢幕作為狀態表示,讓我們計算一下使用連續四步的螢幕作為狀態,可能的狀態空間。螢幕大小84*84,每個畫素點有256個灰度值,那麼就有256^(84*84*4)~10^67970種可能的狀態。也就是說,我們的Q-表將要有10^67970行。這個數字甚至多於宇宙中的原子個數!有人會說:有些螢幕狀態永遠不會出現,或者,能不能只用在學習過程中碰到過的狀態作為Q-表的狀態呢?即便如此,這種稀疏表示的Q-表裡仍包含很多狀態,並且需要很長時間收斂。理想的情況是,即便某些狀態沒有見過,我們的模型也能對它進行比較合理的估計。
在這種情況下,深度學習就進入了我們的視野。深度學習的一大優勢是從結構資料中抽取特徵(對資料進行很好的表示)。我們可以用一個神經網路對Q-函式進行建模。這個神經網路接收一個狀態(連續四步的螢幕)和一個動作,然後輸出對應的Q-函式的值。當然,這個網路也可以只接受一個狀態作為輸入,然後輸出所有動作的分數(具體來講是動作個數大小的向量)。這種做法有一個好處:我們只需要做一次前向過程就可以獲得所有動作的分數。
圖3:左:樸素的Q-函式網路 右:在DeepMind論文中使用最佳化的Q網路 DeepMind在論文中使用的網路結構如下:
這個網路是普通的神經網路:從輸入開始,三個卷積層,接著兩個全連線層。熟悉使用神經網路做物體識別的讀者或許會意識到,這個網路沒有池化層(pooling layer)。但是細想一下我們就知道,池化層帶來位置不變性,會使我們的網路對於物體的位置不敏感,從而無法有效地識別遊戲中球的位置。而我們都知道,球的位置對於決定遊戲潛在的獎勵來講有非常大的意義,我們不應該丟掉這部分資訊。
輸入是84x84的灰度圖片,輸出的是每種可能的動作的Q-值。這個神經網路解決的問題變成了一個典型的迴歸問題。簡單的平方誤差可以用作學習目標。
給定一個轉移<s, a, r, s’>,Q-表的更新演算法只要替換成如下流程就可以學習Q-網路。
- 對於當前狀態s,透過前向過程獲得所有動作的Q-值
- 對於下一個狀態s’,透過前向過程計算Q-值最大的動作max_a’ Q(s’, a’)
- 將r+\gamma max_a’ Q(s’, a’)作為學習目標,對於其他動作,設定第一步獲得的Q-值作為學習目標(也就是不會在反向過程中更新引數)
- 使用反向傳播演算法更新引數。
經驗回放
到現在,我們已經知道如何用Q-learning的演算法估計未來獎勵,並能夠用一個卷積神經網路近似Q-函式。但使用Q 值近似非線性的Q-函式可能非常不穩定。你需要很多小技巧才能使這個函式收斂。即使如此,在單GPU上也需要一個星期的時間訓練模型。
這其中,最重要的技巧是經驗回放(experience replay)。在玩遊戲的過程中,所有經歷的<s, a, r, s’>都被記錄起來。當我們訓練神經網路時,我們從這些記錄的<s, a, r, s’>中隨機選取一些mini-batch作為訓練資料訓練,而不是按照時序地選取一些連續的<s, a, r, s’>。在後一種做法中,訓練例項之間相似性較大,網路很容易收斂到區域性最小值。同時,經驗回放也使Q-learning演算法更像傳統監督學習。我們可以收集一些人類玩家的記錄,並從這些記錄中學習。
探索-利用困境
Q-learning演算法嘗試解決信用分配問題。透過Q-learning,獎勵被回饋到關鍵的決策時刻。然而,我們還沒有解決探索-利用困境。
我們第一個觀察是:在遊戲開始階段,Q-表或Q-網路是隨機初始化的。它給出的Q-值最高的動作是完全隨機的,智慧體表現出的是隨機的“探索”。當Q-函式收斂時,隨機“探索”的情況減少。所以,Q-learning中包含“探索”的成分。但是這種探索是“貪心”的,它只會探索當前模型認為的最好的策略。
對於這個問題,一個簡單的修正技巧是使用\epsilon-貪心探索。在學習Q-函式時,這種技巧以\epsilon的機率選取隨機的動作做為下一步動作,1-\epsilon的機率選取分數最高的動作。在DeepMind的系統中,\epsilon隨著時間從1減少到0.1。這意味著開始時,系統完全隨機地探索狀態空間,最後以固定的機率探索。
Deep Q-learning演算法
最後給出使用經驗回放的Deep Q-learning演算法
除了上述技巧,DeepMind還使用了一系列其他的技巧,比如:目標網路、誤差截斷、回饋截斷等等。但是這些已經超出本文的範疇了。
最令人驚喜的是這種演算法可以應對各種學習問題。在演算法的執行初期,Q-函式用來學習模型引數的資料幾乎完全是(隨機猜測的)垃圾資料,在執行過程中,也只能透過一些偶然的獎勵學習引數。這種事情想想就很瘋狂,它是怎麼學到一個很好的模型呢?但事實上,它確實學到了一個很好的模型。
最後要注意的問題
自從Deep Q-learning提出之後,很多工作嘗試對他進行提升,其中包括:Double Q-learning, Prioritized Experience Replay, Dueling Network Architecture, extension to continuous action space等等。如果要跟進最新的研究成果,可以關注NIPS 2015 deep reinforcement learning workshop以及ICLR 2016(用“reinforcement”作為關鍵詞搜尋)。有一點需要注意的是Deep Q-learning已經被谷歌申請專利了。
我們常說我們還沒搞清楚什麼是人工智慧。一旦我們搞清其中的工作原理,它看起來就不那麼智慧。但是深度Q-網路仍在不斷地給我帶來驚喜。觀察Q-learning學習翫一個新遊戲的過程就像觀察野外的動物。透過不斷地與環境互動獲得獎勵從而成為更強的物種。
原文:Demystifying Deep Reinforcement Learning,譯者:哈工大 SCIR 劉一佳
本文來源於哈工大SCIR
原文連結點選即可跳轉