1. 程式人生 > >Reinforcement Learning強化學習系列之一:model-based learning

Reinforcement Learning強化學習系列之一:model-based learning

前言

在機器學習和深度學習坑裡呆了有一些時日了,在阿里實習過程中,也感覺到了工業界和學術界的一些迥異,比如強化學習在工業界用的非常廣泛,而自己之前沒有怎麼接觸過強化學習的一些知識,所以感覺還是要好好的補一補更新一下自己的知識庫,以免被AI時代拋棄。

強化學習初識

強化學習要素

強化學習可以用下面這張圖表示:
這裡寫圖片描述
從上圖可以看出,強化學習的要素是:
1. Agent(圖中指大腦)
2. Environment(圖中指地球)
在每個時間t內:
Agent做的事是:
1. 做出行動At
2. 觀察環境Ot
3. 計算收益Rewardt

Environment做的事是:
1. 感知Agent的A

t
2. 做出環境反應Ot+1
3. 反饋收益Rt+1

因此強化學習其實是一個不斷Agent與外界環境進行互動併產生新的行為的過程,而如何讓行為得到最大的收益,這就是其學習過程。這裡我使用【參考1】的強化學習任務要素:E=<X,A,P,R>,其中X指的是當前的環境狀態,A是做出的行動,P是指從狀態Xt執行行動At後到新的狀態X的轉移概率矩陣,R指的是獎賞reward,而我們的學習目標就是,讓agent學習出一個好的策略policy使得總體的期望reward最大。

具體概念性請參考【參考1】

強化學習與監督學習

強化學習和有監督學習以及無監督學習的區別和聯絡可以用下圖表示:
這裡寫圖片描述

與有監督的學習差異

有監督的學習可以描述為你在學習過程中,有個老師在旁邊教你怎麼做,有著嚴格的標準,而強化學習則沒有這個老師教,而且也沒有固定的標準方法,其標準方法都是探索出來的。

與無監督的學習差異

強化學習看似是無監督學習,其實和無監督的學習差別較大,主要體現在幾點:
1. 無監督的學習更多的是探索資料內部的存在規律或者聯絡,而強化學習主要探索的是策略方式
2. 強化學習和時間有很大的關係,而且反饋都是具有時間效應的,這點和無監督學習非常不一樣

MDP過程

所謂MDP,即Markov Decison Process,具備馬爾科夫鏈性質:系統下一時間的狀態僅由當前時刻的狀態決定;回到強化學習本省,其實就是下一個狀態只由前一時刻的狀態和Action決定,和歷史的狀態和Action無關。

這個性質非常重要,因為後面的很多推斷都是依據這個性質推匯出來的,瞭解HMM模型的人應該知道,馬爾科夫鏈的這條性質是解碼演算法的根本。

有模型的學習:model-based learning

強化學習主要有 1)有模型的學習 2)無模型學習 3)值函式近似 4)模仿學習 等;本系列主要對前3種學習方法進行敘述

有模型和無模型的學習差異在於有模型的E=<X,A,P,R>都是已知的,而無模型的學習是E=<X,A,P,R>不一定可知;

對於有模型的學習基本的基礎知識可以參看【參考1】的第16章的第3小節;這裡我主要針對一個實際的問題,對其原理進行一個闡述;

問題描述

這裡寫圖片描述

現有N×M的二維矩陣,其E=<X,A,P,R>描述為:
X:其狀態有2個終態,也就是圖中的陰影部分,其他的都是非終態;
A:對於每個狀態都有四個action,分別是上下左右
P:對於一個確定的狀態S和一個動作action,其下一個狀態一定是確定的,也就是轉移概率為1
R:如果達到終態,其reward為0;否則為-1
任務:確定最佳的策略/Value function,使其期望reward最大

我們首先對任務進行建模:

#coding=utf-8
import numpy as np
"""
author:luchi
date:2017/9/2
description:gridworld environment
"""

