強化學習(一)模型基礎

    從今天開始整理強化學習領域的知識,主要參考的資料是Sutton的強化學習書和UCL強化學習的課程。這個系列大概準備寫10到20篇,但願寫完後本身的強化學習碎片化知識能夠獲得融會貫通,也但願能夠幫到更多的人,畢竟目前系統的講解強化學習的中文資料不太多。git

    第一篇會從強化學習的基本概念講起,對應Sutton書的第一章和UCL課程的第一講。github

1.  強化學習在機器學習中的位置

    強化學習的學習思路和人比較相似,是在實踐中學習,好比學習走路,若是摔倒了,那麼咱們大腦後面會給一個負面的獎勵值,說明走的姿式很差。而後咱們從摔倒狀態中爬起來,若是後面正常走了一步,那麼大腦會給一個正面的獎勵值,咱們會知道這是一個好的走路姿式。那麼這個過程和以前講的機器學習方法有什麼區別呢?算法

    強化學習是和監督學習,非監督學習並列的第三種機器學習方法,從下圖咱們能夠看出來。app

    強化學習來和監督學習最大的區別是它是沒有監督學習已經準備好的訓練數據輸出值的。強化學習只有獎勵值,可是這個獎勵值和監督學習的輸出值不同,它不是事先給出的,而是延後給出的,好比上面的例子裏走路摔倒了才獲得大腦的獎勵值。同時,強化學習的每一步與時間順序先後關係緊密。而監督學習的訓練數據之間通常都是獨立的,沒有這種先後的依賴關係。dom

    再來看看強化學習和非監督學習的區別。也仍是在獎勵值這個地方。非監督學習是沒有輸出值也沒有獎勵值的,它只有數據特徵。同時和監督學習同樣,數據之間也都是獨立的,沒有強化學習這樣的先後依賴關係。機器學習

2. 強化學習的建模

    咱們如今來看看強化學習這樣的問題咱們怎麼來建模,簡單的來講,是下圖這樣的:函數

    上面的大腦表明咱們的算法執行個體,咱們能夠操做個體來作決策,即選擇一個合適的動做(Action)$A_t$。下面的地球表明咱們要研究的環境,它有本身的狀態模型,咱們選擇了動做$A_t$後,環境的狀態(State)會變,咱們會發現環境狀態已經變爲$S_{t+1}$,同時咱們獲得了咱們採起動做$A_t$的延時獎勵(Reward)$R_{t+1}$。而後個體能夠繼續選擇下一個合適的動做,而後環境的狀態又會變,又有新的獎勵值。。。這就是強化學習的思路。學習

    那麼咱們能夠整理下這個思路里面出現的強化學習要素。this

    第一個是環境的狀態$S$, t時刻環境的狀態$S_t$是它的環境狀態集中某一個狀態。spa

    第二個是個體的動做$A$, t時刻個體採起的動做$A_t$是它的動做集中某一個動做。

    第三個是環境的獎勵$R$,t時刻個體在狀態$S_t$採起的動做$A_t$對應的獎勵$R_{t+1}$會在t+1時刻獲得。

    下面是稍複雜一些的模型要素。

    第四個是個體的策略(policy)$\pi$,它表明個體採起動做的依據,即個體會依據策略$\pi$來選擇動做。最多見的策略表達方式是一個條件機率分佈$\pi(a|s)$, 即在狀態$s$時採起動做$a$的機率。即$\pi(a|s) = P(A_t=a | S_t=s)$.此時機率大的動做被個體選擇的機率較高。

    第五個是個體在策略$\pi$和狀態$s$時,採起行動後的價值(value),通常用$v_{\pi}(s)$表示。這個價值通常是一個指望函數。雖然當前動做會給一個延時獎勵$R_{t+1}$,可是光看這個延時獎勵是不行的,由於當前的延時獎勵高,不表明到了t+1,t+2,...時刻的後續獎勵也高。好比下象棋,咱們能夠某個動做能夠吃掉對方的車,這個延時獎勵是很高,可是接着後面咱們輸棋了。此時吃車的動做獎勵值高可是價值並不高。所以咱們的價值要綜合考慮當前的延時獎勵和後續的延時獎勵。價值函數$v_{\pi}(s)$通常能夠表示爲下式,不一樣的算法會有對應的一些價值函數變種,但思路相同。:$$v_{\pi}(s) = \mathbb{E}_{\pi}(R_{t+1} + \gamma R_{t+2} + \gamma^2R_{t+3}+...|S_t=s)$$

    其中$\gamma$是第六個模型要素,即獎勵衰減因子,在[0,1]之間。若是爲0,則是貪婪法,即價值只由當前延時獎勵決定,若是是1,則全部的後續狀態獎勵和當前獎勵一視同仁。大多數時候,咱們會取一個0到1之間的數字,即當前延時獎勵的權重比後續獎勵的權重大。

    第七個是環境的狀態轉化模型,能夠理解爲一個機率狀態機,它能夠表示爲一個機率模型,即在狀態$s$下采起動做$a$,轉到下一個狀態$s'$的機率,表示爲$P_{ss'}^a$。

    第八個是探索率$\epsilon$,這個比率主要用在強化學習訓練迭代過程當中,因爲咱們通常會選擇使當前輪迭代價值最大的動做,可是這會致使一些較好的但咱們沒有執行過的動做被錯過。所以咱們在訓練選擇最優動做時,會有必定的機率$\epsilon$不選擇使當前輪迭代價值最大的動做,而選擇其餘的動做。

    以上8個就是強化學習模型的基本要素了。固然,在不一樣的強化學習模型中,會考慮一些其餘的模型要素,或者不考慮上述要素的某幾個,可是這8個是大多數強化學習模型的基本要素。

