通過(guò) Q-learning 深入理解強(qiáng)化學(xué)習(xí)
本文將帶你學(xué)習(xí)經(jīng)典強(qiáng)化學(xué)習(xí)算法 Q-learning 的相關(guān)知識(shí)。在這篇文章中,你將學(xué)到:(1)Q-learning 的概念解釋和算法詳解;(2)通過(guò) Numpy 實(shí)現(xiàn) Q-learning。
故事案例:騎士和公主
假設(shè)你是一名騎士,并且你需要拯救上面的地圖里被困在城堡中的公主。
你每次可以移動(dòng)一個(gè)方塊的距離。敵人是不能移動(dòng)的,但是如果你和敵人落在了同一個(gè)方塊中,你就會(huì)死。你的目標(biāo)是以盡可能快的路線走到城堡去。這可以使用一個(gè)「按步積分」系統(tǒng)來(lái)評(píng)估。
- 你在每一步都會(huì)失去 1 分(每一步失去的分?jǐn)?shù)幫助智能體訓(xùn)練的更快)
- 如果碰到了一個(gè)敵人,你會(huì)失去 100 分,并且訓(xùn)練 episode 結(jié)束。
- 如果進(jìn)入到城堡中,你就獲勝了,獲得 100 分。
那么問(wèn)題來(lái)了:如何才能夠創(chuàng)建這樣的智能體呢?
下面我將介紹第一個(gè)策略。假設(shè)智能體試圖走遍每一個(gè)方塊,并且將其著色。綠色代表「安全」,紅色代表「不安全」。
同樣的地圖,但是被著色了,用于顯示哪些方塊是可以被安全訪問(wèn)的。
接著,我們告訴智能體只能選擇綠色的方塊。
但問(wèn)題是,這種策略并不是十分有用。當(dāng)綠色的方塊彼此相鄰時(shí),我們不知道選擇哪個(gè)方塊是最好的。所以,智能體可能會(huì)在尋找城堡的過(guò)程中陷入無(wú)限的循環(huán)。
Q-Table 簡(jiǎn)介
下面我將介紹第二種策略:創(chuàng)建一個(gè)表格。通過(guò)它,我們可以為每一個(gè)狀態(tài)(state)上進(jìn)行的每一個(gè)動(dòng)作(action)計(jì)算出最大的未來(lái)獎(jiǎng)勵(lì)(reward)的期望。
得益于這個(gè)表格,我們可以知道為每一個(gè)狀態(tài)采取的最佳動(dòng)作。
每個(gè)狀態(tài)(方塊)允許四種可能的操作:左移、右移、上移、下移。
「0」代表不可能的移動(dòng)(如果你在左上角,你不可能向左移動(dòng)或者向上移動(dòng)!)
在計(jì)算過(guò)程中,我們可以將這個(gè)網(wǎng)格轉(zhuǎn)換成一個(gè)表。
這種表格被稱為 Q-table(「Q」代表動(dòng)作的「質(zhì)量」)。每一列將代表四個(gè)操作(左、右、上、下),行代表狀態(tài)。每個(gè)單元格的值代表給定狀態(tài)和相應(yīng)動(dòng)作的最大未來(lái)獎(jiǎng)勵(lì)期望。
每個(gè) Q-table 的分?jǐn)?shù)將代表在給定最佳策略的狀態(tài)下采取相應(yīng)動(dòng)作獲得的最大未來(lái)獎(jiǎng)勵(lì)期望。
為什么我們說(shuō)「給定的策略」呢?這是因?yàn)槲覀儾⒉粚?shí)現(xiàn)這些策略。相反,我們只需要改進(jìn) Q-table 就可以一直選擇最佳的動(dòng)作。
將這個(gè) Q-table 想象成一個(gè)「?jìng)渫垪l」游戲。得益于此,我們通過(guò)尋找每一行中最高的分?jǐn)?shù),可以知道對(duì)于每一個(gè)狀態(tài)(Q-table 中的每一行)來(lái)說(shuō),可采取的最佳動(dòng)作是什么。
太棒了!我解決了這個(gè)城堡問(wèn)題!但是,請(qǐng)等一下... 我們?nèi)绾斡?jì)算 Q-table 中每個(gè)元素的值呢?
為了學(xué)習(xí)到 Q-table 中的每個(gè)值,我們將使用 Q-learning 算法。
Q-learning 算法:學(xué)習(xí)動(dòng)作值函數(shù)(action value function)
動(dòng)作值函數(shù)(或稱「Q 函數(shù)」)有兩個(gè)輸入:「狀態(tài)」和「動(dòng)作」。它將返回在該狀態(tài)下執(zhí)行該動(dòng)作的未來(lái)獎(jiǎng)勵(lì)期望。
我們可以把 Q 函數(shù)視為一個(gè)在 Q-table 上滾動(dòng)的讀取器,用于尋找與當(dāng)前狀態(tài)關(guān)聯(lián)的行以及與動(dòng)作關(guān)聯(lián)的列。它會(huì)從相匹配的單元格中返回 Q 值。這就是未來(lái)獎(jiǎng)勵(lì)的期望。
在我們探索環(huán)境(environment)之前,Q-table 會(huì)給出相同的任意的設(shè)定值(大多數(shù)情況下是 0)。隨著對(duì)環(huán)境的持續(xù)探索,這個(gè) Q-table 會(huì)通過(guò)迭代地使用 Bellman 方程(動(dòng)態(tài)規(guī)劃方程)更新 Q(s,a) 來(lái)給出越來(lái)越好的近似。
Q-learning 算法流程
Q-learning 算法的偽代碼
步驟 1:初始化 Q 值。我們構(gòu)造了一個(gè) m 列(m = 動(dòng)作數(shù) ),n 行(n = 狀態(tài)數(shù))的 Q-table,并將其中的值初始化為 0。
步驟 2:在整個(gè)生命周期中(或者直到訓(xùn)練被中止前),步驟 3 到步驟 5 會(huì)一直被重復(fù),直到達(dá)到了最大的訓(xùn)練次數(shù)(由用戶指定)或者手動(dòng)中止訓(xùn)練。
步驟 3:選取一個(gè)動(dòng)作。在基于當(dāng)前的 Q 值估計(jì)得出的狀態(tài) s 下選擇一個(gè)動(dòng)作 a。
但是……如果每個(gè) Q 值都等于零,我們一開(kāi)始該選擇什么動(dòng)作呢?在這里,我們就可以看到探索/利用(exploration/exploitation)的權(quán)衡有多重要了。
思路就是,在一開(kāi)始,我們將使用 epsilon 貪婪策略:
- 我們指定一個(gè)探索速率「epsilon」,一開(kāi)始將它設(shè)定為 1。這個(gè)就是我們將隨機(jī)采用的步長(zhǎng)。在一開(kāi)始,這個(gè)速率應(yīng)該處于最大值,因?yàn)槲覀儾恢? Q-table 中任何的值。這意味著,我們需要通過(guò)隨機(jī)選擇動(dòng)作進(jìn)行大量的探索。
- 生成一個(gè)隨機(jī)數(shù)。如果這個(gè)數(shù)大于 epsilon,那么我們將會(huì)進(jìn)行「利用」(這意味著我們?cè)诿恳徊嚼靡呀?jīng)知道的信息選擇動(dòng)作)。否則,我們將繼續(xù)進(jìn)行探索。
- 在剛開(kāi)始訓(xùn)練 Q 函數(shù)時(shí),我們必須有一個(gè)大的 epsilon。隨著智能體對(duì)估算出的 Q 值更有把握,我們將逐漸減小 epsilon。
步驟 4-5:評(píng)價(jià)!采用動(dòng)作 a 并且觀察輸出的狀態(tài) s' 和獎(jiǎng)勵(lì) r?,F(xiàn)在我們更新函數(shù) Q(s,a)。
我們采用在步驟 3 中選擇的動(dòng)作 a,然后執(zhí)行這個(gè)動(dòng)作會(huì)返回一個(gè)新的狀態(tài) s' 和獎(jiǎng)勵(lì) r。
接著我們使用 Bellman 方程去更新 Q(s,a):
如下方代碼所示,更新 Q(state,action):
- New Q value =
- Current Q value +
- lr * [Reward + discount_rate * (highest Q value between possible actions from the new state s’ ) — Current Q value ]
讓我們舉個(gè)例子:
- 一塊奶酪 = +1
- 兩塊奶酪 = +2
- 一大堆奶酪 = +10(訓(xùn)練結(jié)束)
- 吃到了鼠藥 = -10(訓(xùn)練結(jié)束)
步驟 1:初始化 Q-table
初始化之后的 Q-table
步驟 2:選擇一個(gè)動(dòng)作。從起始點(diǎn),你可以在向右走和向下走其中選擇一個(gè)。由于有一個(gè)大的 epsilon 速率(因?yàn)槲覀冎两駥?duì)于環(huán)境一無(wú)所知),我們隨機(jī)地選擇一個(gè)。例如向右走。
我們隨機(jī)移動(dòng)(例如向右走)
我們發(fā)現(xiàn)了一塊奶酪(+1),現(xiàn)在我們可以更新開(kāi)始時(shí)的 Q 值并且向右走,通過(guò) Bellman 方程實(shí)現(xiàn)。
步驟 4-5:更新 Q 函數(shù)
- 首先,我們計(jì)算 Q 值的改變量 ΔQ(start, right)。
- 接著我們將初始的 Q 值與 ΔQ(start, right) 和學(xué)習(xí)率的積相加。
可以將學(xué)習(xí)率看作是網(wǎng)絡(luò)有多快地拋棄舊值、生成新值的度量。如果學(xué)習(xí)率是 1,新的估計(jì)值會(huì)成為新的 Q 值,并完全拋棄舊值。
更新后的 Q-table
太好了!我們剛剛更新了第一個(gè) Q 值?,F(xiàn)在我們要做的就是一次又一次地做這個(gè)工作直到學(xué)習(xí)結(jié)束。
實(shí)現(xiàn) Q-learning 算法
既然我們知道了它是如何工作的,我們將一步步地實(shí)現(xiàn) Q-learning 算法。代碼的每一部分都在下面的 Jupyter notebook 中直接被解釋了。
你可以在我的深度強(qiáng)化學(xué)習(xí)課程 repo 中獲得代碼。
項(xiàng)目地址:
https://github.com/simoninithomas/Deep_reinforcement_learning_Course/blob/master/Q%20learning/Q%20Learning%20with%20FrozenLake.ipynb
回顧
- Q-learning 是一個(gè)基于值的強(qiáng)化學(xué)習(xí)算法,利用 Q 函數(shù)尋找最優(yōu)的「動(dòng)作—選擇」策略。
- 它根據(jù)動(dòng)作值函數(shù)評(píng)估應(yīng)該選擇哪個(gè)動(dòng)作,這個(gè)函數(shù)決定了處于某一個(gè)特定狀態(tài)以及在該狀態(tài)下采取特定動(dòng)作的獎(jiǎng)勵(lì)期望值。
- 目的:最大化 Q 函數(shù)的值(給定一個(gè)狀態(tài)和動(dòng)作時(shí)的未來(lái)獎(jiǎng)勵(lì)期望)。
- Q-table 幫助我們找到對(duì)于每個(gè)狀態(tài)來(lái)說(shuō)的最佳動(dòng)作。
- 通過(guò)選擇所有可能的動(dòng)作中最佳的一個(gè)來(lái)最大化期望獎(jiǎng)勵(lì)。
- Q 作為某一特定狀態(tài)下采取某一特定動(dòng)作的質(zhì)量的度量。
- 函數(shù) Q(state,action)→返回在當(dāng)前狀態(tài)下采取該動(dòng)作的未來(lái)獎(jiǎng)勵(lì)期望。
- 這個(gè)函數(shù)可以通過(guò) Q-learning 算法來(lái)估計(jì),使用 Bellman 方程迭代地更新 Q(s,a)
- 在我們探索環(huán)境之前:Q-table 給出相同的任意的設(shè)定值→ 但是隨著對(duì)環(huán)境的持續(xù)探索→Q 給出越來(lái)越好的近似。
就是這些了!不要忘記自己去實(shí)現(xiàn)代碼的每一部分——試著修改已有的代碼是十分重要的。
試著增加迭代次數(shù),改變學(xué)習(xí)率,并且使用一個(gè)更復(fù)雜的環(huán)境(例如:8*8 方格的 Frozen-lake)。祝你玩的開(kāi)心!
原文鏈接:
https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】