class GridWorldEnv(object):


    def __init__(self,shape=[4,4]):
        if not isinstance(shape, (list, tuple)) or not len(shape) == 2:
            raise ValueError('shape argument must be a list/tuple of length 2')
        self.nS = np.prod(shape)
        self.nA = 4 # four directions
        MAX_X = shape[0]
        MAX_Y = shape[1]

        P={}
        grid = np.arange(self.nS).reshape(shape)

        it = np.nditer(grid,flags=['multi_index'])
        #move directions
        UP = 0
        RIGHT = 1
        DOWN = 2
        LEFT = 3

        while not it.finished:

            state = it.iterindex
            x,y = it.multi_index
            # print state
            # print(x,y)
            P[state] = {a:[] for a in range(self.nA)}
            is_terminal_state = lambda state: state==0 or state==self.nS-1
            reward = lambda state : 0.0 if is_terminal_state(state) else -1.0
            if is_terminal_state(state):
                P[state][UP] = [(1.0,state,reward(state),True)]
                P[state][RIGHT] = [(1.0,state,reward(state),True)]
                P[state][DOWN] = [(1.0,state,reward(state),True)]
                P[state][LEFT] = [(1.0,state,reward(state),True)]
            else:
                Up_Grid = state if x==0 else state-MAX_Y
                Right_Grid = state if y==MAX_Y-1 else state+1
                Down_Grid = state if x==MAX_X-1 else state+MAX_Y
                Left_Grid = state if y==0 else state-1

                P[state][UP] = [(1.0,Up_Grid,reward(Up_Grid),is_terminal_state(Up_Grid))]
                P[state][RIGHT] = [(1.0,Right_Grid,reward(Right_Grid),is_terminal_state(Right_Grid))]
                P[state][DOWN] = [(1.0,Down_Grid,reward(Down_Grid),is_terminal_state(Down_Grid))]
                P[state][LEFT] = [(1.0,Left_Grid,reward(Left_Grid),is_terminal_state(Left_Grid))]
            # print P[state]
            it.iternext()
            self.P = P

grid = GridWorldEnv()

策略評估

策略評估是已知模型的引數的,對於一個策略,估計其期望累計獎賞,使用discount的計算方法,對於策略π,在時間T取得的預期收益VπT(x)計算方法如下:

VπT(x)=aAπ(x,a)xXPaxx(Raxx+γVπT1(x))因此這是一個動態規劃問題,對於t=0初始化Vπ0(x)為0,然後按照遞推公式動態規劃計算即可。

在本文的問題中,我們使用隨機策略randompolicy作為我們的起始策略;這裡隨機策略指的是,對於一個狀態Saction的所有概率都相等,也就是uniform分佈,按照下面的方法計算其策略Value值:

def policy_evaluation(self,policy,env,discount_factor=1.0, theta=0.00001,max_iter_num=1000):

        delta =0.0
        V = np.zeros(env.nS)
        iter_count=0
        while True:
            new_V = np.zeros(env.nS)
            for s in range(env.nS):
                V_x = 0.0
                for idx,prob in enumerate(policy[s]):
                    for trans_prob,next_state,reward,isFinite in env.P[s][idx]:
                        V_x += prob*trans_prob*(reward+discount_factor*V[next_state])

                new_V[s]=V_x
                delta = max(delta, np.abs(V_x - V[s]))
            iter_count+=1
            if delta<theta or iter_count>max_iter_num:
                break
            else:
                V = new_V
        return np.array(V)

計算的V結果如下:

[[  0. -13. -19. -21.]
 [-13. -17. -19. -19.]
 [-19. -19. -17. -13.]
 [-21. -19. -13.   0.]]

我們可以看到對於model-based 學習方法,其value值最終計算的能夠逐步收斂,且反映了資料本身的特徵。

策略改進演算法

我們想得到一個policy能夠使得期望的V最大,對於|X|個狀態和|A|個動作,我們的策略就會有|A|

相關推薦

no