3. 強化學習的簡單實例

    這裏給出一個簡單的強化學習例子Tic-Tac-Toe。這是一個簡單的遊戲,在一個3x3的九宮格里,兩我的輪流下,直到有我的的棋子知足三個一橫一豎或者一斜,贏得比賽遊戲結束,或者九宮格填滿也沒有人贏,則和棋。

    這個例子的完整代碼在個人github例子只有一個文件,很簡單,代碼首先會用兩個電腦選手訓練模型,而後可讓人和機器對戰。固然,因爲這個模型很簡單,因此只要你不亂走,最後的結果都是和棋,固然想贏電腦也是不可能的。

    咱們重點看看這個例子的模型,理解上面第二節的部分。如何訓練強化學習模型能夠先無論。代碼部分你們能夠本身去看,只有300多行。

    首先看第一個要素環境的狀態$S$。這是一個九宮格,每一個格子有三種狀態,即沒有棋子(取值0),有第一個選手的棋子(取值1),有第二個選手的棋子(取值-1)。那麼這個模型的狀態一共有$3^9=19683$個。

    接着咱們看個體的動做$A$,這裏只有9個格子,每次也只能下一步,因此最多隻有9個動做選項。實際上因爲已經有棋子的格子是不能再下的,因此動做選項會更少。實際能夠選擇動做的就是那些取值爲0的格子。

    第三個是環境的獎勵$R$,這個通常是咱們本身設計。因爲咱們的目的是贏棋,因此若是某個動做致使的改變到的狀態可使咱們贏棋,結束遊戲,那麼獎勵最高,反之則獎勵最低。其他的雙方下棋動做都有獎勵,但獎勵較少。特別的,對於先下的棋手,不會致使結束的動做獎勵要比後下的棋手少。

    # 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)$\pi$,這個通常是學習獲得的,咱們會在每輪以較大的機率選擇當前價值最高的動做,同時以較小的機率去探索新動做,在這裏AI的策略以下面代碼所示。

    裏面的exploreRate就是咱們的第八個要素探索率$\epsilon$。即策略是以$1-\epsilon$的機率選擇當前最大價值的動做,以$\epsilon$的機率隨機選擇新動做。

   # 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

    第五個是價值函數,代碼裏用value表示。價值函數的更新代碼裏只考慮了當前動做的現有價值和獲得的獎勵兩部分,能夠認爲咱們的第六個模型要素衰減因子$\gamma$爲0。具體的代碼部分以下,價值更新部分的代碼加粗。具體爲何會這樣更新價值函數咱們之後會講。

    # 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 = []

    第七個是環境的狀態轉化模型, 這裏因爲每個動做後,環境的下一個模型狀態是肯定的,也就是九宮格的每一個格子是否有某個選手的棋子是肯定的,所以轉化的機率都是1,不存在某個動做後會以必定的機率到某幾個新狀態,比較簡單。

    從這個例子,相信你們對於強化學習的建模會有一個初步的認識了。        

    以上就是強化學習的模型基礎,下一篇會討論馬爾科夫決策過程。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)

相關文章
相關標籤/搜索