0
本文作者: 宗仁 | 2019-03-05 17:25 |
本系列文章通過通俗易懂的方式介紹強化學習的基本概念,雖然語言通俗,但是內容依舊非常嚴謹性。文中用很多的公式,對數學公式頭疼的讀者可能會被嚇住,但是如果讀者一步一步follow下來,就會發(fā)現公式的推導非常自然,對于透徹的理解這些基本概念非常有幫助。除了理論之外,文章還會介紹每種算法的實現代碼,深入解答每一行關鍵代碼。讓讀者不但理解理論和算法,同時還能知道怎么用代碼來實現。通過理論與實際的結合,更加深入的理解學過的概念。讀者只需要基本的Python編程知識,文中每一個算法都有對應的Jupyter Notebook代碼。(文章來源,李理的Github博客)
引言
馬爾科夫決策過程(MDP)
和環(huán)境的互動
目標和獎勵
回報(Return)
馬爾科夫屬性
馬爾科夫決策過程(Markov Decision Processes)
價值函數(Value Function)
最優(yōu)價值函數(Optimal Value Functions)
OpenAI Gym簡介
運行Environment
觀察(Observations)
Spaces
前面我們介紹了監(jiān)督學習,監(jiān)督學習的特點是有一個“老師”來“監(jiān)督”我們,告訴我們正確的結果是什么。在我們在小的時候,會有老師來教我們,本質上監(jiān)督學習是一種知識的傳遞,但不能發(fā)現新的知識。對于人類整體而言,真正(甚至唯一)的知識來源是實踐——也就是強化學習。比如神農嘗百草,最早人類并不知道哪些草能治病,但是通過嘗試,就能學到新的知識。學到的這些知識通過語言文字記錄下來,一代一代的流傳下來,從而人類社會作為整體能夠不斷的進步。和監(jiān)督學習不同,沒有一個“老師”會“監(jiān)督“我們。比如下圍棋,不會有人告訴我們當前局面最好的走法是什么,只有到游戲結束的時候我們才知道最終的勝負,我們需要自己復盤(學習)哪一步是好棋哪一步是臭棋。自然界也是一樣,它不會告訴我們是否應該和別人合作,但是通過優(yōu)勝劣汰,最終”告訴”我們互相協(xié)助的社會會更有競爭力。和前面的監(jiān)督非監(jiān)督學習相比有一個很大的不同點:在強化學習的Agent是可以通過Action影響環(huán)境的——我們的每走一步棋都會改變局面,有可能變好也有可能變壞。
它要解決的核心問題是給定一個狀態(tài),我們需要判斷它的價值(Value)。價值和獎勵(Reward)是強化學習最基本的兩個概念。對于一個Agent(強化學習的主體)來說,Reward是立刻獲得的,內在的甚至與生俱來的。比如處于饑餓狀態(tài)下,吃飯會有Reward。而Value是延遲的,需要計算和慎重考慮的。比如饑餓狀態(tài)下去偷東西吃可以有Reward,但是從Value(價值觀)的角度這(可能)并不是一個好的Action。為什么不好?雖然人類很監(jiān)督學習,比如先賢告訴我們這是不符合道德規(guī)范的,不是好的行為。但是我們之前說了,人類最終的知識來源是強化學習,先賢是從哪里知道的呢?有人認為來自上帝或者就是來自人的天性,比如“人之初性本善”,我們會在最后一章討論哲學的問題。如果從進化論的角度來解釋,人類其實在玩一場”生存”游戲,有遵循道德的人群和有不遵循的人群,大自然會通過優(yōu)勝劣汰”告訴”我們最終的結果,最終我們的先賢“學到”了(其實是被選擇了)這些道德規(guī)范,并且把這些規(guī)范通過教育(監(jiān)督學習)一代代流傳下來。
馬爾科夫決策過程(Markov Decision Process)是強化學習最常見的模型。我們通過這個模型來介紹強化學習的一些基本概念。
和環(huán)境的互動
強化學習的本質就是通過與環(huán)境的互動來學習怎么達成一個目標。這個學習和做決策的主體就叫Agent。Agent交互的對象就是環(huán)境(Environment),環(huán)境可大可小,對于坐井觀天的青蛙來說,它的環(huán)境就是那口小井;而對于人類來說,整個地球甚至太陽系都是我們研究的對象。Agent會持續(xù)的和環(huán)境交互,根據當前的狀態(tài)選擇行為(Action),而環(huán)境會給Agent新的狀態(tài)和Reward。整個交互過程如下圖所示。
圖:強化學習里Agent和環(huán)境的互動
Agent和環(huán)境的交互假設是時刻t=0,1,…。在t時刻,Agent處于某個狀態(tài)St∈S,這里SS表示所有可能狀態(tài)的集合,也就是狀態(tài)空間。它可以選擇一個行為At∈A(St),其中A(St)是狀態(tài)St時可以選擇的所有行為的集合。選擇了行為 At之后,環(huán)境會在下一個(t+1)時刻給Agent一個新的狀態(tài)St+1和Reward Rt+1∈R?R。
一個實數值的Reward是否足夠?拿人來說,是有很多方面的追求,比如同時要考慮工作和家庭。當然最簡單的方法是把兩個目標(goal)進行加權求和,而且這個權重似乎會變化,因此人類是否有一個單一的目標,而其他目標都是它的一種外在表現?我們這里不討論這個問題,但是對于實際的Task來說,一般是足夠了。比如下圍棋,就是勝負;玩Atari游戲就是獲得最高的得分。
在每個時刻t,Agent根據當前的狀態(tài)St會選取不同的行為 At,選擇的方法叫做策略(Policy),一般假設是它一個概率分布(確定的策略是它的特殊情況)πt(At|St),如果這個隨機過程是平穩(wěn)的(Stationary),那么我們的策略也一般與時間無關的,即πt(At|St)=π(At|St)。策略有好有壞,Agent的目標是學習到最好的策略(是否存在也是強化學習的一個理論問題,不過我們一般認為存在,也有一些理論可以證明如果系統(tǒng)滿足一些假設,最優(yōu)策略是存在的)。
目標和獎勵
每個時刻t,環(huán)境都會給Agent一個RewardRt,而Agent的目標(Goal)是最大化最終得到的所有Reward的和。這里隱含的意思是:我們的目標不是短期的Reward,而是長期Reward的累加。在學校的時候平時努力學習最終會有回報的,如果短期來看,學習可能會饑餓會疲憊,而出去玩可能會愉快。這就是所謂的“Reward假設”:我們所說的目標(Goal)或者目的(Purpose)最終可以被看成最大化一個Reward信號的累加值。
就像前文說過,用一個數值來描述Agent所有的目標(尤其是人這樣復雜的生物)似乎有些不夠,我們暫且把Agent放到一些具體的任務(Task)上來看看似乎足夠。比如我們讓一個老鼠逃離迷宮(Maze),如果它沒有找到出口我們給它-1的Reward,這樣它學習的目標就是盡快的逃離迷宮。比如下象棋,如果獲勝,我們給它+1的Reward,如果輸棋則是-1,和棋則是0。又比如掃地機器人,如果它收集到垃圾,那么給它+1的Reward,那么它的目標就是盡可能多的收集垃圾。
注意:我們定義的目標是要告訴Agent我們期望它做的是什么(What),而不是告訴它怎么做(How)。比如下棋時吃掉對方的棋子是一種獲勝的策略(怎么做),我們不能給吃子Reward,否則它就可能學到的策略是為了吃子,因為我們知道有的時候為了獲勝必須犧牲己方的棋子。
回報(Return)
Agent的目標是最大化長期的Reward累加值,下面我們來形式化的定義這個累加值——回報。假設t時刻之后的Reward是Rt,Rt+1,…,我們期望這些Reward的和最大。由于環(huán)境(可能)是隨機的,而且Agent的策略也(可能)是隨機的,因此Agent的目標是最大化Reward累加和的期望值?;貓驡t定義如下:
Gt=Rt+1+Rt+2+Rt+3+...+RT
其中T是最后的時刻。有些任務會有一些結束的狀態(tài),從任務的初始狀態(tài)到結束狀態(tài),我們稱之為一個episode。比如下象棋,從開始下棋到最終分出勝負(或者和棋)一局游戲結束就叫一個episode。如果我們開始一個新的episode,比如下棋重新開始一局,那么Agent的狀態(tài)會重置到初始化狀態(tài),而且新的一局和上一局是沒有關系的。除了episode的任務之外,還有一種任務沒有結束狀態(tài),會一直繼續(xù)下去,也就是T=∞。
由于未來的不確定性,我們一般會對未來的Reward進行打折(Discount)。這很好理解,眼前的Reward的是確定的,拿到手再說,未來的Reward不確定因素太多,所以要打折。因此我們可以定義打折后的回報(Discounted Return)如下:
其中γ是一個參數,0≤γ≤10≤γ≤1,叫做打折率(Discount Ratio)。如果γ<1γ<1并且Reward是有界的,那么無窮項的和是收斂的。如果γ=0,則Agent只考慮當前t時刻的Reward,而隨著γγ趨近于1,則未來的Reward越來越重要,當γ=1γ=1時,未來的Reward和當前的一樣重要。回報Gt有如下的遞歸公式:
在強化學習里,Agent根據狀態(tài)來決定采取什么樣的行為,而狀態(tài)是來自環(huán)境的一個信號(Signal)。狀態(tài)可以來自Agent的傳感器的測量(Sensory Measurements),也可以是這些原始測量的復雜處理??梢允钱斍皶r刻的傳感器信號,也可以包含以前的信號。理想的,我們期望狀態(tài)信號能夠緊湊的壓縮過去所有的信息,它能夠保留所有相關的信息而盡量丟棄無關的信息。這通常要求狀態(tài)不僅包含當前時刻的信號,還可能包含之前的一些信息,當然通常不需要所有過去的信息。如果一個狀態(tài)信號包含了所有相關的信息,那么就叫它具有馬爾科夫屬性(Markov Property)。比如下象棋,當前的局面(包括所有棋子的位置和誰走下一步棋)包含了所有的信息。不管是先走車再走馬還是先走馬再走車,總之它們到達了相同的局面。因此通常馬爾科夫屬性通常與具體的“路徑”無關。下面我們來形式化的定義馬爾科夫屬性。
我們假設環(huán)境的動力系統(tǒng)(dynamics)是如下的隨機過程:
也就是在過去所有的歷史信息的情況下(S0,A0,R1,…,St?1,At?1,Rt),Agent處于狀態(tài)St下采取At后環(huán)境反饋的新狀態(tài)是s’并且rewward是r的聯合概率分布。如果系統(tǒng)滿足馬爾科夫屬性,那么所有的過去歷史信息都壓縮在St里了,因此給定St的條件下與過去的歷史無關,因此滿足馬爾科夫屬性的系統(tǒng)的動力系統(tǒng)可以簡化為如下公式:
如果環(huán)境具有馬爾科夫屬性,那么在給定當前狀態(tài)和行為的條件下我們可以使用上式預測下一個狀態(tài)和Reward(的概率)。通過不斷迭代的使用這個公式,我們可以(精確的)計算當前狀態(tài)的期望回報。
圖:Atari Broke游戲
比如上圖Atari Broke游戲,玩法就是用下面的擋板把球反彈回去,然后碰掉上方的格子,每碰掉一個格子就會有加分(Reward),如果所有格子都碰掉了或者擋板沒有接到球讓它落入屏幕下方就算游戲結束。玩家的目標就是獲得更多的得分。
如果我們分析這個游戲的環(huán)境,假如我們把當前幀的圖像作為當前的狀態(tài),那么它是否是馬爾科夫的呢?似乎不行,因為一幅圖像只有今天的信息,可能有兩個狀態(tài)圖像相同但是球速可能不同。我們可以把當前幀和前一幀圖像作為當前的狀態(tài),假設球是勻速直線運動的(在沒有碰撞的時候是這樣的),那么根據兩幀的球的位置可以計算出其速度來。這樣就可以大致認為它是具有馬爾科夫屬性的了。
滿足馬爾科夫屬性的強化學習叫做馬爾科夫決策過程,如果狀態(tài)空間和行為空間是有限的,那么它就叫有限馬爾科夫決策過程。一個馬爾科夫決策過程完全由環(huán)境的當前狀態(tài)決定,我們再次重復一下這個重要公式:
有了上面的公式,我們可以計算關于環(huán)境的任何信息(也就是說環(huán)境完全由這個公式確定)。比如我們可以計算某個特點狀態(tài)s和行為a的期望reward如下:
上面的公式直接根據期望的定義推導出來,我們這里簡單的推導一下,后面類似的地方就略過了。
同樣我們可以得到狀態(tài)轉移概率:
以及給定當前s、當前a和下一個s條件時期望的Reward:
價值函數(Value Function)
很多強化學習方法會涉及求狀態(tài)的價值函數(或者State-Action對的價值函數)。這個函數計算Agent處于這個狀態(tài)(或者Agent處于狀態(tài)s并且采取xingw行為a)到底有多好。比如下棋的時候我們會思考如果我們處于某個局面(Position)到底是好是壞,從而采取Action引導局面向這個好的局面發(fā)展或者避開不好的局面。這里的“好”指的是在這個狀態(tài)下Agent獲得回報的期望值,當然這個期望值是與Agent的策略(Policy)緊密相關的,因此價值函數指的是在某個策略下的價值函數。
回憶一下,策略π是一個從狀態(tài)s∈S, Action a∈A(s)到概率π(a|s)的映射。我們把狀態(tài)s時策略π的價值,也就是Agent處于狀態(tài)s,并且使用策略π,它所能得到的回報的期望值,定義為vπ(s)。它的形式化定義是:
這里Eπ[?]代表Agent使用策略π來采取行為時隨機變量的期望值。如果有終止狀態(tài),我們定義其價值函數為零。我們把函數vπ叫做策略ππ的狀態(tài)價值函數(State Value Function)。
類似的我們可以定義qπ(s,a),在狀態(tài)s下采取Action a的價值,其形式化定義為:
我們把qπ叫做策略π的行為價值函數(Action Value Function)。
值函數vπ和qπ可以從經驗(Experience)中估計出來。比如我們可以這樣來估計:如果一個Agent使用策略π模擬很多次,通過平均可以估計出一個值來,如果模擬次數趨于無窮大,那么這種方法得到的估計值v^π(s)會收斂到真正的vπ(s))。這就是蒙特卡羅(Monte Carlo)方法,這個方法也可以用于qπ(s,a)的估計。如果狀態(tài)空間非常大,我們也可以假設vπ(s)或者qπ(s,a)是參數化的函數(模型)vπ(s;w)或者qπ(s,a;w),這就是近似的方法。我們可以用深度神經網絡來實現vπ(s;w)或者qπ(s,a;w),這就是所謂的深度強化學習(Deep Reinforcement Learning)。
值函數一個非常重要的特效是它滿足某種遞歸性,這在強化學習和動態(tài)規(guī)劃會經常用到。這個遞歸公式就是貝爾曼方程(Bellman Equation),希望讀者能夠理解并推導下面的公式(如果有些步驟不能推導,也至少讀懂它在說什么并能夠“認可”這個等式,書讀百遍其義自見,實在不理解多抄兩遍也會有幫助)。
我們再來看一下Bellman公式,它是遞歸定義的——vπ(s)是由vπ(s′)來定義的,對于有些簡單問題,我們可以根據這個公式把vπ通過解方程解出來。
我們結合上圖來分析上面公式的。當前狀態(tài)是s,根據策略π,我們采取行為a的概率是π(a|s),而我們在狀態(tài)a和行為s的條件下,環(huán)境反饋r和s’的概率是p(r,s′|s,a),所有可能的(a,r,s’)組合我們都要求和,所以就得到,在每一條路徑(每一種s,r,s’的組合)下Rt+1就是r,因此可以得到
。而在給定路徑的情況下,s,r,s′s,r,s′都固定了,因此s’也是固定的了,而根據馬爾科夫屬性,Gt+1Gt+1只與t+1時刻的狀態(tài)St+1=s′St+1=s′有關,因此第二項變成了
最優(yōu)價值函數(Optimal Value Functions)
解決強化學習任務,粗略來說,就是找到一個策略,使得長期的reward盡可能多。首先我們定義什么是一個策略π比另外一個策略π‘好(或者一樣好),記作π≥π′。形式化的定義是π≥π′??s∈S,vπ(s)≥vπ′(s)。 可以證明(這里略過)存在一個(可能有多個)最優(yōu)的$\pi_,它比所有其它策略都“好”。最優(yōu)策略對于的價值函數叫做最優(yōu)價值函數,記作v_(s)$:
同理對于行為也有一個最優(yōu)的行為價值函數:
$q_(s,a)和和v_(s)$有如下關系:
我們可以這樣解讀這個公式:s和a確定后,它會進入St+1狀態(tài)并得到Reward Rt+1,這是過程是有概率的,因此前面有一個期望E。但是這和Agent無關,和Agent有關的是在t+1時刻的行為,如果要得到最優(yōu)的q(s,a),那么它必須在t+1時刻根據最優(yōu)策略π?來計算v(St+1),因此就是v?(St+1)。
需要注意:上面公式的隨機變量只是Rt+1Rt+1,它由環(huán)境p(r,s′|s,a)確定,而v?(s)和q?(s,a)是兩個常量(給定s,a的情況下)。
OpenAI Gym是一個用來開發(fā)和比較強化學習算法的工具。它對Agent的實現沒有任何約束,因此你可以用TensorFlow或者其它任何工具來實現Agent。它提供統(tǒng)一的Environment的接口,你可以用這個接口來定義一個具體的強化學習任務,此外它也提供很多常見的任務,比如很多Atari的游戲。
首先我們介紹一個很簡單的游戲CartPole-v0,如下圖所示。
圖:CartPole-v0運行時的截圖
這個游戲有一個小車,可以對車子施加+1或者-1的力(加速度),車上有一個桿子,我們的目標是要求車子的位置在-2.4到2.4之間,并且桿子相對于垂直的角度在-15°和15°之間。如果從物理的角度來分析,它有4個狀態(tài)變量,車子的位置,車子的速度,桿的角度,桿的角速度。而我們施加的力會改變車子的速度,從而間接改變車子的位置。我們可以用幾行代碼運行CartPole-v0這個游戲:
代碼很簡單,首先創(chuàng)建一個CartPole-v0 Environment對象env,重置(reset)使環(huán)境進入初始狀態(tài)。接著循環(huán)1000次,每次首先把當前的游戲狀態(tài)繪制出來(render),然后隨機的選擇一個Action env.action_space.sample(),接著調用env.step函數真正的“執(zhí)行”這個Action。
觀察就是MDP里的狀態(tài)(State),Environment的step有4個返回值:
observation 一個對象,代表觀察,不同的環(huán)境返回的對象是不同的。
reward float類型 表示Reward。
done bool類型 表示任務是否結束。對于Episode類任務會有結束狀態(tài),進入結束狀態(tài)后再調用step是沒有意義的,必須要先調用reset
info 調試用的一些信息
我們可以用如下代碼打印出其中的一些信息:
Spaces
Environment對象里有兩個空間(Space):狀態(tài)空間(State Space)和行為空間(Action Space),它們定義了所有可能的狀態(tài)和行為。我們可以查看一些CartPole-v0的Space:
從輸出可以看出,Discrete(2)表示這個任務有兩個選的Action(分布表示向左和向右移動),Box(4,)表示狀態(tài)由4維向量表示,物理意義分別是車子相對原點的位置和速度,桿相對于垂直方向的角度和角速度。我們可以用如下的代碼檢查其取值范圍:
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。