系統(tǒng)學(xué)習(xí)機(jī)器學(xué)習(xí)之增強(qiáng)學(xué)習(xí)(一)--模型基礎(chǔ)x

        發(fā)布時間:2020-09-08 來源: 事跡材料 點擊:

         系統(tǒng)學(xué)習(xí)機(jī)器學(xué)習(xí)之增強(qiáng)學(xué)習(xí)(一)-- 模型基礎(chǔ) 轉(zhuǎn)自:https://www.cnblogs.com/pinard/p/9385570.html 從今天開始整理強(qiáng)化學(xué)習(xí)領(lǐng)域的知識,主要參考的資料是 Sutton 的強(qiáng)化學(xué)習(xí)書和UCL 強(qiáng)化學(xué)習(xí)的課程。這個系列大概準(zhǔn)備寫 10 到 20 篇,希望寫完后自己的強(qiáng)化學(xué)習(xí)碎片化知識可以得到融會貫通,也希望可以幫到更多的人,畢竟目前系統(tǒng)的講解強(qiáng)化學(xué)習(xí)的中文資料不太多。

          第一篇會從強(qiáng)化學(xué)習(xí)的基本概念講起,對應(yīng) Sutton 書的第一章和 UCL 課程的第一講。

         1.

         強(qiáng)化學(xué)習(xí)在機(jī)器學(xué)習(xí)中的位置

          強(qiáng)化學(xué)習(xí)的學(xué)習(xí)思路和人比較類似,是在實踐中學(xué)習(xí),比如學(xué)習(xí)走路,如果摔倒了,那么我們大腦后面會給一個負(fù)面的獎勵值,說明走的姿勢不好。然后我們從摔倒?fàn)顟B(tài)中爬起來,如果后面正常走了一步,那么大腦會給一個正面的獎勵值,我們會知道這是一個好的走路姿勢。那么這個過程和之前講的機(jī)器學(xué)習(xí)方法有什么區(qū)別呢?

          強(qiáng)化學(xué)習(xí)是和監(jiān)督學(xué)習(xí),非監(jiān)督學(xué)習(xí)并列的第三種機(jī)器學(xué)習(xí)方法,從下圖我們可以看出來。

         強(qiáng)化學(xué)習(xí)來和監(jiān)督學(xué)習(xí)最大的區(qū)別是它是沒有監(jiān)督學(xué)習(xí)已經(jīng)準(zhǔn)備好的訓(xùn)練數(shù)據(jù)輸出值的。強(qiáng)化學(xué)習(xí)只有獎勵值,但是這個獎勵值和監(jiān)督學(xué)習(xí)的輸出值不一樣,它不是事先給出的,而是延后給出的,比如上面的例子里走路摔倒了才得到大腦的獎勵值。同時,強(qiáng)化學(xué)習(xí)的每一步與時間順序前后關(guān)系緊密。而監(jiān)督學(xué)習(xí)的訓(xùn)練數(shù)據(jù)之間一般都是獨立的,沒有這種前后的依賴關(guān)系。

         再來看看強(qiáng)化學(xué)習(xí)和非監(jiān)督學(xué)習(xí)的區(qū)別。也還是在獎勵值這個地方。非監(jiān)督學(xué)習(xí)是沒有輸出值也沒有獎勵值的,它只有數(shù)據(jù)特征。同時和監(jiān)督學(xué)習(xí)一樣,數(shù)據(jù)之間也都是獨立的,沒有強(qiáng)化學(xué)習(xí)這樣的前后依賴關(guān)系。

         2. 強(qiáng)化學(xué)習(xí)的建模

          我們現(xiàn)在來看看強(qiáng)化學(xué)習(xí)這樣的問題我們怎么來建模,簡單的來說,是下圖這樣的:

         上面的大腦代表我們的算法執(zhí)行個體,我們可以操作個體來做決策,即選擇一個合適的動作(Action)At。下面的地球代表我們要研究的環(huán)境,它有自己的狀態(tài)模型,我們選擇了動作 At 后,環(huán)境的狀態(tài)(State)會變,我們會發(fā)現(xiàn)環(huán)境狀態(tài)已經(jīng)變?yōu)?St+1,同時我們得到了我們采取動作 At 的延時獎勵(Reward)Rt+1。然后個體可以繼續(xù)選擇下一個合適的動作,然后環(huán)境的狀態(tài)又會變,又有新的獎勵值。。。這就是強(qiáng)化學(xué)習(xí)的思路。

          那么我們可以整理下這個思路里面出現(xiàn)的強(qiáng)化學(xué)習(xí)要素。

          第一個是環(huán)境的狀態(tài) S, t 時刻環(huán)境的狀態(tài) St 是它的環(huán)境狀態(tài)集中某一個狀態(tài)。

          第二個是個體的動作 A, t 時刻個體采取的動作 At 是它的動作集中某一個動作。

          第三個是環(huán)境的獎勵 R,t 時刻個體在狀態(tài) St 采取的動作 At 對應(yīng)的獎勵Rt+1 會在 t+1 時刻得到。

          下面是稍復(fù)雜一些的模型要素。

         第四個是個體的策略(policy)π,它代表個體采取動作的依據(jù),即個體會依據(jù)策略 π 來選擇動作。最常見的策略表達(dá)方式是一個條件分布 π(a|s), 即在狀態(tài) s 時采取動作 a 的概率。即 π(a|s)=P(At=a|St=s).此時概率大的動作被個體選擇的概率較高。

          第五個是個體在策略 π 和狀態(tài) s 時,采取行動后的價值(value),一般用 vπ(s)表示。這個價值一般是一個期望函數(shù)。雖然當(dāng)前動作會給一個延時獎勵Rt+1,但是光看這個延時獎勵是不行的,因為當(dāng)前的延時獎勵高,不代表到了t+1,t+2,...時刻的后續(xù)獎勵也高。比如下象棋,我們可以某個動作可以吃掉對方的車,這個延時獎勵是很高,但是接著后面我們輸棋了。此時吃車的動作獎勵值高但是價值并不高。因此我們的價值要綜合考慮當(dāng)前的延時獎勵和后續(xù)的延時獎勵。價值函數(shù) vπ(s)一般可以表示為下式,不同的算法會有對應(yīng)的一些價值函數(shù)變種,但思路相同。:

         vπ(s)=?π(Rt+1+γRt+2+γ2Rt+3+...|St=s)

          其中 γ 是第六個模型要素,即獎勵衰減因子,在[0,1]之間。如果為 0,則是貪婪法,即價值只由當(dāng)前延時獎勵決定,如果是 1,則所有的后續(xù)狀態(tài)獎勵和當(dāng)前獎勵一視同仁。大多數(shù)時候,我們會取一個 0 到 1 之間的數(shù)字,即當(dāng)前延時獎勵的權(quán)重比后續(xù)獎勵的權(quán)重大。

          第七個是環(huán)境的狀態(tài)轉(zhuǎn)化模型,可以理解為一個概率狀態(tài)機(jī),它可以表示為一個概率模型,即在狀態(tài) s 下采取動作 a,轉(zhuǎn)到下一個狀態(tài) s′的概率,表示為Pass′。

          第八個是探索率 ?,這個比率主要用在強(qiáng)化學(xué)習(xí)訓(xùn)練迭代過程中,由于我們一般會選擇使當(dāng)前輪迭代價值最大的動作,但是這會導(dǎo)致一些較好的但我們沒有執(zhí)行過的動作被錯過。因此我們在訓(xùn)練選擇最優(yōu)時,會有一定的概率 ? 不選擇使當(dāng)前輪迭代價值最大的動作,而選擇其他的動作。

          以上 8 個就是強(qiáng)化學(xué)習(xí)模型的基本要素了。當(dāng)然,在不同的強(qiáng)化學(xué)習(xí)模型中,會考慮一些其他的模型,或者不考慮上述要素的某幾個,但是這 8 個是大多數(shù)強(qiáng)化學(xué)習(xí)模型的基本要素。

         3. 強(qiáng)化學(xué)習(xí)的簡單實例

          這里給出一個簡單的強(qiáng)化學(xué)習(xí)例子 Tic-Tac-Toe。這是一個簡單的游戲,在一個 3x3 的九宮格里,兩個人輪流下,直到有個人的棋子滿足三個一橫一豎或者一斜,贏得比賽游戲結(jié)束,或者九宮格填滿也沒有人贏,則和棋。

          這個例子的完整代碼在我的 github。例子只有一個文件,很簡單,代碼首先會用兩個電腦選手訓(xùn)練模型,然后可以讓人和機(jī)器對戰(zhàn)。當(dāng)然,由于這個模型很簡單,所以只要你不亂走,最后的結(jié)果都是和棋,當(dāng)然想贏電腦也是不可能的。

         我們重點看看這個例子的模型,理解上面第二節(jié)的部分。如何訓(xùn)練強(qiáng)化學(xué)習(xí)模型可以先不管。代碼部分大家可以自己去看,只有 300 多行。

          首先看第一個要素環(huán)境的狀態(tài) S。這是一個九宮格,每個格子有三種狀態(tài),即沒有棋子(取值 0),有第一個選手的棋子(取值 1),有第二個選手的棋子(取值-1)。那么這個模型的狀態(tài)一共有 19683 個。

          接著我們看個體的動作 A,這里只有 9 個格子,每次也只能下一步,所以最多只有 9 個動作選項。實際上由于已經(jīng)有棋子的格子是不能再下的,所以動作選項會更少。實際可以選擇動作的就是那些取值為 0 的格子。

          第三個是環(huán)境的獎勵 R,這個一般是我們自己設(shè)計。由于我們的目的是贏棋,所以如果某個動作導(dǎo)致的改變到的狀態(tài)可以使我們贏棋,結(jié)束游戲,那么獎勵最高,反之則獎勵最低。其余的雙方下棋動作都有獎勵,但獎勵較少。特別的,對于先下的棋手,不會導(dǎo)致結(jié)束的動作獎勵要比后下的棋手少。

         # give reward to two players

         def giveReward(self):

         if self.currentState.winner == self.p1Symbol:

         self.p1.feedReward(1)

         self.p2.feedReward(0)

         elif self.currentState.winner == self.p2Symbol:

         self.p1.feedReward(0)

         self.p2.feedReward(1)

         else:

         self.p1.feedReward(0.1)

         self.p2.feedReward(0.5)

          第四個是個體的策略(policy)π,這個一般是學(xué)習(xí)得到的,我們會在每輪以較大的概率選擇當(dāng)前價值最高的動作,同時以較小的概率去探索新動作,在這里AI 的策略如下面代碼所示。

          里面的 exploreRate 就是我們的第八個要素探索率 ?。即策略是以 1−? 的概率選擇當(dāng)前最大價值的動作,以 ? 的概率隨機(jī)選擇新動作。

          # determine next action

         def takeAction(self):

         state = self.states[-1]

         nextStates = []

         nextPositions = []

         for i in range(BOARD_ROWS):

         for j in range(BOARD_COLS):

         if state.data[i, j] == 0:

         nextPositions.append([i, j])

         nextStates.append(state.nextState(i, j, self.symbol).getHash())

         if np.random.binomial(1, self.exploreRate):

         np.random.shuffle(nextPositions)

         # Not sure if truncating is the best way to deal with exploratory step

         # Maybe it"s better to only skip this step rather than forget all the history

         self.states = []

         action = nextPositions[0]

         action.append(self.symbol)

         return action

          values = []

         for hash, pos in zip(nextStates, nextPositions):

         values.append((self.estimations[hash], pos))

         np.random.shuffle(values)

         values.sort(key=lambda x: x[0], reverse=True)

         action = values[0][1]

         action.append(self.symbol)

         return action

          第五個是價值函數(shù),代碼里用 value 表示。價值函數(shù)的更新代碼里只考慮了當(dāng)前動作的現(xiàn)有價值和得到的獎勵兩部分,可以認(rèn)為我們的第六個模型要素衰減因子 γ 為 0。具體的代碼部分如下,價值更新部分的代碼加粗。具體為什么會這樣更新價值函數(shù)我們以后會講。

         # update estimation according to reward

         def feedReward(self, reward):

         if len(self.states) == 0:

         return

         self.states = [state.getHash() for state in self.states]

         target = reward

         for latestState in reversed(self.states):

         value = self.estimations[latestState] + self.stepSize * (target - self.estimations[latestState])

         self.estimations[latestState] = value

         target = value

         self.states = []

         第七個是環(huán)境的狀態(tài)轉(zhuǎn)化模型, 這里由于每一個動作后,環(huán)境的下一個模型狀態(tài)是確定的,也就是九宮格的每個格子是否有某個選手的棋子是確定的,因此轉(zhuǎn)化的概率都是 1,不存在某個動作后會以一定的概率到某幾個新狀態(tài),比較簡單。

          從這個例子,相信大家對于強(qiáng)化學(xué)習(xí)的建模會有一個初步的認(rèn)識了。

          以上就是強(qiáng)化學(xué)習(xí)的模型基礎(chǔ),下一篇會討論馬爾科夫決策過程。

        相關(guān)熱詞搜索:學(xué)習(xí) 模型 增強(qiáng)

        版權(quán)所有 蒲公英文摘 www.zuancaijixie.com
        91啦在线播放,特级一级全黄毛片免费,国产中文一区,亚洲国产一成人久久精品