博主的github鏈接,歡迎大家來訪問~:https://github.com/Sh-Zh-7
強化學習經典算法實現地址:https://github.com/Sh-Zh-7/reinforce-learning-impl
0. 前言
不得不說Github確實是一個社交網站,我在這個上面follow了其他人以後,就可以看到其他人最近的動向。這不,我在GitHub上follow了一個大三的學長,發現他正在搞這個,所以我也萌生了搞強化學習的主意。
經過一比對,我發現他的代碼都是借(chao)鑑(xi)Morvan Zhou的。然而現在,2020年爲止,Morvan Zhou的強化學習是使用tensorflow框架實現的,並沒有對應pytorch的實現(諷刺的是,Morvan Zhou Github上star最多的反而是他pytorch的教程)。筆者此時並不會tensorflow,所以決定找其它的教程。
最後我找到了一個star3600+(截止2020年2月初)的repo,雖然他也使用tensorflow實現的(那沒辦法,目前能找到的pytorch強化學習教程很少),但是他的思路非常清晰。我就跟着這個教程用pytorch重新寫了一遍這些算法。不過pytorch近年來越來越火熱,AI搞得最火熱的Stanford University近年來的深度學習框架也由tensorflow轉變到了pytorch,相信以後高質量的pytorch強化學習教程會越來越多。所以本專欄並不是一個面向新手的教程,只不過是一個關於強化學習知識點的總結。
想要強化學習入門,我個人的建議是:臺大李宏毅視頻教程(沒必要貼鏈接,這種東西每年都會有新的資源)-> Morvan Zhou強化學習tensorflow implementation(實在找不到好的pytorch教程了。。tensorflow湊合着看吧)-> 理論知識的學習,這裏推薦Sutton的經典書籍
1. 強化學習基本要素
- state:又被稱作是obersavation,我個人認爲叫obersavation更爲準確,因爲它是我們agent對於environment的觀測。舉幾個例子,比如在windy-world中它是agent所在位置的座標,在cart-pole中,它是cart-pole的速度,位置,角度等信息。
- action: 這個就是agent所作出的動作。注意對於同一個state, 你做出相同的action,並不一定會跳轉到下一個相同的state. RL中,我們有專門的數學概念來闡述這個問題,叫做狀態轉化模型P。他衡量了“給定狀態和動作,跳轉到某個狀態的概率”。這就可以證明我們之前的言論。
- reward:強化學習最關鍵的就是這個reward,我們強化學習的目的就是最大化我們trajactory中的accumulated reward。這個reward其實是你自己設定的。比如在space invader遊戲裏面,我們的action有左右移動和射擊三個。只有我們擊敗了敵人,才能獲得分數。因此我們可以給射擊設置reward爲1,左右移動設爲0。
- policy: policy就是所謂的策略,他與我們的問題也是息息相關的,一般而言,我們程序的目的是最大化accumlated reward, 輸出則是policy。同一個狀態採用不同的動作,得到的reward也不同。既然我們的目的是最大化accumulated reward,那麼我們就要有一個策略來指導我們:到了某一狀態時,應該採用什麼樣的動作,這個就是我們的policy。
2. 強化學習流程
在瞭解強化學習基本概念之後,我們再瞭解一下強化學習的流程:
- 先初始化observation。
- 根據policy選擇action, 即給定state, 輸出action。
- 用這個action與environment interact, 得到下一個state和reward(這一步主要基於你的狀態轉移模型)。
- 判斷是否結束,不然返回2.
這只不過是一個episode的流程,實際上,爲了得到正確的決策,上面的流程必須要做多次纔行,而且我也沒有往裏面添加更新策略的步驟。這個在後面的篇章裏將會提到。
3. 強化學習在機器學習中的地位
其實強化學習和監督和無監督學習完全是三碼不同的事情。如果你硬要說和那個像一點,我覺得他到更像是監督學習。
雖然強化學習沒有顯示地給出label,但是他是通過reward學習的,通過reward來改變它的決策。所以強化學習並非無監督學習。
那強化學習和監督學習差別是什麼呢?以下棋爲例,監督學習是讓人教他怎麼下:比如遇到了某一個狀況,那就讓人告訴他下哪兒好。強化學習則是讓機器自己學習,通過下棋的勝負給定reward,在極大化reward的時候,增強自己的能力。
很顯然,我們用監督學習,只能訓練出會下棋的AI,然而我們用強化學習,卻能訓練出能痛扁人類的AI。
一般而言,我們在實際工程的時候,都是先用監督學習訓練一個會下棋的AI,然後再讓他自己和自己打,以此提高能力。
下圖是強化學習在機器學習中的地位,從這幅圖中我們也能看出強化學習和監督和無監督學習是兩碼事情。
4. 馬爾可夫決策過程MDP
讓我們稍微把目光從強化學習上移開,看看其它重要的東西。
馬爾可夫假設是屬於我們馬爾可夫決策過程的概念。它的出現主要是爲了簡化我們的建模。
其基本思想是:當前狀態只由其上一個狀態所決定,而不是由所有出現過的歷史狀態決定的。
這樣我們的一些概念就可以用更簡單的數學公式來表達了:
- 原來與歷史狀態相關的狀態轉移模型只與當前狀態有關了。
- 在描述策略的時候,我們也不用考慮歷史的狀態了。
- 在考慮狀態和動作價值的時候,也不用考慮歷史的狀態了。(後面的篇章會提到)
5. 強化學習怎麼做
(1) Accumulated reward表達式
之前我們已經講了,我們強化學習的目的就是最大化accumlated reward。那麼我們應該怎麼做呢?最簡單的想法就是把reward全部加起來, 然後想方設法把它最大化:
這個想法很簡單,但是並不靠譜,我們對其稍作休整,考慮一下觀點:
- 當前狀態,對越是遙遠未來的狀態,影響越小,因此,我們再考慮其導致未來狀態的reward的時候,就要加上一個discount factor。
- 考慮之前MDP的假設,我們當前狀態的G,不應該受之前狀態的影響。
所以我們的G就變成了:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2) 狀態價值函數和動作價值函數和策略
好了,我們的表達式已經列出來了,注意我們的目的是調整狀態和動作來最大化這個G,因此我們要引入兩個新的概念,那就是狀態價值和動作價值。
-
狀態價值用來衡量,當前狀態,後續執行策略, 會得到多少價值。
-
而動作價值則用來衡量,當前狀態,執行某個動作,後續再執行策略, 會得到多少價值。
之前已經提到過,由於策略的隨機性和環境的隨機性。後續的狀態的價值其實是一個random variable。因此,不管是我們的狀態價值函數還是我們的動作價值函數,我們使用的都是期望。
因爲我們要輸出的是策略,所以我們要把這策略和這兩個函數聯繫起來。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3) 尋找最優解
首先定義我們的最優解:
對於所有的狀態和動作,都有:
這時候,策略爲
我們的目的就是找到或者逼近這個策略,具體怎麼做,看我接下來的博文。強化學習方法有很多種分類,下圖只是其中一種: