從強化學習基本概念到Q學習的實現(xiàn),打造自己的迷宮智能體
近年以來,強化學習在人工智能所充當?shù)慕巧絹碓街匾?,很多研究機構(gòu)和大學都將強化學習與深度學習相結(jié)合打造高性能的系統(tǒng)。因此,本文注重描述強化學習的基本概念與實現(xiàn),希望能為讀者介紹這一機器學習分支的巨大魅力。
強化學習其實也是機器學習的一個分支,但是它與我們常見監(jiān)督學習和無監(jiān)督學習又不太一樣。強化學習旨在選擇***決策,它講究在一系列的情景之下,通過多步恰當?shù)臎Q策來達到一個目標,是一種序列多步?jīng)Q策的問題。該學習算法能幫助我們公式化表達生物體以獎勵為動機(reward-motivated)的行為。比如說,讓一個孩子坐下來安靜地為考試而復習是十分困難的,但如果你在他每次學完一章時獎勵一塊巧克力,那么他就會明白只有保持學習才能獲得獎勵,因此也就有動力復習備考。而現(xiàn)在,如果這個孩子在備考時沒有明確的方法,他可能會花大量時間學習一個章節(jié)而不能及時完成課程大綱。所以我們需要小孩有效率地學,因此如果小孩在一小時內(nèi)完成某章節(jié),那么就獎勵大塊巧克力,而超過 1 小時那就只獎勵小塊巧克力?,F(xiàn)在他不僅會學習,同時大腦會思考設(shè)計出更快完成章節(jié)學習的方法。
在這個例子中,孩子就是代表著訓練實體(Agent :與環(huán)境交互的對象)。獎勵系統(tǒng)和考試就代表著環(huán)境(Environment)。而章節(jié)就可以類比為強化學習的狀態(tài)(States)。所以孩子們就需要決定哪些章節(jié)更重要(即計算每一個章節(jié)的值),這也就是價值函數(shù)(Value-Function)所做的事。并且小孩每次從一個狀態(tài)到另一個狀態(tài)就能收到獎勵,而他隨時間完成章節(jié)的方式就是策略(Policy)。
強化學習和其他機器學習范式有什么不同:
- 沒有大量標注數(shù)據(jù)進行監(jiān)督,所以也就不能由樣本數(shù)據(jù)告訴系統(tǒng)什么是最可能的動作,訓練主體只能從每一步動作得出獎勵。因此系統(tǒng)是不能立即得到標記的,而只能得到一個反饋,也可以說強化學習是一種標記延遲的監(jiān)督學習。
- 時間序列的重要性,強化學習不像其他接受隨機輸入的學習方法,其更注重序列型數(shù)據(jù),并且下一步的輸入經(jīng)常依賴于前一狀態(tài)的輸入。
- 延遲獎勵的概念,系統(tǒng)可能不會在每步動作上都獲得獎勵,而只有當完成整個任務(wù)時才會獲得獎勵。
- 訓練實體的動作影響下一個輸入。如你可以選擇向左走或向右走,那么當選擇的方向不同時,下一個時間步的輸入也會不同。即選擇不同的動作進入不同的狀態(tài)后,當前可選的動作又不一樣。
總的來說,強化學習的目標就是要尋找一個能使得我們獲得***累積獎賞的策略。因此,強化學習實際上和我們?nèi)祟惻c環(huán)境的交互方式類似,是一套非常通用的框架,可以用來解決各種各樣的人工智能的問題。
如上所示,在任何時間步(t),訓練實體會得到一個環(huán)境的觀察值(實例)。然后它會從所有可行動作中采取一種,并獲得環(huán)境的獎勵和下一個觀察值。所以我們需要為訓練實體提供算法,其所作出的決策應(yīng)該是以***化提升結(jié)束時的全部獎勵為目的。
一、歷史與狀態(tài)
歷史(History)是描述在環(huán)境和訓練實體之間發(fā)生的所有事件的變量集合。
訓練實體必須將歷史映射到一個確切的動作中。對于環(huán)境,其必須將歷史映射到需要發(fā)送的下一組觀察值。因此,訓練實體必須持續(xù)保持并儲存大量的信息,這將占用大量的儲存空間和處理時間。
所以,我們想創(chuàng)建歷史的抽象表征,它可以儲存足夠的信息以便我們可以選擇下一步動作,這也就是狀態(tài)的概念。所以基本上系統(tǒng)的輸出就取決于我們怎樣定義狀態(tài)。
在上式中,S 表征狀態(tài)、f 表征一種能對時間步「t」的歷史求和的函數(shù)。
上述表達式中,前一個代表訓練實體的內(nèi)部表征,其可以對歷史求和并允許在以后采取動作。而后一個代表環(huán)境的內(nèi)部表征,其允許發(fā)送下一個觀察值。
1. 馬爾可夫狀態(tài)(Markov State)
馬爾可夫狀態(tài)使用抽象形式儲存過去所有的信息。所以如果訓練實體預測未來的動作,其并不會使用全部的歷史,而是使用馬爾可夫狀態(tài)。本質(zhì)上來說,馬爾可夫狀態(tài)儲存的信息并不比歷史少。
所以在給定狀態(tài) St 的情況下求未來狀態(tài) St+1 的概率和給定前面所有狀態(tài)求 St+1 的概率相同。這是因為狀態(tài) St 已經(jīng)將前面所有狀態(tài)的信息都嵌入了其中。
2. 序列的游戲
現(xiàn)在假設(shè)有個游戲發(fā)生在餐廳里,餐廳提供三種食物:甜甜圈、飲料和三明治。現(xiàn)在顧客要求服務(wù)員帶五樣食品,且服務(wù)員會按順序依次提供這五樣食品。如果顧客喜歡這些食物的順序,那么服務(wù)員將得到獎勵,否則就會得到懲罰?,F(xiàn)在服務(wù)員***次提供食物的順序如 S1 所示,他得到了獎勵。
然而,當下一次服務(wù)員又以另一個順序帶來五份食品(S2)時,他得到了懲罰。那么現(xiàn)在第三個序列 S3 的輸出是什么,獎勵還是懲罰?
這里的解決方案取決于先前狀態(tài)的定義。如果說狀態(tài)的定義僅僅只是采用食物序列***三項的順序,那么根據(jù) S1 ***三項的結(jié)果,S3 序列能獲得獎勵。然而如果根據(jù)每個食物出現(xiàn)的數(shù)量來定義,那么 S3 最有可能得到懲罰,因為 S2 和 S3 每一份食物的數(shù)量都相同。所以本質(zhì)上系統(tǒng)的輸出是依賴于狀態(tài)的定義。
二、環(huán)境
如果你在電腦上玩自己編寫的象棋,那么你就很清楚計算機是如何分析怎樣下棋。所以基本上你知道在給定的行動下電腦確定的是哪一步棋。這是一種完全可觀察的環(huán)境(Fully Observable Environment)。
現(xiàn)在如果你在玩由其他人編寫的象棋游戲,你并不知道電腦下一步會怎么下。所以現(xiàn)在你能做的就是在下一步棋后觀察電腦的下棋。這是一種部分可觀察環(huán)境(Partially Observable Environment)。在這種情況下,你能做的就是預測游戲的內(nèi)部動態(tài),并期望能對其內(nèi)部狀態(tài)能有一個足夠好的預測。
另外,根據(jù)周志華的《機器學習》,我們需注意「機器」與「環(huán)境」的界限。例如在種西瓜任務(wù)中,環(huán)境是西瓜生長的自然世界;在下棋對弈中,環(huán)境是棋盤與對手;在機器人控制中,環(huán)境是機器人的軀體與物理世界。總之,在環(huán)境中狀態(tài)的轉(zhuǎn)移、獎賞的返回是不受機器控制的,機器只能通過選擇要執(zhí)行的動作來影響環(huán)境,也只能通過觀察轉(zhuǎn)移后的狀態(tài)和返回的獎賞來感知環(huán)境。
***總結(jié)一下強化學習的概念,強化學習的輸入 是:
- 狀態(tài) (States) = 環(huán)境,例如迷宮的每一格就是一個狀態(tài)
- 動作 (Actions) = 在每個狀態(tài)下,有什么行動是容許的
- 獎勵 (Rewards) = 進入每個狀態(tài)時,能帶來正面或負面的價值 (utility)
而輸出就是:
- 策略 (Policy) = 在每個狀態(tài)下,你會選擇哪個行動?
如上圖所示,強化學習的思想主要:即訓練實體 (Agent) 不斷地采取動作 (action), 之后轉(zhuǎn)到下一個狀態(tài) (State), 并且獲得一個獎勵 (reward), 從而進一步更新訓練實體。
在了解了強化學習的基本概念后,我們就可以進一步理解 Q 學習(Q-Learning)的原理和實現(xiàn)。
下面我們將從迷宮尋寶游戲開始了解 Q 學習的基本概念。該游戲規(guī)則如下:
該游戲從一個給定的位置開始,即初始狀態(tài)(starting state)。在每一個狀態(tài)下訓練實體都可以保留原地或選擇向上、下、左、右移動,但不能穿越迷宮的邊界。每個動作都將使得訓練實體進入不同的單元格(即不同的狀態(tài))?,F(xiàn)在在某個單元格有一個寶箱(即目標狀態(tài))。此外,迷宮的某些位置/狀態(tài)有蛇。因此訓練實體的目標就是通過尋找一條沒有蛇的路徑從起始狀態(tài)走到目標狀態(tài)。
現(xiàn)在當我們在網(wǎng)格中(即環(huán)境中)放置一個訓練實體,它首先會開始探索。它最開始不知道蛇是什么,也不知道什么是寶箱或?qū)毾湓谀?。所以我們需要給定訓練主體蛇和寶箱的概念,并在每一步動作后給予一定的獎勵。對于每一塊有蛇的單元格(狀態(tài)),我們給予-10 的獎勵,而對于寶藏,我們給予+10 的獎勵?,F(xiàn)在我們希望訓練實體盡快完成任務(wù)(采取最短路徑),因此我們給予其他狀態(tài)-1 的獎勵。***我們給定訓練實體的目標就是***化***累積得分。隨著訓練實體的探索,它會知道蛇是有害的,寶藏是有益的,并且它需要盡可能快地得到寶箱。上圖中「-」就表示從起始狀態(tài)到目標狀態(tài)最短的路徑。
Q 學習(Q-Learning)就嘗試在給定狀態(tài)下學習當前值,并采取特定的動作。
現(xiàn)在我們設(shè)計一張表格,其中每行是訓練實體的狀態(tài),而每列是訓練實體可能采取的動作。所以上例有 16×5 種可能的狀態(tài)-行動對,其中每種狀態(tài)都是迷宮中的一個單元格。
首先我們初始化矩陣(上文所述的 16×5 表格)為零矩陣,然后根據(jù)不同動作所獲得的獎勵更新矩陣的元素。當然,更新該矩陣的方法為計算貝爾曼方程(Bellman Equation):
「S」代表當前狀態(tài),「a」代表訓練實體在當前狀態(tài)下所采取的動作,「S'」代表采取該動作所產(chǎn)生的狀態(tài),「r'」是采取該動作所得到的獎勵。貼現(xiàn)系數(shù)(discount factor)「γ」決定了訓練實體對未來獎勵的重視程度,γ越大,訓練實體就會越重視以往經(jīng)驗,而γ越小,訓練實體只重視眼前的利益。如果說訓練實體向遠離目標狀態(tài)的狀態(tài)運動,而該狀態(tài)遇到蛇的概率減少,那么實時獎勵將減少,未來獎勵將增加,訓練實體更注重未來的獎勵。
我們將每次迭代(訓練主體的嘗試動作)作為一個 episode。對于每一次 episode,訓練主體將嘗試到達目標狀態(tài),并且對于每一次動作,Q 矩陣元素都會進行一次更新。
現(xiàn)在讓我們了解一下 Q 矩陣是如何計算的(為了更簡潔,我們采用更小的 2×2 迷宮):
Q 矩陣的初始狀態(tài)如下(每行代表一個狀態(tài),每列代表一個動作):
U—向上走, D—向下走, L—向左走, R—向右走
獎勵矩陣如下所示:
其中 E 代表空值(NULL,訓練主體不能采取該動作)
算法:
- 初始化 Q 矩陣為零矩陣,設(shè)定「γ」值,完成獎勵矩陣。
- 對于每一 episode,選擇一個隨機起始狀態(tài)(在這個案例中,我們嚴格限制起始狀態(tài)為-1)。
- 在當前狀態(tài)(S)的所有可能動作中選擇一個。
- 作為該動作(a)的結(jié)果,訓練主體移往下一個狀態(tài)(S')。
- 對于狀態(tài)(S')產(chǎn)生的所有可能動作,選擇 Q 值***的動作。
- 使用貝爾曼方程(Bellman Equation)更新 Q 矩陣。
- 將下一個狀態(tài)設(shè)置為當前狀態(tài)。
- 如果到達目標狀態(tài),結(jié)束算法。
我們可以從以下一段偽代碼進一步理解:
現(xiàn)在假設(shè)訓練主體從狀態(tài) 1 開始,其可以采取動作 D 或 R。如果采取了動作 D,那么訓練主體到達狀態(tài) 3(蛇),并可以采取動作 U 或 R?,F(xiàn)在取值γ = 0.8,那么方程有:
- Q(1,D) = R(1,D) + γ*[max(Q(3,U) & Q(3,R))]
- Q(1,D) = -10 + 0.8*0 = -10
其中,因為 Q 矩陣還沒有更新,max(Q(3,U) & Q(3,R)) = 0。設(shè)定設(shè)定踩上蛇的獎勵為-10?,F(xiàn)在新的 Q 矩陣的值就如下所示:
現(xiàn)在,狀態(tài) 3 為當前狀態(tài),從狀態(tài) 3 采取了動作 R。訓練主體就到達狀態(tài) 4,并其可以采取動作 U 或 L。
- Q(3,R) = R(3,R) + 0.8*[max(Q(4,U) & Q(4,L))]
- Q(3,R) = 10 + 0.8*0 = 10
再一次更新 Q 矩陣的值:
所以,現(xiàn)在訓練主體到達目標狀態(tài) 4。接下來終止該進程,并進行更多的訓練直到訓練主體理解了所有狀態(tài)和動作,且所有的 Q 矩陣元素成為常數(shù)。這也就意味為訓練主體已經(jīng)嘗試了所有的狀態(tài)-動作對。
這一過程的 Python 實現(xiàn):
*** Q 矩陣的輸出:
原文:
https://medium.com/becoming-human/the-very-basics-of-reinforcement-learning-154f28a79071
【本文是51CTO專欄機構(gòu)機器之心的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】